From 63541676b3813246105e5a560bb69dda57aa89ad Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Mon, 11 Mar 2024 18:56:54 +0100 Subject: [PATCH 01/27] add core logic to support access token in postgres scaler Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scalers/postgresql_scaler.go | 195 +++++++++++++++++++------- pkg/scalers/postgresql_scaler_test.go | 9 +- 2 files changed, 148 insertions(+), 56 deletions(-) diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index 00f1edada2f..5793f17bdb7 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -4,24 +4,39 @@ import ( "context" "database/sql" "fmt" + "regexp" "strconv" "strings" + "time" + "github.com/Azure/azure-sdk-for-go/sdk/azcore" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" + "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/go-logr/logr" + // PostreSQL drive required for this scaler _ "github.com/jackc/pgx/v5/stdlib" v2 "k8s.io/api/autoscaling/v2" "k8s.io/metrics/pkg/apis/external_metrics" + kedav1alpha1 "github.com/kedacore/keda/v2/apis/keda/v1alpha1" + "github.com/kedacore/keda/v2/pkg/scalers/azure" "github.com/kedacore/keda/v2/pkg/scalers/scalersconfig" kedautil "github.com/kedacore/keda/v2/pkg/util" ) +const ( + // Azure AD resource ID for Azure Database for PostgreSQL is https://ossrdbms-aad.database.windows.net + // https://learn.microsoft.com/en-us/azure/postgresql/single-server/how-to-connect-with-managed-identity + azureDatabasePostgresResource = "https://ossrdbms-aad.database.windows.net/.default" +) + type postgreSQLScaler struct { - metricType v2.MetricTargetType - metadata *postgreSQLMetadata - connection *sql.DB - logger logr.Logger + metricType v2.MetricTargetType + metadata *postgreSQLMetadata + connection *sql.DB + podIdentity kedav1alpha1.AuthPodIdentity + logger logr.Logger } type postgreSQLMetadata struct { @@ -30,10 +45,16 @@ type postgreSQLMetadata struct { connection string query string triggerIndex int + azureAuthContext azureAuthContext +} + +type azureAuthContext struct { + cred *azidentity.ChainedTokenCredential + token *azcore.AccessToken } // NewPostgreSQLScaler creates a new postgreSQL scaler -func NewPostgreSQLScaler(config *scalersconfig.ScalerConfig) (Scaler, error) { +func NewPostgreSQLScaler(ctx context.Context, config *scalersconfig.ScalerConfig) (Scaler, error) { metricType, err := GetMetricTargetType(config) if err != nil { return nil, fmt.Errorf("error getting scaler metric type: %w", err) @@ -41,7 +62,7 @@ func NewPostgreSQLScaler(config *scalersconfig.ScalerConfig) (Scaler, error) { logger := InitializeLogger(config, "postgresql_scaler") - meta, err := parsePostgreSQLMetadata(config) + meta, podIdentity, err := parsePostgreSQLMetadata(ctx, logger, config) if err != nil { return nil, fmt.Errorf("error parsing postgreSQL metadata: %w", err) } @@ -51,33 +72,36 @@ func NewPostgreSQLScaler(config *scalersconfig.ScalerConfig) (Scaler, error) { return nil, fmt.Errorf("error establishing postgreSQL connection: %w", err) } return &postgreSQLScaler{ - metricType: metricType, - metadata: meta, - connection: conn, - logger: logger, + metricType: metricType, + metadata: meta, + connection: conn, + podIdentity: podIdentity, + logger: logger, }, nil } -func parsePostgreSQLMetadata(config *scalersconfig.ScalerConfig) (*postgreSQLMetadata, error) { +func parsePostgreSQLMetadata(ctx context.Context, logger logr.Logger, config *scalersconfig.ScalerConfig) (*postgreSQLMetadata, kedav1alpha1.AuthPodIdentity, error) { meta := postgreSQLMetadata{} + authPodIdentity := kedav1alpha1.AuthPodIdentity{} + if val, ok := config.TriggerMetadata["query"]; ok { meta.query = val } else { - return nil, fmt.Errorf("no query given") + return nil, authPodIdentity, fmt.Errorf("no query given") } if val, ok := config.TriggerMetadata["targetQueryValue"]; ok { targetQueryValue, err := strconv.ParseFloat(val, 64) if err != nil { - return nil, fmt.Errorf("queryValue parsing error %w", err) + return nil, authPodIdentity, fmt.Errorf("queryValue parsing error %w", err) } meta.targetQueryValue = targetQueryValue } else { if config.AsMetricSource { meta.targetQueryValue = 0 } else { - return nil, fmt.Errorf("no targetQueryValue given") + return nil, authPodIdentity, fmt.Errorf("no targetQueryValue given") } } @@ -85,61 +109,93 @@ func parsePostgreSQLMetadata(config *scalersconfig.ScalerConfig) (*postgreSQLMet if val, ok := config.TriggerMetadata["activationTargetQueryValue"]; ok { activationTargetQueryValue, err := strconv.ParseFloat(val, 64) if err != nil { - return nil, fmt.Errorf("activationTargetQueryValue parsing error %w", err) + return nil, authPodIdentity, fmt.Errorf("activationTargetQueryValue parsing error %w", err) } meta.activationTargetQueryValue = activationTargetQueryValue } - switch { - case config.AuthParams["connection"] != "": - meta.connection = config.AuthParams["connection"] - case config.TriggerMetadata["connectionFromEnv"] != "": - meta.connection = config.ResolvedEnv[config.TriggerMetadata["connectionFromEnv"]] - default: - host, err := GetFromAuthOrMeta(config, "host") - if err != nil { - return nil, err - } + switch config.PodIdentity.Provider { + case "", kedav1alpha1.PodIdentityProviderNone: + switch { + case config.AuthParams["connection"] != "": + meta.connection = config.AuthParams["connection"] + case config.TriggerMetadata["connectionFromEnv"] != "": + meta.connection = config.ResolvedEnv[config.TriggerMetadata["connectionFromEnv"]] + default: + params, err := buildConnArray(config) + if err != nil { + return nil, authPodIdentity, fmt.Errorf("failed to parse fields related to the connection") + } - port, err := GetFromAuthOrMeta(config, "port") - if err != nil { - return nil, err + var password string + if config.AuthParams["password"] != "" { + password = config.AuthParams["password"] + } else if config.TriggerMetadata["passwordFromEnv"] != "" { + password = config.ResolvedEnv[config.TriggerMetadata["passwordFromEnv"]] + } + params = append(params, "password="+escapePostgreConnectionParameter(password)) + meta.connection = strings.Join(params, " ") } - - userName, err := GetFromAuthOrMeta(config, "userName") + case kedav1alpha1.PodIdentityProviderAzure, kedav1alpha1.PodIdentityProviderAzureWorkload: + params, err := buildConnArray(config) if err != nil { - return nil, err + return nil, authPodIdentity, fmt.Errorf("failed to parse fields related to the connection") } - dbName, err := GetFromAuthOrMeta(config, "dbName") + cred, err := azure.NewChainedCredential(logger, config.PodIdentity.GetIdentityID(), config.PodIdentity.GetIdentityTenantID(), config.PodIdentity.Provider) if err != nil { - return nil, err + return nil, authPodIdentity, err } + meta.azureAuthContext.cred = cred - sslmode, err := GetFromAuthOrMeta(config, "sslmode") - if err != nil { - return nil, err - } + authPodIdentity = kedav1alpha1.AuthPodIdentity{Provider: config.PodIdentity.Provider} - var password string - if config.AuthParams["password"] != "" { - password = config.AuthParams["password"] - } else if config.TriggerMetadata["passwordFromEnv"] != "" { - password = config.ResolvedEnv[config.TriggerMetadata["passwordFromEnv"]] + accessToken, err := getAzureAccessToken(ctx, &meta, azureDatabasePostgresResource) + if err != nil { + return nil, authPodIdentity, err } - - // Build connection str - var params []string - params = append(params, "host="+escapePostgreConnectionParameter(host)) - params = append(params, "port="+escapePostgreConnectionParameter(port)) - params = append(params, "user="+escapePostgreConnectionParameter(userName)) - params = append(params, "dbname="+escapePostgreConnectionParameter(dbName)) - params = append(params, "sslmode="+escapePostgreConnectionParameter(sslmode)) - params = append(params, "password="+escapePostgreConnectionParameter(password)) + params = append(params, "password="+escapePostgreConnectionParameter(accessToken)) meta.connection = strings.Join(params, " ") } meta.triggerIndex = config.TriggerIndex - return &meta, nil + + return &meta, authPodIdentity, nil +} + +func buildConnArray(config *scalersconfig.ScalerConfig) ([]string, error) { + var params []string + + host, err := GetFromAuthOrMeta(config, "host") + if err != nil { + return nil, err + } + + port, err := GetFromAuthOrMeta(config, "port") + if err != nil { + return nil, err + } + + userName, err := GetFromAuthOrMeta(config, "userName") + if err != nil { + return nil, err + } + + dbName, err := GetFromAuthOrMeta(config, "dbName") + if err != nil { + return nil, err + } + + sslmode, err := GetFromAuthOrMeta(config, "sslmode") + if err != nil { + return nil, err + } + params = append(params, "host="+escapePostgreConnectionParameter(host)) + params = append(params, "port="+escapePostgreConnectionParameter(port)) + params = append(params, "user="+escapePostgreConnectionParameter(userName)) + params = append(params, "dbname="+escapePostgreConnectionParameter(dbName)) + params = append(params, "sslmode="+escapePostgreConnectionParameter(sslmode)) + + return params, nil } func getConnection(meta *postgreSQLMetadata, logger logr.Logger) (*sql.DB, error) { @@ -168,6 +224,26 @@ func (s *postgreSQLScaler) Close(context.Context) error { func (s *postgreSQLScaler) getActiveNumber(ctx context.Context) (float64, error) { var id float64 + + // Only one Azure case now but maybe more in the future. + switch s.podIdentity.Provider { + case kedav1alpha1.PodIdentityProviderAzure, kedav1alpha1.PodIdentityProviderAzureWorkload: + if s.metadata.azureAuthContext.token.ExpiresOn.After(time.Now().Add(time.Second * 60)) { + accessToken, err := getAzureAccessToken(ctx, s.metadata, azureDatabasePostgresResource) + if err != nil { + return 0, err + } + pattern := regexp.MustCompile(`password='([^']*)'`) + newPasswordField := "password=" + escapePostgreConnectionParameter(accessToken) + s.metadata.connection = pattern.ReplaceAllString(s.metadata.connection, newPasswordField) + + s.connection, err = getConnection(s.metadata, s.logger) + if err != nil { + return 0, fmt.Errorf("error establishing postgreSQL connection: %w", err) + } + } + } + err := s.connection.QueryRowContext(ctx, s.metadata.query).Scan(&id) if err != nil { s.logger.Error(err, fmt.Sprintf("could not query postgreSQL: %s", err)) @@ -210,3 +286,18 @@ func escapePostgreConnectionParameter(str string) string { str = strings.ReplaceAll(str, "'", "\\'") return fmt.Sprintf("'%s'", str) } + +func getAzureAccessToken(ctx context.Context, metadata *postgreSQLMetadata, scope string) (string, error) { + accessToken, err := metadata.azureAuthContext.cred.GetToken(ctx, policy.TokenRequestOptions{ + Scopes: []string{ + scope, + }, + }) + if err != nil { + return "", err + } + + metadata.azureAuthContext.token = &accessToken + + return metadata.azureAuthContext.token.Token, nil +} diff --git a/pkg/scalers/postgresql_scaler_test.go b/pkg/scalers/postgresql_scaler_test.go index 02e9fe9d157..ab0cb0fd6a5 100644 --- a/pkg/scalers/postgresql_scaler_test.go +++ b/pkg/scalers/postgresql_scaler_test.go @@ -6,6 +6,7 @@ import ( "github.com/go-logr/logr" + kedav1alpha1 "github.com/kedacore/keda/v2/apis/keda/v1alpha1" "github.com/kedacore/keda/v2/pkg/scalers/scalersconfig" ) @@ -45,11 +46,11 @@ var postgreSQLMetricIdentifiers = []postgreSQLMetricIdentifier{ func TestPosgresSQLGetMetricSpecForScaling(t *testing.T) { for _, testData := range postgreSQLMetricIdentifiers { - meta, err := parsePostgreSQLMetadata(&scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadataTestData.metadata, AuthParams: testData.authParam, TriggerIndex: testData.scaleIndex}) + meta, _, err := parsePostgreSQLMetadata(context.TODO(), logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadataTestData.metadata, AuthParams: testData.authParam, TriggerIndex: testData.scaleIndex}) if err != nil { t.Fatal("Could not parse metadata:", err) } - mockPostgresSQLScaler := postgreSQLScaler{"", meta, nil, logr.Discard()} + mockPostgresSQLScaler := postgreSQLScaler{"", meta, nil, kedav1alpha1.AuthPodIdentity{}, logr.Discard()} metricSpec := mockPostgresSQLScaler.GetMetricSpecForScaling(context.Background()) metricName := metricSpec[0].External.Metric.Name @@ -79,7 +80,7 @@ var testPostgreSQLConnectionstring = []postgreSQLConnectionStringTestData{ func TestPosgresSQLConnectionStringGeneration(t *testing.T) { for _, testData := range testPostgreSQLConnectionstring { - meta, err := parsePostgreSQLMetadata(&scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadata, AuthParams: testData.authParam, TriggerIndex: 0}) + meta, _, err := parsePostgreSQLMetadata(context.TODO(), logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadata, AuthParams: testData.authParam, TriggerIndex: 0}) if err != nil { t.Fatal("Could not parse metadata:", err) } @@ -135,7 +136,7 @@ var testPostgresMetadata = []parsePostgresMetadataTestData{ func TestParsePosgresSQLMetadata(t *testing.T) { for _, testData := range testPostgresMetadata { - _, err := parsePostgreSQLMetadata(&scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadata, AuthParams: testData.authParams}) + _, _, err := parsePostgreSQLMetadata(context.TODO(), logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadata, AuthParams: testData.authParams}) if err != nil && !testData.raisesError { t.Error("Expected success but got error", err) } From b2855ec16a4d60920161686918662b1ad7b044c7 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Mon, 11 Mar 2024 20:19:05 +0100 Subject: [PATCH 02/27] minor fix Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scaling/scalers_builder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/scaling/scalers_builder.go b/pkg/scaling/scalers_builder.go index afcfc574bb1..0eb1d80a4a0 100644 --- a/pkg/scaling/scalers_builder.go +++ b/pkg/scaling/scalers_builder.go @@ -224,7 +224,7 @@ func buildScaler(ctx context.Context, client client.Client, triggerType string, case "openstack-swift": return scalers.NewOpenstackSwiftScaler(config) case "postgresql": - return scalers.NewPostgreSQLScaler(config) + return scalers.NewPostgreSQLScaler(ctx, config) case "predictkube": return scalers.NewPredictKubeScaler(ctx, config) case "prometheus": From f3760a515e894380e2ab400a1b1a09d868c36e11 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Mon, 11 Mar 2024 20:34:45 +0100 Subject: [PATCH 03/27] run make build to fmt code Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scalers/postgresql_scaler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index 5793f17bdb7..28f13d154f9 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -49,7 +49,7 @@ type postgreSQLMetadata struct { } type azureAuthContext struct { - cred *azidentity.ChainedTokenCredential + cred *azidentity.ChainedTokenCredential token *azcore.AccessToken } From bee72e1f5d37139506b9f22dbc61c4bab3dba8ee Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Wed, 13 Mar 2024 20:33:29 +0100 Subject: [PATCH 04/27] make regexp password pattern global Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scalers/postgresql_scaler.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index 28f13d154f9..864d3ce9258 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -31,6 +31,10 @@ const ( azureDatabasePostgresResource = "https://ossrdbms-aad.database.windows.net/.default" ) +var ( + passwordConnPattern = regexp.MustCompile(`password='([^']*)'`) +) + type postgreSQLScaler struct { metricType v2.MetricTargetType metadata *postgreSQLMetadata @@ -233,9 +237,8 @@ func (s *postgreSQLScaler) getActiveNumber(ctx context.Context) (float64, error) if err != nil { return 0, err } - pattern := regexp.MustCompile(`password='([^']*)'`) - newPasswordField := "password=" + escapePostgreConnectionParameter(accessToken) - s.metadata.connection = pattern.ReplaceAllString(s.metadata.connection, newPasswordField) + newPasswordField := "password="+escapePostgreConnectionParameter(accessToken) + s.metadata.connection = passwordConnPattern.ReplaceAllString(s.metadata.connection, newPasswordField) s.connection, err = getConnection(s.metadata, s.logger) if err != nil { From de5b4ae52be1664b2880184ea311c7d2a7fb6a7e Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Wed, 13 Mar 2024 21:02:30 +0100 Subject: [PATCH 05/27] adapt to use placeholder for regexp Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scalers/postgresql_scaler.go | 42 +++++++++++++-------------- pkg/scalers/postgresql_scaler_test.go | 6 ++-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index 864d3ce9258..24eb25e0c08 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -32,7 +32,7 @@ const ( ) var ( - passwordConnPattern = regexp.MustCompile(`password='([^']*)'`) + passwordConnPattern = regexp.MustCompile(`%PASSWORD%`) ) type postgreSQLScaler struct { @@ -66,12 +66,12 @@ func NewPostgreSQLScaler(ctx context.Context, config *scalersconfig.ScalerConfig logger := InitializeLogger(config, "postgresql_scaler") - meta, podIdentity, err := parsePostgreSQLMetadata(ctx, logger, config) + meta, podIdentity, err := parsePostgreSQLMetadata(logger, config) if err != nil { return nil, fmt.Errorf("error parsing postgreSQL metadata: %w", err) } - conn, err := getConnection(meta, logger) + conn, err := getConnection(ctx, meta, podIdentity, logger) if err != nil { return nil, fmt.Errorf("error establishing postgreSQL connection: %w", err) } @@ -84,7 +84,7 @@ func NewPostgreSQLScaler(ctx context.Context, config *scalersconfig.ScalerConfig }, nil } -func parsePostgreSQLMetadata(ctx context.Context, logger logr.Logger, config *scalersconfig.ScalerConfig) (*postgreSQLMetadata, kedav1alpha1.AuthPodIdentity, error) { +func parsePostgreSQLMetadata(logger logr.Logger, config *scalersconfig.ScalerConfig) (*postgreSQLMetadata, kedav1alpha1.AuthPodIdentity, error) { meta := postgreSQLMetadata{} authPodIdentity := kedav1alpha1.AuthPodIdentity{} @@ -152,13 +152,7 @@ func parsePostgreSQLMetadata(ctx context.Context, logger logr.Logger, config *sc } meta.azureAuthContext.cred = cred - authPodIdentity = kedav1alpha1.AuthPodIdentity{Provider: config.PodIdentity.Provider} - - accessToken, err := getAzureAccessToken(ctx, &meta, azureDatabasePostgresResource) - if err != nil { - return nil, authPodIdentity, err - } - params = append(params, "password="+escapePostgreConnectionParameter(accessToken)) + params = append(params, "%PASSWORD%") meta.connection = strings.Join(params, " ") } meta.triggerIndex = config.TriggerIndex @@ -202,8 +196,20 @@ func buildConnArray(config *scalersconfig.ScalerConfig) ([]string, error) { return params, nil } -func getConnection(meta *postgreSQLMetadata, logger logr.Logger) (*sql.DB, error) { - db, err := sql.Open("pgx", meta.connection) +func getConnection(ctx context.Context, meta *postgreSQLMetadata, podIdentity kedav1alpha1.AuthPodIdentity, logger logr.Logger) (*sql.DB, error) { + connectionString := meta.connection + + switch podIdentity.Provider { + case kedav1alpha1.PodIdentityProviderAzure, kedav1alpha1.PodIdentityProviderAzureWorkload: + accessToken, err := getAzureAccessToken(ctx, meta, azureDatabasePostgresResource) + if err != nil { + return nil, err + } + newPasswordField := "password=" + escapePostgreConnectionParameter(accessToken) + connectionString = passwordConnPattern.ReplaceAllString(meta.connection, newPasswordField) + } + + db, err := sql.Open("pgx", connectionString) if err != nil { logger.Error(err, fmt.Sprintf("Found error opening postgreSQL: %s", err)) return nil, err @@ -233,17 +239,11 @@ func (s *postgreSQLScaler) getActiveNumber(ctx context.Context) (float64, error) switch s.podIdentity.Provider { case kedav1alpha1.PodIdentityProviderAzure, kedav1alpha1.PodIdentityProviderAzureWorkload: if s.metadata.azureAuthContext.token.ExpiresOn.After(time.Now().Add(time.Second * 60)) { - accessToken, err := getAzureAccessToken(ctx, s.metadata, azureDatabasePostgresResource) - if err != nil { - return 0, err - } - newPasswordField := "password="+escapePostgreConnectionParameter(accessToken) - s.metadata.connection = passwordConnPattern.ReplaceAllString(s.metadata.connection, newPasswordField) - - s.connection, err = getConnection(s.metadata, s.logger) + newConnection, err := getConnection(ctx, s.metadata, s.podIdentity, s.logger) if err != nil { return 0, fmt.Errorf("error establishing postgreSQL connection: %w", err) } + s.connection = newConnection } } diff --git a/pkg/scalers/postgresql_scaler_test.go b/pkg/scalers/postgresql_scaler_test.go index ab0cb0fd6a5..ac8622d956e 100644 --- a/pkg/scalers/postgresql_scaler_test.go +++ b/pkg/scalers/postgresql_scaler_test.go @@ -46,7 +46,7 @@ var postgreSQLMetricIdentifiers = []postgreSQLMetricIdentifier{ func TestPosgresSQLGetMetricSpecForScaling(t *testing.T) { for _, testData := range postgreSQLMetricIdentifiers { - meta, _, err := parsePostgreSQLMetadata(context.TODO(), logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadataTestData.metadata, AuthParams: testData.authParam, TriggerIndex: testData.scaleIndex}) + meta, _, err := parsePostgreSQLMetadata(logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadataTestData.metadata, AuthParams: testData.authParam, TriggerIndex: testData.scaleIndex}) if err != nil { t.Fatal("Could not parse metadata:", err) } @@ -80,7 +80,7 @@ var testPostgreSQLConnectionstring = []postgreSQLConnectionStringTestData{ func TestPosgresSQLConnectionStringGeneration(t *testing.T) { for _, testData := range testPostgreSQLConnectionstring { - meta, _, err := parsePostgreSQLMetadata(context.TODO(), logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadata, AuthParams: testData.authParam, TriggerIndex: 0}) + meta, _, err := parsePostgreSQLMetadata(logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadata, AuthParams: testData.authParam, TriggerIndex: 0}) if err != nil { t.Fatal("Could not parse metadata:", err) } @@ -136,7 +136,7 @@ var testPostgresMetadata = []parsePostgresMetadataTestData{ func TestParsePosgresSQLMetadata(t *testing.T) { for _, testData := range testPostgresMetadata { - _, _, err := parsePostgreSQLMetadata(context.TODO(), logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadata, AuthParams: testData.authParams}) + _, _, err := parsePostgreSQLMetadata(logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadata, AuthParams: testData.authParams}) if err != nil && !testData.raisesError { t.Error("Expected success but got error", err) } From 1a4e3722010f108e4f04e19e946f186978ddefc4 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Wed, 13 Mar 2024 21:11:36 +0100 Subject: [PATCH 06/27] add missing authPodIdentity variable Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scalers/postgresql_scaler.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index 24eb25e0c08..430b817e0cd 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -151,6 +151,7 @@ func parsePostgreSQLMetadata(logger logr.Logger, config *scalersconfig.ScalerCon return nil, authPodIdentity, err } meta.azureAuthContext.cred = cred + authPodIdentity = kedav1alpha1.AuthPodIdentity{Provider: config.PodIdentity.Provider} params = append(params, "%PASSWORD%") meta.connection = strings.Join(params, " ") From d3b045628b93847e1b595fee7f785655fecfcf46 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Wed, 13 Mar 2024 22:33:19 +0100 Subject: [PATCH 07/27] lint code using gci write... command Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scalers/postgresql_scaler.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index 430b817e0cd..d4a651ffd60 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -13,7 +13,6 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/go-logr/logr" - // PostreSQL drive required for this scaler _ "github.com/jackc/pgx/v5/stdlib" v2 "k8s.io/api/autoscaling/v2" From 18856088406590c4cc2f355ef064cbabaa706780 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Thu, 14 Mar 2024 20:01:53 +0100 Subject: [PATCH 08/27] lint import + add 2 unite tests Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scalers/postgresql_scaler.go | 3 +-- pkg/scalers/postgresql_scaler_test.go | 38 +++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index d4a651ffd60..f1e27c6dcd3 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -13,8 +13,7 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/go-logr/logr" - // PostreSQL drive required for this scaler - _ "github.com/jackc/pgx/v5/stdlib" + _ "github.com/jackc/pgx/v5/stdlib" // PostreSQL drive required for this scaler v2 "k8s.io/api/autoscaling/v2" "k8s.io/metrics/pkg/apis/external_metrics" diff --git a/pkg/scalers/postgresql_scaler_test.go b/pkg/scalers/postgresql_scaler_test.go index ac8622d956e..3b422934f39 100644 --- a/pkg/scalers/postgresql_scaler_test.go +++ b/pkg/scalers/postgresql_scaler_test.go @@ -91,6 +91,44 @@ func TestPosgresSQLConnectionStringGeneration(t *testing.T) { } } +var testPodIdentityAzureWorkloadPostgreSQLConnectionstring = []postgreSQLConnectionStringTestData{ + // from meta + {metadata: map[string]string{"query": "test_query", "targetQueryValue": "5", "host": "localhost", "port": "1234", "dbName": "testDb", "userName": "user", "sslmode": "required"}, connectionString: "host=localhost port=1234 user=user dbname=testDb sslmode=required %PASSWORD%"}, +} + +func TestPodIdentityAzureWorkloadPosgresSQLConnectionStringGeneration(t *testing.T) { + identityID := "IDENTITY_ID_CORRESPONDING_TO_USERNAME_FIELD" + for _, testData := range testPodIdentityAzureWorkloadPostgreSQLConnectionstring { + meta, _, err := parsePostgreSQLMetadata(logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadata, PodIdentity: kedav1alpha1.AuthPodIdentity{Provider: kedav1alpha1.PodIdentityProviderAzureWorkload, IdentityID: &identityID}, AuthParams: testData.authParam, TriggerIndex: 0}) + if err != nil { + t.Fatal("Could not parse metadata:", err) + } + + if meta.connection != testData.connectionString { + t.Errorf("Error generating connectionString, expected '%s' and get '%s'", testData.connectionString, meta.connection) + } + } +} + +var testPodIdentityAzurePostgreSQLConnectionstring = []postgreSQLConnectionStringTestData{ + // from meta + {metadata: map[string]string{"query": "test_query", "targetQueryValue": "5", "host": "localhost", "port": "1234", "dbName": "testDb", "userName": "user", "sslmode": "required"}, connectionString: "host=localhost port=1234 user=user dbname=testDb sslmode=required %PASSWORD%"}, +} + +func TestPodIdentityAzurePosgresSQLConnectionStringGeneration(t *testing.T) { + identityID := "IDENTITY_ID_CORRESPONDING_TO_USERNAME_FIELD" + for _, testData := range testPodIdentityAzurePostgreSQLConnectionstring { + meta, _, err := parsePostgreSQLMetadata(logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadata, PodIdentity: kedav1alpha1.AuthPodIdentity{Provider: kedav1alpha1.PodIdentityProviderAzure, IdentityID: &identityID}, AuthParams: testData.authParam, TriggerIndex: 0}) + if err != nil { + t.Fatal("Could not parse metadata:", err) + } + + if meta.connection != testData.connectionString { + t.Errorf("Error generating connectionString, expected '%s' and get '%s'", testData.connectionString, meta.connection) + } + } +} + type parsePostgresMetadataTestData struct { metadata map[string]string authParams map[string]string From ce1c2d1214d99ad4c91157f428e25101da65d34f Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Thu, 14 Mar 2024 20:16:49 +0100 Subject: [PATCH 09/27] lint with make fmt Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scalers/postgresql_scaler_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/scalers/postgresql_scaler_test.go b/pkg/scalers/postgresql_scaler_test.go index 3b422934f39..f75e086eb54 100644 --- a/pkg/scalers/postgresql_scaler_test.go +++ b/pkg/scalers/postgresql_scaler_test.go @@ -93,7 +93,7 @@ func TestPosgresSQLConnectionStringGeneration(t *testing.T) { var testPodIdentityAzureWorkloadPostgreSQLConnectionstring = []postgreSQLConnectionStringTestData{ // from meta - {metadata: map[string]string{"query": "test_query", "targetQueryValue": "5", "host": "localhost", "port": "1234", "dbName": "testDb", "userName": "user", "sslmode": "required"}, connectionString: "host=localhost port=1234 user=user dbname=testDb sslmode=required %PASSWORD%"}, + {metadata: map[string]string{"query": "test_query", "targetQueryValue": "5", "host": "localhost", "port": "1234", "dbName": "testDb", "userName": "user", "sslmode": "required"}, connectionString: "host=localhost port=1234 user=user dbname=testDb sslmode=required %PASSWORD%"}, } func TestPodIdentityAzureWorkloadPosgresSQLConnectionStringGeneration(t *testing.T) { @@ -112,7 +112,7 @@ func TestPodIdentityAzureWorkloadPosgresSQLConnectionStringGeneration(t *testing var testPodIdentityAzurePostgreSQLConnectionstring = []postgreSQLConnectionStringTestData{ // from meta - {metadata: map[string]string{"query": "test_query", "targetQueryValue": "5", "host": "localhost", "port": "1234", "dbName": "testDb", "userName": "user", "sslmode": "required"}, connectionString: "host=localhost port=1234 user=user dbname=testDb sslmode=required %PASSWORD%"}, + {metadata: map[string]string{"query": "test_query", "targetQueryValue": "5", "host": "localhost", "port": "1234", "dbName": "testDb", "userName": "user", "sslmode": "required"}, connectionString: "host=localhost port=1234 user=user dbname=testDb sslmode=required %PASSWORD%"}, } func TestPodIdentityAzurePosgresSQLConnectionStringGeneration(t *testing.T) { From 1034b6c593b5711bf9557bb5f12a32f7bb90f03a Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Sun, 19 May 2024 00:23:33 +0200 Subject: [PATCH 10/27] remove podIdentityAzure references (but keep AzureWorkload ones) Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scalers/postgresql_scaler.go | 6 +++--- pkg/scalers/postgresql_scaler_test.go | 19 ------------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index f1e27c6dcd3..9baafada866 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -138,7 +138,7 @@ func parsePostgreSQLMetadata(logger logr.Logger, config *scalersconfig.ScalerCon params = append(params, "password="+escapePostgreConnectionParameter(password)) meta.connection = strings.Join(params, " ") } - case kedav1alpha1.PodIdentityProviderAzure, kedav1alpha1.PodIdentityProviderAzureWorkload: + case kedav1alpha1.PodIdentityProviderAzureWorkload: params, err := buildConnArray(config) if err != nil { return nil, authPodIdentity, fmt.Errorf("failed to parse fields related to the connection") @@ -199,7 +199,7 @@ func getConnection(ctx context.Context, meta *postgreSQLMetadata, podIdentity ke connectionString := meta.connection switch podIdentity.Provider { - case kedav1alpha1.PodIdentityProviderAzure, kedav1alpha1.PodIdentityProviderAzureWorkload: + case kedav1alpha1.PodIdentityProviderAzureWorkload: accessToken, err := getAzureAccessToken(ctx, meta, azureDatabasePostgresResource) if err != nil { return nil, err @@ -236,7 +236,7 @@ func (s *postgreSQLScaler) getActiveNumber(ctx context.Context) (float64, error) // Only one Azure case now but maybe more in the future. switch s.podIdentity.Provider { - case kedav1alpha1.PodIdentityProviderAzure, kedav1alpha1.PodIdentityProviderAzureWorkload: + case kedav1alpha1.PodIdentityProviderAzureWorkload: if s.metadata.azureAuthContext.token.ExpiresOn.After(time.Now().Add(time.Second * 60)) { newConnection, err := getConnection(ctx, s.metadata, s.podIdentity, s.logger) if err != nil { diff --git a/pkg/scalers/postgresql_scaler_test.go b/pkg/scalers/postgresql_scaler_test.go index f75e086eb54..3f79d3a4319 100644 --- a/pkg/scalers/postgresql_scaler_test.go +++ b/pkg/scalers/postgresql_scaler_test.go @@ -110,25 +110,6 @@ func TestPodIdentityAzureWorkloadPosgresSQLConnectionStringGeneration(t *testing } } -var testPodIdentityAzurePostgreSQLConnectionstring = []postgreSQLConnectionStringTestData{ - // from meta - {metadata: map[string]string{"query": "test_query", "targetQueryValue": "5", "host": "localhost", "port": "1234", "dbName": "testDb", "userName": "user", "sslmode": "required"}, connectionString: "host=localhost port=1234 user=user dbname=testDb sslmode=required %PASSWORD%"}, -} - -func TestPodIdentityAzurePosgresSQLConnectionStringGeneration(t *testing.T) { - identityID := "IDENTITY_ID_CORRESPONDING_TO_USERNAME_FIELD" - for _, testData := range testPodIdentityAzurePostgreSQLConnectionstring { - meta, _, err := parsePostgreSQLMetadata(logr.Discard(), &scalersconfig.ScalerConfig{ResolvedEnv: testData.resolvedEnv, TriggerMetadata: testData.metadata, PodIdentity: kedav1alpha1.AuthPodIdentity{Provider: kedav1alpha1.PodIdentityProviderAzure, IdentityID: &identityID}, AuthParams: testData.authParam, TriggerIndex: 0}) - if err != nil { - t.Fatal("Could not parse metadata:", err) - } - - if meta.connection != testData.connectionString { - t.Errorf("Error generating connectionString, expected '%s' and get '%s'", testData.connectionString, meta.connection) - } - } -} - type parsePostgresMetadataTestData struct { metadata map[string]string authParams map[string]string From 5d9bcee933ecdba05174c40b8a6b24400f9a99b7 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Mon, 20 May 2024 01:19:51 +0200 Subject: [PATCH 11/27] replace switch by if statements + fix error when comparing + close connection before recreating it Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scalers/postgresql_scaler.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index 9baafada866..35d7b2c45de 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -198,8 +198,7 @@ func buildConnArray(config *scalersconfig.ScalerConfig) ([]string, error) { func getConnection(ctx context.Context, meta *postgreSQLMetadata, podIdentity kedav1alpha1.AuthPodIdentity, logger logr.Logger) (*sql.DB, error) { connectionString := meta.connection - switch podIdentity.Provider { - case kedav1alpha1.PodIdentityProviderAzureWorkload: + if podIdentity.Provider == kedav1alpha1.PodIdentityProviderAzureWorkload { accessToken, err := getAzureAccessToken(ctx, meta, azureDatabasePostgresResource) if err != nil { return nil, err @@ -235,9 +234,9 @@ func (s *postgreSQLScaler) getActiveNumber(ctx context.Context) (float64, error) var id float64 // Only one Azure case now but maybe more in the future. - switch s.podIdentity.Provider { - case kedav1alpha1.PodIdentityProviderAzureWorkload: - if s.metadata.azureAuthContext.token.ExpiresOn.After(time.Now().Add(time.Second * 60)) { + if s.podIdentity.Provider == kedav1alpha1.PodIdentityProviderAzureWorkload { + if s.metadata.azureAuthContext.token.ExpiresOn.Before(time.Now().Add(time.Second * 60)) { + s.connection.Close() newConnection, err := getConnection(ctx, s.metadata, s.podIdentity, s.logger) if err != nil { return 0, fmt.Errorf("error establishing postgreSQL connection: %w", err) From acd9e2876fea66214d3f62e8c1d1039113401c5d Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Tue, 21 May 2024 12:20:02 +0200 Subject: [PATCH 12/27] generate a new token if the current one has expired + add log info statement Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- pkg/scalers/postgresql_scaler.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index 35d7b2c45de..618fa1492dc 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -235,7 +235,8 @@ func (s *postgreSQLScaler) getActiveNumber(ctx context.Context) (float64, error) // Only one Azure case now but maybe more in the future. if s.podIdentity.Provider == kedav1alpha1.PodIdentityProviderAzureWorkload { - if s.metadata.azureAuthContext.token.ExpiresOn.Before(time.Now().Add(time.Second * 60)) { + if s.metadata.azureAuthContext.token.ExpiresOn.Before(time.Now()) { + s.logger.Info("The Azure Access Token expired, retrieving a new Azure Access Token and instantiating a new Postgres connection object.") s.connection.Close() newConnection, err := getConnection(ctx, s.metadata, s.podIdentity, s.logger) if err != nil { From 239b8e23281bf17d29fea171dde5e0e3c4f047ec Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Thu, 23 May 2024 13:27:57 +0200 Subject: [PATCH 13/27] minor change + add entry in CHANGELOG.md Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- CHANGELOG.md | 1 + pkg/scalers/postgresql_scaler.go | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b999413fae3..a9bc083d65e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,6 +72,7 @@ Here is an overview of all new **experimental** features: - **GCP Scalers**: Added custom time horizon in GCP scalers ([#5778](https://github.com/kedacore/keda/issues/5778)) - **GitHub Scaler**: Fixed pagination, fetching repository list ([#5738](https://github.com/kedacore/keda/issues/5738)) - **Kafka**: Fix logic to scale to zero on invalid offset even with earliest offsetResetPolicy ([#5689](https://github.com/kedacore/keda/issues/5689)) +- **Postgres Scaler**: Add support for access token authentication to an Azure Postgres Flexible Server ([#5823](https://github.com/kedacore/keda/issues/5823)) ### Fixes diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index 618fa1492dc..fd432465fe2 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -233,7 +233,6 @@ func (s *postgreSQLScaler) Close(context.Context) error { func (s *postgreSQLScaler) getActiveNumber(ctx context.Context) (float64, error) { var id float64 - // Only one Azure case now but maybe more in the future. if s.podIdentity.Provider == kedav1alpha1.PodIdentityProviderAzureWorkload { if s.metadata.azureAuthContext.token.ExpiresOn.Before(time.Now()) { s.logger.Info("The Azure Access Token expired, retrieving a new Azure Access Token and instantiating a new Postgres connection object.") From 6fd7dfa6a011fd196af94c0898f908a25b80863a Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Sun, 2 Jun 2024 21:24:53 +0200 Subject: [PATCH 14/27] Add first draft of an e2e test Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- ...zure_postgresql_flex_server_aad_wi_test.go | 226 ++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go diff --git a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go new file mode 100644 index 00000000000..9bb1b4a864a --- /dev/null +++ b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go @@ -0,0 +1,226 @@ +//go:build e2e +// +build e2e + +package postgresql_standalone_test + +import ( + "encoding/base64" + "fmt" + "os" + "testing" + + "github.com/joho/godotenv" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "k8s.io/client-go/kubernetes" + + . "github.com/kedacore/keda/v2/tests/helper" + pg "github.com/kedacore/keda/v2/tests/scalers/postgresql/helper" +) + +// Load environment variables from .env file +var _ = godotenv.Load("../../.env") + +const ( + testName = "azure-postgresql-test" +) + +var ( + testNamespace = fmt.Sprintf("%s-ns", testName) + deploymentName = fmt.Sprintf("%s-deployment", testName) + scaledObjectName = fmt.Sprintf("%s-so", testName) + azureTriggerAuthenticationName = fmt.Sprintf("%s-ta", testName) + secretName = fmt.Sprintf("%s-secret", testName) + secretKey = "postgresql_conn_str" + postgreSQLStatefulSetName = "azure-postgresql" + postgresqlPodName = fmt.Sprintf("%s-0", postgreSQLStatefulSetName) + azurePostgreSQLAdminUsername = os.Getenv("TF_AZURE_POSTGRES_ADMIN_USERNAME") + azurePostgreSQLAdminPassword = os.Getenv("TF_AZURE_POSTGRES_ADMIN_PASSWORD") + azurePostgreSQLFQDN = os.Getenv("TF_AZURE_POSTGRES_FQDN") + azurePostgreSQLDatabase = os.Getenv("TF_AZURE_POSTGRES_DB_NAME") + azureADTenantID = os.Getenv("TF_AZURE_SP_TENANT") + azurePostgreSQLUamiClientID = os.Getenv("TF_AZURE_POSTGRES_IDENTITY_APP_ID") + azurePostgreSQLUamiName = os.Getenv("TF_AZURE_POSTGRES_IDENTITY_NAME") + azurePostgreSQLConnectionString = GetAzureConnectionString(azurePostgreSQLAdminUsername, azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLDatabase) + localPostgreSQLUsername = "test-user" + localPostgreSQLPassword = "test-password" + localPostgreSQLDatabase = "test_db" + minReplicaCount = 0 + maxReplicaCount = 2 +) + +type templateData struct { + TestNamespace string + DeploymentName string + ScaledObjectName string + AzureTriggerAuthenticationName string + SecretName string + SecretKey string + PostgreSQLImage string + PostgreSQLStatefulSetName string + AzurePostgreSQLConnectionStringBase64 string + AzurePostgreSQLAdminUsername string + AzurePostgreSQLAdminPassword string + AzurePostgreSQLFQDN string + AzurePostgreSQLDatabase string + AzurePostgreSQLUamiClientID string + AzurePostgreSQLUamiName string + AzureADTenantID string + PostgreSQLUsername string + PostgreSQLPassword string + PostgreSQLDatabase string + MinReplicaCount int + MaxReplicaCount int +} + +const ( + azureSecretTemplate = `apiVersion: v1 +kind: Secret +metadata: + name: {{.SecretName}} + namespace: {{.TestNamespace}} +type: Opaque +data: + postgresql_conn_str: {{.AzurePostgreSQLConnectionStringBase64}} +` + + azureTriggerAuthTemplate = ` +apiVersion: keda.sh/v1alpha1 +kind: TriggerAuthentication +metadata: + name: {{.TriggerAuthenticationName}} + namespace: {{.TestNamespace}} +spec: + podIdentity: + provider: azure-workload + identityId: {{.AzurePostgreSQLUAMIClientID}} + identityTenantId: {{.AzureADTenantID}} +` + + azureScaledObjectTemplate = `apiVersion: keda.sh/v1alpha1 +kind: ScaledObject +metadata: + name: {{.ScaledObjectName}} + namespace: {{.TestNamespace}} +spec: + scaleTargetRef: + name: {{.DeploymentName}} + pollingInterval: 5 + cooldownPeriod: 10 + minReplicaCount: {{.MinReplicaCount}} + maxReplicaCount: {{.MaxReplicaCount}} + triggers: + - type: postgresql + metadata: + host: {{.AzurePostgreSQLFQDN}} + port: "5432" + userName: {{.AzurePostgreSQLUamiName}} + dbName: {{.AzurePostgreSQLDatabase}} + targetQueryValue: "4" + activationTargetQueryValue: "5" + query: "SELECT CEIL(COUNT(*) / 5) FROM task_instance WHERE state='running' OR state='queued'" + authenticationRef: + name: {{.TriggerAuthenticationName}} +` +) + +func TestPostreSQLScaler(t *testing.T) { + kc := GetKubernetesClient(t) + _, postgreSQLtemplates := getPostgreSQLTemplateData() + _, templates := getTemplateData() + t.Cleanup(func() { + // Delete table on Azure Postgres Flexible server + deleteTableSQL := "DROP TABLE task_instance;" + del_ok, del_out, del_errOut, del_err := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, + fmt.Sprintf("PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c \"%s\"", azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, deleteTableSQL), 60, 3) + require.True(t, del_ok, "executing a command on PostreSQL Pod should work; Output: %s, ErrorOutput: %s, Error: %s", del_out, del_errOut, del_err) + + KubectlDeleteMultipleWithTemplate(t, data, templates) + DeleteKubernetesResources(t, testNamespace, data, postgreSQLtemplates) + }) + + // Create kubernetes resources for PostgreSQL server + CreateKubernetesResources(t, kc, testNamespace, data, postgreSQLtemplates) + + require.True(t, WaitForStatefulsetReplicaReadyCount(t, kc, postgreSQLStatefulSetName, testNamespace, 1, 60, 3), + "replica count should be %d after 3 minutes", 1) + + // Create table on Azure Postgres Flexible server + createTableSQL := "CREATE TABLE task_instance (id serial PRIMARY KEY,state VARCHAR(10));" + ok, out, errOut, err := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, + fmt.Sprintf("PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c \"%s\"", azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, createTableSQL), 60, 3) + require.True(t, ok, "executing a command on PostreSQL Pod should work; Output: %s, ErrorOutput: %s, Error: %s", out, errOut, err) + + // Create kubernetes resources for testing + KubectlApplyMultipleWithTemplate(t, data, templates) + assert.True(t, WaitForDeploymentReplicaReadyCount(t, kc, deploymentName, testNamespace, minReplicaCount, 60, 3), + "replica count should be %d after 3 minutes", minReplicaCount) + + testActivation(t, kc, data) + testScaleOut(t, kc, data) + testScaleIn(t, kc) +} + +func testActivation(t *testing.T, kc *kubernetes.Clientset, data templateData) { + t.Log("--- testing activation ---") + KubectlReplaceWithTemplate(t, data, "lowLevelRecordsJobTemplate", pg.LowLevelRecordsJobTemplate) + + AssertReplicaCountNotChangeDuringTimePeriod(t, kc, deploymentName, testNamespace, minReplicaCount, 60) +} + +func testScaleOut(t *testing.T, kc *kubernetes.Clientset, data templateData) { + t.Log("--- testing scale out ---") + KubectlReplaceWithTemplate(t, data, "insertRecordsJobTemplate", pg.InsertRecordsJobTemplate) + + assert.True(t, WaitForDeploymentReplicaReadyCount(t, kc, deploymentName, testNamespace, maxReplicaCount, 60, 3), + "replica count should be %d after 3 minutes", maxReplicaCount) +} + +func testScaleIn(t *testing.T, kc *kubernetes.Clientset) { + t.Log("--- testing scale in ---") + + assert.True(t, WaitForDeploymentReplicaReadyCount(t, kc, deploymentName, testNamespace, minReplicaCount, 60, 3), + "replica count should be %d after 3 minutes", minReplicaCount) +} + +var data = templateData{ + TestNamespace: testNamespace, + PostgreSQLStatefulSetName: postgreSQLStatefulSetName, + DeploymentName: deploymentName, + ScaledObjectName: scaledObjectName, + MinReplicaCount: minReplicaCount, + MaxReplicaCount: maxReplicaCount, + AzureTriggerAuthenticationName: azureTriggerAuthenticationName, + SecretName: secretName, + SecretKey: secretKey, + PostgreSQLImage: pg.PostgresqlImage, + AzurePostgreSQLAdminUsername: azurePostgreSQLAdminUsername, + AzurePostgreSQLAdminPassword: azurePostgreSQLAdminPassword, + AzurePostgreSQLDatabase: azurePostgreSQLDatabase, + AzureADTenantID: azureADTenantID, + AzurePostgreSQLUamiClientID: azurePostgreSQLUamiClientID, + AzurePostgreSQLUamiName: azurePostgreSQLUamiName, + AzurePostgreSQLConnectionStringBase64: base64.StdEncoding.EncodeToString([]byte(azurePostgreSQLConnectionString)), + PostgreSQLUsername: localPostgreSQLUsername, + PostgreSQLPassword: localPostgreSQLPassword, + PostgreSQLDatabase: localPostgreSQLDatabase, +} + +func getPostgreSQLTemplateData() (templateData, []Template) { + return data, []Template{ + {Name: "postgreSQLStatefulSetTemplate", Config: pg.PostgreSQLStatefulSetTemplate}, + } +} + +func getTemplateData() (templateData, []Template) { + return data, []Template{ + {Name: "azureSecretTemplate", Config: azureSecretTemplate}, + {Name: "deploymentTemplate", Config: pg.DeploymentTemplate}, + {Name: "azureTriggerAuthenticationTemplate", Config: azureTriggerAuthTemplate}, + {Name: "azureScaledObjectTemplate", Config: azureScaledObjectTemplate}, + } +} + +func GetAzureConnectionString(username string, password string, fqdn string, database string) string { + return fmt.Sprintf("postgresql://%s:%s@%s:5432/%s?sslmode=require", username, password, fqdn, database) +} From 9ed7d3973f27c9c4be652d27b5cbd6a8791df86a Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Sun, 2 Jun 2024 21:31:18 +0200 Subject: [PATCH 15/27] Add comment and change package name Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- .../azure_postgresql_flex_server_aad_wi_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go index 9bb1b4a864a..b6107f5c671 100644 --- a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go +++ b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go @@ -1,7 +1,7 @@ //go:build e2e // +build e2e -package postgresql_standalone_test +package azure_postgresql_flex_server_aad_wi_test import ( "encoding/base64" @@ -129,7 +129,7 @@ func TestPostreSQLScaler(t *testing.T) { _, postgreSQLtemplates := getPostgreSQLTemplateData() _, templates := getTemplateData() t.Cleanup(func() { - // Delete table on Azure Postgres Flexible server + // Delete table on remote Azure Postgres Flexible server deleteTableSQL := "DROP TABLE task_instance;" del_ok, del_out, del_errOut, del_err := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, fmt.Sprintf("PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c \"%s\"", azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, deleteTableSQL), 60, 3) @@ -139,13 +139,13 @@ func TestPostreSQLScaler(t *testing.T) { DeleteKubernetesResources(t, testNamespace, data, postgreSQLtemplates) }) - // Create kubernetes resources for PostgreSQL server + // Create kubernetes resources for local PostgreSQL server CreateKubernetesResources(t, kc, testNamespace, data, postgreSQLtemplates) require.True(t, WaitForStatefulsetReplicaReadyCount(t, kc, postgreSQLStatefulSetName, testNamespace, 1, 60, 3), "replica count should be %d after 3 minutes", 1) - // Create table on Azure Postgres Flexible server + // Create table on remote Azure Postgres Flexible server createTableSQL := "CREATE TABLE task_instance (id serial PRIMARY KEY,state VARCHAR(10));" ok, out, errOut, err := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, fmt.Sprintf("PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c \"%s\"", azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, createTableSQL), 60, 3) From 432c28016117c0f11f6a52d6319dd77700379e30 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Mon, 3 Jun 2024 01:52:43 +0200 Subject: [PATCH 16/27] fix golanci lint Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- .../azure_postgresql_flex_server_aad_wi_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go index b6107f5c671..9174a835a2a 100644 --- a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go +++ b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go @@ -131,9 +131,9 @@ func TestPostreSQLScaler(t *testing.T) { t.Cleanup(func() { // Delete table on remote Azure Postgres Flexible server deleteTableSQL := "DROP TABLE task_instance;" - del_ok, del_out, del_errOut, del_err := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, + delOk, delOut, delErrOut, delErr := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, fmt.Sprintf("PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c \"%s\"", azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, deleteTableSQL), 60, 3) - require.True(t, del_ok, "executing a command on PostreSQL Pod should work; Output: %s, ErrorOutput: %s, Error: %s", del_out, del_errOut, del_err) + require.True(t, delOk, "executing a command on PostreSQL Pod should work; Output: %s, ErrorOutput: %s, Error: %s", delOut, delErrOut, delErr) KubectlDeleteMultipleWithTemplate(t, data, templates) DeleteKubernetesResources(t, testNamespace, data, postgreSQLtemplates) From 3783d1cdef77bb6cfaabafb797374b4c0a8812c8 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:10:02 +0200 Subject: [PATCH 17/27] use identity 1 in e2e tests Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- .../azure_postgresql_flex_server_aad_wi_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go index 9174a835a2a..7ab269dae6d 100644 --- a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go +++ b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go @@ -39,8 +39,8 @@ var ( azurePostgreSQLFQDN = os.Getenv("TF_AZURE_POSTGRES_FQDN") azurePostgreSQLDatabase = os.Getenv("TF_AZURE_POSTGRES_DB_NAME") azureADTenantID = os.Getenv("TF_AZURE_SP_TENANT") - azurePostgreSQLUamiClientID = os.Getenv("TF_AZURE_POSTGRES_IDENTITY_APP_ID") - azurePostgreSQLUamiName = os.Getenv("TF_AZURE_POSTGRES_IDENTITY_NAME") + azurePostgreSQLUamiClientID = os.Getenv("TF_AZURE_IDENTITY_1_APP_ID") + azurePostgreSQLUamiName = os.Getenv("TF_AZURE_IDENTITY_1_NAME") azurePostgreSQLConnectionString = GetAzureConnectionString(azurePostgreSQLAdminUsername, azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLDatabase) localPostgreSQLUsername = "test-user" localPostgreSQLPassword = "test-password" From 718d7de6487a3545da26cb9afbcc625ecbd10300 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Sat, 8 Jun 2024 19:15:18 +0200 Subject: [PATCH 18/27] fix e2e tests after testing it + change .env file Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- tests/.env | 8 ++++ ...zure_postgresql_flex_server_aad_wi_test.go | 38 +++++++++++++------ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/tests/.env b/tests/.env index f87c28a3445..6c98721bcf7 100644 --- a/tests/.env +++ b/tests/.env @@ -27,6 +27,14 @@ TF_AZURE_SERVICE_BUS_EVENTGRID_CONNECTION_STRING= TF_AZURE_EVENT_GRID_TOPIC_ENDPOINT= TF_AZURE_EVENT_GRID_TOPIC_KEY= TF_AZURE_SB_EVENT_GRID_RECEIVE_TOPIC= +TF_AZURE_POSTGRES_ADMIN_USERNAME= +TF_AZURE_POSTGRES_ADMIN_PASSWORD= +TF_AZURE_POSTGRES_FQDN= +TF_AZURE_POSTGRES_DB_NAME= +TF_AZURE_SP_TENANT= +TF_AZURE_IDENTITY_1_APP_ID= +TF_AZURE_IDENTITY_1_NAME= +AZURE_RUN_WORKLOAD_IDENTITY_TESTS= AZURE_SP_KEY= TF_AZURE_SP_OBJECT_ID= TF_AZURE_SP_TENANT= diff --git a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go index 7ab269dae6d..1fdefafafdf 100644 --- a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go +++ b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go @@ -29,7 +29,7 @@ var ( testNamespace = fmt.Sprintf("%s-ns", testName) deploymentName = fmt.Sprintf("%s-deployment", testName) scaledObjectName = fmt.Sprintf("%s-so", testName) - azureTriggerAuthenticationName = fmt.Sprintf("%s-ta", testName) + triggerAuthenticationName = fmt.Sprintf("%s-ta", testName) secretName = fmt.Sprintf("%s-secret", testName) secretKey = "postgresql_conn_str" postgreSQLStatefulSetName = "azure-postgresql" @@ -53,7 +53,7 @@ type templateData struct { TestNamespace string DeploymentName string ScaledObjectName string - AzureTriggerAuthenticationName string + TriggerAuthenticationName string SecretName string SecretKey string PostgreSQLImage string @@ -93,11 +93,12 @@ metadata: spec: podIdentity: provider: azure-workload - identityId: {{.AzurePostgreSQLUAMIClientID}} + identityId: {{.AzurePostgreSQLUamiClientID}} identityTenantId: {{.AzureADTenantID}} ` - azureScaledObjectTemplate = `apiVersion: keda.sh/v1alpha1 + azureScaledObjectTemplate = ` +apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: {{.ScaledObjectName}} @@ -112,10 +113,11 @@ spec: triggers: - type: postgresql metadata: - host: {{.AzurePostgreSQLFQDN}} - port: "5432" - userName: {{.AzurePostgreSQLUamiName}} - dbName: {{.AzurePostgreSQLDatabase}} + host: {{.AzurePostgreSQLFQDN}} + port: "5432" + userName: {{.AzurePostgreSQLUamiName}} + dbName: {{.AzurePostgreSQLDatabase}} + sslmode: require targetQueryValue: "4" activationTargetQueryValue: "5" query: "SELECT CEIL(COUNT(*) / 5) FROM task_instance WHERE state='running' OR state='queued'" @@ -130,7 +132,7 @@ func TestPostreSQLScaler(t *testing.T) { _, templates := getTemplateData() t.Cleanup(func() { // Delete table on remote Azure Postgres Flexible server - deleteTableSQL := "DROP TABLE task_instance;" + deleteTableSQL := "DROP TABLE IF EXISTS task_instance;" delOk, delOut, delErrOut, delErr := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, fmt.Sprintf("PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c \"%s\"", azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, deleteTableSQL), 60, 3) require.True(t, delOk, "executing a command on PostreSQL Pod should work; Output: %s, ErrorOutput: %s, Error: %s", delOut, delErrOut, delErr) @@ -145,12 +147,23 @@ func TestPostreSQLScaler(t *testing.T) { require.True(t, WaitForStatefulsetReplicaReadyCount(t, kc, postgreSQLStatefulSetName, testNamespace, 1, 60, 3), "replica count should be %d after 3 minutes", 1) + // Delete table on remote Azure Postgres Flexible server + deleteTableSQL := "DROP TABLE IF EXISTS task_instance;" + delOk, delOut, delErrOut, delErr := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, + fmt.Sprintf("PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c \"%s\"", azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, deleteTableSQL), 60, 3) + require.True(t, delOk, "executing a command on PostreSQL Pod should work; Output: %s, ErrorOutput: %s, Error: %s", delOut, delErrOut, delErr) + // Create table on remote Azure Postgres Flexible server - createTableSQL := "CREATE TABLE task_instance (id serial PRIMARY KEY,state VARCHAR(10));" + createTableSQL := "CREATE TABLE IF NOT EXISTS task_instance (id serial PRIMARY KEY,state VARCHAR(10));" ok, out, errOut, err := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, - fmt.Sprintf("PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c \"%s\"", azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, createTableSQL), 60, 3) + fmt.Sprintf(`PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c "%s"`, azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, createTableSQL), 60, 3) require.True(t, ok, "executing a command on PostreSQL Pod should work; Output: %s, ErrorOutput: %s, Error: %s", out, errOut, err) + grantPrivilegesSQL := fmt.Sprintf(`GRANT ALL ON task_instance TO \"%s\";`, azurePostgreSQLUamiName) + grantOk, grantOut, grantErrOut, grantErr := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, + fmt.Sprintf("PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c \"%v\"", azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, grantPrivilegesSQL), 60, 3) + require.True(t, grantOk, "executing a command on PostreSQL Pod should work; Output: %s, ErrorOutput: %s, Error: %s", grantOut, grantErrOut, grantErr) + // Create kubernetes resources for testing KubectlApplyMultipleWithTemplate(t, data, templates) assert.True(t, WaitForDeploymentReplicaReadyCount(t, kc, deploymentName, testNamespace, minReplicaCount, 60, 3), @@ -190,7 +203,7 @@ var data = templateData{ ScaledObjectName: scaledObjectName, MinReplicaCount: minReplicaCount, MaxReplicaCount: maxReplicaCount, - AzureTriggerAuthenticationName: azureTriggerAuthenticationName, + TriggerAuthenticationName: triggerAuthenticationName, SecretName: secretName, SecretKey: secretKey, PostgreSQLImage: pg.PostgresqlImage, @@ -198,6 +211,7 @@ var data = templateData{ AzurePostgreSQLAdminPassword: azurePostgreSQLAdminPassword, AzurePostgreSQLDatabase: azurePostgreSQLDatabase, AzureADTenantID: azureADTenantID, + AzurePostgreSQLFQDN: azurePostgreSQLFQDN, AzurePostgreSQLUamiClientID: azurePostgreSQLUamiClientID, AzurePostgreSQLUamiName: azurePostgreSQLUamiName, AzurePostgreSQLConnectionStringBase64: base64.StdEncoding.EncodeToString([]byte(azurePostgreSQLConnectionString)), From d0a04559f22d81906ad38d0ad5fabc20314eea11 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Sat, 8 Jun 2024 19:35:00 +0200 Subject: [PATCH 19/27] go fmt Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- .../azure_postgresql_flex_server_aad_wi_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go index 1fdefafafdf..a8a6dd89dbc 100644 --- a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go +++ b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go @@ -152,7 +152,7 @@ func TestPostreSQLScaler(t *testing.T) { delOk, delOut, delErrOut, delErr := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, fmt.Sprintf("PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c \"%s\"", azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, deleteTableSQL), 60, 3) require.True(t, delOk, "executing a command on PostreSQL Pod should work; Output: %s, ErrorOutput: %s, Error: %s", delOut, delErrOut, delErr) - + // Create table on remote Azure Postgres Flexible server createTableSQL := "CREATE TABLE IF NOT EXISTS task_instance (id serial PRIMARY KEY,state VARCHAR(10));" ok, out, errOut, err := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, @@ -211,7 +211,7 @@ var data = templateData{ AzurePostgreSQLAdminPassword: azurePostgreSQLAdminPassword, AzurePostgreSQLDatabase: azurePostgreSQLDatabase, AzureADTenantID: azureADTenantID, - AzurePostgreSQLFQDN: azurePostgreSQLFQDN, + AzurePostgreSQLFQDN: azurePostgreSQLFQDN, AzurePostgreSQLUamiClientID: azurePostgreSQLUamiClientID, AzurePostgreSQLUamiName: azurePostgreSQLUamiName, AzurePostgreSQLConnectionStringBase64: base64.StdEncoding.EncodeToString([]byte(azurePostgreSQLConnectionString)), From 9bc3a6eeeb109732e85813c5e140f7b87f9ad496 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Tue, 11 Jun 2024 01:35:02 +0200 Subject: [PATCH 20/27] remove entries in .env file Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- tests/.env | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/.env b/tests/.env index 6c98721bcf7..f87c28a3445 100644 --- a/tests/.env +++ b/tests/.env @@ -27,14 +27,6 @@ TF_AZURE_SERVICE_BUS_EVENTGRID_CONNECTION_STRING= TF_AZURE_EVENT_GRID_TOPIC_ENDPOINT= TF_AZURE_EVENT_GRID_TOPIC_KEY= TF_AZURE_SB_EVENT_GRID_RECEIVE_TOPIC= -TF_AZURE_POSTGRES_ADMIN_USERNAME= -TF_AZURE_POSTGRES_ADMIN_PASSWORD= -TF_AZURE_POSTGRES_FQDN= -TF_AZURE_POSTGRES_DB_NAME= -TF_AZURE_SP_TENANT= -TF_AZURE_IDENTITY_1_APP_ID= -TF_AZURE_IDENTITY_1_NAME= -AZURE_RUN_WORKLOAD_IDENTITY_TESTS= AZURE_SP_KEY= TF_AZURE_SP_OBJECT_ID= TF_AZURE_SP_TENANT= From 0fb1288fc45d074f4942d81e16b6455eb963c42f Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Sat, 22 Jun 2024 20:46:17 +0200 Subject: [PATCH 21/27] Add Postgres env variables Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- .github/workflows/v1-build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/v1-build.yml b/.github/workflows/v1-build.yml index ea70ec4c36d..0a09aecbeef 100644 --- a/.github/workflows/v1-build.yml +++ b/.github/workflows/v1-build.yml @@ -43,4 +43,8 @@ jobs: TF_AZURE_SP_TENANT: ${{ secrets.TF_AZURE_SP_TENANT }} TF_AZURE_STORAGE_CONNECTION_STRING: ${{ secrets.TF_AZURE_STORAGE_CONNECTION_STRING }} TF_AZURE_LOG_ANALYTICS_WORKSPACE_ID: ${{ secrets.TF_AZURE_LOG_ANALYTICS_WORKSPACE_ID }} + TF_AZURE_POSTGRES_ADMIN_USERNAME: ${{ secrets.TF_AZURE_POSTGRES_ADMIN_USERNAME }} + TF_AZURE_POSTGRES_ADMIN_PASSWORD: ${{ secrets.TF_AZURE_POSTGRES_ADMIN_PASSWORD }} + TF_AZURE_POSTGRES_FQDN: ${{ secrets.TF_AZURE_POSTGRES_FQDN }} + TF_AZURE_POSTGRES_DB_NAME: ${{ secrets.TF_AZURE_POSTGRES_DB_NAME }} run: make e2e-test From 548e6d3e233fc02d6e911489e4ab23a057eb5910 Mon Sep 17 00:00:00 2001 From: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:11:08 +0200 Subject: [PATCH 22/27] remove useless variables Signed-off-by: Ferdinand de Baecque <45566171+Ferdinanddb@users.noreply.github.com> --- .github/workflows/v1-build.yml | 4 ---- .../azure_postgresql_flex_server_aad_wi_test.go | 8 -------- 2 files changed, 12 deletions(-) diff --git a/.github/workflows/v1-build.yml b/.github/workflows/v1-build.yml index 0a09aecbeef..ea70ec4c36d 100644 --- a/.github/workflows/v1-build.yml +++ b/.github/workflows/v1-build.yml @@ -43,8 +43,4 @@ jobs: TF_AZURE_SP_TENANT: ${{ secrets.TF_AZURE_SP_TENANT }} TF_AZURE_STORAGE_CONNECTION_STRING: ${{ secrets.TF_AZURE_STORAGE_CONNECTION_STRING }} TF_AZURE_LOG_ANALYTICS_WORKSPACE_ID: ${{ secrets.TF_AZURE_LOG_ANALYTICS_WORKSPACE_ID }} - TF_AZURE_POSTGRES_ADMIN_USERNAME: ${{ secrets.TF_AZURE_POSTGRES_ADMIN_USERNAME }} - TF_AZURE_POSTGRES_ADMIN_PASSWORD: ${{ secrets.TF_AZURE_POSTGRES_ADMIN_PASSWORD }} - TF_AZURE_POSTGRES_FQDN: ${{ secrets.TF_AZURE_POSTGRES_FQDN }} - TF_AZURE_POSTGRES_DB_NAME: ${{ secrets.TF_AZURE_POSTGRES_DB_NAME }} run: make e2e-test diff --git a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go index a8a6dd89dbc..15599c56cfa 100644 --- a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go +++ b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go @@ -38,8 +38,6 @@ var ( azurePostgreSQLAdminPassword = os.Getenv("TF_AZURE_POSTGRES_ADMIN_PASSWORD") azurePostgreSQLFQDN = os.Getenv("TF_AZURE_POSTGRES_FQDN") azurePostgreSQLDatabase = os.Getenv("TF_AZURE_POSTGRES_DB_NAME") - azureADTenantID = os.Getenv("TF_AZURE_SP_TENANT") - azurePostgreSQLUamiClientID = os.Getenv("TF_AZURE_IDENTITY_1_APP_ID") azurePostgreSQLUamiName = os.Getenv("TF_AZURE_IDENTITY_1_NAME") azurePostgreSQLConnectionString = GetAzureConnectionString(azurePostgreSQLAdminUsername, azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLDatabase) localPostgreSQLUsername = "test-user" @@ -63,9 +61,7 @@ type templateData struct { AzurePostgreSQLAdminPassword string AzurePostgreSQLFQDN string AzurePostgreSQLDatabase string - AzurePostgreSQLUamiClientID string AzurePostgreSQLUamiName string - AzureADTenantID string PostgreSQLUsername string PostgreSQLPassword string PostgreSQLDatabase string @@ -93,8 +89,6 @@ metadata: spec: podIdentity: provider: azure-workload - identityId: {{.AzurePostgreSQLUamiClientID}} - identityTenantId: {{.AzureADTenantID}} ` azureScaledObjectTemplate = ` @@ -210,9 +204,7 @@ var data = templateData{ AzurePostgreSQLAdminUsername: azurePostgreSQLAdminUsername, AzurePostgreSQLAdminPassword: azurePostgreSQLAdminPassword, AzurePostgreSQLDatabase: azurePostgreSQLDatabase, - AzureADTenantID: azureADTenantID, AzurePostgreSQLFQDN: azurePostgreSQLFQDN, - AzurePostgreSQLUamiClientID: azurePostgreSQLUamiClientID, AzurePostgreSQLUamiName: azurePostgreSQLUamiName, AzurePostgreSQLConnectionStringBase64: base64.StdEncoding.EncodeToString([]byte(azurePostgreSQLConnectionString)), PostgreSQLUsername: localPostgreSQLUsername, From 84e9252b09b9a0b6a8ea7325e0e6f393120cacc6 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Date: Wed, 24 Jul 2024 17:51:45 +0200 Subject: [PATCH 23/27] Update e2e test to reset all the task using a query Signed-off-by: Jorge Turrado --- .../azure_postgresql_flex_server_aad_wi_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go index 15599c56cfa..96881680257 100644 --- a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go +++ b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go @@ -186,6 +186,12 @@ func testScaleOut(t *testing.T, kc *kubernetes.Clientset, data templateData) { func testScaleIn(t *testing.T, kc *kubernetes.Clientset) { t.Log("--- testing scale in ---") + // Update all the instances + updateRecords := "UPDATE task_instance SET state = processed;" + ok, out, errOut, err := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, + fmt.Sprintf(`PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c "%s"`, azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, updateRecords), 60, 3) + require.True(t, ok, "executing a command on PostreSQL Pod should work; Output: %s, ErrorOutput: %s, Error: %s", out, errOut, err) + assert.True(t, WaitForDeploymentReplicaReadyCount(t, kc, deploymentName, testNamespace, minReplicaCount, 60, 3), "replica count should be %d after 3 minutes", minReplicaCount) } From ea13133bbf1050284bff8cf8e4e2f3151003d876 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Date: Wed, 24 Jul 2024 18:02:48 +0200 Subject: [PATCH 24/27] missing changes after rebase Signed-off-by: Jorge Turrado --- go.sum | 13 ++++++------- pkg/scalers/postgresql_scaler.go | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/go.sum b/go.sum index c87806ce063..5b72c848fcc 100644 --- a/go.sum +++ b/go.sum @@ -1930,16 +1930,15 @@ github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I= -github.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= -github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= @@ -2023,6 +2022,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jstemmer/go-junit-report/v2 v2.1.0 h1:X3+hPYlSczH9IMIpSC9CQSZA0L+BipYafciZUWHEmsc= +github.com/jstemmer/go-junit-report/v2 v2.1.0/go.mod h1:mgHVr7VUo5Tn8OLVr1cKnLuEy0M92wdRntM99h7RkgQ= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -2074,7 +2075,6 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -2284,7 +2284,6 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= diff --git a/pkg/scalers/postgresql_scaler.go b/pkg/scalers/postgresql_scaler.go index fd432465fe2..f3133cc14ad 100644 --- a/pkg/scalers/postgresql_scaler.go +++ b/pkg/scalers/postgresql_scaler.go @@ -144,7 +144,7 @@ func parsePostgreSQLMetadata(logger logr.Logger, config *scalersconfig.ScalerCon return nil, authPodIdentity, fmt.Errorf("failed to parse fields related to the connection") } - cred, err := azure.NewChainedCredential(logger, config.PodIdentity.GetIdentityID(), config.PodIdentity.GetIdentityTenantID(), config.PodIdentity.Provider) + cred, err := azure.NewChainedCredential(logger, config.PodIdentity) if err != nil { return nil, authPodIdentity, err } From 11333821ab98c85dc4222a4da1d030a9a55f7162 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Wed, 24 Jul 2024 21:34:10 +0200 Subject: [PATCH 25/27] fix typo in the query Signed-off-by: Jorge Turrado Ferrero --- .../azure_postgresql_flex_server_aad_wi_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go index 96881680257..cbf1ff22149 100644 --- a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go +++ b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go @@ -187,7 +187,7 @@ func testScaleIn(t *testing.T, kc *kubernetes.Clientset) { t.Log("--- testing scale in ---") // Update all the instances - updateRecords := "UPDATE task_instance SET state = processed;" + updateRecords := "UPDATE task_instance SET state = 'processed';" ok, out, errOut, err := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, fmt.Sprintf(`PGPASSWORD=%s psql -h %s -p 5432 -U %s -d %s -c "%s"`, azurePostgreSQLAdminPassword, azurePostgreSQLFQDN, azurePostgreSQLAdminUsername, azurePostgreSQLDatabase, updateRecords), 60, 3) require.True(t, ok, "executing a command on PostreSQL Pod should work; Output: %s, ErrorOutput: %s, Error: %s", out, errOut, err) From 130bf5a64ebf4815c9075047e13a08c1d70894dd Mon Sep 17 00:00:00 2001 From: Jorge Turrado Date: Wed, 24 Jul 2024 23:01:19 +0200 Subject: [PATCH 26/27] remove the load Signed-off-by: Jorge Turrado --- .../azure_postgresql_flex_server_aad_wi_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go index cbf1ff22149..846c190d1b6 100644 --- a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go +++ b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go @@ -186,6 +186,12 @@ func testScaleOut(t *testing.T, kc *kubernetes.Clientset, data templateData) { func testScaleIn(t *testing.T, kc *kubernetes.Clientset) { t.Log("--- testing scale in ---") + // As Azure Database is slower than in cluster database (0 latency vs external service) + // we need to remove the load and manually trigger the scaling in condition in the database + + //Remove the load + KubectlDeleteWithTemplate(t, data, "lowLevelRecordsJobTemplate", pg.LowLevelRecordsJobTemplate) + KubectlDeleteWithTemplate(t, data, "insertRecordsJobTemplate", pg.InsertRecordsJobTemplate) // Update all the instances updateRecords := "UPDATE task_instance SET state = 'processed';" ok, out, errOut, err := WaitForSuccessfulExecCommandOnSpecificPod(t, postgresqlPodName, testNamespace, From 21b8e3c466c347a77beff3c3b1c2cdcca78a22b9 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Date: Wed, 24 Jul 2024 23:32:53 +0200 Subject: [PATCH 27/27] fix style Signed-off-by: Jorge Turrado --- .../azure_postgresql_flex_server_aad_wi_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go index 846c190d1b6..0281b337ff2 100644 --- a/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go +++ b/tests/scalers/postgresql/azure_postgresql_flex_server_aad_wi/azure_postgresql_flex_server_aad_wi_test.go @@ -189,7 +189,7 @@ func testScaleIn(t *testing.T, kc *kubernetes.Clientset) { // As Azure Database is slower than in cluster database (0 latency vs external service) // we need to remove the load and manually trigger the scaling in condition in the database - //Remove the load + // Remove the load KubectlDeleteWithTemplate(t, data, "lowLevelRecordsJobTemplate", pg.LowLevelRecordsJobTemplate) KubectlDeleteWithTemplate(t, data, "insertRecordsJobTemplate", pg.InsertRecordsJobTemplate) // Update all the instances