alicloud/service_alicloud_max_compute_v2.go (579 lines of code) (raw):

package alicloud import ( "encoding/json" "fmt" "strings" "time" "github.com/PaesslerAG/jsonpath" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/tidwall/sjson" ) type MaxComputeServiceV2 struct { client *connectivity.AliyunClient } // DescribeMaxComputeProject <<< Encapsulated get interface for MaxCompute Project. func (s *MaxComputeServiceV2) DescribeMaxComputeProject(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]*string projectName := id request = make(map[string]interface{}) query = make(map[string]*string) request["projectName"] = id action := fmt.Sprintf("/api/v1/projects/%s", projectName) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RoaGet("MaxCompute", "2022-01-04", action, query, nil, nil) if err != nil { if IsExpectedErrors(err, []string{"500"}) || NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"OBJECT_NOT_EXIST", "ODPS-0420111", "INTERNAL_SERVER_ERROR", "ODPS-0420095"}) { return object, WrapErrorf(NotFoundErr("Project", id), NotFoundMsg, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.data", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.data", response) } return v.(map[string]interface{}), nil } func (s *MaxComputeServiceV2) DescribeProjectListTagResources(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]*string request = make(map[string]interface{}) query = make(map[string]*string) query["ResourceId"] = StringPointer(id) query["RegionId"] = StringPointer(client.RegionId) query["ResourceType"] = StringPointer("project") action := fmt.Sprintf("/tags") wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RoaGet("MaxCompute", "2022-01-04", action, query, nil, nil) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return response, nil } func (s *MaxComputeServiceV2) MaxComputeProjectStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeMaxComputeProject(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeMaxComputeProject >>> Encapsulated. // SetResourceTags <<< Encapsulated tag function for MaxCompute. func (s *MaxComputeServiceV2) SetResourceTags(d *schema.ResourceData, resourceType string) error { if d.HasChange("tags") { var action string var err error client := s.client var request map[string]interface{} var response map[string]interface{} query := make(map[string]*string) body := make(map[string]interface{}) added, removed := parsingTags(d) removedTagKeys := make([]string, 0) for _, v := range removed { if !ignoredTags(v, "") { removedTagKeys = append(removedTagKeys, v) } } if len(removedTagKeys) > 0 { action = fmt.Sprintf("/tags") request = make(map[string]interface{}) query = make(map[string]*string) body = make(map[string]interface{}) query["ResourceId"] = StringPointer(d.Id()) query["RegionId"] = StringPointer(client.RegionId) query["TagKey"] = StringPointer(convertListToCommaSeparate(convertListStringToListInterface(removedTagKeys))) query["ResourceType"] = StringPointer(resourceType) body = request wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RoaDelete("MaxCompute", "2022-01-04", action, query, nil, nil, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } } if len(added) > 0 { action = fmt.Sprintf("/tags") request = make(map[string]interface{}) query = make(map[string]*string) body = make(map[string]interface{}) count := 1 tagsMaps := make([]map[string]interface{}, 0) for key, value := range added { tagsMap := make(map[string]interface{}) tagsMap["Value"] = value tagsMap["Key"] = key tagsMaps = append(tagsMaps, tagsMap) count++ } request["Tag"] = tagsMaps request["RegionId"] = client.RegionId request["ResourceType"] = resourceType jsonString := convertObjectToJsonString(request) jsonString, _ = sjson.Set(jsonString, "ResourceId.0", d.Id()) _ = json.Unmarshal([]byte(jsonString), &request) body = request wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RoaPost("MaxCompute", "2022-01-04", action, query, nil, body, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } } } return nil } // SetResourceTags >>> tag function encapsulated. // DescribeMaxComputeQuotaPlan <<< Encapsulated get interface for MaxCompute QuotaPlan. func (s *MaxComputeServiceV2) DescribeMaxComputeQuotaPlan(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]*string parts := strings.Split(id, ":") if len(parts) != 2 { err = WrapError(fmt.Errorf("invalid Resource Id %s. Expected parts' length %d, got %d", id, 2, len(parts))) } nickname := parts[0] planName := parts[1] request = make(map[string]interface{}) query = make(map[string]*string) action := fmt.Sprintf("/api/v1/quotas/%s/computeQuotaPlan/%s", nickname, planName) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RoaGet("MaxCompute", "2022-01-04", action, query, nil, nil) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"QUOTA_PLAN_NOT_FOUND"}) { return object, WrapErrorf(NotFoundErr("QuotaPlan", id), NotFoundMsg, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.data", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.data", response) } return v.(map[string]interface{}), nil } func (s *MaxComputeServiceV2) MaxComputeQuotaPlanStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeMaxComputeQuotaPlan(id) if err != nil { if NotFoundError(err) { return object, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeMaxComputeQuotaPlan >>> Encapsulated. // DescribeMaxComputeRole <<< Encapsulated get interface for MaxCompute Role. func (s *MaxComputeServiceV2) DescribeMaxComputeRole(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]*string parts := strings.Split(id, ":") if len(parts) != 2 { err = WrapError(fmt.Errorf("invalid Resource Id %s. Expected parts' length %d, got %d", id, 2, len(parts))) } projectName := parts[0] roleName := parts[1] request = make(map[string]interface{}) query = make(map[string]*string) action := fmt.Sprintf("/api/v1/projects/%s/roles/%s/policy", projectName, roleName) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RoaGet("MaxCompute", "2022-01-04", action, query, nil, nil) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"OBJECT_NOT_EXIST"}) { return object, WrapErrorf(NotFoundErr("Role", id), NotFoundMsg, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return response, nil } func (s *MaxComputeServiceV2) MaxComputeRoleStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeMaxComputeRole(id) if err != nil { if NotFoundError(err) { return object, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeMaxComputeRole >>> Encapsulated. // DescribeMaxComputeQuotaSchedule <<< Encapsulated get interface for MaxCompute QuotaSchedule. func (s *MaxComputeServiceV2) DescribeMaxComputeQuotaSchedule(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]*string parts := strings.Split(id, ":") if len(parts) != 2 { err = WrapError(fmt.Errorf("invalid Resource Id %s. Expected parts' length %d, got %d", id, 2, len(parts))) } nickname := parts[0] request = make(map[string]interface{}) query = make(map[string]*string) query["displayTimezone"] = StringPointer(parts[1]) action := fmt.Sprintf("/api/v1/quotas/%s/computeQuotaSchedule", nickname) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RoaGet("MaxCompute", "2022-01-04", action, query, nil, nil) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return response, nil } func (s *MaxComputeServiceV2) MaxComputeQuotaScheduleStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeMaxComputeQuotaSchedule(id) if err != nil { if NotFoundError(err) { return object, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeMaxComputeQuotaSchedule >>> Encapsulated. // DescribeMaxComputeRoleUserAttachment <<< Encapsulated get interface for MaxCompute RoleUserAttachment. func (s *MaxComputeServiceV2) DescribeMaxComputeRoleUserAttachment(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]*string parts := strings.Split(id, "&") if len(parts) != 3 { err = WrapError(fmt.Errorf("invalid Resource Id %s. Expected parts' length %d, got %d", id, 3, len(parts))) } projectName := parts[0] roleName := parts[1] request = make(map[string]interface{}) query = make(map[string]*string) action := fmt.Sprintf("/api/v1/projects/%s/roles/%s/users", projectName, roleName) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RoaGet("MaxCompute", "2022-01-04", action, query, nil, nil) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.data.users[*]", response) if err != nil { return object, WrapErrorf(NotFoundErr("RoleUserAttachment", id), NotFoundMsg, response) } if len(v.([]interface{})) == 0 { return object, WrapErrorf(NotFoundErr("RoleUserAttachment", id), NotFoundMsg, response) } result, _ := v.([]interface{}) for _, v := range result { item := v.(map[string]interface{}) if fmt.Sprint(item["name"]) != parts[2] { continue } return item, nil } return object, WrapErrorf(NotFoundErr("RoleUserAttachment", id), NotFoundMsg, response) } func (s *MaxComputeServiceV2) MaxComputeRoleUserAttachmentStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeMaxComputeRoleUserAttachment(id) if err != nil { if NotFoundError(err) { return object, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeMaxComputeRoleUserAttachment >>> Encapsulated. // DescribeMaxComputeTunnelQuotaTimer <<< Encapsulated get interface for MaxCompute TunnelQuotaTimer. func (s *MaxComputeServiceV2) DescribeMaxComputeTunnelQuotaTimer(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]*string nickname := id request = make(map[string]interface{}) query = make(map[string]*string) request["nickname"] = id action := fmt.Sprintf("/api/v1/tunnel/%s/timers", nickname) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RoaGet("MaxCompute", "2022-01-04", action, query, nil, nil) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return response, nil } func (s *MaxComputeServiceV2) MaxComputeTunnelQuotaTimerStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeMaxComputeTunnelQuotaTimer(id) if err != nil { if NotFoundError(err) { return object, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeMaxComputeTunnelQuotaTimer >>> Encapsulated. // DescribeMaxComputeQuota <<< Encapsulated get interface for MaxCompute Quota. func (s *MaxComputeServiceV2) DescribeMaxComputeQuota(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]*string nickname := id request = make(map[string]interface{}) query = make(map[string]*string) request["nickname"] = id action := fmt.Sprintf("/api/v1/quotas/%s", nickname) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RoaGet("MaxCompute", "2022-01-04", action, query, nil, nil) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"QUOTA_UNKNOWN_NICKNAME"}) { return object, WrapErrorf(NotFoundErr("Quota", id), NotFoundMsg, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return response, nil } func (s *MaxComputeServiceV2) DescribeQuotaListTagResources(id string) (object map[string]interface{}, err error) { client := s.client var request map[string]interface{} var response map[string]interface{} var query map[string]*string request = make(map[string]interface{}) query = make(map[string]*string) query["ResourceId"] = StringPointer(id) query["RegionId"] = StringPointer(client.RegionId) query["ResourceType"] = StringPointer("quota") action := fmt.Sprintf("/tags") wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(1*time.Minute, func() *resource.RetryError { response, err = client.RoaGet("MaxCompute", "2022-01-04", action, query, nil, nil) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return response, nil } func (s *MaxComputeServiceV2) MaxComputeQuotaStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeMaxComputeQuota(id) if err != nil { if NotFoundError(err) { return object, "", nil } return nil, "", WrapError(err) } v, err := jsonpath.Get(field, object) currentStatus := fmt.Sprint(v) if strings.HasPrefix(field, "#") { v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object) if v != nil { currentStatus = "#CHECKSET" } } for _, failState := range failStates { if currentStatus == failState { return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus)) } } return object, currentStatus, nil } } // DescribeMaxComputeQuota >>> Encapsulated.