alibabacloudstack/service_apsarastack_slb.go (952 lines of code) (raw):

package alibabacloudstack import ( "encoding/json" "fmt" "log" "regexp" "strconv" "strings" "time" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses" "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "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" ) type SlbService struct { client *connectivity.AlibabacloudStackClient } type SlbTag struct { TagKey string TagValue string } const max_num_per_time = 50 const tags_max_num_per_time = 5 const tags_max_page_size = 50 func (s *SlbService) DoSlbDescribeloadbalancerattributeRequest(id string) (*slb.DescribeLoadBalancerAttributeResponse, error) { return s.DescribeSlb(id) } func (s *SlbService) DescribeSlb(id string) (*slb.DescribeLoadBalancerAttributeResponse, error) { response := &slb.DescribeLoadBalancerAttributeResponse{} request := slb.CreateDescribeLoadBalancerAttributeRequest() s.client.InitRpcRequest(*request.RpcRequest) request.LoadBalancerId = id raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.DescribeLoadBalancerAttribute(request) }) bresponse, ok := raw.(*slb.DescribeLoadBalancerAttributeResponse) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"InvalidLoadBalancerId.NotFound"}) { err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Slb", id)), errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } else { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } return response, err } addDebug(request.GetActionName(), raw, request.RpcRequest) if bresponse.LoadBalancerId == "" { err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Slb", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } return bresponse, err } func (s *SlbService) DescribeSlbRule(id string) (*slb.DescribeRuleAttributeResponse, error) { response := &slb.DescribeRuleAttributeResponse{} request := slb.CreateDescribeRuleAttributeRequest() s.client.InitRpcRequest(*request.RpcRequest) request.RuleId = id raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.DescribeRuleAttribute(request) }) bresponse, ok := raw.(*slb.DescribeRuleAttributeResponse) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"InvalidRuleId.NotFound"}) { return response, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SlbRule", id)), errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_rule", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return bresponse, nil } func (s *SlbService) DoSlbDescribevservergroupattributeRequest(id string) (*slb.DescribeVServerGroupAttributeResponse, error) { return s.DescribeSlbServerGroup(id) } func (s *SlbService) DescribeSlbServerGroup(id string) (*slb.DescribeVServerGroupAttributeResponse, error) { response := &slb.DescribeVServerGroupAttributeResponse{} request := slb.CreateDescribeVServerGroupAttributeRequest() s.client.InitRpcRequest(*request.RpcRequest) request.VServerGroupId = id raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.DescribeVServerGroupAttribute(request) }) bresponse, ok := raw.(*slb.DescribeVServerGroupAttributeResponse) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"The specified VServerGroupId does not exist", "InvalidParameter"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_server_group", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if bresponse.VServerGroupId == "" { return response, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SlbServerGroup", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } return bresponse, err } func (s *SlbService) DescribeSlbMasterSlaveServerGroup(id string) (*slb.DescribeMasterSlaveServerGroupAttributeResponse, error) { response := &slb.DescribeMasterSlaveServerGroupAttributeResponse{} request := slb.CreateDescribeMasterSlaveServerGroupAttributeRequest() s.client.InitRpcRequest(*request.RpcRequest) request.MasterSlaveServerGroupId = id raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.DescribeMasterSlaveServerGroupAttribute(request) }) bresponse, ok := raw.(*slb.DescribeMasterSlaveServerGroupAttributeResponse) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"The specified MasterSlaveGroupId does not exist", "InvalidParameter"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return response, errmsgs.WrapErrorf(err, errmsgs.DefaultDebugMsg, "alibabacloudstack_slb_master_slave_server_group", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if bresponse.MasterSlaveServerGroupId == "" { return response, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SlbMasterSlaveServerGroup", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } return bresponse, err } func (s *SlbService) DescribeSlbBackendServer(id string) (*slb.DescribeLoadBalancerAttributeResponse, error) { response := &slb.DescribeLoadBalancerAttributeResponse{} request := slb.CreateDescribeLoadBalancerAttributeRequest() s.client.InitRpcRequest(*request.RpcRequest) request.LoadBalancerId = id raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.DescribeLoadBalancerAttribute(request) }) bresponse, ok := raw.(*slb.DescribeLoadBalancerAttributeResponse) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"InvalidLoadBalancerId.NotFound"}) { err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SlbBackendServers", id)), errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } else { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_backend_server", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } return response, err } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if bresponse.LoadBalancerId == "" { err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SlbBackendServers", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } return bresponse, err } func (s *SlbService) DescribeSlbListener(id string) (listener map[string]interface{}, err error) { parts, err := ParseSlbListenerId(id) if err != nil { return nil, errmsgs.WrapError(err) } protocol := parts[1] apiName := fmt.Sprintf("DescribeLoadBalancer%sListenerAttribute", strings.ToUpper(string(protocol))) request := s.client.NewCommonRequest("GET", "slb", "2014-05-15", apiName, "") request.QueryParams["LoadBalancerId"] = parts[0] port, _ := strconv.Atoi(parts[2]) request.QueryParams["ListenerPort"] = string(requests.NewInteger(port)) err = resource.Retry(5*time.Minute, func() *resource.RetryError { raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.ProcessCommonRequest(request) }) response, ok := raw.(*responses.CommonResponse) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"The specified resource does not exist"}) { return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)) } else if errmsgs.IsExpectedErrors(err, errmsgs.SlbIsBusy) { return resource.RetryableError(errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_slb_listener", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_listener", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)) } addDebug(request.GetActionName(), raw, request, request.QueryParams) if err = json.Unmarshal(response.GetHttpContentBytes(), &listener); err != nil { return resource.NonRetryableError(errmsgs.WrapError(err)) } if port, ok := listener["ListenerPort"]; ok && port.(float64) > 0 { return nil } else { return resource.RetryableError(errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SlbListener", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)) } }) return } func (s *SlbService) DoSlbDescribeaccesscontrollistattributeRequest(id string) (*slb.DescribeAccessControlListAttributeResponse, error) { return s.DescribeSlbAcl(id) } func (s *SlbService) DescribeSlbAcl(id string) (*slb.DescribeAccessControlListAttributeResponse, error) { response := &slb.DescribeAccessControlListAttributeResponse{} request := slb.CreateDescribeAccessControlListAttributeRequest() s.client.InitRpcRequest(*request.RpcRequest) request.AclId = id raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.DescribeAccessControlListAttribute(request) }) bresponse, ok := raw.(*slb.DescribeAccessControlListAttributeResponse) if err != nil { if err != nil { if errmsgs.IsExpectedErrors(err, []string{"AclNotExist"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_acl", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return bresponse, nil } func (s *SlbService) WaitForSlbAcl(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeSlbAcl(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } else { return nil } time.Sleep(DefaultIntervalShort * time.Second) if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.AclId, id, errmsgs.ProviderERROR) } } } func (s *SlbService) WaitForSlb(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeSlb(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } else if strings.ToLower(object.LoadBalancerStatus) == strings.ToLower(string(status)) { //TODO break } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.LoadBalancerStatus, status, errmsgs.ProviderERROR) } time.Sleep(DefaultIntervalShort * time.Second) } return nil } func (s *SlbService) WaitForSlbListener(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeSlbListener(id) if err != nil && !errmsgs.IsExpectedErrors(err, []string{"InvalidLoadBalancerId.NotFound"}) { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } gotStatus := "" if value, ok := object["Status"]; ok { gotStatus = strings.ToLower(value.(string)) } if gotStatus == strings.ToLower(string(status)) { //TODO break } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, gotStatus, status, errmsgs.ProviderERROR) } time.Sleep(DefaultIntervalShort * time.Second) } return nil } func (s *SlbService) WaitForSlbRule(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { _, err := s.DescribeSlbRule(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if status != Deleted { break } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, "", id, errmsgs.ProviderERROR) } time.Sleep(DefaultIntervalShort * time.Second) } return nil } func (s *SlbService) WaitForSlbServerGroup(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeSlbServerGroup(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if object.VServerGroupId == id { break } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.VServerGroupId, id, errmsgs.ProviderERROR) } time.Sleep(DefaultIntervalShort * time.Second) } return nil } func (s *SlbService) WaitForSlbMasterSlaveServerGroup(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeSlbMasterSlaveServerGroup(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if object.MasterSlaveServerGroupId == id && status != Deleted { break } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.MasterSlaveServerGroupId, id, errmsgs.ProviderERROR) } time.Sleep(DefaultIntervalShort * time.Second) } return nil } func (s *SlbService) WaitSlbAttribute(id string, instanceSet *schema.Set, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) RETRY: object, err := s.DescribeSlb(id) if err != nil { if errmsgs.NotFoundError(err) { return nil } return errmsgs.WrapError(err) } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, Null, id, errmsgs.ProviderERROR) } servers := object.BackendServers.BackendServer if len(servers) > 0 { for _, s := range servers { if instanceSet.Contains(s.ServerId) { goto RETRY } } } return nil } func (s *SlbService) slbRemoveAccessControlListEntryPerTime(list []interface{}, id string) error { request := slb.CreateRemoveAccessControlListEntryRequest() s.client.InitRpcRequest(*request.RpcRequest) request.AclId = id b, err := json.Marshal(list) if err != nil { return errmsgs.WrapError(err) } request.AclEntrys = string(b) raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.RemoveAccessControlListEntry(request) }) bresponse, ok := raw.(*responses.CommonResponse) if err != nil { if !errmsgs.IsExpectedErrors(err, []string{"AclEntryEmpty"}) { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_remove_access_control_list_entry", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return nil } func (s *SlbService) SlbRemoveAccessControlListEntry(list []interface{}, aclId string) error { num := len(list) if num <= 0 { return nil } t := (num + max_num_per_time - 1) / max_num_per_time for i := 0; i < t; i++ { start := i * max_num_per_time end := (i + 1) * max_num_per_time if end > num { end = num } slice := list[start:end] if err := s.slbRemoveAccessControlListEntryPerTime(slice, aclId); err != nil { return err } } return nil } func (s *SlbService) slbAddAccessControlListEntryPerTime(list []interface{}, id string) error { request := slb.CreateAddAccessControlListEntryRequest() s.client.InitRpcRequest(*request.RpcRequest) request.AclId = id b, err := json.Marshal(list) if err != nil { return errmsgs.WrapError(err) } request.AclEntrys = string(b) raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.AddAccessControlListEntry(request) }) bresponse, ok := raw.(*responses.CommonResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_add_access_control_list_entry", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return nil } func (s *SlbService) SlbAddAccessControlListEntry(list []interface{}, aclId string) error { num := len(list) if num <= 0 { return nil } t := (num + max_num_per_time - 1) / max_num_per_time for i := 0; i < t; i++ { start := i * max_num_per_time end := (i + 1) * max_num_per_time if end > num { end = num } slice := list[start:end] if err := s.slbAddAccessControlListEntryPerTime(slice, aclId); err != nil { return err } } return nil } // Flattens an array of slb.AclEntry into a []map[string]string func (s *SlbService) FlattenSlbAclEntryMappings(list []slb.AclEntry) []map[string]interface{} { result := make([]map[string]interface{}, 0, len(list)) for _, i := range list { l := map[string]interface{}{ "entry": i.AclEntryIP, "comment": i.AclEntryComment, } result = append(result, l) } return result } // Flattens an array of slb.AclEntry into a []map[string]string func (s *SlbService) flattenSlbRelatedListenerMappings(list []slb.RelatedListener) []map[string]interface{} { result := make([]map[string]interface{}, 0, len(list)) for _, i := range list { l := map[string]interface{}{ "load_balancer_id": i.LoadBalancerId, "protocol": i.Protocol, "frontend_port": i.ListenerPort, "acl_type": i.AclType, } result = append(result, l) } return result } func (s *SlbService) DoSlbDescribecacertificatesRequest(id string) (*slb.CACertificate, error) { return s.DescribeSlbCACertificate(id) } func (s *SlbService) DescribeSlbCACertificate(id string) (*slb.CACertificate, error) { certificate := &slb.CACertificate{} request := slb.CreateDescribeCACertificatesRequest() s.client.InitRpcRequest(*request.RpcRequest) request.CACertificateId = id raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.DescribeCACertificates(request) }) bresponse, ok := raw.(*responses.CommonResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return certificate, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_ca_certificate", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ := raw.(*slb.DescribeCACertificatesResponse) if len(response.CACertificates.CACertificate) < 1 { return certificate, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SlbCACertificate", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } return &response.CACertificates.CACertificate[0], nil } func (s *SlbService) WaitForSlbCACertificate(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeSlbCACertificate(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } else { break } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.CACertificateId, id, errmsgs.ProviderERROR) } } return nil } func (s *SlbService) DoSlbDescribeservercertificateRequest(id string) (*slb.ServerCertificate, error) { return s.DescribeSlbServerCertificate(id) } func (s *SlbService) DescribeSlbServerCertificate(id string) (*slb.ServerCertificate, error) { certificate := &slb.ServerCertificate{} request := slb.CreateDescribeServerCertificatesRequest() s.client.InitRpcRequest(*request.RpcRequest) request.ServerCertificateId = id raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.DescribeServerCertificates(request) }) bresponse, ok := raw.(*responses.CommonResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return certificate, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_server_certificate", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ := raw.(*slb.DescribeServerCertificatesResponse) if len(response.ServerCertificates.ServerCertificate) < 1 || response.ServerCertificates.ServerCertificate[0].ServerCertificateId != id { return certificate, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SlbServerCertificate", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } return &response.ServerCertificates.ServerCertificate[0], nil } func (s *SlbService) WaitForSlbServerCertificate(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeSlbServerCertificate(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if object.ServerCertificateId == id { break } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.ServerCertificateId, id, errmsgs.ProviderERROR) } } return nil } func toSlbTagsString(tags []Tag) string { slbTags := make([]SlbTag, 0, len(tags)) for _, tag := range tags { slbTag := SlbTag{ TagKey: tag.Key, TagValue: tag.Value, } slbTags = append(slbTags, slbTag) } b, _ := json.Marshal(slbTags) return string(b) } func (s *SlbService) DoSlbDescribedomainextensionattributeRequest(domainExtensionId string) (*slb.DescribeDomainExtensionAttributeResponse, error) { return s.DescribeDomainExtensionAttribute(domainExtensionId) } func (s *SlbService) DescribeDomainExtensionAttribute(domainExtensionId string) (*slb.DescribeDomainExtensionAttributeResponse, error) { response := &slb.DescribeDomainExtensionAttributeResponse{} request := slb.CreateDescribeDomainExtensionAttributeRequest() s.client.InitRpcRequest(*request.RpcRequest) request.DomainExtensionId = domainExtensionId var raw interface{} var err error err = resource.Retry(5*time.Minute, func() *resource.RetryError { raw, err = s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.DescribeDomainExtensionAttribute(request) }) if err != nil { if errmsgs.IsExpectedErrors(err, []string{errmsgs.AlibabacloudStackGoClientFailure, "ServiceUnavailable", errmsgs.Throttling}) { time.Sleep(10 * time.Second) return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return nil }) bresponse, ok := raw.(*slb.DescribeDomainExtensionAttributeResponse) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"InvalidParameter.DomainExtensionId", "InvalidParameter"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_domain_extension", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } if bresponse.DomainExtensionId != domainExtensionId { return response, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SLBDomainExtension", domainExtensionId)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } return bresponse, nil } func (s *SlbService) WaitForSlbDomainExtension(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { _, err := s.DescribeDomainExtensionAttribute(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, Null, string(status), errmsgs.ProviderERROR) } } } func (s *SlbService) setInstanceTags(d *schema.ResourceData, resourceType TagResourceType) error { oraw, nraw := d.GetChange("tags") o := oraw.(map[string]interface{}) n := nraw.(map[string]interface{}) create, remove := s.diffTags(s.tagsFromMap(o), s.tagsFromMap(n)) if len(remove) > 0 { var tagKey []string for _, v := range remove { tagKey = append(tagKey, v.TagKey) } request := slb.CreateRemoveTagsRequest() s.client.InitRpcRequest(*request.RpcRequest) request.LoadBalancerId = d.Id() bytes, _ := json.Marshal(remove) s2 := string(bytes) request.Tags = fmt.Sprint(s2) request.RegionId = s.client.RegionId wait := incrementalWait(1*time.Second, 1*time.Second) err := resource.Retry(10*time.Minute, func() *resource.RetryError { raw, err := s.client.WithSlbClient(func(client *slb.Client) (interface{}, error) { return client.RemoveTags(request) }) bresponse, ok := raw.(*responses.CommonResponse) if err != nil { if errmsgs.IsThrottling(err) { wait() return resource.RetryableError(err) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_remove_tags", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return nil }) if err != nil { return err } } if len(create) > 0 { request := slb.CreateAddTagsRequest() s.client.InitRpcRequest(*request.RpcRequest) request.LoadBalancerId = d.Id() bytes, _ := json.Marshal(create) s2 := string(bytes) request.Tags = fmt.Sprint(s2) request.RegionId = s.client.RegionId wait := incrementalWait(1*time.Second, 1*time.Second) err := resource.Retry(10*time.Minute, func() *resource.RetryError { raw, err := s.client.WithSlbClient(func(client *slb.Client) (interface{}, error) { return client.AddTags(request) }) bresponse, ok := raw.(*responses.CommonResponse) if err != nil { if errmsgs.IsThrottling(err) { wait() return resource.RetryableError(err) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_add_tags", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return nil }) if err != nil { return err } } return nil } func (s *SlbService) tagsToMap(tags []slb.TagSet) map[string]string { result := make(map[string]string) for _, t := range tags { if !s.ignoreTag(t) { result[t.TagKey] = t.TagValue } } return result } func (s *SlbService) ignoreTag(t slb.TagSet) bool { filter := []string{"^aliyun", "^acs:", "^http://", "^https://"} for _, v := range filter { log.Printf("[DEBUG] Matching prefix %v with %v\n", v, t.TagKey) ok, _ := regexp.MatchString(v, t.TagKey) if ok { log.Printf("[DEBUG] Found Alibaba Cloud specific t %s (val: %s), ignoring.\n", t.TagKey, t.TagValue) return true } } return false } func (s *SlbService) diffTags(oldTags, newTags []slb.TagSet) ([]slb.TagSet, []slb.TagSet) { // First, we're creating everything we have create := make(map[string]interface{}) for _, t := range newTags { create[t.TagKey] = t.TagValue } // Build the list of what to remove var remove []slb.TagSet for _, t := range oldTags { old, ok := create[t.TagKey] if !ok || old != t.TagValue { // Delete it! remove = append(remove, t) } } return s.tagsFromMap(create), remove } func (s *SlbService) tagsFromMap(m map[string]interface{}) []slb.TagSet { result := make([]slb.TagSet, 0, len(m)) for k, v := range m { result = append(result, slb.TagSet{ TagKey: k, TagValue: v.(string), }) } return result } func (s *SlbService) DescribeTags(resourceId string, resourceTags map[string]interface{}, resourceType TagResourceType) (tags []slb.TagSet, err error) { request := slb.CreateDescribeTagsRequest() s.client.InitRpcRequest(*request.RpcRequest) request.LoadBalancerId = resourceId if resourceTags != nil && len(resourceTags) > 0 { var reqTags []slb.TagSet for key, value := range resourceTags { reqTags = append(reqTags, slb.TagSet{ TagKey: key, TagValue: value.(string), }) } bytes, _ := json.Marshal(reqTags) s2 := string(bytes) request.Tags = fmt.Sprint(s2) } err = resource.Retry(5*time.Minute, func() *resource.RetryError { raw, err := s.client.WithSlbClient(func(Client *slb.Client) (interface{}, error) { return Client.DescribeTags(request) }) bresponse, ok := raw.(*slb.DescribeTagsResponse) if err != nil { if errmsgs.IsExpectedErrors(err, []string{errmsgs.Throttling}) { time.Sleep(2 * time.Second) return resource.RetryableError(err) } errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_describe_tags", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)) } tags = bresponse.TagSets.TagSet return nil }) if err != nil { return nil, err } return } func (s *SlbService) SetAccessLogsDownloadAttribute(logs_download_attributes map[string]interface{}, load_balancer_id string) error { request := requests.NewCommonRequest() if strings.ToLower(s.client.Config.Protocol) == "https" { request.Scheme = "https" } else { request.Scheme = "http" } logs_attr_str := fmt.Sprintf("[{\"LoadBalancerId\":\"%s\",\"LogProject\":\"%s\",\"Logstore\":\"%s\",\"LogType\":\"layer7\",\"RoleName\":\"aliyunlogarchiverole\",\"Department\":\"%s\",\"ResourceGroup\":\"%s\"}]", load_balancer_id, logs_download_attributes["log_project"], logs_download_attributes["log_store"], s.client.Department, s.client.ResourceGroup) request.Method = "POST" request.Product = "Slb" request.Version = "2014-05-15" request.ApiName = "SetAccessLogsDownloadAttribute" request.RegionId = s.client.RegionId request.Headers = map[string]string{ "RegionId": s.client.RegionId, } request.QueryParams = map[string]string{ "Product": "slb", "Department": s.client.Department, "ResourceGroup": s.client.ResourceGroup, "RegionId": s.client.RegionId, "LogsDownloadAttributes": logs_attr_str, "loadBalancerId": load_balancer_id, } raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.ProcessCommonRequest(request) }) addDebug(request.GetActionName(), raw, request, request.QueryParams) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "apsarastack_slb", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } response, _ := raw.(*responses.CommonResponse) if !response.IsSuccess() { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "apsarastack_slb", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } return nil } func (s *SlbService) DeleteAccessLogsDownloadAttribute(load_balancer_id string) error { request := requests.NewCommonRequest() if strings.ToLower(s.client.Config.Protocol) == "https" { request.Scheme = "https" } else { request.Scheme = "http" } logs_download_attributes := fmt.Sprintf("[{\"LoadBalancerId\":\"%s\",}]", load_balancer_id) request.Method = "POST" request.Product = "Slb" request.Version = "2014-05-15" request.ApiName = "DeleteAccessLogsDownloadAttribute" request.RegionId = s.client.RegionId request.Headers = map[string]string{ "RegionId": s.client.RegionId, } request.QueryParams = map[string]string{ "Product": "slb", "Department": s.client.Department, "ResourceGroup": s.client.ResourceGroup, "RegionId": s.client.RegionId, "LogsDownloadAttributes": logs_download_attributes, "loadBalancerId": load_balancer_id, } raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.ProcessCommonRequest(request) }) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "apsarastack_slb", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } addDebug(request.GetActionName(), raw, request, request.QueryParams) response, _ := raw.(*responses.CommonResponse) if !response.IsSuccess() { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "apsarastack_slb", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } return nil } func (s *SlbService) DescribeAccessLogsDownloadAttribute(logs_type string, load_balancer_id string) (logsattr []interface{}, err error) { request := requests.NewCommonRequest() if strings.ToLower(s.client.Config.Protocol) == "https" { request.Scheme = "https" } else { request.Scheme = "http" } request.Method = "POST" request.Product = "Slb" request.Version = "2014-05-15" request.ApiName = "DescribeAccessLogsDownloadAttribute" request.RegionId = s.client.RegionId request.Headers = map[string]string{ "RegionId": s.client.RegionId, } logsattr = make([]interface{}, 0) PageNumber := 1 for { request.QueryParams = map[string]string{ "Product": "slb", "Department": s.client.Department, "ResourceGroup": s.client.ResourceGroup, "RegionId": s.client.RegionId, "PageNumber": "1", "PageSize": "50", "loadBalancerId": load_balancer_id, "LogType": "layer7", } raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { return slbClient.ProcessCommonRequest(request) }) if err != nil { return nil, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "apsarastack_slb", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } addDebug(request.GetActionName(), raw, request, request.QueryParams) response, _ := raw.(*responses.CommonResponse) if !response.IsSuccess() { return nil, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "apsarastack_slb", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } response_body := make(map[string]interface{}) err = json.Unmarshal(response.GetHttpContentBytes(), &response_body) if err != nil { return nil, errmsgs.WrapError(err) } else { logsattr = append(logsattr, response_body["LogsDownloadAttributes"].([]interface{})...) } if len(logsattr) < response_body["TotalCount"].(int) { PageNumber += 1 } else { break } } return logsattr, nil }