From 18325a57cb05f50583a1822797604bb6648e37f2 Mon Sep 17 00:00:00 2001 From: Nedim Akar Date: Tue, 31 Oct 2023 11:39:12 +0100 Subject: [PATCH] applied JRA's suggestions --- src/jetstream/cnsi.go | 21 ++++++++++----- src/jetstream/custom_error/custom_error.go | 15 ----------- .../custom_errors/constants/constants.go | 7 +++++ src/jetstream/custom_errors/custom_errors.go | 26 +++++++++++++++++++ src/jetstream/datastore/datastore.go | 6 ++--- src/jetstream/middleware.go | 4 +-- src/jetstream/plugins/kubernetes/main.go | 5 ++-- .../pgsql_goose_db_version.go | 20 +++++++------- .../pgsql_goose_db_version_test.go | 4 +-- src/jetstream/setup_console.go | 6 ++--- 10 files changed, 69 insertions(+), 45 deletions(-) delete mode 100644 src/jetstream/custom_error/custom_error.go create mode 100644 src/jetstream/custom_errors/constants/constants.go create mode 100644 src/jetstream/custom_errors/custom_errors.go diff --git a/src/jetstream/cnsi.go b/src/jetstream/cnsi.go index d5ac2c8e09..1fe0e72e95 100644 --- a/src/jetstream/cnsi.go +++ b/src/jetstream/cnsi.go @@ -3,6 +3,7 @@ package main import ( "crypto/x509" "encoding/json" + "errors" "fmt" "net/http" "net/url" @@ -23,15 +24,21 @@ import ( const dbReferenceError = "unable to establish a database reference: '%v'" func isSSLRelatedError(err error) (bool, string) { - if urlErr, ok := err.(*url.Error); ok { - if x509Err, ok := urlErr.Err.(x509.UnknownAuthorityError); ok { - return true, x509Err.Error() + var urlError *url.Error + if errors.As(err, &urlError) { + var ( + certInvalidError *x509.CertificateInvalidError + unknownAuthorityError *x509.UnknownAuthorityError + hostnameError *x509.HostnameError + ) + if errors.As(urlError.Err, unknownAuthorityError) { + return true, unknownAuthorityError.Error() } - if x509Err, ok := urlErr.Err.(x509.HostnameError); ok { - return true, x509Err.Error() + if errors.As(urlError.Err, hostnameError) { + return true, hostnameError.Error() } - if x509Err, ok := urlErr.Err.(x509.CertificateInvalidError); ok { - return true, x509Err.Error() + if errors.As(urlError.Err, certInvalidError) { + return true, certInvalidError.Error() } } return false, "" diff --git a/src/jetstream/custom_error/custom_error.go b/src/jetstream/custom_error/custom_error.go deleted file mode 100644 index 7c533c506a..0000000000 --- a/src/jetstream/custom_error/custom_error.go +++ /dev/null @@ -1,15 +0,0 @@ -package custom_error - -import "errors" - -const ( - ERR_DIAL_TCP = "dial" - ERR_NO_DATABASE_VERSIONS_FOUND = "no database versions found" - ERR_NO_SUCH_TABLE = "no such table" - ERR_X509_CERTIFICATE = "x509: certificate" -) - -var ErrDialTcp = errors.New(ERR_DIAL_TCP) -var ErrNoDatabaseVersionsFound = errors.New(ERR_NO_DATABASE_VERSIONS_FOUND) -var ErrNoSuchTable = errors.New(ERR_NO_SUCH_TABLE) -var Err509Certificate = errors.New(ERR_X509_CERTIFICATE) diff --git a/src/jetstream/custom_errors/constants/constants.go b/src/jetstream/custom_errors/constants/constants.go new file mode 100644 index 0000000000..f7dcacc278 --- /dev/null +++ b/src/jetstream/custom_errors/constants/constants.go @@ -0,0 +1,7 @@ +package constants + +const ( + ERR_GOOSE_DB_NO_DATABASE_VERSIONS_FOUND = "pgsql_goosedb: no database versions found" + ERR_GOOSE_DB_NO_SUCH_TABLE = "pgsql_goosedb: no such table" + ERR_GOOSE_DB_FAILED_GETTING_CURRENT_DATABASE_VERSION = "pgsql_goosedb: error trying to get current database version: %w" +) diff --git a/src/jetstream/custom_errors/custom_errors.go b/src/jetstream/custom_errors/custom_errors.go new file mode 100644 index 0000000000..a6e35a0e79 --- /dev/null +++ b/src/jetstream/custom_errors/custom_errors.go @@ -0,0 +1,26 @@ +package custom_errors + +import ( + "fmt" + + "github.com/cloudfoundry-incubator/stratos/src/jetstream/custom_error/constants" +) + +type GooseDBNoDatabaseVersionsFoundError struct{} + +func (e GooseDBNoDatabaseVersionsFoundError) Error() string { + return constants.ERR_GOOSE_DB_NO_DATABASE_VERSIONS_FOUND +} + +type GooseDBNoSuchTableError struct{} + +func (e GooseDBNoSuchTableError) Error() string { + return constants.ERR_GOOSE_DB_NO_SUCH_TABLE +} + +func ErrGettingCurrentVersion(err error) error { + return fmt.Errorf(constants.ERR_GOOSE_DB_FAILED_GETTING_CURRENT_DATABASE_VERSION, err) +} + +var ErrNoDatabaseVersionsFound = GooseDBNoDatabaseVersionsFoundError{} +var ErrNoSuchTable = GooseDBNoSuchTableError{} diff --git a/src/jetstream/datastore/datastore.go b/src/jetstream/datastore/datastore.go index 98a7983888..17030c102c 100644 --- a/src/jetstream/datastore/datastore.go +++ b/src/jetstream/datastore/datastore.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "github.com/cloudfoundry-incubator/stratos/src/jetstream/custom_error" + "github.com/cloudfoundry-incubator/stratos/src/jetstream/custom_errors" goosedbversion "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/goose-db-version" "github.com/govau/cf-common/env" @@ -304,9 +304,9 @@ func WaitForMigrations(db *sql.DB) error { databaseVersionRec, err := dbVersionRepo.GetCurrentVersion() if err != nil { var errorMsg = err.Error() - if strings.Contains(err.Error(), custom_error.ERR_NO_SUCH_TABLE) { + if errors.Is(err, custom_errors.ErrNoSuchTable) { errorMsg = "Waiting for versions table to be created" - } else if errors.Is(err, custom_error.ErrNoDatabaseVersionsFound) { + } else if errors.Is(err, custom_errors.ErrNoDatabaseVersionsFound) { errorMsg = "Versions table is empty - waiting for migrations" } log.Infof("Database schema check: %s", errorMsg) diff --git a/src/jetstream/middleware.go b/src/jetstream/middleware.go index c610f43048..2b4cfdd48d 100644 --- a/src/jetstream/middleware.go +++ b/src/jetstream/middleware.go @@ -11,8 +11,6 @@ import ( "strings" "time" - "github.com/cloudfoundry-incubator/stratos/src/jetstream/custom_error" - "github.com/gorilla/context" "github.com/govau/cf-common/env" "github.com/labstack/echo/v4" @@ -44,7 +42,7 @@ func handleSessionError(config api.PortalConfig, c echo.Context, err error, doNo var netOpErr *net.OpError if errors.As(err, &netOpErr) { - if netOpErr.Op == custom_error.ERR_DIAL_TCP { + if netOpErr.Op == "dial" && netOpErr.Net == "tcp" { return api.NewHTTPShadowError( http.StatusServiceUnavailable, "Service is currently unavailable", diff --git a/src/jetstream/plugins/kubernetes/main.go b/src/jetstream/plugins/kubernetes/main.go index b417345fc6..36ad4d201e 100644 --- a/src/jetstream/plugins/kubernetes/main.go +++ b/src/jetstream/plugins/kubernetes/main.go @@ -1,18 +1,17 @@ package kubernetes import ( + "crypto/x509" "encoding/json" "fmt" "io/ioutil" "net/http" "net/url" "strconv" - "strings" "errors" "github.com/cloudfoundry-incubator/stratos/src/jetstream/api" - "github.com/cloudfoundry-incubator/stratos/src/jetstream/custom_error" "github.com/labstack/echo/v4" log "github.com/sirupsen/logrus" @@ -289,7 +288,7 @@ func (c *KubernetesSpecification) RequiresCert(ec echo.Context) error { Message string } if err != nil { - if strings.Contains(err.Error(), custom_error.ERR_X509_CERTIFICATE) { + if errors.Is(err, new(x509.CertificateInvalidError)) { response.Status = http.StatusOK response.Required = true } else { diff --git a/src/jetstream/repository/goose-db-version/pgsql_goose_db_version.go b/src/jetstream/repository/goose-db-version/pgsql_goose_db_version.go index 9c52ca33ac..7a340a5b17 100644 --- a/src/jetstream/repository/goose-db-version/pgsql_goose_db_version.go +++ b/src/jetstream/repository/goose-db-version/pgsql_goose_db_version.go @@ -2,12 +2,14 @@ package goosedbversion import ( "database/sql" + "errors" "fmt" + "strings" log "github.com/sirupsen/logrus" "github.com/cloudfoundry-incubator/stratos/src/jetstream/api" - "github.com/cloudfoundry-incubator/stratos/src/jetstream/custom_error" + "github.com/cloudfoundry-incubator/stratos/src/jetstream/custom_errors" ) const ( @@ -35,15 +37,15 @@ func (p *PostgresGooseDBVersionRepository) GetCurrentVersion() (api.GooseDBVersi err := p.db.QueryRow(getCurrentVersion).Scan(&dbVersion.VersionID) - switch { - case err == sql.ErrNoRows: - return api.GooseDBVersionRecord{}, custom_error.ErrNoDatabaseVersionsFound - case err != nil: - return api.GooseDBVersionRecord{}, fmt.Errorf("Error trying to get current database version: %v", err) - default: - // do nothing + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return api.GooseDBVersionRecord{}, custom_errors.ErrNoDatabaseVersionsFound + } else if strings.Contains(err.Error(), "no such table") { + return api.GooseDBVersionRecord{}, custom_errors.ErrNoSuchTable + } else { + return api.GooseDBVersionRecord{}, custom_errors.ErrGettingCurrentVersion(err) + } } - return *dbVersion, nil } diff --git a/src/jetstream/repository/goose-db-version/pgsql_goose_db_version_test.go b/src/jetstream/repository/goose-db-version/pgsql_goose_db_version_test.go index 665c55f054..e7b344ba01 100644 --- a/src/jetstream/repository/goose-db-version/pgsql_goose_db_version_test.go +++ b/src/jetstream/repository/goose-db-version/pgsql_goose_db_version_test.go @@ -10,7 +10,7 @@ import ( . "github.com/smartystreets/goconvey/convey" "github.com/cloudfoundry-incubator/stratos/src/jetstream/api" - "github.com/cloudfoundry-incubator/stratos/src/jetstream/custom_error" + "github.com/cloudfoundry-incubator/stratos/src/jetstream/custom_errors" ) func TestPgSQLGooseDB(t *testing.T) { @@ -72,7 +72,7 @@ func TestPgSQLGooseDB(t *testing.T) { Convey("there should be an error", func() { repository, _ := NewPostgresGooseDBVersionRepository(db) _, err := repository.GetCurrentVersion() - So(err, ShouldResemble, custom_error.ErrNoDatabaseVersionsFound) + So(err, ShouldResemble, custom_errors.ErrNoDatabaseVersionsFound) dberr := mock.ExpectationsWereMet() So(dberr, ShouldBeNil) diff --git a/src/jetstream/setup_console.go b/src/jetstream/setup_console.go index c426317d78..fca48fad3f 100644 --- a/src/jetstream/setup_console.go +++ b/src/jetstream/setup_console.go @@ -1,13 +1,13 @@ package main import ( + "crypto/x509" "errors" "fmt" "net/http" "net/url" "regexp" "strconv" - "strings" "github.com/govau/cf-common/env" "github.com/labstack/echo/v4" @@ -17,7 +17,6 @@ import ( "github.com/cloudfoundry-incubator/stratos/src/jetstream/api" "github.com/cloudfoundry-incubator/stratos/src/jetstream/api/config" "github.com/cloudfoundry-incubator/stratos/src/jetstream/crypto" - "github.com/cloudfoundry-incubator/stratos/src/jetstream/custom_error" "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/console_config" "github.com/cloudfoundry-incubator/stratos/src/jetstream/repository/localusers" ) @@ -94,7 +93,8 @@ func (p *portalProxy) setupGetAvailableScopes(c echo.Context) error { errInfo, ok := err.(api.ErrHTTPRequest) if ok { if errInfo.Status == 0 { - if strings.Contains(errInfo.Error(), custom_error.ERR_X509_CERTIFICATE) { + var certError *x509.CertificateInvalidError + if errors.As(err, certError) { return api.NewHTTPShadowError( http.StatusBadRequest, "Could not connect to the UAA - Certificate error - check Skip SSL validation setting",