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)
}