diff --git a/CHANGELOG.md b/CHANGELOG.md index c1552b4431b..6615f67ed73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -93,6 +93,7 @@ Here is an overview of all new **experimental** features: - **MongoDB Scaler**: MongoDB url parses correctly `+srv` scheme ([#5760](https://github.com/kedacore/keda/issues/5760)) - **New Relic Scaler**: Fix CVE-2024-6104 in github.com/hashicorp/go-retryablehttp ([#5944](https://github.com/kedacore/keda/issues/5944)) - **ScaledJob**: Fix ScaledJob ignores failing trigger(s) error ([#5922](https://github.com/kedacore/keda/issues/5922)) +- **MongoDB Scaler**: MongoDB url parses correctly `+srv` scheme ([#5760](https://github.com/kedacore/keda/issues/5760)) ### Deprecations diff --git a/pkg/scalers/mongo_scaler.go b/pkg/scalers/mongo_scaler.go index f7871c8567e..f30b8fb97ec 100644 --- a/pkg/scalers/mongo_scaler.go +++ b/pkg/scalers/mongo_scaler.go @@ -7,6 +7,7 @@ import ( "net" "net/url" "strconv" + "strings" "time" "github.com/go-logr/logr" @@ -178,11 +179,13 @@ func parseMongoDBMetadata(config *scalersconfig.ScalerConfig) (*mongoDBMetadata, } meta.host = host - port, err := GetFromAuthOrMeta(config, "port") - if err != nil { - return nil, "", err + if !strings.Contains(scheme, "mongodb+srv") { + port, err := GetFromAuthOrMeta(config, "port") + if err != nil { + return nil, "", err + } + meta.port = port } - meta.port = port username, err := GetFromAuthOrMeta(config, "username") if err != nil { @@ -200,14 +203,18 @@ func parseMongoDBMetadata(config *scalersconfig.ScalerConfig) (*mongoDBMetadata, } } - if meta.connectionString != "" { + switch { + case meta.connectionString != "": connStr = meta.connectionString - } else { - // Build connection str + case meta.scheme == "mongodb+srv": + // nosemgrep: db-connection-string + connStr = fmt.Sprintf("%s://%s:%s@%s/%s", meta.scheme, url.QueryEscape(meta.username), url.QueryEscape(meta.password), meta.host, meta.dbName) + default: addr := net.JoinHostPort(meta.host, meta.port) // nosemgrep: db-connection-string connStr = fmt.Sprintf("%s://%s:%s@%s/%s", meta.scheme, url.QueryEscape(meta.username), url.QueryEscape(meta.password), addr, meta.dbName) } + meta.triggerIndex = config.TriggerIndex return &meta, connStr, nil } diff --git a/pkg/scalers/mongo_scaler_test.go b/pkg/scalers/mongo_scaler_test.go index 02f1e9479ef..fd9f54f8337 100644 --- a/pkg/scalers/mongo_scaler_test.go +++ b/pkg/scalers/mongo_scaler_test.go @@ -73,7 +73,7 @@ var testMONGODBMetadata = []parseMongoDBMetadataTestData{ // mongodb srv support { metadata: map[string]string{"query": `{"name":"John"}`, "collection": "demo", "queryValue": "12"}, - authParams: map[string]string{"dbName": "test", "scheme": "mongodb+srv", "host": "localhost", "port": "1234", "username": "sample", "password": "sec@ure"}, + authParams: map[string]string{"dbName": "test", "scheme": "mongodb+srv", "host": "localhost", "port": "", "username": "sample", "password": "sec@ure"}, resolvedEnv: testMongoDBResolvedEnv, raisesError: false, }, @@ -90,7 +90,7 @@ var mongoDBConnectionStringTestDatas = []mongoDBConnectionStringTestData{ {metadataTestData: &testMONGODBMetadata[2], connectionString: "mongodb://mongodb0.example.com:27017"}, {metadataTestData: &testMONGODBMetadata[3], connectionString: "mongodb://sample:test%40password@localhost:1234/test"}, {metadataTestData: &testMONGODBMetadata[4], connectionString: "mongodb://sample:sec%40ure@localhost:1234/test"}, - {metadataTestData: &testMONGODBMetadata[5], connectionString: "mongodb+srv://sample:sec%40ure@localhost:1234/test"}, + {metadataTestData: &testMONGODBMetadata[5], connectionString: "mongodb+srv://sample:sec%40ure@localhost/test"}, } var mongoDBMetricIdentifiers = []mongoDBMetricIdentifier{