alicloud/service_alicloud_alb.go (1,039 lines of code) (raw):

package alicloud import ( "fmt" "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" ) type AlbService struct { client *connectivity.AliyunClient } func (s *AlbService) ListAclEntries(id string) (objects []map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "ListAclEntries" request := map[string]interface{}{ "AclId": id, "MaxResults": PageSizeLarge, } for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 { if IsExpectedErrors(err, []string{"ResourceNotFound.Acl"}) { return objects, WrapErrorf(NotFoundErr("ALB:Acl", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return objects, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } resp, err := jsonpath.Get("$.AclEntries", response) if formatInt(response["TotalCount"]) != 0 && err != nil { return objects, WrapErrorf(err, FailedGetAttributeMsg, id, "$.AclEntries", response) } result, _ := resp.([]interface{}) for _, v := range result { item := v.(map[string]interface{}) objects = append(objects, item) } if nextToken, ok := response["NextToken"].(string); ok && nextToken != "" { request["NextToken"] = nextToken } else { break } } return objects, nil } func (s *AlbService) ListTagResources(id string, resourceType string) (object interface{}, err error) { client := s.client action := "ListTagResources" request := map[string]interface{}{ "RegionId": s.client.RegionId, "ResourceType": resourceType, "ResourceId.1": id, } tags := make([]interface{}, 0) var response map[string]interface{} for { wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err := client.RpcPost("Alb", "2020-06-16", action, nil, request, false) if err != nil { if IsExpectedErrors(err, []string{Throttling}) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) v, err := jsonpath.Get("$.TagResources", response) if err != nil { return resource.NonRetryableError(WrapErrorf(err, FailedGetAttributeMsg, id, "$.TagResources", response)) } if v != nil { tags = append(tags, v.([]interface{})...) } return nil }) if err != nil { err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) return } if response["NextToken"] == nil { break } request["NextToken"] = response["NextToken"] } return tags, nil } func (s *AlbService) SetResourceTags(d *schema.ResourceData, resourceType string) error { if d.HasChange("tags") { added, removed := parsingTags(d) client := s.client removedTagKeys := make([]string, 0) for _, v := range removed { if !ignoredTags(v, "") { removedTagKeys = append(removedTagKeys, v) } } if len(removedTagKeys) > 0 { action := "UnTagResources" request := map[string]interface{}{ "RegionId": s.client.RegionId, "ResourceType": resourceType, "ResourceId.1": d.Id(), } for i, key := range removedTagKeys { request[fmt.Sprintf("TagKey.%d", i+1)] = key } wait := incrementalWait(2*time.Second, 1*time.Second) err := resource.Retry(10*time.Minute, func() *resource.RetryError { response, err := client.RpcPost("Alb", "2020-06-16", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } } if len(added) > 0 { action := "TagResources" request := map[string]interface{}{ "RegionId": s.client.RegionId, "ResourceType": resourceType, "ResourceId.1": d.Id(), } count := 1 for key, value := range added { request[fmt.Sprintf("Tag.%d.Key", count)] = key request[fmt.Sprintf("Tag.%d.Value", count)] = value count++ } wait := incrementalWait(2*time.Second, 1*time.Second) err := resource.Retry(10*time.Minute, func() *resource.RetryError { response, err := client.RpcPost("Alb", "2020-06-16", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) return nil }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } } d.SetPartial("tags") } return nil } func (s *AlbService) DescribeAlbAcl(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "ListAcls" request := map[string]interface{}{ "MaxResults": 100, } idExist := false for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 { if IsExpectedErrors(err, []string{"Forbidden.Acl"}) { return object, WrapErrorf(NotFoundErr("ALB:Acl", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } totalCount, err := jsonpath.Get("$.TotalCount", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.TotalCount", response) } if fmt.Sprint(totalCount) == "0" { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } v, err := jsonpath.Get("$.Acls", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Acls", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } for _, v := range v.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["AclId"]) == id { idExist = true return v.(map[string]interface{}), nil } } if nextToken, ok := response["NextToken"].(string); ok && nextToken != "" { request["NextToken"] = nextToken } else { break } } if !idExist { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } return } func (s *AlbService) DescribeAlbSecurityPolicy(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "ListSecurityPolicies" request := map[string]interface{}{ "MaxResults": 100, } idExist := false for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.SecurityPolicies", response) if formatInt(response["TotalCount"]) == 0 { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.SecurityPolicies", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } for _, v := range v.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["SecurityPolicyId"]) == id { idExist = true return v.(map[string]interface{}), nil } } if nextToken, ok := response["NextToken"].(string); ok && nextToken != "" { request["NextToken"] = nextToken } else { break } } if !idExist { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } return } func (s *AlbService) ListSystemSecurityPolicies(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "ListSystemSecurityPolicies" request := map[string]interface{}{} idExist := false wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.SecurityPolicies", response) if formatInt(response["TotalCount"]) == 0 { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.SecurityPolicies", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } for _, v := range v.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["SecurityPolicyId"]) == id { idExist = true return v.(map[string]interface{}), nil } } if !idExist { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } return object, nil } func (s *AlbService) AlbSecurityPolicyStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAlbSecurityPolicy(id) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["SecurityPolicyStatus"]) == failState { return object, fmt.Sprint(object["SecurityPolicyStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["SecurityPolicyStatus"]))) } } return object, fmt.Sprint(object["SecurityPolicyStatus"]), nil } } func (s *AlbService) ListServerGroupServers(id string) (object []interface{}, err error) { var response map[string]interface{} action := "ListServerGroupServers" client := s.client request := map[string]interface{}{ "ServerGroupId": id, } idExist := false for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } if formatInt(response["TotalCount"]) == 0 { return object, nil } resp, err := jsonpath.Get("$.Servers", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Servers", response) } if v, ok := resp.([]interface{}); !ok || len(v) < 1 { return object, WrapErrorf(NotFoundErr("Alb:ServerGroup", id), NotFoundWithResponse, response) } for _, v := range resp.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["ServerGroupId"]) == id { idExist = true return resp.([]interface{}), nil } } if nextToken, ok := response["NextToken"].(string); ok && nextToken != "" { request["NextToken"] = nextToken } else { break } } if !idExist { return object, WrapErrorf(NotFoundErr("Alb:ServerGroup", id), NotFoundWithResponse, response) } return object, nil } func (s *AlbService) DescribeAlbServerGroup(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "ListServerGroups" client := s.client request := map[string]interface{}{ "MaxResults": PageSizeXLarge, } idExist := false for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } resp, err := jsonpath.Get("$.ServerGroups", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.ServerGroups", response) } if v, ok := resp.([]interface{}); !ok || len(v) < 1 { return object, WrapErrorf(NotFoundErr("Alb:ServerGroup", id), NotFoundWithResponse, response) } for _, v := range resp.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["ServerGroupId"]) == id { idExist = true return v.(map[string]interface{}), nil } } if nextToken, ok := response["NextToken"].(string); ok && nextToken != "" { request["NextToken"] = nextToken } else { break } } if !idExist { return object, WrapErrorf(NotFoundErr("Alb:ServerGroup", id), NotFoundWithResponse, response) } return object, nil } func (s *AlbService) AlbServerGroupStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAlbServerGroup(id) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["ServerGroupStatus"]) == failState { return object, fmt.Sprint(object["ServerGroupStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["ServerGroupStatus"]))) } } return object, fmt.Sprint(object["ServerGroupStatus"]), nil } } func (s *AlbService) DescribeAlbLoadBalancer(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetLoadBalancerAttribute" request := map[string]interface{}{ "LoadBalancerId": id, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 { if IsExpectedErrors(err, []string{"ResourceNotFound.LoadBalancer"}) { return object, WrapErrorf(NotFoundErr("ALB:LoadBalancer", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response) } object = v.(map[string]interface{}) return object, nil } func (s *AlbService) GetLoadBalancerAttribute(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetLoadBalancerAttribute" request := map[string]interface{}{ "LoadBalancerId": id, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 { if IsExpectedErrors(err, []string{"ResourceNotFound.LoadBalancer"}) { return object, WrapErrorf(NotFoundErr("ALB:LoadBalancer", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response) } object = v.(map[string]interface{}) return object, nil } func (s *AlbService) AlbLoadBalancerStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAlbLoadBalancer(id) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["LoadBalancerStatus"]) == failState { return object, fmt.Sprint(object["LoadBalancerStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["LoadBalancerStatus"]))) } } return object, fmt.Sprint(object["LoadBalancerStatus"]), nil } } func (s *AlbService) AlbLoadBalancerEditionRefreshFunc(d *schema.ResourceData, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAlbLoadBalancer(d.Id()) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["LoadBalancerEdition"]) == failState { return object, fmt.Sprint(object["LoadBalancerEdition"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["LoadBalancerEdition"]))) } } return object, fmt.Sprint(object["LoadBalancerEdition"]), nil } } func (s *AlbService) AlbAclStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAlbAcl(id) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["AclStatus"]) == failState { return object, fmt.Sprint(object["AclStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["AclStatus"]))) } } return object, fmt.Sprint(object["AclStatus"]), nil } } func (s *AlbService) AlbListenerStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAlbListener(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["ListenerStatus"]) == failState { return object, fmt.Sprint(object["ListenerStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["ListenerStatus"]))) } } return object, fmt.Sprint(object["ListenerStatus"]), nil } } func (s *AlbService) DescribeAlbListener(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetListenerAttribute" request := map[string]interface{}{ "ListenerId": id, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 { if IsExpectedErrors(err, []string{"ResourceNotFound.Listener"}) { return object, WrapErrorf(NotFoundErr("ALB:Listener", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response) } object = v.(map[string]interface{}) return object, nil } func (s *AlbService) DescribeAlbRule(id, direction string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "ListRules" request := map[string]interface{}{ "MaxResults": PageSizeLarge, } if direction != "" { request["Direction"] = direction } idExist := false for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Rules", response) if formatInt(response["TotalCount"]) != 0 && err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Rules", response) } if val, ok := v.([]interface{}); !ok || len(val) < 1 { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } for _, v := range v.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["RuleId"]) == id { idExist = true return v.(map[string]interface{}), nil } } if nextToken, ok := response["NextToken"].(string); ok && nextToken != "" { request["NextToken"] = nextToken } else { break } } if !idExist { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } return } func (s *AlbService) AlbRuleStateRefreshFunc(id, direction string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAlbRule(id, direction) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["RuleStatus"]) == failState { return object, fmt.Sprint(object["RuleStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["RuleStatus"]))) } } return object, fmt.Sprint(object["RuleStatus"]), nil } } func (s *AlbService) DescribeAlbHealthCheckTemplate(id string) (object map[string]interface{}, err error) { var response map[string]interface{} action := "GetHealthCheckTemplateAttribute" client := s.client request := map[string]interface{}{ "HealthCheckTemplateId": id, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 { if IsExpectedErrors(err, []string{"ResourceNotFound.HealthCheckTemplate"}) { return object, WrapErrorf(NotFoundErr("ALB:HealthCheckTemplate", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response) } object = v.(map[string]interface{}) return object, nil } func (s *AlbService) DescribeAlbListenerAdditionalCertificateAttachment(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client parts, err := ParseResourceId(id, 2) if err != nil { return object, WrapError(err) } action := "ListListenerCertificates" request := map[string]interface{}{ "ListenerId": parts[0], "MaxResults": PageSizeLarge, } idExist := false for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Certificates", response) if formatInt(response["TotalCount"]) != 0 && err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Certificates", response) } if val, ok := v.([]interface{}); !ok || len(val) < 1 { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } for _, v := range v.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["CertificateId"]) == parts[1] { idExist = true return v.(map[string]interface{}), nil } } if nextToken, ok := response["NextToken"].(string); ok && nextToken != "" { request["NextToken"] = nextToken } else { break } } if !idExist { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } return } func (s *AlbService) AlbListenerAdditionalCertificateAttachmentStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAlbListenerAdditionalCertificateAttachment(id) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["Status"]) == failState { return object, fmt.Sprint(object["Status"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["Status"]))) } } return object, fmt.Sprint(object["Status"]), nil } } func (s *AlbService) DescribeAlbListenerAclAttachment(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client parts, err := ParseResourceId(id, 2) if err != nil { return object, WrapError(err) } action := "GetListenerAttribute" request := map[string]interface{}{ "ListenerId": parts[0], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 { if IsExpectedErrors(err, []string{"ResourceNotFound.Listener"}) { return object, WrapErrorf(NotFoundErr("ALB", id), NotFoundWithResponse, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response) } listenerObject := v.(map[string]interface{}) aclConfig, ok := listenerObject["AclConfig"] if !ok { return object, WrapErrorf(NotFoundErr("alb_listener_acl_attachment", id), NotFoundWithResponse, response) } idExist := false aclConfigObject := aclConfig.(map[string]interface{}) object = make(map[string]interface{}) object["AclType"] = aclConfigObject["AclType"] if aclRelationsLis, ok := aclConfigObject["AclRelations"]; ok { for _, v := range aclRelationsLis.([]interface{}) { aclRelations := v.(map[string]interface{}) if fmt.Sprint(aclRelations["AclId"]) == parts[1] { object["AclId"] = aclRelations["AclId"] object["Status"] = aclRelations["Status"] idExist = true break } } } if !idExist { return nil, WrapErrorf(NotFoundErr("alb_listener_acl_attachment", id), NotFoundWithResponse, response) } return object, nil } func (s *AlbService) DescribeAlbAclEntryAttachment(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client parts, err := ParseResourceId(id, 2) if err != nil { return object, WrapError(err) } action := "ListAclEntries" request := map[string]interface{}{ "AclId": parts[0], "MaxResults": PageSizeLarge, } idExist := false for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Alb", "2020-06-16", action, nil, request, 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 { if IsExpectedErrors(err, []string{"ResourceNotFound.Acl"}) { return object, WrapErrorf(NotFoundErr("ALB:AclEntryAttachment", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } resp, err := jsonpath.Get("$.AclEntries", response) if formatInt(response["TotalCount"]) != 0 && err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.AclEntries", response) } if v, ok := resp.([]interface{}); !ok || len(v) < 1 { return object, WrapErrorf(NotFoundErr("ALB:AclEntryAttachment", id), NotFoundWithResponse, response) } for _, v := range resp.([]interface{}) { item := v.(map[string]interface{}) if fmt.Sprint(item["Entry"]) == parts[1] { idExist = true return item, nil } } if nextToken, ok := response["NextToken"].(string); ok && nextToken != "" { request["NextToken"] = nextToken } else { break } } if !idExist { return object, WrapErrorf(NotFoundErr("ALB:AclEntryAttachment", id), NotFoundWithResponse, response) } return object, nil } func (s *AlbService) AlbAclEntryAttachmentStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAlbAclEntryAttachment(id) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["Status"]) == failState { return object, fmt.Sprint(object["Status"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["Status"]))) } } return object, fmt.Sprint(object["Status"]), nil } } func (s *AlbService) DescribeAlbAscript(id string) (object map[string]interface{}, err error) { client := s.client request := map[string]interface{}{ "AScriptIds.1": id, } var response map[string]interface{} action := "ListAScripts" wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { resp, err := client.RpcPost("Alb", "2020-06-16", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } response = resp addDebug(action, response, request) return nil }) if err != nil { if IsExpectedErrors(err, []string{"InternalError"}) { return object, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.AScripts", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.AScripts", response) } resp := v.([]interface{}) if len(resp) < 1 { return object, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } return resp[0].(map[string]interface{}), nil } func (s *AlbService) AlbAscriptStateRefreshFunc(d *schema.ResourceData, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAlbAscript(d.Id()) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["AScriptStatus"]) == failState { return object, fmt.Sprint(object["AScriptStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["AScriptStatus"]))) } } return object, fmt.Sprint(object["AScriptStatus"]), nil } } func (s *AlbService) DescribeAlbLoadBalancerCommonBandwidthPackageAttachment(id string) (object map[string]interface{}, err error) { client := s.client parts, err := ParseResourceId(id, 2) if err != nil { return object, WrapError(err) } request := map[string]interface{}{ "LoadBalancerId": parts[0], } var response map[string]interface{} action := "GetLoadBalancerAttribute" wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { resp, err := client.RpcPost("Alb", "2020-06-16", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } response = resp addDebug(action, response, request) return nil }) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$", response) } return v.(map[string]interface{}), nil } func (s *AlbService) AlbLoadBalancerCommonBandwidthPackageAttachmentStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeAlbLoadBalancerCommonBandwidthPackageAttachment(id) if err != nil { if NotFoundError(err) { return nil, "", nil } return nil, "", WrapError(err) } loadBalancerStatus82 := object["LoadBalancerStatus"] for _, failState := range failStates { if fmt.Sprint(loadBalancerStatus82) == failState { return object, fmt.Sprint(loadBalancerStatus82), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(loadBalancerStatus82))) } } return object, fmt.Sprint(loadBalancerStatus82), nil } }