alibabacloudstack/resource_apsarastack_cr_repo.go (205 lines of code) (raw):

package alibabacloudstack import ( "encoding/json" "fmt" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "log" "strings" "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" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" ) func resourceAlibabacloudStackCRRepo() *schema.Resource { resource := &schema.Resource{ Schema: map[string]*schema.Schema{ "namespace": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: validation.StringLenBetween(2, 30), }, "name": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: validation.StringLenBetween(2, 64), }, "summary": { Type: schema.TypeString, Required: true, ValidateFunc: validation.StringLenBetween(1, 100), }, "repo_type": { Type: schema.TypeString, Required: true, ValidateFunc: validation.StringInSlice([]string{RepoTypePublic, RepoTypePrivate}, false), }, "detail": { Type: schema.TypeString, Optional: true, ValidateFunc: validation.StringLenBetween(0, 2000), }, // computed "domain_list": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "vpc": { Type: schema.TypeString, Computed: true, }, "public": { Type: schema.TypeString, Computed: true, }, "internal": { Type: schema.TypeString, Computed: true, }, }, }, }, }, } setResourceFunc(resource, resourceAlibabacloudStackCRRepoCreate, resourceAlibabacloudStackCRRepoRead, resourceAlibabacloudStackCRRepoUpdate, resourceAlibabacloudStackCRRepoDelete) return resource } func resourceAlibabacloudStackCRRepoCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) resp := ResponseCr{} repoNamespace := d.Get("namespace").(string) repoName := d.Get("name").(string) summary := d.Get("summary").(string) repoType := d.Get("repo_type").(string) detail := d.Get("detail").(string) request := client.NewCommonRequest("PUT", "cr", "2016-06-07", "CreateRepo", "/repos") body := map[string]interface{}{ "repo": map[string]interface{}{ "RepoName": repoName, "RepoNamespace": repoNamespace, "repoType": repoType, "summary": summary, "detail": detail, }, } jsonData, err := json.Marshal(body) if err != nil { return errmsgs.WrapError(fmt.Errorf("Error marshaling to JSON: %v", err)) } request.SetContentType(requests.Json) request.SetContent(jsonData) response, err := client.ProcessCommonRequest(request) addDebug(request.GetActionName(), response, request) if err != nil { if response == nil { return errmsgs.WrapErrorf(err, "Process Common Request Failed") } errmsg := errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_cr_repo", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } log.Printf("repo create response %v", response) err = json.Unmarshal(response.GetHttpContentBytes(), &resp) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_cr_repo", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } log.Printf("repo create unmarshalled response %v", &resp) d.SetId(fmt.Sprintf("%s%s%s", repoNamespace, SLASH_SEPARATED, repoName)) return nil } type ResponseCr struct { Code string `json:"code"` Data struct { Data struct { RepoID int `json:"repoId"` } `json:"data"` } `json:"data"` SuccessResponse bool `json:"successResponse"` } func resourceAlibabacloudStackCRRepoUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) resp := ResponseCr{} repoNamespace := d.Get("namespace").(string) repoName := d.Get("name").(string) summary := d.Get("summary").(string) repoType := d.Get("repo_type").(string) detail := d.Get("detail").(string) if d.HasChanges("summary", "detail", "repo_type") { request := client.NewCommonRequest("POST", "cr", "2016-06-07", "UpdateRepo", fmt.Sprintf("/repos/%s/%s",repoNamespace,repoName) ) request.QueryParams["RepoNamespace"] = repoNamespace request.QueryParams["RepoName"] = repoName body := map[string]interface{}{ "repo": map[string]interface{}{ "repoType": repoType, "summary": summary, "detail": detail, }, } jsonData, err := json.Marshal(body) if err != nil { return errmsgs.WrapError(fmt.Errorf("Error marshaling to JSON: %v", err)) } request.SetContentType(requests.Json) request.SetContent(jsonData) response, err := client.ProcessCommonRequest(request) addDebug(request.GetActionName(), response, request) if err != nil { if response == nil { return errmsgs.WrapErrorf(err, "Process Common Request Failed") } errmsg := errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_cr_repo", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } log.Printf("repo update response %v", response) err = json.Unmarshal(response.GetHttpContentBytes(), &resp) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_cr_repo", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } log.Printf("repo update unmarshalled response %v", &resp) } return nil } func resourceAlibabacloudStackCRRepoRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) crService := CrService{client} object, err := crService.DescribeCrRepo(d.Id()) if err != nil { if errmsgs.NotFoundError(err) { d.SetId("") return nil } return errmsgs.WrapError(err) } d.Set("namespace", object.Data.Repo.RepoNamespace) d.Set("name", object.Data.Repo.RepoName) d.Set("detail", object.Data.Repo.Detail) d.Set("summary", object.Data.Repo.Summary) d.Set("repo_type", object.Data.Repo.RepoType) domainList := make([]map[string]string, 1) domains := make(map[string]string) domains["public"] = object.Data.Repo.RepoDomainList.Public domains["internal"] = object.Data.Repo.RepoDomainList.Internal domains["vpc"] = object.Data.Repo.RepoDomainList.Vpc domainList = append(domainList, domains) d.Set("domain_list", domainList) return nil } func resourceAlibabacloudStackCRRepoDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) sli := strings.Split(d.Id(), SLASH_SEPARATED) repoNamespace := sli[0] repoName := sli[1] request := client.NewCommonRequest("DELETE", "cr", "2016-06-07", "DeleteRepo", fmt.Sprintf("/repos/%s/%s",repoNamespace,repoName)) request.QueryParams["RepoNamespace"] = repoNamespace request.QueryParams["RepoName"] = repoName response, err := client.ProcessCommonRequest(request) addDebug(request.GetActionName(), response, request) if err != nil { if response == nil { return errmsgs.WrapErrorf(err, "Process Common Request Failed") } errmsg := errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_cr_repo", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } return nil }