Skip to content

Commit baa3ed6

Browse files
authored
Merge pull request #231 from terraform-providers/fix-#228
Fix #228: Changes to mongodbatlas_database_user.role.collection_name are ignored
2 parents 159449b + 268bef4 commit baa3ed6

File tree

2 files changed

+104
-13
lines changed

2 files changed

+104
-13
lines changed

mongodbatlas/resource_mongodbatlas_database_user.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func resourceMongoDBAtlasDatabaseUser() *schema.Resource {
5454
Default: "NONE",
5555
},
5656
"roles": {
57-
Type: schema.TypeList,
57+
Type: schema.TypeSet,
5858
Optional: true,
5959
Computed: true,
6060
Elem: &schema.Resource{
@@ -286,9 +286,9 @@ func splitDatabaseUserImportID(ID string) (*string, *string, *string, error) {
286286
func expandRoles(d *schema.ResourceData) []matlas.Role {
287287
var roles []matlas.Role
288288
if v, ok := d.GetOk("roles"); ok {
289-
if rs := v.([]interface{}); len(rs) > 0 {
290-
roles = make([]matlas.Role, len(rs))
291-
for k, r := range rs {
289+
if rs := v.(*schema.Set); rs.Len() > 0 {
290+
roles = make([]matlas.Role, rs.Len())
291+
for k, r := range rs.List() {
292292
roleMap := r.(map[string]interface{})
293293
roles[k] = matlas.Role{
294294
RoleName: roleMap["role_name"].(string),
@@ -301,8 +301,8 @@ func expandRoles(d *schema.ResourceData) []matlas.Role {
301301
return roles
302302
}
303303

304-
func flattenRoles(roles []matlas.Role) []map[string]interface{} {
305-
roleList := make([]map[string]interface{}, 0)
304+
func flattenRoles(roles []matlas.Role) []interface{} {
305+
roleList := make([]interface{}, 0)
306306
for _, v := range roles {
307307
roleList = append(roleList, map[string]interface{}{
308308
"role_name": v.RoleName,

mongodbatlas/resource_mongodbatlas_database_user_test.go

+98-7
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ func TestAccResourceMongoDBAtlasDatabaseUser_basic(t *testing.T) {
3333
resource.TestCheckResourceAttr(resourceName, "username", username),
3434
resource.TestCheckResourceAttr(resourceName, "password", "test-acc-password"),
3535
resource.TestCheckResourceAttr(resourceName, "auth_database_name", "admin"),
36-
resource.TestCheckResourceAttr(resourceName, "roles.0.role_name", "atlasAdmin"),
3736
resource.TestCheckResourceAttr(resourceName, "labels.#", "1"),
3837
),
3938
},
@@ -46,7 +45,6 @@ func TestAccResourceMongoDBAtlasDatabaseUser_basic(t *testing.T) {
4645
resource.TestCheckResourceAttr(resourceName, "username", username),
4746
resource.TestCheckResourceAttr(resourceName, "password", "test-acc-password"),
4847
resource.TestCheckResourceAttr(resourceName, "auth_database_name", "admin"),
49-
resource.TestCheckResourceAttr(resourceName, "roles.0.role_name", "read"),
5048
resource.TestCheckResourceAttr(resourceName, "labels.#", "1"),
5149
),
5250
},
@@ -75,7 +73,6 @@ func TestAccResourceMongoDBAtlasDatabaseUser_withX509Type(t *testing.T) {
7573
resource.TestCheckResourceAttr(resourceName, "username", username),
7674
resource.TestCheckResourceAttr(resourceName, "x509_type", "MANAGED"),
7775
resource.TestCheckResourceAttr(resourceName, "auth_database_name", "$external"),
78-
resource.TestCheckResourceAttr(resourceName, "roles.0.role_name", "atlasAdmin"),
7976
resource.TestCheckResourceAttr(resourceName, "labels.#", "1"),
8077
),
8178
},
@@ -104,7 +101,6 @@ func TestAccResourceMongoDBAtlasDatabaseUser_WithLabels(t *testing.T) {
104101
resource.TestCheckResourceAttr(resourceName, "username", username),
105102
resource.TestCheckResourceAttr(resourceName, "password", "test-acc-password"),
106103
resource.TestCheckResourceAttr(resourceName, "auth_database_name", "admin"),
107-
resource.TestCheckResourceAttr(resourceName, "roles.0.role_name", "atlasAdmin"),
108104
resource.TestCheckResourceAttr(resourceName, "labels.#", "0"),
109105
),
110106
},
@@ -128,7 +124,6 @@ func TestAccResourceMongoDBAtlasDatabaseUser_WithLabels(t *testing.T) {
128124
resource.TestCheckResourceAttr(resourceName, "username", username),
129125
resource.TestCheckResourceAttr(resourceName, "password", "test-acc-password"),
130126
resource.TestCheckResourceAttr(resourceName, "auth_database_name", "admin"),
131-
resource.TestCheckResourceAttr(resourceName, "roles.0.role_name", "atlasAdmin"),
132127
resource.TestCheckResourceAttr(resourceName, "labels.#", "2"),
133128
),
134129
},
@@ -156,14 +151,74 @@ func TestAccResourceMongoDBAtlasDatabaseUser_WithLabels(t *testing.T) {
156151
resource.TestCheckResourceAttr(resourceName, "username", username),
157152
resource.TestCheckResourceAttr(resourceName, "password", "test-acc-password"),
158153
resource.TestCheckResourceAttr(resourceName, "auth_database_name", "admin"),
159-
resource.TestCheckResourceAttr(resourceName, "roles.0.role_name", "read"),
160154
resource.TestCheckResourceAttr(resourceName, "labels.#", "3"),
161155
),
162156
},
163157
},
164158
})
165159
}
166160

161+
func TestAccResourceMongoDBAtlasDatabaseUser_withRoles(t *testing.T) {
162+
var dbUser matlas.DatabaseUser
163+
164+
resourceName := "mongodbatlas_database_user.test"
165+
projectID := os.Getenv("MONGODB_ATLAS_PROJECT_ID")
166+
username := acctest.RandomWithPrefix("test-acc-user-")
167+
password := acctest.RandomWithPrefix("test-acc-pass-")
168+
169+
resource.ParallelTest(t, resource.TestCase{
170+
PreCheck: func() { testAccPreCheck(t) },
171+
Providers: testAccProviders,
172+
CheckDestroy: testAccCheckMongoDBAtlasDatabaseUserDestroy,
173+
Steps: []resource.TestStep{
174+
{
175+
Config: testAccMongoDBAtlasDatabaseUserWithRoles(username, password, projectID,
176+
[]*matlas.Role{
177+
{
178+
RoleName: "read",
179+
DatabaseName: "admin",
180+
CollectionName: "stir",
181+
},
182+
{
183+
RoleName: "read",
184+
DatabaseName: "admin",
185+
CollectionName: "unpledged",
186+
},
187+
},
188+
),
189+
Check: resource.ComposeTestCheckFunc(
190+
testAccCheckMongoDBAtlasDatabaseUserExists(resourceName, &dbUser),
191+
testAccCheckMongoDBAtlasDatabaseUserAttributes(&dbUser, username),
192+
resource.TestCheckResourceAttrSet(resourceName, "project_id"),
193+
resource.TestCheckResourceAttr(resourceName, "username", username),
194+
resource.TestCheckResourceAttr(resourceName, "password", password),
195+
resource.TestCheckResourceAttr(resourceName, "auth_database_name", "admin"),
196+
resource.TestCheckResourceAttr(resourceName, "roles.#", "2"),
197+
),
198+
},
199+
{
200+
Config: testAccMongoDBAtlasDatabaseUserWithRoles(username, password, projectID,
201+
[]*matlas.Role{
202+
{
203+
RoleName: "read",
204+
DatabaseName: "admin",
205+
},
206+
},
207+
),
208+
Check: resource.ComposeTestCheckFunc(
209+
testAccCheckMongoDBAtlasDatabaseUserExists(resourceName, &dbUser),
210+
testAccCheckMongoDBAtlasDatabaseUserAttributes(&dbUser, username),
211+
resource.TestCheckResourceAttrSet(resourceName, "project_id"),
212+
resource.TestCheckResourceAttr(resourceName, "username", username),
213+
resource.TestCheckResourceAttr(resourceName, "password", password),
214+
resource.TestCheckResourceAttr(resourceName, "auth_database_name", "admin"),
215+
resource.TestCheckResourceAttr(resourceName, "roles.#", "1"),
216+
),
217+
},
218+
},
219+
})
220+
}
221+
167222
func TestAccResourceMongoDBAtlasDatabaseUser_importBasic(t *testing.T) {
168223
projectID := os.Getenv("MONGODB_ATLAS_PROJECT_ID")
169224

@@ -182,7 +237,6 @@ func TestAccResourceMongoDBAtlasDatabaseUser_importBasic(t *testing.T) {
182237
resource.TestCheckResourceAttr(resourceName, "username", username),
183238
resource.TestCheckResourceAttr(resourceName, "password", "test-acc-password"),
184239
resource.TestCheckResourceAttr(resourceName, "auth_database_name", "admin"),
185-
resource.TestCheckResourceAttr(resourceName, "roles.0.role_name", "read"),
186240
resource.TestCheckResourceAttr(resourceName, "labels.#", "1"),
187241
),
188242
},
@@ -329,3 +383,40 @@ func testAccMongoDBAtlasDatabaseUserWithLabelsConfig(projectID, roleName, userna
329383
}
330384
`, projectID, roleName, username, labelsConf)
331385
}
386+
387+
func testAccMongoDBAtlasDatabaseUserWithRoles(username, password, projectID string, rolesArr []*matlas.Role) string {
388+
var roles string
389+
for _, role := range rolesArr {
390+
var roleName, databaseName, collection string
391+
392+
if role.RoleName != "" {
393+
roleName = fmt.Sprintf(`role_name = "%s"`, role.RoleName)
394+
}
395+
if role.DatabaseName != "" {
396+
databaseName = fmt.Sprintf(`database_name = "%s"`, role.DatabaseName)
397+
}
398+
if role.CollectionName != "" {
399+
collection = fmt.Sprintf(`collection_name = "%s"`, role.CollectionName)
400+
}
401+
402+
roles += fmt.Sprintf(`
403+
roles {
404+
%s
405+
%s
406+
%s
407+
}
408+
`, roleName, databaseName, collection)
409+
}
410+
411+
return fmt.Sprintf(`
412+
resource "mongodbatlas_database_user" "test" {
413+
username = "%s"
414+
password = "%s"
415+
project_id = "%s"
416+
auth_database_name = "admin"
417+
418+
%s
419+
420+
}
421+
`, username, password, projectID, roles)
422+
}

0 commit comments

Comments
 (0)