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