Skip to content

Commit fd52aad

Browse files
committed
fix: custom force update function when hashes are different
1 parent 96ec3cc commit fd52aad

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

provider/resource_rediscloud_active_active_database.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ func resourceRedisCloudActiveActiveDatabase() *schema.Resource {
6666
}
6767
}
6868

69+
// Force update when enable_default_user is removed from config
70+
// (Computed fields don't trigger updates when removed, but we need to clear API override)
71+
if diff.Id() != "" { // Only during updates, not creates
72+
if err := forceUpdateWhenEnableDefaultUserRemoved(ctx, diff); err != nil {
73+
return err
74+
}
75+
}
76+
6977
return nil
7078
},
7179

@@ -1265,3 +1273,95 @@ func isEnableDefaultUserInActualPersistedState(d *schema.ResourceData, regionNam
12651273

12661274
return found
12671275
}
1276+
1277+
// forceUpdateWhenEnableDefaultUserRemoved detects when enable_default_user is removed from config
1278+
// and forces an update so the API override can be cleared. This is necessary because Computed fields
1279+
// don't trigger updates when removed from config - Terraform carries forward the old value.
1280+
func forceUpdateWhenEnableDefaultUserRemoved(ctx context.Context, diff *schema.ResourceDiff) error {
1281+
// Get actual config (not the merged diff with Computed fields carried forward)
1282+
rawConfig := diff.GetRawConfig()
1283+
if rawConfig.IsNull() || !rawConfig.IsKnown() {
1284+
return nil
1285+
}
1286+
1287+
// Find regions in CONFIG that don't have enable_default_user
1288+
configRegionsWithoutField := make(map[string]bool)
1289+
1290+
if rawConfig.Type().HasAttribute("override_region") {
1291+
overrideRegions := rawConfig.GetAttr("override_region")
1292+
if !overrideRegions.IsNull() && overrideRegions.IsKnown() {
1293+
iter := overrideRegions.ElementIterator()
1294+
for iter.Next() {
1295+
_, regionVal := iter.Element()
1296+
1297+
if !regionVal.Type().HasAttribute("name") {
1298+
continue
1299+
}
1300+
1301+
regionName := regionVal.GetAttr("name").AsString()
1302+
1303+
// Check if enable_default_user is in config for this region
1304+
hasField := false
1305+
if regionVal.Type().HasAttribute("enable_default_user") {
1306+
fieldAttr := regionVal.GetAttr("enable_default_user")
1307+
if !fieldAttr.IsNull() {
1308+
hasField = true
1309+
}
1310+
}
1311+
1312+
if !hasField {
1313+
configRegionsWithoutField[regionName] = true
1314+
}
1315+
}
1316+
}
1317+
}
1318+
1319+
// Check old state to see which regions HAD the field
1320+
oldOverrideRegion, _ := diff.GetChange("override_region")
1321+
if oldOverrideRegion != nil {
1322+
oldSet := oldOverrideRegion.(*schema.Set)
1323+
for _, oldRegion := range oldSet.List() {
1324+
oldMap := oldRegion.(map[string]interface{})
1325+
regionName := oldMap["name"].(string)
1326+
1327+
_, hadFieldInState := oldMap["enable_default_user"]
1328+
fieldRemovedFromConfig := configRegionsWithoutField[regionName]
1329+
1330+
if hadFieldInState && fieldRemovedFromConfig {
1331+
// Field was in state but removed from config!
1332+
log.Printf("[DEBUG] CustomizeDiff: enable_default_user removed from config for region %s, forcing update", regionName)
1333+
1334+
// Since override_region is not Computed, we can't use SetNewComputed
1335+
// Instead, rebuild the set without the removed field and use SetNew to force a diff
1336+
newRegionSet := make([]interface{}, 0, oldSet.Len())
1337+
for _, region := range oldSet.List() {
1338+
regionMap := region.(map[string]interface{})
1339+
regionName := regionMap["name"].(string)
1340+
1341+
// Create a new map for this region
1342+
newRegionMap := make(map[string]interface{})
1343+
for k, v := range regionMap {
1344+
// Copy all fields except enable_default_user if it should be removed
1345+
if k == "enable_default_user" && configRegionsWithoutField[regionName] {
1346+
// Skip this field - it was removed from config
1347+
continue
1348+
}
1349+
newRegionMap[k] = v
1350+
}
1351+
newRegionSet = append(newRegionSet, newRegionMap)
1352+
}
1353+
1354+
// Set the new value to force Terraform to detect a change
1355+
if err := diff.SetNew("override_region", newRegionSet); err != nil {
1356+
return fmt.Errorf("failed to set new override_region for region %s: %w", regionName, err)
1357+
}
1358+
1359+
log.Printf("[DEBUG] CustomizeDiff: Rebuilt override_region set without enable_default_user for removed regions")
1360+
// Only need to rebuild once for all removals
1361+
break
1362+
}
1363+
}
1364+
}
1365+
1366+
return nil
1367+
}

0 commit comments

Comments
 (0)