alibabacloudstack/resource_apsarastack_edas_k8s_cluster.go (142 lines of code) (raw):

package alibabacloudstack import ( "encoding/json" "log" "time" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func resourceAlibabacloudStackEdasK8sCluster() *schema.Resource { resource := &schema.Resource{ Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(30 * time.Minute), Delete: schema.DefaultTimeout(10 * time.Minute), }, Schema: map[string]*schema.Schema{ "cs_cluster_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, "namespace_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "cluster_name": { Type: schema.TypeString, Computed: true, }, "cluster_type": { Type: schema.TypeInt, Computed: true, }, "network_mode": { Type: schema.TypeInt, Computed: true, }, "vpc_id": { Type: schema.TypeString, Computed: true, }, "cluster_import_status": { Type: schema.TypeInt, Computed: true, }, }, } setResourceFunc(resource, resourceAlibabacloudStackEdasK8sClusterCreate, resourceAlibabacloudStackEdasK8sClusterRead, nil, resourceAlibabacloudStackEdasK8sClusterDelete) return resource } type ImportK8sClusterResponse struct { Code int `json:"Code" xml:"Code"` Message string `json:"Message" xml:"Message"` Data string `json:"Data" xml:"Data"` RequestId string `json:"RequestId" xml:"RequestId"` } func resourceAlibabacloudStackEdasK8sClusterCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) request := client.NewCommonRequest("POST", "Edas", "2017-08-01", "ImportK8sCluster", "/pop/v5/import_k8s_cluster") request.QueryParams["ClusterId"] = d.Get("cs_cluster_id").(string) if v, ok := d.GetOk("namespace_id"); ok { request.QueryParams["RegionId"] = v.(string) } bresponse, err := client.ProcessCommonRequest(request) addDebug(request.GetActionName(), bresponse, request, request.QueryParams) if err != nil { if bresponse == nil { return errmsgs.WrapErrorf(err, "Process Common Request Failed") } errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_k8s_cluster", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } response := ImportK8sClusterResponse{} err = json.Unmarshal(bresponse.GetHttpContentBytes(), &response) if err != nil { return errmsgs.WrapError(err) } log.Printf("unmarshal response for read %v", &response) if len(response.Data) == 0 { return errmsgs.WrapError(errmsgs.Error("null cluster id after import k8s cluster")) } d.SetId(response.Data) // Wait until import succeed edasService := EdasService{client} stateConf := BuildStateConf([]string{"3"}, []string{"1"}, d.Timeout(schema.TimeoutCreate), 10*time.Second, edasService.ClusterImportK8sStateRefreshFunc(d.Id(), []string{"0", "2", "4"})) if _, err := stateConf.WaitForState(); err != nil { return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id()) } return nil } func resourceAlibabacloudStackEdasK8sClusterRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) edasService := EdasService{client} object, err := edasService.DescribeEdasK8sCluster(d.Id()) if err != nil { if errmsgs.NotFoundError(err) { d.SetId("") return nil } return errmsgs.WrapError(err) } d.Set("cluster_name", object.ClusterName) d.Set("cluster_type", object.ClusterType) d.Set("network_mode", object.NetworkMode) d.Set("vpc_id", object.VpcId) d.Set("namespace_id", object.RegionId) d.Set("cluster_import_status", object.ClusterImportStatus) d.Set("cs_cluster_id", object.CsClusterId) return nil } func resourceAlibabacloudStackEdasK8sClusterDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) request := client.NewCommonRequest("DELETE", "Edas", "2017-08-01", "DeleteCluster", "/pop/v5/resource/cluster") request.QueryParams["ClusterId"] = d.Id() // request.Headers["x-acs-content-type"] = "application/x-www-form-urlencoded" wait := incrementalWait(1*time.Second, 2*time.Second) err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { bresponse, err := client.ProcessCommonRequest(request) addDebug(request.GetActionName(), bresponse, request) if err != nil { if bresponse == nil { return resource.RetryableError(err) } if errmsgs.IsExpectedErrors(err, []string{errmsgs.ThrottlingUser}) { wait() return resource.RetryableError(err) } errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_k8s_cluster", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)) } return nil }) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } edasService := EdasService{client} stateConf := BuildStateConf([]string{"4"}, []string{"0"}, d.Timeout(schema.TimeoutCreate), 10*time.Second, edasService.ClusterImportK8sStateRefreshFunc(d.Id(), []string{"1", "2", "3"})) if _, err := stateConf.WaitForState(); err != nil { return nil } return nil }