func resourceAliyunEssEciScalingConfigurationUpdate()

in alicloud/resource_alicloud_ess_eci_scaling_configuration.go [1425:1909]


func resourceAliyunEssEciScalingConfigurationUpdate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AliyunClient)
	essService := EssService{client}
	d.Partial(true)

	sgId := d.Get("scaling_group_id").(string)
	group, err := essService.DescribeEssScalingGroup(sgId)
	if err != nil {
		return WrapError(err)
	}

	if d.HasChange("active") {
		c, err := essService.DescribeEssEciScalingConfiguration(d.Id())
		if err != nil {
			if NotFoundError(err) {
				d.SetId("")
				return nil
			}
			return WrapError(err)
		}
		if d.Get("active").(bool) {
			if c["LifecycleState"] == string(Inactive) {
				modifyGroupRequest := ess.CreateModifyScalingGroupRequest()
				modifyGroupRequest.ScalingGroupId = sgId
				modifyGroupRequest.ActiveScalingConfigurationId = d.Id()
				_, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) {
					return essClient.ModifyScalingGroup(modifyGroupRequest)
				})
				if err != nil {
					return WrapErrorf(err, DefaultErrorMsg, d.Id(), modifyGroupRequest.GetActionName(), AlibabaCloudSdkGoERROR)
				}
			}
			if group.LifecycleState == string(Inactive) {
				enableGroupRequest := ess.CreateEnableScalingGroupRequest()
				enableGroupRequest.RegionId = client.RegionId
				enableGroupRequest.ScalingGroupId = sgId
				_, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) {
					return essClient.EnableScalingGroup(enableGroupRequest)
				})
				if err != nil {
					return WrapErrorf(err, DefaultErrorMsg, d.Id(), enableGroupRequest.GetActionName(), AlibabaCloudSdkGoERROR)
				}
			}
		}
		d.SetPartial("active")
	}

	request := map[string]interface{}{
		"ScalingConfigurationId": d.Id(),
		"RegionId":               client.RegionId,
	}
	update := false

	if d.HasChange("scaling_configuration_name") {
		update = true
		request["ScalingConfigurationName"] = d.Get("scaling_configuration_name")
	}
	if d.HasChange("description") {
		update = true
		request["Description"] = d.Get("description")
	}
	if d.HasChange("security_group_id") {
		update = true
		request["SecurityGroupId"] = d.Get("security_group_id")
	}
	if d.HasChange("container_group_name") {
		update = true
		request["ContainerGroupName"] = d.Get("container_group_name")
	}
	if d.HasChange("restart_policy") {
		update = true
		request["RestartPolicy"] = d.Get("restart_policy")
	}
	if d.HasChange("cpu") {
		update = true
		request["Cpu"] = d.Get("cpu")
	}
	if d.HasChange("memory") {
		update = true
		request["Memory"] = d.Get("memory")
	}
	if d.HasChange("resource_group_id") {
		update = true
		request["ResourceGroupId"] = d.Get("resource_group_id")
	}
	if d.HasChange("dns_policy") {
		update = true
		request["DnsPolicy"] = d.Get("dns_policy")
	}
	if d.HasChange("cost_optimization") {
		update = true
		request["CostOptimization"] = d.Get("cost_optimization")
	}
	if d.HasChange("enable_sls") {
		update = true
		request["EnableSls"] = d.Get("enable_sls")
	}
	if d.HasChange("image_snapshot_id") {
		update = true
		request["ImageSnapshotId"] = d.Get("image_snapshot_id")
	}
	if d.HasChange("instance_family_level") {
		update = true
		request["InstanceFamilyLevel"] = d.Get("instance_family_level")
	}
	if d.HasChange("ram_role_name") {
		update = true
		request["RamRoleName"] = d.Get("ram_role_name")
	}
	if d.HasChange("termination_grace_period_seconds") {
		update = true
		request["TerminationGracePeriodSeconds"] = d.Get("termination_grace_period_seconds")
	}
	if d.HasChange("auto_match_image_cache") {
		update = true
		request["AutoMatchImageCache"] = d.Get("auto_match_image_cache")
	}
	if d.HasChange("ipv6_address_count") {
		update = true
		request["Ipv6AddressCount"] = d.Get("ipv6_address_count")
	}
	if d.HasChange("cpu_options_core") {
		if v, ok := d.GetOkExists("cpu_options_core"); ok {
			if v != 0 {
				update = true
				request["CpuOptionsCore"] = v
			}
		}
	}
	if d.HasChange("cpu_options_threads_per_core") {
		if v, ok := d.GetOkExists("cpu_options_threads_per_core"); ok {
			if v != 0 {
				update = true
				request["CpuOptionsThreadsPerCore"] = v
			}
		}
	}
	if d.HasChange("active_deadline_seconds") {
		update = true
		v := d.Get("active_deadline_seconds")
		request["ActiveDeadlineSeconds"] = v
	}
	if d.HasChange("spot_strategy") {
		update = true
		request["SpotStrategy"] = d.Get("spot_strategy")
	}
	if d.HasChange("spot_price_limit") {
		update = true
		request["SpotPriceLimit"] = strconv.FormatFloat(d.Get("spot_price_limit").(float64), 'f', 2, 64)
	}
	if d.HasChange("auto_create_eip") {
		update = true
		request["AutoCreateEip"] = d.Get("auto_create_eip")
	}
	if d.HasChange("eip_bandwidth") {
		update = true
		request["EipBandwidth"] = d.Get("eip_bandwidth")
	}
	if d.HasChange("host_name") {
		update = true
		request["HostName"] = d.Get("host_name")
	}
	if d.HasChange("ingress_bandwidth") {
		update = true
		request["IngressBandwidth"] = d.Get("ingress_bandwidth")
	}
	if d.HasChange("egress_bandwidth") {
		update = true
		request["EgressBandwidth"] = d.Get("egress_bandwidth")
	}
	if d.HasChange("ephemeral_storage") {
		update = true
		request["EphemeralStorage"] = d.Get("ephemeral_storage")
	}
	if d.HasChange("load_balancer_weight") {
		update = true
		request["LoadBalancerWeight"] = d.Get("load_balancer_weight")
	}
	if d.HasChange("tags") {
		update = true
		count := 1
		for key, value := range d.Get("tags").(map[string]interface{}) {
			request[fmt.Sprintf("Tag.%d.Key", count)] = key
			request[fmt.Sprintf("Tag.%d.Value", count)] = value
			count++
		}
	}

	if d.HasChange("image_registry_credentials") {
		update = true
		if v, ok := d.GetOk("image_registry_credentials"); ok {
			imageRegisryCredentialMaps := make([]map[string]interface{}, 0)
			for _, raw := range v.(*schema.Set).List() {
				obj := raw.(map[string]interface{})
				imageRegisryCredentialMaps = append(imageRegisryCredentialMaps, map[string]interface{}{
					"Password": obj["password"],
					"Server":   obj["server"],
					"UserName": obj["username"],
				})
			}
			request["ImageRegistryCredential"] = imageRegisryCredentialMaps
		}
	}

	if d.HasChange("dns_config_options") {
		update = true
		if v, ok := d.GetOk("dns_config_options"); ok {
			dnsConfigOptionMaps := make([]map[string]interface{}, 0)
			for _, raw := range v.(*schema.Set).List() {
				obj := raw.(map[string]interface{})
				dnsConfigOptionMaps = append(dnsConfigOptionMaps, map[string]interface{}{
					"Name":  obj["name"],
					"Value": obj["value"],
				})
			}
			request["DnsConfigOption"] = dnsConfigOptionMaps
		}
	}

	if d.HasChange("security_context_sysctls") {
		update = true
		if v, ok := d.GetOk("security_context_sysctls"); ok {
			securityContextSysctlMaps := make([]map[string]interface{}, 0)
			for _, raw := range v.(*schema.Set).List() {
				obj := raw.(map[string]interface{})
				securityContextSysctlMaps = append(securityContextSysctlMaps, map[string]interface{}{
					"Name":  obj["name"],
					"Value": obj["value"],
				})
			}
			request["SecurityContextSysctl"] = securityContextSysctlMaps
		}
	}

	if d.HasChange("acr_registry_infos") {
		update = true
		if v, ok := d.GetOk("acr_registry_infos"); ok {
			acrRegistryInfoMaps := make([]map[string]interface{}, 0)
			for _, raw := range v.(*schema.Set).List() {
				obj := raw.(map[string]interface{})

				acrRegistryInfoMaps = append(acrRegistryInfoMaps, map[string]interface{}{
					"Domain":       expandStringList(obj["domains"].(*schema.Set).List()),
					"InstanceName": obj["instance_name"],
					"InstanceId":   obj["instance_id"],
					"RegionId":     obj["region_id"],
				})
			}
			request["AcrRegistryInfo"] = acrRegistryInfoMaps
		}
	}

	if d.HasChange("containers") {
		update = true
		Containers := make([]map[string]interface{}, len(d.Get("containers").([]interface{})))
		for i, ContainersValue := range d.Get("containers").([]interface{}) {
			ContainersMap := ContainersValue.(map[string]interface{})
			Containers[i] = make(map[string]interface{})
			Containers[i]["SecurityContext.Capability.Add"] = ContainersMap["security_context_capability_adds"]
			Containers[i]["LifecyclePreStopHandlerExec"] = ContainersMap["lifecycle_pre_stop_handler_execs"]
			Containers[i]["SecurityContext.ReadOnlyRootFilesystem"] = ContainersMap["security_context_read_only_root_file_system"]
			Containers[i]["Tty"] = ContainersMap["tty"]
			Containers[i]["Stdin"] = ContainersMap["stdin"]
			Containers[i]["SecurityContext.RunAsUser"] = ContainersMap["security_context_run_as_user"]
			Containers[i]["WorkingDir"] = ContainersMap["working_dir"]
			Containers[i]["Arg"] = ContainersMap["args"]
			Containers[i]["Cpu"] = ContainersMap["cpu"]
			Containers[i]["Gpu"] = ContainersMap["gpu"]
			Containers[i]["Memory"] = ContainersMap["memory"]
			Containers[i]["Name"] = ContainersMap["name"]
			Containers[i]["Image"] = ContainersMap["image"]
			Containers[i]["ImagePullPolicy"] = ContainersMap["image_pull_policy"]
			Containers[i]["Command"] = ContainersMap["commands"]

			Containers[i]["ReadinessProbe.Exec.Command"] = ContainersMap["readiness_probe_exec_commands"]
			if ContainersMap["readiness_probe_period_seconds"] != nil && ContainersMap["readiness_probe_period_seconds"] != 0 {
				Containers[i]["ReadinessProbe.PeriodSeconds"] = ContainersMap["readiness_probe_period_seconds"]
			}
			Containers[i]["ReadinessProbe.HttpGet.Path"] = ContainersMap["readiness_probe_http_get_path"]
			if ContainersMap["readiness_probe_failure_threshold"] != 0 {
				Containers[i]["ReadinessProbe.FailureThreshold"] = ContainersMap["readiness_probe_failure_threshold"]
			}
			if ContainersMap["readiness_probe_initial_delay_seconds"] != 0 {
				Containers[i]["ReadinessProbe.InitialDelaySeconds"] = ContainersMap["readiness_probe_initial_delay_seconds"]
			}
			if ContainersMap["readiness_probe_http_get_port"] != 0 {
				Containers[i]["ReadinessProbe.HttpGet.Port"] = ContainersMap["readiness_probe_http_get_port"]
			}
			Containers[i]["ReadinessProbe.HttpGet.Scheme"] = ContainersMap["readiness_probe_http_get_scheme"]
			if ContainersMap["readiness_probe_tcp_socket_port"] != 0 {
				Containers[i]["ReadinessProbe.TcpSocket.Port"] = ContainersMap["readiness_probe_tcp_socket_port"]
			}
			if ContainersMap["readiness_probe_success_threshold"] != nil && ContainersMap["readiness_probe_success_threshold"] != 0 {
				Containers[i]["ReadinessProbe.SuccessThreshold"] = ContainersMap["readiness_probe_success_threshold"]
			}
			if ContainersMap["readiness_probe_timeout_seconds"] != nil && ContainersMap["readiness_probe_timeout_seconds"] != 0 {
				Containers[i]["ReadinessProbe.TimeoutSeconds"] = ContainersMap["readiness_probe_timeout_seconds"]
			}

			Containers[i]["LivenessProbe.Exec.Command"] = ContainersMap["liveness_probe_exec_commands"]
			if ContainersMap["liveness_probe_period_seconds"] != nil && ContainersMap["liveness_probe_period_seconds"] != 0 {
				Containers[i]["LivenessProbe.PeriodSeconds"] = ContainersMap["liveness_probe_period_seconds"]
			}
			Containers[i]["LivenessProbe.HttpGet.Path"] = ContainersMap["liveness_probe_http_get_path"]
			if ContainersMap["liveness_probe_failure_threshold"] != 0 {
				Containers[i]["LivenessProbe.FailureThreshold"] = ContainersMap["liveness_probe_failure_threshold"]
			}
			if ContainersMap["liveness_probe_initial_delay_seconds"] != 0 {
				Containers[i]["LivenessProbe.InitialDelaySeconds"] = ContainersMap["liveness_probe_initial_delay_seconds"]
			}
			if ContainersMap["liveness_probe_http_get_port"] != 0 {
				Containers[i]["LivenessProbe.HttpGet.Port"] = ContainersMap["liveness_probe_http_get_port"]
			}
			Containers[i]["LivenessProbe.HttpGet.Scheme"] = ContainersMap["liveness_probe_http_get_scheme"]
			if ContainersMap["liveness_probe_tcp_socket_port"] != 0 {
				Containers[i]["LivenessProbe.TcpSocket.Port"] = ContainersMap["liveness_probe_tcp_socket_port"]
			}
			if ContainersMap["liveness_probe_success_threshold"] != nil && ContainersMap["liveness_probe_success_threshold"] != 0 {
				Containers[i]["LivenessProbe.SuccessThreshold"] = ContainersMap["liveness_probe_success_threshold"]
			}
			if ContainersMap["liveness_probe_timeout_seconds"] != nil && ContainersMap["liveness_probe_timeout_seconds"] != 0 {
				Containers[i]["LivenessProbe.TimeoutSeconds"] = ContainersMap["liveness_probe_timeout_seconds"]
			}

			EnvironmentVars := make([]map[string]interface{}, len(ContainersMap["environment_vars"].(*schema.Set).List()))
			for i, EnvironmentVarsValue := range ContainersMap["environment_vars"].(*schema.Set).List() {
				EnvironmentVarsMap := EnvironmentVarsValue.(map[string]interface{})
				EnvironmentVars[i] = make(map[string]interface{})
				EnvironmentVars[i]["Key"] = EnvironmentVarsMap["key"]
				EnvironmentVars[i]["Value"] = EnvironmentVarsMap["value"]
				EnvironmentVars[i]["FieldRef.FieldPath"] = EnvironmentVarsMap["field_ref_field_path"]
			}
			Containers[i]["EnvironmentVar"] = EnvironmentVars

			Ports := make([]map[string]interface{}, len(ContainersMap["ports"].(*schema.Set).List()))
			for i, PortsValue := range ContainersMap["ports"].(*schema.Set).List() {
				PortsMap := PortsValue.(map[string]interface{})
				Ports[i] = make(map[string]interface{})
				Ports[i]["Port"] = PortsMap["port"]
				Ports[i]["Protocol"] = PortsMap["protocol"]
			}
			Containers[i]["Port"] = Ports

			VolumeMounts := make([]map[string]interface{}, len(ContainersMap["volume_mounts"].(*schema.Set).List()))
			for i, VolumeMountsValue := range ContainersMap["volume_mounts"].(*schema.Set).List() {
				VolumeMountsMap := VolumeMountsValue.(map[string]interface{})
				VolumeMounts[i] = make(map[string]interface{})
				VolumeMounts[i]["MountPath"] = VolumeMountsMap["mount_path"]
				VolumeMounts[i]["Name"] = VolumeMountsMap["name"]
				VolumeMounts[i]["ReadOnly"] = VolumeMountsMap["read_only"]
				VolumeMounts[i]["SubPath"] = VolumeMountsMap["sub_path"]
				if VolumeMountsMap["mount_propagation"] != nil && VolumeMountsMap["mount_propagation"] != "" {
					VolumeMounts[i]["MountPropagation"] = VolumeMountsMap["mount_propagation"]
				}
			}
			Containers[i]["VolumeMount"] = VolumeMounts
		}
		request["Container"] = Containers
	}

	if d.HasChange("init_containers") {
		update = true
		InitContainers := make([]map[string]interface{}, len(d.Get("init_containers").([]interface{})))
		for i, InitContainersValue := range d.Get("init_containers").([]interface{}) {
			InitContainersMap := InitContainersValue.(map[string]interface{})
			InitContainers[i] = make(map[string]interface{})
			InitContainers[i]["WorkingDir"] = InitContainersMap["working_dir"]
			InitContainers[i]["Arg"] = InitContainersMap["args"]
			InitContainers[i]["Cpu"] = InitContainersMap["cpu"]
			InitContainers[i]["Gpu"] = InitContainersMap["gpu"]
			InitContainers[i]["Memory"] = InitContainersMap["memory"]
			InitContainers[i]["Name"] = InitContainersMap["name"]
			InitContainers[i]["Image"] = InitContainersMap["image"]
			InitContainers[i]["ImagePullPolicy"] = InitContainersMap["image_pull_policy"]
			InitContainers[i]["Command"] = InitContainersMap["commands"]
			InitContainers[i]["SecurityContext.Capability.Add"] = InitContainersMap["security_context_capability_adds"]
			InitContainers[i]["SecurityContext.ReadOnlyRootFilesystem"] = InitContainersMap["security_context_read_only_root_file_system"]
			InitContainers[i]["SecurityContext.RunAsUser"] = InitContainersMap["security_context_run_as_user"]

			EnvironmentVars := make([]map[string]interface{}, len(InitContainersMap["environment_vars"].(*schema.Set).List()))
			for i, EnvironmentVarsValue := range InitContainersMap["environment_vars"].(*schema.Set).List() {
				EnvironmentVarsMap := EnvironmentVarsValue.(map[string]interface{})
				EnvironmentVars[i] = make(map[string]interface{})
				EnvironmentVars[i]["Key"] = EnvironmentVarsMap["key"]
				EnvironmentVars[i]["Value"] = EnvironmentVarsMap["value"]
				EnvironmentVars[i]["FieldRef.FieldPath"] = EnvironmentVarsMap["field_ref_field_path"]
			}
			InitContainers[i]["InitContainerEnvironmentVar"] = EnvironmentVars

			Ports := make([]map[string]interface{}, len(InitContainersMap["ports"].(*schema.Set).List()))
			for i, PortsValue := range InitContainersMap["ports"].(*schema.Set).List() {
				PortsMap := PortsValue.(map[string]interface{})
				Ports[i] = make(map[string]interface{})
				Ports[i]["Port"] = PortsMap["port"]
				Ports[i]["Protocol"] = PortsMap["protocol"]
			}
			InitContainers[i]["InitContainerPort"] = Ports

			VolumeMounts := make([]map[string]interface{}, len(InitContainersMap["volume_mounts"].(*schema.Set).List()))
			for i, VolumeMountsValue := range InitContainersMap["volume_mounts"].(*schema.Set).List() {
				VolumeMountsMap := VolumeMountsValue.(map[string]interface{})
				VolumeMounts[i] = make(map[string]interface{})
				VolumeMounts[i]["MountPath"] = VolumeMountsMap["mount_path"]
				VolumeMounts[i]["Name"] = VolumeMountsMap["name"]
				VolumeMounts[i]["ReadOnly"] = VolumeMountsMap["read_only"]
				VolumeMounts[i]["SubPath"] = VolumeMountsMap["sub_path"]
				if VolumeMountsMap["mount_propagation"] != nil && VolumeMountsMap["mount_propagation"] != "" {
					VolumeMounts[i]["MountPropagation"] = VolumeMountsMap["mount_propagation"]
				}
			}
			InitContainers[i]["InitContainerVolumeMount"] = VolumeMounts
		}
		request["InitContainer"] = InitContainers
	}

	if d.HasChange("volumes") {
		update = true
		Volumes := make([]map[string]interface{}, len(d.Get("volumes").(*schema.Set).List()))
		for i, VolumesValue := range d.Get("volumes").(*schema.Set).List() {
			VolumesMap := VolumesValue.(map[string]interface{})
			Volumes[i] = make(map[string]interface{})
			ConfigFileVolumeConfigFileToPaths := make([]map[string]interface{}, len(VolumesMap["config_file_volume_config_file_to_paths"].(*schema.Set).List()))
			for i, ConfigFileVolumeConfigFileToPathsValue := range VolumesMap["config_file_volume_config_file_to_paths"].(*schema.Set).List() {
				ConfigFileVolumeConfigFileToPathsMap := ConfigFileVolumeConfigFileToPathsValue.(map[string]interface{})
				ConfigFileVolumeConfigFileToPaths[i] = make(map[string]interface{})
				ConfigFileVolumeConfigFileToPaths[i]["Content"] = ConfigFileVolumeConfigFileToPathsMap["content"]
				ConfigFileVolumeConfigFileToPaths[i]["Path"] = ConfigFileVolumeConfigFileToPathsMap["path"]
				if ConfigFileVolumeConfigFileToPathsMap["mode"] != nil && ConfigFileVolumeConfigFileToPathsMap["mode"] != 0 {
					ConfigFileVolumeConfigFileToPaths[i]["Mode"] = ConfigFileVolumeConfigFileToPathsMap["mode"]
				}
			}
			Volumes[i]["ConfigFileVolumeConfigFileToPath"] = ConfigFileVolumeConfigFileToPaths
			Volumes[i]["DiskVolume.DiskId"] = VolumesMap["disk_volume_disk_id"]
			Volumes[i]["HostPathVolume.Type"] = VolumesMap["host_path_volume_type"]
			Volumes[i]["EmptyDirVolume.SizeLimit"] = VolumesMap["empty_dir_volume_size_limit"]
			Volumes[i]["EmptyDirVolume.Medium"] = VolumesMap["empty_dir_volume_medium"]
			Volumes[i]["HostPathVolume.Path"] = VolumesMap["host_path_volume_path"]
			if VolumesMap["config_file_volume_default_mode"] != nil && VolumesMap["config_file_volume_default_mode"] != 0 {
				Volumes[i]["ConfigFileVolumeDefaultMode"] = VolumesMap["config_file_volume_default_mode"]
			}
			Volumes[i]["DiskVolume.FsType"] = VolumesMap["disk_volume_fs_type"]
			Volumes[i]["DiskVolume.DiskSize"] = VolumesMap["disk_volume_disk_size"]
			Volumes[i]["FlexVolume.Driver"] = VolumesMap["flex_volume_driver"]
			Volumes[i]["FlexVolume.FsType"] = VolumesMap["flex_volume_fs_type"]
			Volumes[i]["FlexVolume.Options"] = VolumesMap["flex_volume_options"]
			Volumes[i]["NFSVolume.Path"] = VolumesMap["nfs_volume_path"]
			Volumes[i]["NFSVolume.Server"] = VolumesMap["nfs_volume_server"]
			Volumes[i]["NFSVolume.ReadOnly"] = VolumesMap["nfs_volume_read_only"]
			Volumes[i]["Name"] = VolumesMap["name"]
			Volumes[i]["Type"] = VolumesMap["type"]
		}
		request["Volume"] = Volumes
	}

	if d.HasChange("host_aliases") {
		update = true
		aliases := make([]map[string]interface{}, len(d.Get("host_aliases").(*schema.Set).List()))
		for i, value := range d.Get("host_aliases").(*schema.Set).List() {
			aliasMap := value.(map[string]interface{})
			aliases[i] = make(map[string]interface{})
			aliases[i]["Hostname"] = aliasMap["hostnames"]
			aliases[i]["Ip"] = aliasMap["ip"]
		}
		request["HostAliase"] = aliases
	}

	if d.HasChange("instance_types") {
		update = true
		instanceTypes := d.Get("instance_types").([]interface{})
		types := make([]string, 0, int(5))
		if instanceTypes != nil && len(instanceTypes) > 0 {
			types = expandStringList(instanceTypes)
		}
		request["InstanceType"] = types
	}
	if update {
		_, err = client.RpcPost("Ess", "2014-08-28", "ModifyEciScalingConfiguration", nil, request, false)
		if err != nil {
			return WrapErrorf(err, DefaultErrorMsg, "alicloud_ess_eci_scaling_configuration", "ModifyEciScalingConfiguration", AlibabaCloudSdkGoERROR)
		}
	}
	d.Partial(false)

	return resourceAliyunEssEciScalingConfigurationRead(d, meta)
}