From 29a9d588a66d87a3d6df833692437a1e66b7d43e Mon Sep 17 00:00:00 2001 From: Alex Hemard Date: Wed, 17 Apr 2024 12:16:00 -0500 Subject: [PATCH] feat(Cloud Databases): suppress group diff if no change to allocation --- ibm/service/database/resource_ibm_database.go | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/ibm/service/database/resource_ibm_database.go b/ibm/service/database/resource_ibm_database.go index b5fb8e7500f..626d8a37de0 100644 --- a/ibm/service/database/resource_ibm_database.go +++ b/ibm/service/database/resource_ibm_database.go @@ -476,6 +476,7 @@ func ResourceIBMDatabaseInstance() *schema.Resource { "group": { Type: schema.TypeSet, Optional: true, + Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "group_id": { @@ -2961,6 +2962,8 @@ func validateGroupsDiff(_ context.Context, diff *schema.ResourceDiff, meta inter } } + suppressChange := true + // Get default or current group scaling values for _, group := range tfGroups { if group == nil { @@ -2975,6 +2978,8 @@ func validateGroupsDiff(_ context.Context, diff *schema.ResourceDiff, meta inter } } + suppressChange = suppressChange && suppressGroupDiff(group, groupDefaults) + // set current nodeCount nodeCount := groupDefaults.Members.Allocation @@ -3020,11 +3025,50 @@ func validateGroupsDiff(_ context.Context, diff *schema.ResourceDiff, meta inter } } } + + if suppressChange { + oldGroup, _ := diff.GetChange("group") + + log.Printf( + "suppressing change (%v)", oldGroup) + + diff.SetNew("group", oldGroup) + } } return nil } +func suppressGroupDiff(proposed *Group, current *Group) bool { + var currentMemberCount, proposedMemberCount int + + currentMemberCount = current.Members.Allocation + + if proposed.Members != nil { + proposedMemberCount = proposed.Members.Allocation + } else { + proposedMemberCount = currentMemberCount + } + + if currentMemberCount != proposedMemberCount { + return false + } + + if proposed.Memory != nil && current.Memory.Allocation != proposed.Memory.Allocation*proposedMemberCount { + return false + } + + if proposed.Disk != nil && current.Disk.Allocation != proposed.Disk.Allocation*proposedMemberCount { + return false + } + + if proposed.CPU != nil && current.CPU.Allocation != proposed.CPU.Allocation*proposedMemberCount { + return false + } + + return true +} + func getCpuEnforcementRatios(service string, plan string, hostFlavor string, meta interface{}, group interface{}) (err error, cpuEnforcementRatioCeiling int, cpuEnforcementRatioMb int) { var currentGroups []Group defaultList, err := getDefaultScalingGroups(service, plan, hostFlavor, meta)