alicloud/resource_alicloud_cen_instance.go (259 lines of code) (raw):

package alicloud import ( "fmt" "log" "time" "github.com/PaesslerAG/jsonpath" "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 resourceAliCloudCenCenInstance() *schema.Resource { return &schema.Resource{ Create: resourceAliCloudCenCenInstanceCreate, Read: resourceAliCloudCenCenInstanceRead, Update: resourceAliCloudCenCenInstanceUpdate, Delete: resourceAliCloudCenCenInstanceDelete, 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{ "cen_instance_name": { Type: schema.TypeString, Optional: true, ConflictsWith: []string{"name"}, Computed: true, }, "create_time": { Type: schema.TypeString, Computed: true, }, "description": { Type: schema.TypeString, Optional: true, }, "protection_level": { Type: schema.TypeString, Optional: true, Computed: true, }, "resource_group_id": { Type: schema.TypeString, Optional: true, Computed: true, }, "status": { Type: schema.TypeString, Computed: true, }, "tags": tagsSchema(), "name": { Type: schema.TypeString, Optional: true, Computed: true, Deprecated: "Field 'name' has been deprecated since provider version 1.98.0. New field 'cen_instance_name' instead.", }, }, } } func resourceAliCloudCenCenInstanceCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) action := "CreateCen" var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) var err error request = make(map[string]interface{}) request["ClientToken"] = buildClientToken(action) if v, ok := d.GetOk("name"); ok || d.HasChange("name") { request["Name"] = v } if v, ok := d.GetOk("cen_instance_name"); ok { request["Name"] = v } if v, ok := d.GetOk("protection_level"); ok { request["ProtectionLevel"] = v } if v, ok := d.GetOk("description"); ok { request["Description"] = v } if v, ok := d.GetOk("tags"); ok { tagsMap := ConvertTags(v.(map[string]interface{})) request = expandTagsToMap(request, tagsMap) } wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { response, err = client.RpcPost("Cbn", "2017-09-12", action, query, request, true) if err != nil { if IsExpectedErrors(err, []string{"Operation.Blocking"}) || 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_cen_instance", action, AlibabaCloudSdkGoERROR) } d.SetId(fmt.Sprint(response["CenId"])) cenServiceV2 := CenServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"Active"}, d.Timeout(schema.TimeoutCreate), 5*time.Second, cenServiceV2.CenCenInstanceStateRefreshFunc(d.Id(), "Status", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } return resourceAliCloudCenCenInstanceUpdate(d, meta) } func resourceAliCloudCenCenInstanceRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) cenServiceV2 := CenServiceV2{client} objectRaw, err := cenServiceV2.DescribeCenCenInstance(d.Id()) if err != nil { if !d.IsNewResource() && NotFoundError(err) { log.Printf("[DEBUG] Resource alicloud_cen_instance DescribeCenCenInstance Failed!!! %s", err) d.SetId("") return nil } return WrapError(err) } d.Set("cen_instance_name", objectRaw["Name"]) d.Set("create_time", objectRaw["CreationTime"]) d.Set("description", objectRaw["Description"]) d.Set("protection_level", objectRaw["ProtectionLevel"]) d.Set("resource_group_id", objectRaw["ResourceGroupId"]) d.Set("status", objectRaw["Status"]) tagsMaps, _ := jsonpath.Get("$.Tags.Tag", objectRaw) d.Set("tags", tagsToMap(tagsMaps)) d.Set("name", d.Get("cen_instance_name")) return nil } func resourceAliCloudCenCenInstanceUpdate(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 d.Partial(true) var err error action := "ModifyCenAttribute" request = make(map[string]interface{}) query = make(map[string]interface{}) request["CenId"] = d.Id() if !d.IsNewResource() && d.HasChange("name") { update = true request["Name"] = d.Get("name") } if !d.IsNewResource() && d.HasChange("cen_instance_name") { update = true request["Name"] = d.Get("cen_instance_name") } if !d.IsNewResource() && d.HasChange("protection_level") { update = true request["ProtectionLevel"] = d.Get("protection_level") } if !d.IsNewResource() && d.HasChange("description") { update = true request["Description"] = d.Get("description") } if update { wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("Cbn", "2017-09-12", 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, d.Id(), action, AlibabaCloudSdkGoERROR) } cenServiceV2 := CenServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"Active"}, d.Timeout(schema.TimeoutDelete), 5*time.Second, cenServiceV2.CenCenInstanceStateRefreshFunc(d.Id(), "Status", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } update = false action = "MoveResourceGroup" request = make(map[string]interface{}) query = make(map[string]interface{}) request["ResourceId"] = d.Id() request["ClientToken"] = buildClientToken(action) if _, ok := d.GetOk("resource_group_id"); ok && d.HasChange("resource_group_id") { update = true } request["NewResourceGroupId"] = d.Get("resource_group_id") request["ResourceType"] = "cen" if update { wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("Cbn", "2017-09-12", 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, d.Id(), action, AlibabaCloudSdkGoERROR) } } if d.HasChange("tags") { cenServiceV2 := CenServiceV2{client} if err := cenServiceV2.SetResourceTags(d, "cen"); err != nil { return WrapError(err) } } d.Partial(false) return resourceAliCloudCenCenInstanceRead(d, meta) } func resourceAliCloudCenCenInstanceDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) action := "DeleteCen" var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) var err error request = make(map[string]interface{}) request["CenId"] = d.Id() wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { response, err = client.RpcPost("Cbn", "2017-09-12", action, query, request, true) if err != nil { if IsExpectedErrors(err, []string{"Operation.Blocking", "InvalidOperation.CenInstanceStatus"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"ParameterCenInstanceId"}) || NotFoundError(err) { return nil } return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } cenServiceV2 := CenServiceV2{client} stateConf := BuildStateConf([]string{}, []string{""}, d.Timeout(schema.TimeoutDelete), 5*time.Second, cenServiceV2.CenCenInstanceStateRefreshFunc(d.Id(), "Status", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } return nil }