func resourceAlibabacloudStackKVStoreInstanceCreate()

in alibabacloudstack/resource_apsarastack_kvstore_instance.go [221:350]


func resourceAlibabacloudStackKVStoreInstanceCreate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AlibabacloudStackClient)
	vpcService := VpcService{client}
	kvstoreService := KvstoreService{client}
	var response map[string]interface{}
	action := "CreateInstance"
	request := make(map[string]interface{})

	request["ClientToken"] = buildClientToken("CreateInstance")
	if v, ok := connectivity.GetResourceDataOk(d, "tair_instance_name", "instance_name"); ok {
		request["InstanceName"] = v.(string)
	}
	if v, ok := d.GetOk("cpu_type"); ok {
		request["CpuType"] = v.(string)
	}
	if v, ok := d.GetOk("node_type"); ok {
		request["NodeType"] = v.(string)
	}
	if v, ok := d.GetOk("architecture_type"); ok && v.(string) != "" {
		request["ArchitectureType"] = v.(string)
	}
	if v, ok := d.GetOk("instance_type"); ok {
		request["InstanceType"] = v.(string)
	}
	if v, ok := d.GetOk("engine_version"); ok {
		request["EngineVersion"] = v.(string)
	}
	if v, ok := d.GetOk("instance_class"); ok {
		request["InstanceClass"] = v.(string)
	}
	// 	if v, ok := connectivity.GetResourceDataOk(d, "payment_type", "instance_charge_type"); ok {
	// 		request["ChargeType"] = v.(string)
	// 	} else {
	// 		request["ChargeType"] = string(PostPaid)
	// 	}
	if v, ok := d.GetOk("password"); ok {
		request["Password"] = v.(string)
	}
	if v, ok := d.GetOk("series"); ok {
		request["Series"] = v.(string)
	}

	if request["Password"] == "" {
		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 errmsgs.WrapError(err)
			}
			request["Password"] = decryptResp.Plaintext
		}
	}
	if v, ok := d.GetOk("backup_id"); ok {
		request["BackupId"] = v.(string)
	}

	// 	if request["ChargeType"] == PrePaid {
	// 		request["Period"] = strconv.Itoa(d.Get("period").(int))
	// 	}

	if v, ok := connectivity.GetResourceDataOk(d, "zone_id", "availability_zone"); ok && Trim(v.(string)) != "" {
		request["ZoneId"] = Trim(v.(string))
	}
	request["NetworkType"] = strings.ToUpper(string(Classic))
	if vswitchId, ok := d.GetOk("vswitch_id"); ok && vswitchId.(string) != "" {
		request["VSwitchId"] = vswitchId.(string)
		request["NetworkType"] = strings.ToUpper(string(Vpc))
		// request["PrivateIpAddress"] = Trim(d.Get("private_ip").(string))

		// check vswitchId in zone
		object, err := vpcService.DescribeVSwitch(vswitchId.(string))
		if err != nil {
			return errmsgs.WrapError(err)
		}

		if request["ZoneId"] == "" {
			request["ZoneId"] = object.ZoneId
		}

		request["VpcId"] = object.VpcId
	}

	response, err := client.DoTeaRequest("POST", "R-kvstore", "2015-01-01", action, "", nil, nil, request)
	log.Printf(" create kvstroe instances Finished !! response: %v", response)
	if err != nil {
		return err
	}
	if value, exist := response["asapiSuccess"]; !exist || !value.(bool) {
		err = errmsgs.Error("create kvstroe instances Failed !!")
		return errmsgs.WrapErrorf(err, "create kvstroe instances Failed !! %s", action, errmsgs.AlibabacloudStackSdkGoERROR)
	}

	d.SetId(fmt.Sprint(response["InstanceId"]))
	log.Printf("begin describe kvstroe instances !!")
	// wait instance status change from Creating to Normal
	stateConf := BuildStateConfByTimes([]string{"Creating"}, []string{"Normal"}, d.Timeout(schema.TimeoutCreate), 1*time.Minute, kvstoreService.RdsKvstoreInstanceStateRefreshFunc(d.Id(), []string{"Deleting"}), 200)
	if _, err := stateConf.WaitForState(); err != nil {
		return errmsgs.WrapError(err)
	}

	log.Printf("begin update kvstroe instances !!")
	if tde, ok := d.GetOk("tde_status"); ok && tde.(string) == "Enabled" {
		tde_req := make(map[string]interface{})
		tde_req["InstanceId"] = d.Id()
		tde_req["TDEStatus"] = tde.(string)
		if encryption_key, ok := d.GetOk("encryption_key"); ok && encryption_key != "" {
			tde_req["EncryptionKey"] = encryption_key
		} else {
			if role_arn, ok := d.GetOk("role_arn"); ok && role_arn.(string) != "" {
				tde_req["RoleArn"] = d.Get("role_arn").(string)
			} else if client.Config.RamRoleArn != "" {
				tde_req["RoleArn"] = client.Config.RamRoleArn
			}
		}

		tde_response, err := client.DoTeaRequest("POST", "R-kvstore", "2015-01-01", "ModifyInstanceTDE", "", nil, nil, tde_req)

		addDebug("ModifyInstanceTDE", tde_response, tde_req)
		if err != nil {
			return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "apsarastack_kvstroe_instance", "ModifyInstanceTDE", errmsgs.AlibabacloudStackSdkGoERROR)
		}
		if value, exist := tde_response["asapiSuccess"]; !exist || !value.(bool) {
			err = errmsgs.Error("kvstroe ModifyInstanceTDE Failed !!")
			return errmsgs.WrapErrorf(err, "kvstroe ModifyInstanceTDE Failed !! %s", action, errmsgs.AlibabacloudStackSdkGoERROR)
		}

		log.Print("enabled TDE")
	}
	return nil
}