func resourceAliCloudEcsLaunchTemplateUpdate()

in alicloud/resource_alicloud_ecs_launch_template.go [882:1305]


func resourceAliCloudEcsLaunchTemplateUpdate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AliyunClient)
	ecsService := EcsService{client}
	var response map[string]interface{}
	d.Partial(true)

	if d.HasChange("template_tags") {
		if err := ecsService.SetResourceTemplateTags(d, "launchtemplate"); err != nil {
			return WrapError(err)
		}
		d.SetPartial("template_tags")
	}
	versions, err := getLaunchTemplateVersions(d.Id(), meta)
	if err != nil {
		return WrapError(err)
	}
	// Remove one of the oldest and non-default version when the total number reach 30
	if len(versions) > 29 {
		var oldestVersion int
		for _, version := range versions {
			if !version.(map[string]interface{})["DefaultVersion"].(bool) && (oldestVersion == 0 || formatInt(version.(map[string]interface{})["VersionNumber"]) < oldestVersion) {
				oldestVersion = formatInt(version.(map[string]interface{})["VersionNumber"])
			}
		}

		err = deleteLaunchTemplateVersion(d.Id(), oldestVersion, meta)
		if err != nil {
			return WrapError(err)
		}
	}

	latestVersion := d.Get("latest_version_number")
	update := false
	request := map[string]interface{}{
		"LaunchTemplateId": d.Id(),
	}
	request["RegionId"] = client.RegionId
	if d.HasChange("auto_release_time") {
		update = true
	}
	if v, ok := d.GetOk("auto_release_time"); ok {
		request["AutoReleaseTime"] = v
	}
	if d.HasChange("data_disks") {
		update = true
	}
	if v, ok := d.GetOk("data_disks"); ok {
		DataDisks := make([]map[string]interface{}, len(v.(*schema.Set).List()))
		for i, DataDisksValue := range v.(*schema.Set).List() {
			DataDisksMap := DataDisksValue.(map[string]interface{})
			DataDisks[i] = make(map[string]interface{})

			if category, ok := DataDisksMap["category"].(string); ok && category != "" {
				DataDisks[i]["Category"] = category
			}

			if description, ok := DataDisksMap["description"].(string); ok && description != "" {
				DataDisks[i]["Description"] = description
			}

			if name, ok := DataDisksMap["name"].(string); ok && name != "" {
				DataDisks[i]["DiskName"] = name
			}

			if performanceLevel, ok := DataDisksMap["performance_level"].(string); ok && performanceLevel != "" {
				DataDisks[i]["PerformanceLevel"] = performanceLevel
			}

			if snapshotId, ok := DataDisksMap["snapshot_id"].(string); ok && snapshotId != "" {
				DataDisks[i]["SnapshotId"] = snapshotId
			}

			if device, ok := DataDisksMap["device"].(string); ok && device != "" {
				DataDisks[i]["Device"] = device
			}

			DataDisks[i]["DeleteWithInstance"] = DataDisksMap["delete_with_instance"]
			DataDisks[i]["Encrypted"] = fmt.Sprintf("%v", DataDisksMap["encrypted"].(bool))
			DataDisks[i]["Size"] = DataDisksMap["size"]

		}
		request["DataDisk"] = DataDisks

	}
	if d.HasChange("deployment_set_id") {
		update = true
	}
	if v, ok := d.GetOk("deployment_set_id"); ok {
		request["DeploymentSetId"] = v
	}
	if d.HasChange("description") {
		update = true
	}
	if v, ok := d.GetOk("description"); ok {
		request["Description"] = v
	}
	if d.HasChange("enable_vm_os_config") {
		update = true
	}
	if v, ok := d.GetOkExists("enable_vm_os_config"); ok {
		request["EnableVmOsConfig"] = v
	}
	if d.HasChange("host_name") {
		update = true
	}
	if v, ok := d.GetOk("host_name"); ok {
		request["HostName"] = v
	}
	if d.HasChange("image_id") {
		update = true
	}
	if v, ok := d.GetOk("image_id"); ok {
		request["ImageId"] = v
	}
	if d.HasChange("image_owner_alias") {
		update = true
	}
	if v, ok := d.GetOk("image_owner_alias"); ok {
		request["ImageOwnerAlias"] = v
	}
	if d.HasChange("instance_charge_type") {
		update = true
	}
	if v, ok := d.GetOk("instance_charge_type"); ok {
		request["InstanceChargeType"] = v
	}
	if d.HasChange("instance_name") {
		update = true
	}
	if v, ok := d.GetOk("instance_name"); ok {
		request["InstanceName"] = v
	}
	if d.HasChange("instance_type") {
		update = true
	}
	if v, ok := d.GetOk("instance_type"); ok {
		request["InstanceType"] = v
	}
	if d.HasChange("internet_charge_type") {
		update = true
	}
	if v, ok := d.GetOk("internet_charge_type"); ok {
		request["InternetChargeType"] = v
	}
	if d.HasChange("internet_max_bandwidth_in") {
		update = true
	}
	if v, ok := d.GetOk("internet_max_bandwidth_in"); ok {
		request["InternetMaxBandwidthIn"] = v
	}
	if d.HasChange("internet_max_bandwidth_out") {
		update = true
	}
	if v, ok := d.GetOk("internet_max_bandwidth_out"); ok {
		request["InternetMaxBandwidthOut"] = v
	}
	if d.HasChange("io_optimized") {
		update = true
	}
	if v, ok := d.GetOk("io_optimized"); ok {
		request["IoOptimized"] = v
	}
	if d.HasChange("key_pair_name") {
		update = true
	}
	if v, ok := d.GetOk("key_pair_name"); ok {
		request["KeyPairName"] = v
	}

	if d.HasChange("launch_template_name") {
		update = true
		request["LaunchTemplateName"] = d.Get("launch_template_name")
	} else if d.HasChange("name") {
		update = true
		request["LaunchTemplateName"] = d.Get("name")
	} else {
		if v, ok := d.GetOk("launch_template_name"); ok {
			request["LaunchTemplateName"] = v
		} else if v, ok := d.GetOk("name"); ok {
			request["LaunchTemplateName"] = v
		}
	}
	if d.HasChange("network_interfaces") {
		update = true
	}
	if v, ok := d.GetOk("network_interfaces"); ok {
		NetworkInterfaces := make([]map[string]interface{}, len(v.(*schema.Set).List()))
		for i, NetworkInterfacesValue := range v.(*schema.Set).List() {
			NetworkInterfacesMap := NetworkInterfacesValue.(map[string]interface{})
			NetworkInterfaces[i] = make(map[string]interface{})
			NetworkInterfaces[i]["Description"] = NetworkInterfacesMap["description"]
			NetworkInterfaces[i]["NetworkInterfaceName"] = NetworkInterfacesMap["name"]
			NetworkInterfaces[i]["PrimaryIpAddress"] = NetworkInterfacesMap["primary_ip"]
			NetworkInterfaces[i]["SecurityGroupId"] = NetworkInterfacesMap["security_group_id"]
			NetworkInterfaces[i]["VSwitchId"] = NetworkInterfacesMap["vswitch_id"]
			NetworkInterfaces[i]["DeleteOnRelease"] = NetworkInterfacesMap["delete_on_release"]
		}
		request["NetworkInterface"] = NetworkInterfaces

	}
	if d.HasChange("network_type") {
		update = true
	}
	if v, ok := d.GetOk("network_type"); ok {
		request["NetworkType"] = v
	}
	if d.HasChange("password_inherit") {
		update = true
	}
	if v, ok := d.GetOkExists("password_inherit"); ok {
		request["PasswordInherit"] = v
	}
	if d.HasChange("period") {
		update = true
	}
	if v, ok := d.GetOk("period"); ok {
		request["Period"] = v
	}
	if d.HasChange("private_ip_address") {
		update = true
	}
	if v, ok := d.GetOk("private_ip_address"); ok {
		request["PrivateIpAddress"] = v
	}
	if d.HasChange("ram_role_name") {
		update = true
	}
	if v, ok := d.GetOk("ram_role_name"); ok {
		request["RamRoleName"] = v
	}
	if d.HasChange("resource_group_id") {
		update = true
	}
	if v, ok := d.GetOk("resource_group_id"); ok {
		request["ResourceGroupId"] = v
	}
	if d.HasChange("security_enhancement_strategy") {
		update = true
	}
	if v, ok := d.GetOk("security_enhancement_strategy"); ok {
		request["SecurityEnhancementStrategy"] = v
	}
	if d.HasChange("security_group_id") {
		update = true
	}
	if v, ok := d.GetOk("security_group_id"); ok {
		request["SecurityGroupId"] = v
	}
	if d.HasChange("security_group_ids") {
		update = true
	}
	if v, ok := d.GetOk("security_group_ids"); ok {
		request["SecurityGroupIds"] = v
	}
	if d.HasChange("spot_duration") {
		update = true
	}
	if v, ok := d.GetOk("spot_duration"); ok {
		request["SpotDuration"] = v
	}
	if d.HasChange("spot_price_limit") {
		update = true
	}
	if v, ok := d.GetOk("spot_price_limit"); ok {
		request["SpotPriceLimit"] = v
	}
	if d.HasChange("spot_strategy") {
		update = true
	}
	if v, ok := d.GetOk("spot_strategy"); ok {
		request["SpotStrategy"] = v
	}
	if d.HasChange("system_disk") {
		update = true

		systemDiskMap := make(map[string]interface{})
		for _, systemDisk := range d.Get("system_disk").(*schema.Set).List() {
			systemDiskArg := systemDisk.(map[string]interface{})
			systemDiskMap["Category"] = systemDiskArg["category"]
			systemDiskMap["DeleteWithInstance"] = requests.NewBoolean(systemDiskArg["delete_with_instance"].(bool))
			systemDiskMap["Description"] = systemDiskArg["description"]
			systemDiskMap["Iops"] = systemDiskArg["iops"]
			systemDiskMap["DiskName"] = systemDiskArg["name"]
			systemDiskMap["PerformanceLevel"] = systemDiskArg["performance_level"]
			systemDiskMap["Size"] = requests.NewInteger(systemDiskArg["size"].(int))
			systemDiskMap["Encrypted"] = requests.NewBoolean(systemDiskArg["encrypted"].(bool))
		}
		request["SystemDisk"] = systemDiskMap
	} else {
		systemDiskMap := make(map[string]interface{})
		if d.HasChange("system_disk_category") {
			update = true
		}
		if v, ok := d.GetOk("system_disk_category"); ok {
			systemDiskMap["Category"] = v
		}
		if d.HasChange("system_disk_description") {
			update = true
		}
		if v, ok := d.GetOk("system_disk_description"); ok {
			systemDiskMap["Description"] = v
		}
		if d.HasChange("system_disk_name") {
			update = true
		}
		if v, ok := d.GetOk("system_disk_name"); ok {
			systemDiskMap["DiskName"] = v
		}
		if d.HasChange("system_disk_size") {
			update = true
		}
		if v, ok := d.GetOk("system_disk_size"); ok {
			systemDiskMap["Size"] = v
		}
		diskMap := d.Get("system_disk").(*schema.Set).List()[0].(map[string]interface{})
		systemDiskMap["DeleteWithInstance"] = diskMap["delete_with_instance"]
		systemDiskMap["Iops"] = diskMap["iops"]
		systemDiskMap["PerformanceLevel"] = diskMap["performance_level"]
		request["SystemDisk"] = systemDiskMap
	}
	if d.HasChange("tags") {
		update = true
	}
	if v, ok := d.GetOk("tags"); ok {
		count := 1
		for key, value := range v.(map[string]interface{}) {
			request[fmt.Sprintf("Tag.%d.Key", count)] = key
			request[fmt.Sprintf("Tag.%d.Value", count)] = value
			count++
		}
	}
	if d.HasChange("user_data") {
		update = true
		request["UserData"] = d.Get("user_data")
	} else if d.HasChange("userdata") {
		update = true
		request["UserData"] = d.Get("userdata")
	} else {
		if v, ok := d.GetOk("user_data"); ok {
			request["UserData"] = v
		} else if v, ok := d.GetOk("userdata"); ok {
			request["UserData"] = v
		}
	}
	if d.HasChange("vswitch_id") {
		update = true
	}
	if v, ok := d.GetOk("vswitch_id"); ok {
		request["VSwitchId"] = v
	}
	if d.HasChange("version_description") {
		update = true
	}
	if v, ok := d.GetOk("version_description"); ok {
		request["VersionDescription"] = v
	}
	if d.HasChange("vpc_id") {
		update = true
	}
	if v, ok := d.GetOk("vpc_id"); ok {
		request["VpcId"] = v
	}
	if d.HasChange("zone_id") {
		update = true
	}
	if v, ok := d.GetOk("zone_id"); ok {
		request["ZoneId"] = v
	}
	if update {
		action := "CreateLaunchTemplateVersion"
		wait := incrementalWait(3*time.Second, 3*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("Ecs", "2014-05-26", action, nil, request, false)
			if err != nil {
				if NeedRetry(err) {
					wait()
					return resource.RetryableError(err)
				}
				return resource.NonRetryableError(err)
			}
			return nil
		})
		addDebug(action, response, request)

		if err != nil {
			return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
		}
		latestVersion = response["LaunchTemplateVersionNumber"]
	}

	if d.Get("update_default_version_number").(bool) || d.HasChange("default_version_number") {
		action := "ModifyLaunchTemplateDefaultVersion"
		request = map[string]interface{}{
			"LaunchTemplateId": d.Id(),
			"RegionId":         client.RegionId,
		}

		if d.Get("update_default_version_number").(bool) {
			request["DefaultVersionNumber"] = latestVersion
		} else if d.HasChange("default_version_number") {
			request["DefaultVersionNumber"] = d.Get("default_version_number")
		}

		wait := incrementalWait(3*time.Second, 3*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.RpcPost("Ecs", "2014-05-26", action, nil, request, false)
			if err != nil {
				if NeedRetry(err) {
					wait()
					return resource.RetryableError(err)
				}
				return resource.NonRetryableError(err)
			}
			return nil
		})
		addDebug(action, response, request)

		if err != nil {
			return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
		}
	}
	d.Partial(false)
	return resourceAliCloudEcsLaunchTemplateRead(d, meta)
}