alicloud/diff_suppress_funcs.go (691 lines of code) (raw):

package alicloud import ( "encoding/json" "sort" "strconv" "strings" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) func httpHttpsDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if listener_forward, ok := d.GetOk("listener_forward"); ok && listener_forward.(string) == string(OnFlag) { return true } if protocol, ok := d.GetOk("protocol"); ok && (Protocol(protocol.(string)) == Http || Protocol(protocol.(string)) == Https) { return false } return true } func httpDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if protocol, ok := d.GetOk("protocol"); ok && Protocol(protocol.(string)) == Http { return false } return true } func forwardPortDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { httpDiff := httpDiffSuppressFunc(k, old, new, d) if listenerForward, ok := d.GetOk("listener_forward"); !httpDiff && ok && listenerForward.(string) == string(OnFlag) { return false } return true } func httpsDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if protocol, ok := d.GetOk("protocol"); ok && Protocol(protocol.(string)) == Https { return false } return true } func stickySessionTypeDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { httpDiff := httpHttpsDiffSuppressFunc(k, old, new, d) if session, ok := d.GetOk("sticky_session"); !httpDiff && ok && session.(string) == string(OnFlag) { return false } return true } func cookieTimeoutDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { stickSessionTypeDiff := stickySessionTypeDiffSuppressFunc(k, old, new, d) if session_type, ok := d.GetOk("sticky_session_type"); !stickSessionTypeDiff && ok && session_type.(string) == string(InsertStickySessionType) { return false } return true } func cookieDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { stickSessionTypeDiff := stickySessionTypeDiffSuppressFunc(k, old, new, d) if session_type, ok := d.GetOk("sticky_session_type"); !stickSessionTypeDiff && ok && session_type.(string) == string(ServerStickySessionType) { return false } return true } func tcpUdpDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if protocol, ok := d.GetOk("protocol"); ok && (Protocol(protocol.(string)) == Tcp || Protocol(protocol.(string)) == Udp) { return false } return true } func healthCheckDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { httpDiff := httpHttpsDiffSuppressFunc(k, old, new, d) if health, ok := d.GetOk("health_check"); httpDiff || (ok && health.(string) == string(OnFlag)) { return false } return true } func healthCheckTypeDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if protocol, ok := d.GetOk("protocol"); ok && Protocol(protocol.(string)) == Tcp { return false } return true } func establishedTimeoutDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if protocol, ok := d.GetOk("protocol"); ok && Protocol(protocol.(string)) == Tcp { return false } return true } func httpHttpsTcpDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { httpDiff := httpHttpsDiffSuppressFunc(k, old, new, d) health, okHc := d.GetOk("health_check") protocol, okPro := d.GetOk("protocol") checkType, okType := d.GetOk("health_check_type") if (!httpDiff && okHc && health.(string) == string(OnFlag)) || (okPro && Protocol(protocol.(string)) == Tcp && okType && checkType.(string) == string(HTTPHealthCheckType)) { return false } return true } func sslCertificateIdDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if protocol, ok := d.GetOk("protocol"); ok && Protocol(protocol.(string)) == Https { return false } return true } func dnsValueDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { switch d.Get("type") { case "NS", "MX", "CNAME", "SRV": new = strings.TrimSuffix(strings.TrimSpace(new), ".") } return old == new } func dnsPriorityDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { return d.Get("type").(string) != "MX" } func slbAclDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if status, ok := d.GetOk("acl_status"); ok && status.(string) == string(OnFlag) { return false } return true } func slbServerCertificateDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if alicloudCertificateId, ok := d.GetOk("alicloud_certificate_id"); !ok || alicloudCertificateId.(string) == "" { return false } return true } func ecsInternetDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if max, ok := d.GetOk("internet_max_bandwidth_out"); ok && max.(int) > 0 { return false } return true } func csKubernetesMasterPostPaidDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { return d.Get("master_instance_charge_type").(string) == "PostPaid" || !(d.Id() == "") && !d.Get("force_update").(bool) } func csKubernetesWorkerPostPaidDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { return d.Get("worker_instance_charge_type").(string) == "PostPaid" || !(d.Id() == "") && !d.Get("force_update").(bool) } func csNodepoolInstancePostPaidDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("instance_charge_type"); ok && v.(string) == "PostPaid" { return true } return false } func masterDiskPerformanceLevelDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("master_disk_category"); ok && v.(string) != "cloud_essd" { return true } return false } func workerDiskPerformanceLevelDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("worker_disk_category"); ok && v.(string) != "cloud_essd" { return true } return false } func csNodepoolDiskPerformanceLevelDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("system_disk_category"); ok && v.(string) != "cloud_essd" { return true } return false } func csNodepoolSpotInstanceSettingDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("spot_strategy"); ok && v.(string) == "SpotWithPriceLimit" { return false } return true } func csNodepoolScalingPolicyDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if _, ok := d.GetOk("scaling_config"); ok { return false } return true } func logRetentionPeriodDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("enable_backup_log").(bool) { return false } if d.Get("log_backup").(bool) { return false } if v, err := strconv.Atoi(new); err != nil && v > d.Get("backup_retention_period").(int) { return false } if v, err := strconv.Atoi(new); err != nil && v > d.Get("retention_period").(int) { return false } return true } func enableBackupLogDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("enable_backup_log").(bool) { return false } if d.Get("log_backup").(bool) { return false } return true } func archiveBackupPeriodDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("enable_backup_log").(bool) { return false } if d.Get("log_backup").(bool) { return false } if v, err := strconv.Atoi(new); err != nil && v+730 >= d.Get("backup_retention_period").(int) { return false } if v, err := strconv.Atoi(new); err != nil && v+730 >= d.Get("retention_period").(int) { return false } return true } func PostPaidDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { // payment_type is the instance_charge_type's replacement. // If both instance_charge_type and payment_type are "", it means hiding a default "PostPaid" if v, ok := d.GetOk("instance_charge_type"); ok && strings.ToLower(v.(string)) == "prepaid" { return false } if v, ok := d.GetOk("payment_type"); ok && v.(string) == "Subscription" { return false } return true } func ChargeTypeDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { // payment_type is the instance_charge_type's replacement. if _, ok := d.GetOk("payment_type"); ok { return true } return false } func PostPaidAndRenewDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("instance_charge_type"); ok && strings.ToLower(v.(string)) == "prepaid" && d.Get("auto_renew").(bool) { return false } if v, ok := d.GetOk("payment_type"); ok && v.(string) == "Subscription" && d.Get("auto_renew").(bool) { return false } return true } func redisPostPaidDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("payment_type"); ok && v.(string) == "PrePaid" { return false } if v, ok := d.GetOk("instance_charge_type"); ok && v.(string) == "PrePaid" { return false } return true } func redisPostPaidAndRenewDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("payment_type"); ok && v.(string) == "PrePaid" && d.Get("auto_renew").(bool) { return false } if v, ok := d.GetOk("instance_charge_type"); ok && v.(string) == "PrePaid" && d.Get("auto_renew").(bool) { return false } return true } func ramSAMLProviderDiffSuppressFunc(old, new string) bool { if Trim(strings.Replace(old, "\n", "", -1)) != Trim(strings.Replace(new, "\n", "", -1)) { return false } return true } func redisSecurityGroupIdDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { oldArray := strings.Split(old, ",") newArray := strings.Split(new, ",") if len(oldArray) != len(newArray) { return false } sort.Strings(oldArray) sort.Strings(newArray) for i := range newArray { if newArray[i] != oldArray[i] { return false } } return true } func elasticsearchEnablePublicDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOkExists("enable_public"); ok && v.(bool) == true { return false } return true } func elasticsearchEnableKibanaPublicDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOkExists("enable_kibana_public_network"); ok && v.(bool) == true { return false } return true } func elasticsearchEnableKibanaPrivateDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOkExists("enable_kibana_private_network"); ok && v.(bool) == true { return false } return true } func ecsNotAutoRenewDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("instance_charge_type").(string) == "PostPaid" { return true } if RenewalStatus(d.Get("renewal_status").(string)) == RenewAutoRenewal { return false } return true } func polardbPostPaidDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("pay_type").(string) == "PrePaid" { return false } return true } func polardbPostPaidAndRenewDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("pay_type").(string) == "PrePaid" && d.Get("renewal_status").(string) != string(RenewNotRenewal) { return false } return true } func polardbTDEAndEnabledDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("tde_status"); ok && v.(string) == "Enabled" && old != "" && new != "" && old != new { return true } return false } func polardbStorageTypeDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("creation_category"); ok && v.(string) == "SENormal" { if w, ok := d.GetOk("storage_type"); ok && w.(string) == "ESSDAUTOPL" { return false } } return true } func polardbServrelessTypeDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("db_type").(string) == "MySQL" && (d.Get("db_version").(string) == "8.0" || d.Get("db_version").(string) == "5.7") { if d.Get("serverless_type").(string) == "AgileServerless" || (d.Get("serverless_type").(string) == "SteadyServerless" && d.Get("serverless_steady_switch").(string) == "ON") { return false } } else if d.Get("db_type").(string) == "PostgreSQL" && d.Get("db_version").(string) == "14" { if d.Get("serverless_type").(string) == "AgileServerless" { return false } } return true } func polardbProxyClassDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("creation_category"); ok && v.(string) == "SENormal" { return false } return true } func polardbProxyTypeDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("creation_category").(string) == "SENormal" || d.Get("creation_category").(string) == "Normal" { return false } return true } func polardbDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { creationOption, optionOk := d.GetOk("creation_option") if dbType, ok := d.GetOk("db_type"); ok && dbType.(string) == "MySQL" && (creationOption == "Normal" || !optionOk) { return false } return true } func polardbXengineDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { creationOption, optionOk := d.GetOk("creation_option") if dbType, ok := d.GetOk("db_type"); ok && dbType.(string) == "MySQL" && d.Get("db_version").(string) == "8.0" && (creationOption != "CreateGdnStandby" || !optionOk) { return false } return true } func polardbAndCreationDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { creationCategory, categoryOk := d.GetOk("creation_category") if dbType, ok := d.GetOk("db_type"); ok && dbType.(string) == "MySQL" && (creationCategory == "Normal" || creationCategory == "NormalMultimaster" || !categoryOk) { return false } return true } func polardbCompressStorageDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { creationOption, optionOk := d.GetOk("creation_option") if dbType, ok := d.GetOk("db_type"); ok && dbType.(string) == "MySQL" && (creationOption == "Normal" || !optionOk) && d.Get("storage_type").(string) == "PSL4" { return false } return true } func polardbStandbyAzDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { creationOption, optionOk := d.GetOk("creation_option") if (creationOption == "Normal" || !optionOk) && d.Get("hot_standby_cluster").(string) != "OFF" && old != "auto" && new != "auto" { return false } return true } func adbPostPaidAndRenewDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("pay_type"); ok && v.(string) == "PrePaid" && d.Get("renewal_status").(string) != string(RenewNotRenewal) { return false } if v, ok := d.GetOk("payment_type"); ok && v.(string) == "Subscription" && d.Get("renewal_status").(string) != string(RenewNotRenewal) { return false } return true } func adbPostPaidDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("pay_type"); ok && v.(string) == "PrePaid" { return false } if v, ok := d.GetOk("payment_type"); ok && v.(string) == "Subscription" { return false } return true } func ecsSpotStrategyDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { value, ok := d.GetOk("instance_charge_type") if !ok || value == string(PostPaid) { return false } return true } func ecsSpotPriceLimitDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { value, ok := d.GetOk("instance_charge_type") if (!ok || value == "PostPaid") && d.Get("spot_strategy").(string) == "SpotWithPriceLimit" { return false } return true } func ecsSystemDiskPerformanceLevelSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("system_disk_category").(string) == string(DiskCloudESSD) { return false } return true } func ecsSecurityGroupRulePortRangeDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { protocol := d.Get("ip_protocol").(string) if protocol == "tcp" || protocol == "udp" { if new == AllPortRange { return true } return false } if new == AllPortRange { return false } return true } func ecsSecurityGroupRulePreFixListIdDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { _, cidrIpExist := d.GetOk("cidr_ip") _, ipv6CidrIpExist := d.GetOk("ipv6_cidr_ip") _, SourceSecurityGroupIdExist := d.GetOk("source_security_group_id") if cidrIpExist || SourceSecurityGroupIdExist || ipv6CidrIpExist { return true } return false } func vpcTypeResourceDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if len(Trim(d.Get("vswitch_id").(string))) > 0 { return false } return true } func routerInterfaceAcceptsideDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { return d.Get("role").(string) == string(AcceptingSide) } func routerInterfaceVBRTypeDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("role").(string) == string(AcceptingSide) { return true } if d.Get("router_type").(string) == string(VRouter) { return true } return false } func workerDataDiskSizeSuppressFunc(k, old, new string, d *schema.ResourceData) bool { _, ok := d.GetOk("worker_data_disk_category") return !ok || !(d.Id() == "") && !d.Get("force_update").(bool) } func imageIdSuppressFunc(k, old, new string, d *schema.ResourceData) bool { // setting image_id is not recommended, but is needed by some users. // when image_id is left blank, server will set a random default to it, we only know the default value after creation. // we suppress diff here to prevent unintentional force new action. // if we want to change cluster's image_id to default, we have to find out what the default image_id is, // then fill that image_id in this field. return new == "" || !(d.Id() == "") && !d.Get("force_update").(bool) } func esVersionDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { oldVersion := strings.Split(strings.Split(old, "_")[0], ".") newVersion := strings.Split(strings.Split(new, "_")[0], ".") if len(oldVersion) >= 2 && len(newVersion) >= 2 { if oldVersion[0] == newVersion[0] && oldVersion[1] == newVersion[1] { return true } } return false } func vpnSslConnectionsDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if enable_ssl, ok := d.GetOk("enable_ssl"); !ok || !enable_ssl.(bool) { return true } return false } func slbRuleStickySessionTypeDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { listenerSync := slbRuleListenerSyncDiffSuppressFunc(k, old, new, d) if session, ok := d.GetOk("sticky_session"); !listenerSync && ok && session.(string) == string(OnFlag) { return false } return true } func slbRuleCookieTimeoutDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { stickSessionTypeDiff := slbRuleStickySessionTypeDiffSuppressFunc(k, old, new, d) if session_type, ok := d.GetOk("sticky_session_type"); !stickSessionTypeDiff && ok && session_type.(string) == string(InsertStickySessionType) { return false } return true } func slbRuleCookieDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { stickSessionTypeDiff := slbRuleStickySessionTypeDiffSuppressFunc(k, old, new, d) if session_type, ok := d.GetOk("sticky_session_type"); !stickSessionTypeDiff && ok && session_type.(string) == string(ServerStickySessionType) { return false } return true } func slbRuleHealthCheckDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { listenerSync := slbRuleListenerSyncDiffSuppressFunc(k, old, new, d) if health, ok := d.GetOk("health_check"); !listenerSync && ok && health.(string) == string(OnFlag) { return false } return true } func slbRuleListenerSyncDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if listenerSync, ok := d.GetOk("listener_sync"); ok && listenerSync.(string) == string(OffFlag) { return false } return true } func kmsDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("password"); ok && v.(string) != "" { return true } if v, ok := d.GetOk("account_password"); ok && v.(string) != "" { return true } return false } func sagDnatEntryTypeDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("type").(string) != "Intranet" { return true } return false } func sagClientUserPasswordSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("user_name").(string) == "" { return true } return false } func selectdbPostPaidDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.Get("payment_type").(string) == "Subscription" { return false } return true } func cmsClientInfoSuppressFunc(k, old, new string, d *schema.ResourceData) bool { for _, v := range d.Get("escalations_info").([]interface{}) { mapping := v.(map[string]interface{}) if mapping["statistics"] == "" || mapping["comparison_operator"] == "" || mapping["threshold"] == "" || mapping["times"] == "" { return true } } return false } func cmsClientWarnSuppressFunc(k, old, new string, d *schema.ResourceData) bool { for _, v := range d.Get("escalations_warn").([]interface{}) { mapping := v.(map[string]interface{}) if mapping["statistics"] == "" || mapping["comparison_operator"] == "" || mapping["threshold"] == "" || mapping["times"] == "" { return true } } return false } func cmsClientCriticalSuppressFunc(k, old, new string, d *schema.ResourceData) bool { for _, v := range d.Get("escalations_critical").([]interface{}) { mapping := v.(map[string]interface{}) if mapping["statistics"] == "" || mapping["comparison_operator"] == "" || mapping["threshold"] == "" || mapping["times"] == "" { return true } } return false } func alikafkaInstanceConfigDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if new == "" { return true } if old == "" { return false } oldMap := make(map[string]string) err := json.Unmarshal([]byte(old), &oldMap) if err != nil { return false } newMap := make(map[string]string) err = json.Unmarshal([]byte(new), &newMap) if err != nil { return false } // key exist in oldMap && found new value item different with old item for k, newValueItem := range newMap { oldValueItem, ok := oldMap[k] if ok && newValueItem != oldValueItem { return false } } return true } func payTypePostPaidDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { return strings.ToLower(d.Get("pay_type").(string)) == "postpaid" } func engineDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { return strings.ToLower(d.Get("engine").(string)) == "bds" } func whiteIpListDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { oldArray := strings.Split(old, ",") newArray := strings.Split(new, ",") if len(oldArray) != len(newArray) { return false } sort.Strings(oldArray) sort.Strings(newArray) for i := range newArray { if newArray[i] != oldArray[i] { return false } } return true } func sslEnabledDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("ssl_enabled"); ok && v.(int) == 1 { return false } return true } func sslActionDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("ssl_action"); ok && (v.(string) == "Open" || v.(string) == "Update") { return false } return true } func securityIpsDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("security_ips"); ok && len(v.(*schema.Set).List()) > 0 { return false } return true } func kernelVersionDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("upgrade_db_instance_kernel_version"); ok && v.(bool) == true { return false } return true } func kernelSmallVersionDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if d.HasChange("target_minor_version") { if v, ok := d.GetOk("target_minor_version"); ok && v.(string) != "" { return false } } return true } func StorageAutoScaleDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("storage_auto_scale"); ok && strings.ToLower(v.(string)) == "enable" { return false } return true } func CmsAlarmDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if new == "" { return true } if old == "" { return false } if new == old { return false } new = strings.TrimSuffix(strings.TrimPrefix(new, "["), "]") old = strings.TrimSuffix(strings.TrimPrefix(old, "["), "]") var newvlist, oldvlist []string for _, v := range strings.Split(new, "}") { newvlist = append(newvlist, strings.Trim(strings.TrimSpace(v), ",")+"}") } for _, v := range strings.Split(old, "}") { oldvlist = append(oldvlist, strings.Trim(strings.TrimSpace(v), ",")+"}") } sort.Strings(newvlist) sort.Strings(oldvlist) return strings.Join(newvlist, " ") == strings.Join(oldvlist, " ") } func esDataNodeDiskPerformanceLevelDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("data_node_disk_type"); ok && v.(string) != "cloud_essd" { return true } return false } func UpperLowerCaseDiffSuppressFunc(k, old, new string, d *schema.ResourceData) bool { if strings.ToLower(old) == strings.ToLower(new) { return true } return false }