alicloud/resource_alicloud_rds_custom_disk.go (275 lines of code) (raw):

// Package alicloud. This file is generated automatically. Please do not modify it manually, thank you! package alicloud import ( "fmt" "log" "time" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) func resourceAliCloudRdsCustomDisk() *schema.Resource { return &schema.Resource{ Create: resourceAliCloudRdsCustomDiskCreate, Read: resourceAliCloudRdsCustomDiskRead, Update: resourceAliCloudRdsCustomDiskUpdate, Delete: resourceAliCloudRdsCustomDiskDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(5 * time.Minute), Update: schema.DefaultTimeout(5 * time.Minute), Delete: schema.DefaultTimeout(5 * time.Minute), }, Schema: map[string]*schema.Schema{ "auto_pay": { Type: schema.TypeBool, Optional: true, }, "auto_renew": { Type: schema.TypeBool, Optional: true, }, "create_time": { Type: schema.TypeString, Computed: true, }, "description": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "disk_category": { Type: schema.TypeString, Required: true, }, "disk_name": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "dry_run": { Type: schema.TypeBool, Optional: true, }, "instance_charge_type": { Type: schema.TypeString, Optional: true, }, "performance_level": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "period": { Type: schema.TypeInt, Optional: true, }, "period_unit": { Type: schema.TypeString, Optional: true, }, "region_id": { Type: schema.TypeString, Computed: true, }, "resource_group_id": { Type: schema.TypeString, Computed: true, }, "size": { Type: schema.TypeInt, Required: true, }, "snapshot_id": { Type: schema.TypeString, Optional: true, }, "status": { Type: schema.TypeString, Computed: true, }, "type": { Type: schema.TypeString, Optional: true, }, "zone_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, }, } } func resourceAliCloudRdsCustomDiskCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) action := "CreateRCDisk" var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) var err error request = make(map[string]interface{}) request["RegionId"] = client.RegionId if v, ok := d.GetOk("performance_level"); ok { request["PerformanceLevel"] = v } if v, ok := d.GetOk("description"); ok { request["Description"] = v } request["Size"] = d.Get("size") if v, ok := d.GetOk("disk_name"); ok { request["DiskName"] = v } request["DiskCategory"] = d.Get("disk_category") request["ZoneId"] = d.Get("zone_id") if v, ok := d.GetOk("instance_charge_type"); ok { request["InstanceChargeType"] = v } if v, ok := d.GetOkExists("auto_renew"); ok { request["AutoRenew"] = v } if v, ok := d.GetOk("snapshot_id"); ok { request["SnapshotId"] = v } if v, ok := d.GetOkExists("auto_pay"); ok { request["AutoPay"] = v } if v, ok := d.GetOk("period_unit"); ok { request["PeriodUnit"] = v } if v, ok := d.GetOkExists("period"); ok { request["Period"] = v } wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { response, err = client.RpcPost("Rds", "2014-08-15", action, query, request, true) 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, "alicloud_rds_custom_disk", action, AlibabaCloudSdkGoERROR) } d.SetId(fmt.Sprint(response["DiskId"])) rdsServiceV2 := RdsServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"#CHECKSET"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, rdsServiceV2.RdsCustomDiskStateRefreshFunc(d.Id(), "#$.DiskId", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } return resourceAliCloudRdsCustomDiskRead(d, meta) } func resourceAliCloudRdsCustomDiskRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) rdsServiceV2 := RdsServiceV2{client} objectRaw, err := rdsServiceV2.DescribeRdsCustomDisk(d.Id()) if err != nil { if !d.IsNewResource() && NotFoundError(err) { log.Printf("[DEBUG] Resource alicloud_rds_custom_disk DescribeRdsCustomDisk Failed!!! %s", err) d.SetId("") return nil } return WrapError(err) } d.Set("create_time", objectRaw["CreationTime"]) d.Set("description", objectRaw["Description"]) d.Set("disk_name", objectRaw["DiskName"]) d.Set("performance_level", objectRaw["PerformanceLevel"]) d.Set("region_id", objectRaw["RegionId"]) d.Set("resource_group_id", objectRaw["ResourceGroupId"]) d.Set("size", objectRaw["Size"]) d.Set("status", objectRaw["Status"]) d.Set("zone_id", objectRaw["ZoneId"]) return nil } func resourceAliCloudRdsCustomDiskUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} update := false var err error action := "ResizeRCInstanceDisk" request = make(map[string]interface{}) query = make(map[string]interface{}) request["DiskId"] = d.Id() request["RegionId"] = client.RegionId if v, ok := d.GetOk("type"); ok { request["Type"] = v } if v, ok := d.GetOk("dry_run"); ok { request["DryRun"] = v } if v, ok := d.GetOk("auto_pay"); ok { request["AutoPay"] = v } if d.HasChange("size") { update = true } request["NewSize"] = d.Get("size") if update { wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("Rds", "2014-08-15", action, query, request, true) if err != nil { if IsExpectedErrors(err, []string{"InvalidOrderTask.NotSupport"}) || 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) } rdsServiceV2 := RdsServiceV2{client} stateConf := BuildStateConf([]string{}, []string{fmt.Sprint(d.Get("size"))}, d.Timeout(schema.TimeoutUpdate), 10*time.Second, rdsServiceV2.RdsCustomDiskStateRefreshFunc(d.Id(), "Size", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } return resourceAliCloudRdsCustomDiskRead(d, meta) } func resourceAliCloudRdsCustomDiskDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) action := "DeleteRCDisk" var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) var err error request = make(map[string]interface{}) request["DiskId"] = d.Id() request["RegionId"] = client.RegionId wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { response, err = client.RpcPost("Rds", "2014-08-15", action, query, request, true) if err != nil { if IsExpectedErrors(err, []string{"IncorrectDBInstanceState"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if NotFoundError(err) { return nil } return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } rdsServiceV2 := RdsServiceV2{client} stateConf := BuildStateConf([]string{}, []string{}, d.Timeout(schema.TimeoutDelete), 5*time.Second, rdsServiceV2.RdsCustomDiskStateRefreshFunc(d.Id(), "$.DiskId", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } return nil }