From 2b2c187aad326a0919af9c3e000c0f2bce95545c Mon Sep 17 00:00:00 2001 From: Carlos Salguero Date: Tue, 17 Aug 2021 08:13:16 -0300 Subject: [PATCH] PMM-8125 Set the default authentication database In the DSN for MongoDB, an empty database will make the connection to fail since the driver is not setting it to the default authentication database. --- models/agent_model.go | 4 +++- models/agent_model_test.go | 16 ++++++++-------- services/agents/mongodb_test.go | 14 +++++++------- 3 files changed, 18 insertions(+), 16 deletions(-) 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]) }) }