alibabacloudstack/resource_apsarastack_image_copy.go (138 lines of code) (raw):

package alibabacloudstack import ( "log" "time" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func resourceAlibabacloudStackImageCopy() *schema.Resource { resource := &schema.Resource{ Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(60 * time.Minute), Delete: schema.DefaultTimeout(60 * time.Minute), }, Schema: map[string]*schema.Schema{ "source_image_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, "destination_region_id": { Type: schema.TypeString, ForceNew: true, Required: true, }, "name": { Type: schema.TypeString, Optional: true, Computed: true, Deprecated: "Field 'name' is deprecated and will be removed in a future release. Please use new field 'image_name' instead.", ConflictsWith: []string{"image_name"}, }, "image_name": { Type: schema.TypeString, Optional: true, Computed: true, ConflictsWith: []string{"name"}, }, "description": { Type: schema.TypeString, Optional: true, }, "kms_key_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "encrypted": { Type: schema.TypeBool, Optional: true, ForceNew: true, }, }, } setResourceFunc(resource, resourceAlibabacloudStackImageCopyCreate, resourceAlibabacloudStackImageCopyRead, resourceAlibabacloudStackImageCopyUpdate, resourceAlibabacloudStackImageCopyDelete) return resource } func resourceAlibabacloudStackImageCopyCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) ecsService := EcsService{client} request := ecs.CreateCopyImageRequest() client.InitRpcRequest(*request.RpcRequest) request.ImageId = d.Get("source_image_id").(string) request.DestinationRegionId = d.Get("destination_region_id").(string) request.DestinationImageName = connectivity.GetResourceData(d, "image_name", "name").(string) request.DestinationDescription = d.Get("description").(string) request.ResourceGroupId = client.Config.ResourceGroupId if v, ok := d.GetOk("kms_key_id"); ok && v != "" { request.KMSKeyId = v.(string) } if v, ok := d.GetOk("encrypted"); ok { request.Encrypted = requests.NewBoolean(v.(bool)) } raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { return ecsClient.CopyImage(request) }) if err != nil { errmsg := "" if response, ok := raw.(*ecs.CopyImageResponse); ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "apsrastack_image_copy", request.GetActionName(), errmsgs.AlibabacloudStackGoClientFailure, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ := raw.(*ecs.CopyImageResponse) d.SetId(response.ImageId) log.Printf("[DEBUG] state %#v", d.Id()) stateConf := BuildStateConf([]string{"Creating"}, []string{"Available"}, d.Timeout(schema.TimeoutCreate), 10*time.Minute, ecsService.ImageStateRefreshFuncforcopy(d.Id(), d.Get("destination_region_id").(string), []string{"CreateFailed", "UnAvailable"})) stateConf.NotFoundChecks = 1000 if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } return nil } func resourceAlibabacloudStackImageCopyUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) ecsService := EcsService{client} err := ecsService.updateImage(d) if err != nil { return errmsgs.WrapError(err) } return nil } func resourceAlibabacloudStackImageCopyRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) ecsService := EcsService{client} object, err := ecsService.DescribeImage(d.Id(), d.Get("destination_region_id").(string)) if err != nil { if errmsgs.NotFoundError(err) { d.SetId("") return nil } return errmsgs.WrapError(err) } connectivity.SetResourceData(d, object.ImageName, "image_name", "name") d.Set("description", object.Description) return nil } func resourceAlibabacloudStackImageCopyDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) request := ecs.CreateDeleteImageRequest() request.ImageId = d.Id() client.InitRpcRequest(*request.RpcRequest) raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { return ecsClient.DeleteImage(request) }) if err != nil { errmsg := "" if response, ok := raw.(*ecs.DeleteImageResponse); ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } return nil }