func resourceAliyunEssScalingConfigurationCreate()

in alicloud/resource_alicloud_ess_scaling_configuration.go [478:789]


func resourceAliyunEssScalingConfigurationCreate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AliyunClient)
	var response map[string]interface{}
	action := "CreateScalingConfiguration"
	request := make(map[string]interface{})
	var err error
	securityGroupId := d.Get("security_group_id").(string)
	securityGroupIds := d.Get("security_group_ids").([]interface{})
	if securityGroupId == "" && (securityGroupIds == nil || len(securityGroupIds) == 0) {
		return WrapError(Error("security_group_id or security_group_ids must be assigned"))
	}
	instanceType := d.Get("instance_type").(string)
	instanceTypes := d.Get("instance_types").([]interface{})
	instanceTypeOverrides := d.Get("instance_type_override").(*schema.Set).List()
	if instanceType == "" && (instanceTypes == nil || len(instanceTypes) == 0) && (instanceTypeOverrides == nil || len(instanceTypeOverrides) == 0) {
		return WrapError(Error("instance_type or instance_types or instance_type_override must be assigned"))
	}
	request["ImageId"] = d.Get("image_id")
	request["ScalingGroupId"] = d.Get("scaling_group_id")
	request["PasswordInherit"] = d.Get("password_inherit")
	request["SystemDisk.Encrypted"] = d.Get("system_disk_encrypted")
	request["ImageOptions.LoginAsNonRoot"] = d.Get("image_options_login_as_non_root")
	request["DeletionProtection"] = d.Get("deletion_protection")
	request["SystemDisk.KMSKeyId"] = d.Get("system_disk_kms_key_id")
	if securityGroupId != "" {
		request["SecurityGroupId"] = d.Get("security_group_id")
	}
	password := d.Get("password").(string)
	kmsPassword := d.Get("kms_encrypted_password").(string)
	if password != "" {
		request["Password"] = d.Get("password")
	} else if kmsPassword != "" {
		kmsService := KmsService{client}
		decryptResp, err := kmsService.Decrypt(kmsPassword, d.Get("kms_encryption_context").(map[string]interface{}))
		if err != nil {
			return WrapError(err)
		}
		request["Password"] = decryptResp
	}
	if securityGroupIds != nil && len(securityGroupIds) > 0 {
		request["SecurityGroupIds"] = securityGroupIds
	}

	types := make([]string, 0, int(MaxScalingConfigurationInstanceTypes))
	if instanceTypes != nil && len(instanceTypes) > 0 {
		types = expandStringList(instanceTypes)
	}

	if instanceType != "" {
		types = append(types, instanceType)
	}
	request["InstanceTypes"] = types

	if instanceTypeOverrides != nil && len(instanceTypeOverrides) != 0 {
		instanceTypeOverridesMaps := make([]map[string]interface{}, 0)
		for _, rew := range instanceTypeOverrides {
			instanceTypeOverridesMap := make(map[string]interface{})
			item := rew.(map[string]interface{})
			if instanceType, ok := item["instance_type"].(string); ok && instanceType != "" {
				instanceTypeOverridesMap["InstanceType"] = instanceType
			}
			instanceTypeOverridesMap["WeightedCapacity"] = item["weighted_capacity"].(int)

			instanceTypeOverridesMaps = append(instanceTypeOverridesMaps, instanceTypeOverridesMap)
		}
		request["InstanceTypeOverride"] = instanceTypeOverridesMaps
	}

	if v := d.Get("scaling_configuration_name").(string); v != "" {
		request["ScalingConfigurationName"] = d.Get("scaling_configuration_name")
	}
	if v, ok := d.GetOk("instance_description"); ok {
		request["InstanceDescription"] = v
	}

	if v, ok := d.GetOk("system_disk_encrypt_algorithm"); ok {
		request["SystemDisk.EncryptAlgorithm"] = v
	}

	if v := d.Get("image_name").(string); v != "" {
		request["ImageName"] = d.Get("image_name")
	}

	if v := d.Get("internet_charge_type").(string); v != "" {
		request["InternetChargeType"] = d.Get("internet_charge_type")
	}

	if v, ok := d.GetOk("spot_duration"); ok {
		request["SpotDuration"] = v
	}

	if v, ok := d.GetOk("system_disk_provisioned_iops"); ok {
		request["SystemDisk.ProvisionedIops"] = v
	}

	if v := d.Get("system_disk_category").(string); v != "" {
		request["SystemDisk.Category"] = d.Get("system_disk_category")
	}
	if v, ok := d.GetOk("security_enhancement_strategy"); ok && v.(string) != "" {
		request["SecurityEnhancementStrategy"] = v
	}

	if v := d.Get("internet_max_bandwidth_in").(int); v != 0 {
		request["InternetMaxBandwidthIn"] = d.Get("internet_max_bandwidth_in")
	}

	request["InternetMaxBandwidthOut"] = d.Get("internet_max_bandwidth_out")

	if v := d.Get("credit_specification").(string); v != "" {
		request["CreditSpecification"] = d.Get("credit_specification")
	}

	if v := d.Get("system_disk_size").(int); v != 0 {
		request["SystemDisk.Size"] = d.Get("system_disk_size")
	}

	if v := d.Get("system_disk_name").(string); v != "" {
		request["SystemDisk.DiskName"] = d.Get("system_disk_name")
	}

	if v := d.Get("system_disk_description").(string); v != "" {
		request["SystemDisk.Description"] = d.Get("system_disk_description")
	}

	if v := d.Get("system_disk_auto_snapshot_policy_id").(string); v != "" {
		request["SystemDisk.AutoSnapshotPolicyId"] = d.Get("system_disk_auto_snapshot_policy_id")
	}

	if v := d.Get("system_disk_performance_level").(string); v != "" {
		request["SystemDisk.PerformanceLevel"] = d.Get("system_disk_performance_level")
	}

	if v := d.Get("resource_group_id").(string); v != "" {
		request["ResourceGroupId"] = d.Get("resource_group_id")
	}

	if v, ok := d.GetOk("role_name"); ok && v.(string) != "" {
		request["RamRoleName"] = v
	}

	if v, ok := d.GetOk("key_name"); ok && v.(string) != "" {
		request["KeyPairName"] = v
	}

	if v, ok := d.GetOk("instance_name"); ok && v.(string) != "" {
		request["InstanceName"] = v
	}

	if v, ok := d.GetOk("host_name"); ok && v.(string) != "" {
		request["HostName"] = v
	}

	if v, ok := d.GetOk("spot_strategy"); ok && v.(string) != "" {
		request["SpotStrategy"] = v
	}

	if v, ok := d.GetOk("user_data"); ok {
		_, base64DecodeError := base64.StdEncoding.DecodeString(v.(string))
		if base64DecodeError == nil {
			request["UserData"] = v
		} else {
			request["UserData"] = base64.StdEncoding.EncodeToString([]byte(v.(string)))
		}
	}

	if v, ok := d.GetOk("tags"); ok {
		vv, okk := convertMaptoJsonString(v.(map[string]interface{}))
		if okk == nil {
			request["Tags"] = vv
		}
	}

	if v, ok := d.GetOk("data_disk"); ok {
		disksMaps := make([]map[string]interface{}, 0)
		disks := v.([]interface{})

		for _, rew := range disks {
			disksMap := make(map[string]interface{})
			item := rew.(map[string]interface{})
			disksMap["Size"] = item["size"].(int)
			disksMap["ProvisionedIops"] = item["provisioned_iops"].(int)

			if category, ok := item["category"].(string); ok && category != "" {
				disksMap["Category"] = category
			}
			if snapshotId, ok := item["snapshot_id"].(string); ok && snapshotId != "" {
				disksMap["SnapshotId"] = snapshotId
			}
			disksMap["DeleteWithInstance"] = item["delete_with_instance"].(bool)
			if device, ok := item["device"].(string); ok && device != "" {
				disksMap["Device"] = device
			}
			disksMap["Encrypted"] = item["encrypted"].(bool)
			if kmsKeyId, ok := item["kms_key_id"].(string); ok && kmsKeyId != "" {
				disksMap["KMSKeyId"] = kmsKeyId
			}
			if name, ok := item["name"].(string); ok && name != "" {
				disksMap["DiskName"] = name
			}
			if description, ok := item["description"].(string); ok && description != "" {
				disksMap["Description"] = description
			}
			if autoSnapshotPolicyId, ok := item["auto_snapshot_policy_id"].(string); ok && autoSnapshotPolicyId != "" {
				disksMap["AutoSnapshotPolicyId"] = autoSnapshotPolicyId
			}
			if performanceLevel, ok := item["performance_level"].(string); ok && performanceLevel != "" {
				disksMap["PerformanceLevel"] = performanceLevel
			}
			disksMaps = append(disksMaps, disksMap)
		}
		request["DataDisk"] = disksMaps
	}
	if v, ok := d.GetOk("spot_price_limit"); ok {
		spotPriceLimitsMaps := make([]map[string]interface{}, 0)
		spotPriceLimits := v.(*schema.Set).List()
		for _, rew := range spotPriceLimits {
			spotPriceLimitsMap := make(map[string]interface{})
			item := rew.(map[string]interface{})
			if instanceType, ok := item["instance_type"].(string); ok && instanceType != "" {
				spotPriceLimitsMap["InstanceType"] = instanceType
			}
			spotPriceLimitsMap["PriceLimit"] = strconv.FormatFloat(item["price_limit"].(float64), 'f', 2, 64)
			spotPriceLimitsMaps = append(spotPriceLimitsMaps, spotPriceLimitsMap)
		}
		request["SpotPriceLimit"] = spotPriceLimitsMaps
	}
	if v, ok := d.GetOk("instance_pattern_info"); ok {
		instancePatternInfosMaps := make([]map[string]interface{}, 0)
		instancePatternInfos := v.(*schema.Set).List()
		for _, rew := range instancePatternInfos {
			instancePatternInfosMap := make(map[string]interface{})
			item := rew.(map[string]interface{})

			if instanceFamilyLevel, ok := item["instance_family_level"].(string); ok && instanceFamilyLevel != "" {
				instancePatternInfosMap["InstanceFamilyLevel"] = instanceFamilyLevel
			}
			if burstablePerformance, ok := item["burstable_performance"].(string); ok && burstablePerformance != "" {
				instancePatternInfosMap["BurstablePerformance"] = burstablePerformance
			}
			instancePatternInfosMap["Memory"] = strconv.FormatFloat(item["memory"].(float64), 'f', 2, 64)
			if item["max_price"].(float64) != 0 {
				instancePatternInfosMap["MaxPrice"] = strconv.FormatFloat(item["max_price"].(float64), 'f', 2, 64)
			}
			instancePatternInfosMap["Cores"] = item["cores"].(int)
			instancePatternInfosMap["Architectures"] = item["architectures"]
			instancePatternInfosMap["ExcludedInstanceTypes"] = item["excluded_instance_types"]

			instancePatternInfosMaps = append(instancePatternInfosMaps, instancePatternInfosMap)
		}
		request["InstancePatternInfo"] = instancePatternInfosMaps
	}
	if v, ok := d.GetOk("network_interfaces"); ok {
		networkInterfacesMaps := make([]map[string]interface{}, 0)
		networkInterfaces := v.(*schema.Set).List()
		for _, rew := range networkInterfaces {
			networkInterfacesMap := make(map[string]interface{})
			item := rew.(map[string]interface{})

			if instanceType, ok := item["instance_type"].(string); ok && instanceType != "" {
				networkInterfacesMap["InstanceType"] = instanceType
			}
			if networkInterfaceTrafficMode, ok := item["network_interface_traffic_mode"].(string); ok && networkInterfaceTrafficMode != "" {
				networkInterfacesMap["NetworkInterfaceTrafficMode"] = networkInterfaceTrafficMode
			}
			networkInterfacesMap["Ipv6AddressCount"] = item["ipv6_address_count"].(int)
			networkInterfacesMap["SecurityGroupIds"] = item["security_group_ids"]
			networkInterfacesMaps = append(networkInterfacesMaps, networkInterfacesMap)
		}
		request["NetworkInterfaces"] = networkInterfacesMaps
	}

	if v, ok := d.GetOk("custom_priorities"); ok {
		customPrioritiesMaps := make([]map[string]interface{}, 0)
		customPriorities := v.(*schema.Set).List()
		for _, rew := range customPriorities {
			customPrioritiesMap := make(map[string]interface{})
			item := rew.(map[string]interface{})

			if instanceType, ok := item["instance_type"].(string); ok && instanceType != "" {
				customPrioritiesMap["InstanceType"] = instanceType
			}

			if vswitchId, ok := item["vswitch_id"].(string); ok && vswitchId != "" {
				customPrioritiesMap["VswitchId"] = vswitchId
			}
			customPrioritiesMaps = append(customPrioritiesMaps, customPrioritiesMap)
		}
		request["CustomPriorities"] = customPrioritiesMaps
	}
	request["IoOptimized"] = string(IOOptimized)

	if d.Get("is_outdated").(bool) == true {
		request["IoOptimized"] = string(NoneOptimized)
	}
	err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
		response, err = client.RpcPost("Ess", "2014-08-28", action, nil, request, true)
		if err != nil {
			if IsExpectedErrors(err, []string{Throttling, "IncorrectScalingGroupStatus"}) {
				return resource.RetryableError(err)
			}
			return resource.NonRetryableError(err)
		}
		return nil
	})
	addDebug(action, response, request)
	if err != nil {
		return WrapErrorf(err, DefaultErrorMsg, "alicloud_ess_scaling_configuration", action, AlibabaCloudSdkGoERROR)
	}

	d.SetId(fmt.Sprint(response["ScalingConfigurationId"]))
	return resourceAliyunEssScalingConfigurationUpdate(d, meta)
}