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
}