Skip to content

Commit 7eb0bb5

Browse files
authored
fix!: Fix tag_sets to storage_stores.read_preference in mongodbatlas_federated_database_instance (#1440)
1 parent 7e0d8d7 commit 7eb0bb5

10 files changed

+373
-196
lines changed

examples/federated-database-instance/main.tf

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,22 @@ resource "mongodbatlas_federated_database_instance" "test" {
8585
provider = "atlas"
8686
read_preference {
8787
mode = "secondary"
88+
tag_sets {
89+
tags {
90+
name = "environment"
91+
value = "development"
92+
}
93+
tags {
94+
name = "application"
95+
value = "app"
96+
}
97+
}
98+
tag_sets {
99+
tags {
100+
name = "environment1"
101+
value = "development1"
102+
}
103+
}
88104
}
89105
}
90106

mongodbatlas/data_source_mongodbatlas_federated_database_instance.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -283,18 +283,26 @@ func schemaFederatedDatabaseInstanceStoresDataSource() *schema.Schema {
283283
Type: schema.TypeInt,
284284
Computed: true,
285285
},
286-
"tags": {
286+
"tag_sets": {
287287
Type: schema.TypeList,
288288
Computed: true,
289289
Elem: &schema.Resource{
290290
Schema: map[string]*schema.Schema{
291-
"name": {
292-
Type: schema.TypeString,
293-
Computed: true,
294-
},
295-
"value": {
296-
Type: schema.TypeString,
291+
"tags": {
292+
Type: schema.TypeList,
297293
Computed: true,
294+
Elem: &schema.Resource{
295+
Schema: map[string]*schema.Schema{
296+
"name": {
297+
Type: schema.TypeString,
298+
Computed: true,
299+
},
300+
"value": {
301+
Type: schema.TypeString,
302+
Computed: true,
303+
},
304+
},
305+
},
298306
},
299307
},
300308
},

mongodbatlas/data_source_mongodbatlas_federated_database_instance_test.go

Lines changed: 73 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"os"
88
"testing"
99

10-
matlas "go.mongodb.org/atlas/mongodbatlas"
10+
"go.mongodb.org/atlas-sdk/v20230201006/admin"
1111

1212
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
1313
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
@@ -20,7 +20,7 @@ func TestAccDataSourceFederatedDatabaseInstance_basic(t *testing.T) {
2020
orgID = os.Getenv("MONGODB_ATLAS_ORG_ID")
2121
projectName = acctest.RandomWithPrefix("test-acc")
2222
name = acctest.RandomWithPrefix("test-acc")
23-
federatedInstance = matlas.DataFederationInstance{}
23+
federatedInstance = admin.DataLakeTenant{}
2424
)
2525

2626
resource.ParallelTest(t, resource.TestCase{
@@ -41,6 +41,9 @@ func TestAccDataSourceFederatedDatabaseInstance_basic(t *testing.T) {
4141
testAccCheckMongoDBAtlasFederatedDabaseInstanceAttributes(&federatedInstance, name),
4242
resource.TestCheckResourceAttrSet(resourceName, "project_id"),
4343
resource.TestCheckResourceAttr(resourceName, "name", name),
44+
resource.TestCheckResourceAttrSet(resourceName, "storage_stores.0.read_preference.0.tag_sets.#"),
45+
resource.TestCheckResourceAttr(resourceName, "storage_stores.0.read_preference.0.tag_sets.#", "2"),
46+
resource.TestCheckResourceAttr(resourceName, "storage_stores.0.read_preference.0.tag_sets.0.tags.#", "2"),
4447
),
4548
},
4649
},
@@ -58,7 +61,7 @@ func TestAccDataSourceFederatedDatabaseInstance_S3Bucket(t *testing.T) {
5861
roleName = acctest.RandomWithPrefix("test-acc")
5962
testS3Bucket = os.Getenv("AWS_S3_BUCKET")
6063
region = "VIRGINIA_USA"
61-
federatedInstance = matlas.DataFederationInstance{}
64+
federatedInstance = admin.DataLakeTenant{}
6265
)
6366

6467
resource.ParallelTest(t, resource.TestCase{
@@ -85,9 +88,9 @@ func TestAccDataSourceFederatedDatabaseInstance_S3Bucket(t *testing.T) {
8588
})
8689
}
8790

88-
func testAccCheckMongoDBAtlasFederatedDatabaseDataSourceInstanceExists(resourceName string, dataFederatedInstance *matlas.DataFederationInstance) resource.TestCheckFunc {
91+
func testAccCheckMongoDBAtlasFederatedDatabaseDataSourceInstanceExists(resourceName string, dataFederatedInstance *admin.DataLakeTenant) resource.TestCheckFunc {
8992
return func(s *terraform.State) error {
90-
conn := testAccProvider.Meta().(*MongoDBClient).Atlas
93+
connV2 := testAccProvider.Meta().(*MongoDBClient).AtlasV2
9194

9295
rs, ok := s.RootModule().Resources[resourceName]
9396
if !ok {
@@ -100,7 +103,7 @@ func testAccCheckMongoDBAtlasFederatedDatabaseDataSourceInstanceExists(resourceN
100103

101104
ids := decodeStateID(rs.Primary.ID)
102105

103-
if dataLakeResp, _, err := conn.DataFederation.Get(context.Background(), ids["project_id"], ids["name"]); err == nil {
106+
if dataLakeResp, _, err := connV2.DataFederationApi.GetFederatedDatabase(context.Background(), ids["project_id"], ids["name"]).Execute(); err == nil {
104107
*dataFederatedInstance = *dataLakeResp
105108
return nil
106109
}
@@ -109,11 +112,11 @@ func testAccCheckMongoDBAtlasFederatedDatabaseDataSourceInstanceExists(resourceN
109112
}
110113
}
111114

112-
func testAccCheckMongoDBAtlasFederatedDabaseInstanceAttributes(dataFederatedInstance *matlas.DataFederationInstance, name string) resource.TestCheckFunc {
115+
func testAccCheckMongoDBAtlasFederatedDabaseInstanceAttributes(dataFederatedInstance *admin.DataLakeTenant, name string) resource.TestCheckFunc {
113116
return func(s *terraform.State) error {
114-
log.Printf("[DEBUG] difference dataFederatedInstance.Name: %s , username : %s", dataFederatedInstance.Name, name)
115-
if dataFederatedInstance.Name != name {
116-
return fmt.Errorf("bad data federated instance name: %s", dataFederatedInstance.Name)
117+
log.Printf("[DEBUG] difference dataFederatedInstance.Name: %s , username : %s", dataFederatedInstance.GetName(), name)
118+
if dataFederatedInstance.GetName() != name {
119+
return fmt.Errorf("bad data federated instance name: %s", dataFederatedInstance.GetName())
117120
}
118121

119122
return nil
@@ -243,6 +246,26 @@ resource "mongodbatlas_federated_database_instance" "test" {
243246
provider = "atlas"
244247
read_preference {
245248
mode = "secondary"
249+
tag_sets {
250+
tags {
251+
name = "environment0"
252+
value = "development0"
253+
}
254+
tags {
255+
name = "application0"
256+
value = "app0"
257+
}
258+
}
259+
tag_sets {
260+
tags {
261+
name = "environment1"
262+
value = "development1"
263+
}
264+
tags {
265+
name = "application1"
266+
value = "app1"
267+
}
268+
}
246269
}
247270
}
248271
}
@@ -291,6 +314,26 @@ resource "mongodbatlas_federated_database_instance" "test" {
291314
provider = "atlas"
292315
read_preference {
293316
mode = "secondary"
317+
tag_sets {
318+
tags {
319+
name = "environment0"
320+
value = "development0"
321+
}
322+
tags {
323+
name = "application0"
324+
value = "app0"
325+
}
326+
}
327+
tag_sets {
328+
tags {
329+
name = "environment1"
330+
value = "development1"
331+
}
332+
tags {
333+
name = "application1"
334+
value = "app1"
335+
}
336+
}
294337
}
295338
}
296339
@@ -301,6 +344,26 @@ resource "mongodbatlas_federated_database_instance" "test" {
301344
provider = "atlas"
302345
read_preference {
303346
mode = "secondary"
347+
tag_sets {
348+
tags {
349+
name = "environment0"
350+
value = "development0"
351+
}
352+
tags {
353+
name = "application0"
354+
value = "app0"
355+
}
356+
}
357+
tag_sets {
358+
tags {
359+
name = "environment1"
360+
value = "development1"
361+
}
362+
tags {
363+
name = "application1"
364+
value = "app1"
365+
}
366+
}
304367
}
305368
}
306369
}

mongodbatlas/data_source_mongodbatlas_federated_database_instances_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,26 @@ resource "mongodbatlas_federated_database_instance" "test" {
148148
provider = "atlas"
149149
read_preference {
150150
mode = "secondary"
151+
tag_sets {
152+
tags {
153+
name = "environment0"
154+
value = "development0"
155+
}
156+
tags {
157+
name = "application0"
158+
value = "app0"
159+
}
160+
}
161+
tag_sets {
162+
tags {
163+
name = "environment1"
164+
value = "development1"
165+
}
166+
tags {
167+
name = "application1"
168+
value = "app1"
169+
}
170+
}
151171
}
152172
}
153173

mongodbatlas/resource_mongodbatlas_federated_database_instance.go

Lines changed: 79 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -303,18 +303,26 @@ func schemaFederatedDatabaseInstanceStores() *schema.Schema {
303303
Type: schema.TypeInt,
304304
Optional: true,
305305
},
306-
"tags": {
306+
"tag_sets": {
307307
Type: schema.TypeList,
308-
Computed: true,
308+
Optional: true,
309309
Elem: &schema.Resource{
310310
Schema: map[string]*schema.Schema{
311-
"name": {
312-
Type: schema.TypeString,
313-
Optional: true,
314-
},
315-
"value": {
316-
Type: schema.TypeString,
317-
Optional: true,
311+
"tags": {
312+
Type: schema.TypeList,
313+
Required: true,
314+
Elem: &schema.Resource{
315+
Schema: map[string]*schema.Schema{
316+
"name": {
317+
Type: schema.TypeString,
318+
Optional: true,
319+
},
320+
"value": {
321+
Type: schema.TypeString,
322+
Optional: true,
323+
},
324+
},
325+
},
318326
},
319327
},
320328
},
@@ -405,11 +413,18 @@ func resourceMongoDBFederatedDatabaseInstanceUpdate(ctx context.Context, d *sche
405413
projectID := ids["project_id"]
406414
name := ids["name"]
407415

408-
if _, _, err := connV2.DataFederationApi.UpdateFederatedDatabase(ctx, projectID, name, &admin.DataLakeTenant{
416+
dataLakeTenant := &admin.DataLakeTenant{
409417
Name: stringPtr(name),
410418
CloudProviderConfig: newCloudProviderConfig(d),
411419
DataProcessRegion: newDataProcessRegion(d),
412420
Storage: newDataFederationStorage(d),
421+
}
422+
423+
if _, _, err := connV2.DataFederationApi.UpdateFederatedDatabaseWithParams(ctx, &admin.UpdateFederatedDatabaseApiParams{
424+
GroupId: projectID,
425+
TenantName: name,
426+
SkipRoleValidation: admin.PtrBool(false),
427+
DataLakeTenant: dataLakeTenant,
413428
}).Execute(); err != nil {
414429
return diag.FromErr(fmt.Errorf(errorFederatedDatabaseInstanceUpdate, name, err))
415430
}
@@ -564,7 +579,35 @@ func newReadPreference(storeFromConfMap map[string]interface{}) *admin.DataLakeA
564579
return &admin.DataLakeAtlasStoreReadPreference{
565580
Mode: stringPtr(readPreferenceFromConfMap["mode"].(string)),
566581
MaxStalenessSeconds: intPtr(readPreferenceFromConfMap["max_staleness_seconds"].(int)),
582+
TagSets: newTagSets(readPreferenceFromConfMap),
583+
}
584+
}
585+
586+
func newTagSets(readPreferenceFromConfMap map[string]interface{}) [][]admin.DataLakeAtlasStoreReadPreferenceTag {
587+
var res [][]admin.DataLakeAtlasStoreReadPreferenceTag
588+
589+
tagSetsFromConf, ok := readPreferenceFromConfMap["tag_sets"].([]interface{})
590+
if !ok || len(tagSetsFromConf) == 0 {
591+
return nil
592+
}
593+
594+
for ts := 0; ts < len(tagSetsFromConf); ts++ {
595+
tagSetFromConfMap := tagSetsFromConf[ts].(map[string]interface{})
596+
tagsFromConfigMap := tagSetFromConfMap["tags"].([]interface{})
597+
var atlastags []admin.DataLakeAtlasStoreReadPreferenceTag
598+
599+
for t := 0; t < len(tagsFromConfigMap); t++ {
600+
tagFromConfMap := tagsFromConfigMap[t].(map[string]interface{})
601+
602+
atlastags = append(atlastags, admin.DataLakeAtlasStoreReadPreferenceTag{
603+
Name: stringPtr(tagFromConfMap["name"].(string)),
604+
Value: stringPtr(tagFromConfMap["value"].(string)),
605+
})
606+
}
607+
608+
res = append(res, atlastags)
567609
}
610+
return res
568611
}
569612

570613
func newDataFederationDatabase(d *schema.ResourceData) []admin.DataLakeDatabaseInstance {
@@ -822,10 +865,36 @@ func newReadPreferenceField(atlasReadPreference *admin.DataLakeAtlasStoreReadPre
822865
{
823866
"mode": atlasReadPreference.GetMode(),
824867
"max_staleness_seconds": atlasReadPreference.GetMaxStalenessSeconds(),
868+
"tag_sets": flattenTagSets(atlasReadPreference.TagSets),
825869
},
826870
}
827871
}
828872

873+
func flattenTagSets(tagSets [][]admin.DataLakeAtlasStoreReadPreferenceTag) []map[string]interface{} {
874+
tfTagSets := make([]map[string]interface{}, 0)
875+
876+
for i := range tagSets {
877+
tfTagSets = append(tfTagSets, map[string]interface{}{
878+
"tags": flattenTags(tagSets[i]),
879+
})
880+
}
881+
882+
return tfTagSets
883+
}
884+
885+
func flattenTags(tags []admin.DataLakeAtlasStoreReadPreferenceTag) []map[string]interface{} {
886+
tfTags := make([]map[string]interface{}, 0)
887+
888+
for i := range tags {
889+
tfTags = append(tfTags, map[string]interface{}{
890+
"name": tags[i].Name,
891+
"value": tags[i].Value,
892+
})
893+
}
894+
895+
return tfTags
896+
}
897+
829898
func splitDataFederatedInstanceImportID(id string) (projectID, name, s3Bucket string, err error) {
830899
var parts = strings.Split(id, "--")
831900

0 commit comments

Comments
 (0)