@@ -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