alibabacloudstack/resource_apsarastack_edas_instanceclusterattachment.go (252 lines of code) (raw):

package alibabacloudstack import ( "log" "strings" "time" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/aliyun/alibaba-cloud-sdk-go/services/edas" "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 resourceAlibabacloudStackEdasInstanceClusterAttachment() *schema.Resource { resource := &schema.Resource{ Schema: map[string]*schema.Schema{ "cluster_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, "instance_ids": { Type: schema.TypeList, Elem: &schema.Schema{Type: schema.TypeString}, Required: true, ForceNew: true, }, "pass_word": { Type: schema.TypeString, Required: true, ForceNew: true, }, "status_map": { Type: schema.TypeMap, Elem: &schema.Schema{ Type: schema.TypeInt, }, Computed: true, ForceNew: true, }, "ecu_map": { Type: schema.TypeMap, Elem: &schema.Schema{ Type: schema.TypeString, }, Computed: true, ForceNew: true, }, "cluster_member_ids": { Type: schema.TypeMap, Elem: &schema.Schema{ Type: schema.TypeString, }, Computed: true, ForceNew: true, }, }, } setResourceFunc(resource, resourceAlibabacloudStackEdasInstanceClusterAttachmentCreate, resourceAlibabacloudStackEdasInstanceClusterAttachmentRead, nil, resourceAlibabacloudStackEdasInstanceClusterAttachmentDelete) return resource } func resourceAlibabacloudStackEdasInstanceClusterAttachmentCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} clusterId := d.Get("cluster_id").(string) instanceIds := d.Get("instance_ids").([]interface{}) aString := make([]string, len(instanceIds)) for i, v := range instanceIds { aString[i] = v.(string) } request := edas.CreateInsertClusterMemberRequest() client.InitRoaRequest(*request.RoaRequest) request.ClusterId = clusterId request.Password = d.Get("pass_word").(string) request.InstanceIds = strings.Join(aString, ",") request.SetReadTimeout(30 * time.Second) if err := edasService.SyncResource("ecs"); err != nil { return err } wait := incrementalWait(3*time.Second, 3*time.Second) err := resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { raw, err := edasService.client.WithEdasClient(func(edasClient *edas.Client) (interface{}, error) { return edasClient.InsertClusterMember(request) }) bresponse, ok := raw.(*edas.InsertClusterMemberResponse) if err != nil { if errmsgs.IsThrottling(err) { wait() return resource.RetryableError(err) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_instance_cluster_attachment", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)) } addDebug(request.GetActionName(), raw, request.RoaRequest, request) if bresponse.Code != 200 { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return resource.NonRetryableError(errmsgs.Error("insert instances to cluster failed for " + bresponse.Message + " " + errmsg)) } d.SetId(clusterId + ":" + strings.Join(aString, ",")) return nil }) if err != nil { return err } var cnt int ImportSuccessFlag := false for { if cnt >= 5 { break } requestList := edas.CreateListClusterMembersRequest() client.InitRoaRequest(*request.RoaRequest) requestList.ClusterId = clusterId rawList, err := edasService.client.WithEdasClient(func(edasClient *edas.Client) (interface{}, error) { return edasClient.ListClusterMembers(requestList) }) bresponseList, ok := rawList.(*edas.ListClusterMembersResponse) addDebug(requestList.GetActionName(), rawList, requestList.RoaRequest, requestList) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponseList.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_List_attachment", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } strs, err := ParseResourceId(d.Id(), 2) if err != nil { return errmsgs.WrapError(err) } instanceIdstr := strs[1] for _, member := range bresponseList.ClusterMemberPage.ClusterMemberList.ClusterMember { log.Printf("=================================== instance status: %d ecsId : %s", member.Status, member.EcsId) if strings.Contains(instanceIdstr, member.EcsId) { if member.Status == 1 { ImportSuccessFlag = true break } if member.Status == 7 { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponseList.BaseResponse) } return errmsgs.Error("Instance:`%s` Import Timeout! " + errmsg, member.EcsId) } if member.EcuId != "" { ImportSuccessFlag = true break } } } if ImportSuccessFlag == true { break } time.Sleep(30 * time.Second) cnt++ } return nil } func resourceAlibabacloudStackEdasInstanceClusterAttachmentRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} strs, err := ParseResourceId(d.Id(), 2) if err != nil { return errmsgs.WrapError(err) } clusterId := strs[0] regionId := client.RegionId instanceIdstr := strs[1] request := edas.CreateListClusterMembersRequest() client.InitRoaRequest(*request.RoaRequest) request.ClusterId = clusterId request.RegionId = regionId raw, err := edasService.client.WithEdasClient(func(edasClient *edas.Client) (interface{}, error) { return edasClient.ListClusterMembers(request) }) bresponse, ok := raw.(*edas.ListClusterMembersResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_instance_cluster_attachment", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RoaRequest, request) statusMap := make(map[string]int) ecuMap := make(map[string]string) memMap := make(map[string]string) for _, member := range bresponse.ClusterMemberPage.ClusterMemberList.ClusterMember { if strings.Contains(instanceIdstr, member.EcsId) { statusMap[member.EcsId] = member.Status ecuMap[member.EcsId] = member.EcuId memMap[member.EcsId] = member.ClusterMemberId } } d.Set("status_map", statusMap) d.Set("ecu_map", ecuMap) d.Set("cluster_member_ids", memMap) return nil } func resourceAlibabacloudStackEdasInstanceClusterAttachmentDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} memIds := d.Get("cluster_member_ids").(map[string]interface{}) for instanceId, memberId := range memIds { request := edas.CreateDeleteClusterMemberRequest() client.InitRoaRequest(*request.RoaRequest) request.ClusterId = d.Get("cluster_id").(string) request.ClusterMemberId = memberId.(string) wait := incrementalWait(3*time.Second, 3*time.Second) err := resource.Retry(1*time.Minute, func() *resource.RetryError { raw, err := edasService.client.WithEdasClient(func(edasClient *edas.Client) (interface{}, error) { return edasClient.DeleteClusterMember(request) }) bresponse, ok := raw.(*edas.DeleteClusterMemberResponse) if err != nil { if errmsgs.IsThrottling(err) { wait() return resource.RetryableError(err) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_instance_cluster_attachment", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)) } addDebug(request.GetActionName(), raw, request.RoaRequest, request) if strings.Contains(bresponse.Message, "there are still applications deployed in this cluster") { err = errmsgs.Error("there are still applications deployed in this cluster") return resource.RetryableError(err) } else if bresponse.Code != 200 { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return resource.NonRetryableError(errmsgs.Error("delete instance:" + instanceId + " from cluster failed for " + bresponse.Message + " " + errmsg)) } return nil }) if err != nil { return err } } return nil }