in alibabacloudstack/resource_apsarastack_ecs_instance.go [745:909]
func buildAlibabacloudStackInstanceArgs(d *schema.ResourceData, meta interface{}) (*ecs.RunInstancesRequest, error) {
client := meta.(*connectivity.AlibabacloudStackClient)
request := ecs.CreateRunInstancesRequest()
client.InitRpcRequest(*request.RpcRequest)
if v := d.Get("enable_ipv6").(bool); v {
request.QueryParams["Ipv6CidrBlock"] = d.Get("ipv6_cidr_block").(string)
if d.Get("ipv6_address_count").(int) <= 0 {
return nil, errmsgs.WrapError(errmsgs.Error("if enable_ipv6 = true, ipv6_address_count must be greater than 0"))
}
request.QueryParams["Ipv6AddressCount"] = "0"
}
request.InstanceType = d.Get("instance_type").(string)
request.SystemDiskDiskName = d.Get("system_disk_name").(string)
imageID := d.Get("image_id").(string)
request.ImageId = imageID
if v := d.Get("system_disk_description").(string); v != "" {
request.SystemDiskDescription = v
}
systemDiskCategory := DiskCategory(d.Get("system_disk_category").(string))
if v, ok := connectivity.GetResourceDataOk(d, "zone_id", "availability_zone"); ok && v.(string) != "" {
request.ZoneId = v.(string)
}
request.SystemDiskCategory = string(systemDiskCategory)
request.SystemDiskSize = strconv.Itoa(d.Get("system_disk_size").(int))
if v, ok := d.GetOk("security_groups"); ok {
sgs := expandStringList(v.(*schema.Set).List())
request.SecurityGroupId = sgs[0]
}
if v := d.Get("instance_name").(string); v != "" {
request.InstanceName = v
}
if v := d.Get("description").(string); v != "" {
request.Description = v
}
if v, ok := d.GetOk("internet_max_bandwidth_in"); ok {
request.InternetMaxBandwidthIn = requests.NewInteger(v.(int))
}
if v := d.Get("host_name").(string); v != "" {
request.HostName = v
}
if v := d.Get("password").(string); v != "" {
request.Password = v
}
if v := d.Get("kms_encrypted_password").(string); v != "" {
kmsService := KmsService{client}
decryptResp, err := kmsService.Decrypt(v, d.Get("kms_encryption_context").(map[string]interface{}))
if err != nil {
return request, errmsgs.WrapError(err)
}
request.Password = decryptResp.Plaintext
}
vswitchValue := d.Get("subnet_id").(string)
if vswitchValue == "" {
vswitchValue = d.Get("vswitch_id").(string)
}
if vswitchValue != "" {
request.VSwitchId = vswitchValue
if v, ok := d.GetOk("private_ip"); ok && v.(string) != "" {
request.PrivateIpAddress = v.(string)
}
}
if v := d.Get("user_data").(string); v != "" {
_, base64DecodeError := base64.StdEncoding.DecodeString(v)
if base64DecodeError == nil {
request.UserData = v
} else {
request.UserData = base64.StdEncoding.EncodeToString([]byte(v))
}
}
if v := d.Get("role_name").(string); v != "" {
request.RamRoleName = v
}
if v := d.Get("key_name").(string); v != "" {
request.KeyPairName = v
}
request.InternetMaxBandwidthOut = requests.NewInteger(d.Get("internet_max_bandwidth_out").(int))
i := d.Get("storage_set_partition_number").(int)
if v := d.Get("storage_set_id").(string); v != "" {
request.StorageSetId = v
if i >= 1 {
request.StorageSetPartitionNumber = requests.NewInteger(d.Get("storage_set_partition_number").(int))
} else {
return nil, fmt.Errorf("can't empty storage_set_partition_number when you set storage_set_id and >=2 ")
}
}
if v, ok := d.GetOk("security_enhancement_strategy"); ok {
request.SecurityEnhancementStrategy = v.(string)
}
v, ok := d.GetOk("tags")
if ok && len(v.(map[string]interface{})) > 0 {
tags := make([]ecs.RunInstancesTag, 0)
for key, value := range v.(map[string]interface{}) {
tags = append(tags, ecs.RunInstancesTag{
Key: key,
Value: value.(string),
})
}
request.Tag = &tags
}
request.ClientToken = buildClientToken(request.GetActionName())
if v, ok := d.GetOk("data_disks"); ok {
disks := v.([]interface{})
var dataDiskRequests []ecs.RunInstancesDataDisk
for i := range disks {
disk := disks[i].(map[string]interface{})
dataDiskRequest := ecs.RunInstancesDataDisk{
Category: disk["category"].(string),
DeleteWithInstance: strconv.FormatBool(disk["delete_with_instance"].(bool)),
Encrypted: strconv.FormatBool(disk["encrypted"].(bool)),
}
if enc, ok := disk["encrypted"]; ok {
if enc.(bool) {
if j, ok := disk["kms_key_id"]; ok {
dataDiskRequest.KMSKeyId = j.(string)
}
if dataDiskRequest.KMSKeyId == "" {
return nil, errmsgs.WrapError(errors.New("KmsKeyId can not be empty if encrypted is set to \"true\""))
}
}
}
if kms, ok := disk["kms_key_id"]; ok {
dataDiskRequest.KMSKeyId = kms.(string)
}
if name, ok := disk["name"]; ok {
dataDiskRequest.DiskName = name.(string)
}
if snapshotId, ok := disk["snapshot_id"]; ok {
dataDiskRequest.SnapshotId = snapshotId.(string)
}
if description, ok := disk["description"]; ok {
dataDiskRequest.Description = description.(string)
}
dataDiskRequest.Size = fmt.Sprintf("%d", disk["size"].(int))
dataDiskRequest.Category = disk["category"].(string)
if dataDiskRequest.Category == string(DiskEphemeralSSD) {
dataDiskRequest.DeleteWithInstance = ""
}
dataDiskRequests = append(dataDiskRequests, dataDiskRequest)
}
request.DataDisk = &dataDiskRequests
}
return request, nil
}