diff --git a/models/agent_model.go b/models/agent_model.go index cdeef2b0b3..54c79b0027 100644 --- a/models/agent_model.go +++ b/models/agent_model.go @@ -393,7 +393,9 @@ func (s *Agent) DSN(service *Service, dialTimeout time.Duration, database string // between the last host and the question mark (?) that begins the string of options. path := database if database == "" { - path = "/" + // Don't use an empty database because not all MongoDB flavors will set it to the + // default authentication database so, we need to do it manually. + path = "/admin" } if s.TLS { diff --git a/models/agent_model_test.go b/models/agent_model_test.go index 0c85147c45..230045efbc 100644 --- a/models/agent_model_test.go +++ b/models/agent_model_test.go @@ -74,8 +74,8 @@ func TestAgent(t *testing.T) { t.Run("MongoDBNoDatabase", func(t *testing.T) { agent.AgentType = models.MongoDBExporterType - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000", agent.DSN(service, time.Second, "", nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/", agent.DSN(service, 0, "", nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/admin?connectTimeoutMS=1000", agent.DSN(service, time.Second, "", nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/admin", agent.DSN(service, 0, "", nil)) }) }) @@ -152,8 +152,8 @@ func TestAgent(t *testing.T) { agent.MongoDBOptions.TLSCertificateKeyFilePassword = "" agent.MongoDBOptions.AuthenticationMechanism = "" - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, time.Second, "", nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, 0, "", nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/admin?connectTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, time.Second, "", nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/admin?ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, 0, "", nil)) expectedFiles := map[string]string{ "caFilePlaceholder": "cert", "certificateKeyFilePlaceholder": "key", @@ -168,8 +168,8 @@ func TestAgent(t *testing.T) { agent.MongoDBOptions.AuthenticationMechanism = "MONGO-X509" agent.MongoDBOptions.AuthenticationDatabase = "$external" - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?authMechanism=MONGO-X509&authSource=%24external&connectTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, time.Second, "", nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?authMechanism=MONGO-X509&authSource=%24external&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, 0, "", nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/admin?authMechanism=MONGO-X509&authSource=%24external&connectTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, time.Second, "", nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/admin?authMechanism=MONGO-X509&authSource=%24external&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, 0, "", nil)) expectedFiles := map[string]string{ "caFilePlaceholder": "cert", "certificateKeyFilePlaceholder": "key", @@ -207,8 +207,8 @@ func TestAgent(t *testing.T) { t.Run("MongoDBNoDatabase", func(t *testing.T) { agent.AgentType = models.MongoDBExporterType - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&ssl=true&tlsInsecure=true", agent.DSN(service, time.Second, "", nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?ssl=true&tlsInsecure=true", agent.DSN(service, 0, "", nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/admin?connectTimeoutMS=1000&ssl=true&tlsInsecure=true", agent.DSN(service, time.Second, "", nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/admin?ssl=true&tlsInsecure=true", agent.DSN(service, 0, "", nil)) }) }) } diff --git a/services/agents/mongodb_test.go b/services/agents/mongodb_test.go index 7798e18fe1..268559af00 100644 --- a/services/agents/mongodb_test.go +++ b/services/agents/mongodb_test.go @@ -57,7 +57,7 @@ func TestMongodbExporterConfig(t *testing.T) { "--web.listen-address=:{{ .listen_port }}", }, Env: []string{ - "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=1000", + "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/admin?connectTimeoutMS=1000", "HTTP_AUTH=pmm:agent-password", }, RedactWords: []string{"s3cur3 p@$$w0r4.", "agent-password"}, @@ -70,13 +70,13 @@ func TestMongodbExporterConfig(t *testing.T) { t.Run("EmptyPassword", func(t *testing.T) { exporter.Password = nil actual := mongodbExporterConfig(mongodb, exporter, exposeSecrets, pmmAgentVersion) - assert.Equal(t, "MONGODB_URI=mongodb://username@1.2.3.4:27017/?connectTimeoutMS=1000", actual.Env[0]) + assert.Equal(t, "MONGODB_URI=mongodb://username@1.2.3.4:27017/admin?connectTimeoutMS=1000", actual.Env[0]) }) t.Run("EmptyUsername", func(t *testing.T) { exporter.Username = nil actual := mongodbExporterConfig(mongodb, exporter, exposeSecrets, pmmAgentVersion) - assert.Equal(t, "MONGODB_URI=mongodb://1.2.3.4:27017/?connectTimeoutMS=1000", actual.Env[0]) + assert.Equal(t, "MONGODB_URI=mongodb://1.2.3.4:27017/admin?connectTimeoutMS=1000", actual.Env[0]) }) t.Run("SSLEnabled", func(t *testing.T) { exporter.TLS = true @@ -86,7 +86,7 @@ func TestMongodbExporterConfig(t *testing.T) { TLSCa: "content-of-tls-ca", } actual := mongodbExporterConfig(mongodb, exporter, exposeSecrets, pmmAgentVersion) - expected := "MONGODB_URI=mongodb://1.2.3.4:27017/?connectTimeoutMS=1000&ssl=true&" + + expected := "MONGODB_URI=mongodb://1.2.3.4:27017/admin?connectTimeoutMS=1000&ssl=true&" + "tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}&tlsCertificateKeyFilePassword=passwordoftls" assert.Equal(t, expected, actual.Env[0]) expectedFiles := map[string]string{ @@ -163,7 +163,7 @@ func TestNewMongodbExporterConfig(t *testing.T) { "--web.listen-address=:{{ .listen_port }}", }, Env: []string{ - "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/?connectTimeoutMS=1000", + "MONGODB_URI=mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:27017/admin?connectTimeoutMS=1000", "HTTP_AUTH=pmm:agent-id", }, RedactWords: []string{"s3cur3 p@$$w0r4."}, @@ -176,12 +176,12 @@ func TestNewMongodbExporterConfig(t *testing.T) { t.Run("EmptyPassword", func(t *testing.T) { exporter.Password = nil actual := mongodbExporterConfig(mongodb, exporter, exposeSecrets, pmmAgentVersion) - assert.Equal(t, "MONGODB_URI=mongodb://username@1.2.3.4:27017/?connectTimeoutMS=1000", actual.Env[0]) + assert.Equal(t, "MONGODB_URI=mongodb://username@1.2.3.4:27017/admin?connectTimeoutMS=1000", actual.Env[0]) }) t.Run("EmptyUsername", func(t *testing.T) { exporter.Username = nil actual := mongodbExporterConfig(mongodb, exporter, exposeSecrets, pmmAgentVersion) - assert.Equal(t, "MONGODB_URI=mongodb://1.2.3.4:27017/?connectTimeoutMS=1000", actual.Env[0]) + assert.Equal(t, "MONGODB_URI=mongodb://1.2.3.4:27017/admin?connectTimeoutMS=1000", actual.Env[0]) }) }