diff --git a/CHANGELOG.md b/CHANGELOG.md index d3779083866..b91f3680465 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ FEATURES: IMPROVEMENTS: +- Support provider thread safety [GH-432] - add tags to security group [GH-423] - Resource router_interface support PrePaid [GH-425] - resource alicloud_slb_listener support acl [GH-426] diff --git a/alicloud/alicloud_sweeper_test.go b/alicloud/alicloud_sweeper_test.go index 8bf28fc4dd2..aa4a20afba7 100644 --- a/alicloud/alicloud_sweeper_test.go +++ b/alicloud/alicloud_sweeper_test.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/common" "github.com/hashicorp/terraform/helper/resource" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestMain(m *testing.M) { @@ -25,7 +26,7 @@ func sharedClientForRegion(region string) (interface{}, error) { return nil, fmt.Errorf("empty ALICLOUD_SECRET_KEY") } - conf := Config{ + conf := connectivity.Config{ Region: common.Region(region), RegionId: region, AccessKey: accessKey, diff --git a/alicloud/common.go b/alicloud/common.go index 39ce3616600..5405e06a367 100644 --- a/alicloud/common.go +++ b/alicloud/common.go @@ -1,23 +1,25 @@ package alicloud import ( + "bytes" "encoding/base64" "encoding/json" - "encoding/xml" "fmt" "io/ioutil" + "log" "os" "os/user" "strconv" "strings" + "github.com/mitchellh/go-homedir" + "gopkg.in/yaml.v2" + "time" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" - "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/denverdino/aliyungo/common" "github.com/google/uuid" - "github.com/hashicorp/terraform/helper/schema" ) type InstanceNetWork string @@ -146,14 +148,6 @@ const ( PageSizeLarge = 50 ) -func getRegion(d *schema.ResourceData, meta interface{}) common.Region { - return meta.(*AliyunClient).Region -} - -func getRegionId(d *schema.ResourceData, meta interface{}) string { - return meta.(*AliyunClient).RegionId -} - // Protocol represents network protocol type Protocol string @@ -197,8 +191,6 @@ const COMMA_SEPARATED = "," const COLON_SEPARATED = ":" -const DOT_SEPARATED = "." - const LOCAL_HOST_IP = "127.0.0.1" // Takes the result of flatmap.Expand for an array of strings @@ -284,25 +276,6 @@ func getPagination(pageNumber, pageSize int) (pagination common.Pagination) { const CharityPageUrl = "http://promotion.alicdn.com/help/oss/error.html" -func (client *AliyunClient) JudgeRegionValidation(key, region string) error { - resp, err := client.ecsconn.DescribeRegions(ecs.CreateDescribeRegionsRequest()) - if err != nil { - return fmt.Errorf("DescribeRegions got an error: %#v", err) - } - if resp == nil || len(resp.Regions.Region) < 1 { - return GetNotFoundErrorFromString("There is no any available region.") - } - - var rs []string - for _, v := range resp.Regions.Region { - if v.RegionId == region { - return nil - } - rs = append(rs, v.RegionId) - } - return fmt.Errorf("'%s' is invalid. Expected on %v.", key, strings.Join(rs, ", ")) -} - func userDataHashSum(user_data string) string { // Check whether the user_data is not Base64 encoded. // Always calculate hash of base64 decoded value since we @@ -322,116 +295,6 @@ func Trim(v string) string { return strings.Trim(v, " ") } -// Load endpoints from endpoints.xml or environment variables to meet specified application scenario, like private cloud. -type ServiceCode string - -const ( - ECSCode = ServiceCode("ECS") - ESSCode = ServiceCode("ESS") - RAMCode = ServiceCode("RAM") - VPCCode = ServiceCode("VPC") - SLBCode = ServiceCode("SLB") - RDSCode = ServiceCode("RDS") - OSSCode = ServiceCode("OSS") - CONTAINCode = ServiceCode("CS") - DOMAINCode = ServiceCode("DOMAIN") - CDNCode = ServiceCode("CDN") - CMSCode = ServiceCode("CMS") - KMSCode = ServiceCode("KMS") - OTSCode = ServiceCode("OTS") - PVTZCode = ServiceCode("PVTZ") - LOGCode = ServiceCode("LOG") - FCCode = ServiceCode("FC") - DDSCode = ServiceCode("DDS") - STSCode = ServiceCode("STS") - CENCode = ServiceCode("CEN") - KVSTORECode = ServiceCode("KVSTORE") - DATAHUBCode = ServiceCode("DATAHUB") - MNSCode = ServiceCode("MNS") - CLOUDAPICode = ServiceCode("CLOUDAPI") -) - -//xml -type Endpoints struct { - Endpoint []Endpoint `xml:"Endpoint"` -} - -type Endpoint struct { - Name string `xml:"name,attr"` - RegionIds RegionIds `xml:"RegionIds"` - Products Products `xml:"Products"` -} - -type RegionIds struct { - RegionId string `xml:"RegionId"` -} - -type Products struct { - Product []Product `xml:"Product"` -} - -type Product struct { - ProductName string `xml:"ProductName"` - DomainName string `xml:"DomainName"` -} - -func LoadEndpoint(region string, serviceCode ServiceCode) string { - endpoint := strings.TrimSpace(os.Getenv(fmt.Sprintf("%s_ENDPOINT", string(serviceCode)))) - if endpoint != "" { - return endpoint - } - - // Load current path endpoint file endpoints.xml, if failed, it will load from environment variables TF_ENDPOINT_PATH - data, err := ioutil.ReadFile("./endpoints.xml") - if err != nil || len(data) <= 0 { - d, e := ioutil.ReadFile(os.Getenv("TF_ENDPOINT_PATH")) - if e != nil { - return "" - } - data = d - } - var endpoints Endpoints - err = xml.Unmarshal(data, &endpoints) - if err != nil { - return "" - } - for _, endpoint := range endpoints.Endpoint { - if endpoint.RegionIds.RegionId == string(region) { - for _, product := range endpoint.Products.Product { - if strings.ToLower(product.ProductName) == strings.ToLower(string(serviceCode)) { - return product.DomainName - } - } - } - } - - return "" -} - -const ApiVersion20140526 = "2014-05-26" -const ApiVersion20140828 = "2014-08-28" -const ApiVersion20160815 = "2016-08-15" -const ApiVersion20140515 = "2014-05-15" -const ApiVersion20160428 = "2016-04-28" - -type CommonRequestDomain string - -const ( - ECSDomain = CommonRequestDomain("ecs.aliyuncs.com") - ESSDomain = CommonRequestDomain("ess.aliyuncs.com") -) - -func CommonRequestInit(region string, code ServiceCode, domain CommonRequestDomain) *requests.CommonRequest { - request := requests.NewCommonRequest() - request.Version = ApiVersion20140526 - request.Domain = string(domain) - d := LoadEndpoint(region, code) - if d != "" { - request.Domain = d - } - return request -} - func ConvertIntegerToInt(value requests.Integer) (v int, err error) { if strings.TrimSpace(string(value)) == "" { return @@ -556,3 +419,66 @@ func terraformToAPI(field string) string { } return result } + +func compareJsonTemplateAreEquivalent(tem1, tem2 string) (bool, error) { + var obj1 interface{} + err := json.Unmarshal([]byte(tem1), &obj1) + if err != nil { + return false, err + } + + canonicalJson1, _ := json.Marshal(obj1) + + var obj2 interface{} + err = json.Unmarshal([]byte(tem2), &obj2) + if err != nil { + return false, err + } + + canonicalJson2, _ := json.Marshal(obj2) + + equal := bytes.Compare(canonicalJson1, canonicalJson2) == 0 + if !equal { + log.Printf("[DEBUG] Canonical template are not equal.\nFirst: %s\nSecond: %s\n", + canonicalJson1, canonicalJson2) + } + return equal, nil +} + +func compareYamlTemplateAreEquivalent(tem1, tem2 string) (bool, error) { + var obj1 interface{} + err := yaml.Unmarshal([]byte(tem1), &obj1) + if err != nil { + return false, err + } + + canonicalYaml1, _ := yaml.Marshal(obj1) + + var obj2 interface{} + err = yaml.Unmarshal([]byte(tem2), &obj2) + if err != nil { + return false, err + } + + canonicalYaml2, _ := yaml.Marshal(obj2) + + equal := bytes.Compare(canonicalYaml1, canonicalYaml2) == 0 + if !equal { + log.Printf("[DEBUG] Canonical template are not equal.\nFirst: %s\nSecond: %s\n", + canonicalYaml1, canonicalYaml2) + } + return equal, nil +} + +// loadFileContent returns contents of a file in a given path +func loadFileContent(v string) ([]byte, error) { + filename, err := homedir.Expand(v) + if err != nil { + return nil, err + } + fileContent, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + return fileContent, nil +} diff --git a/alicloud/config.go b/alicloud/config.go deleted file mode 100644 index 44d704b48f0..00000000000 --- a/alicloud/config.go +++ /dev/null @@ -1,609 +0,0 @@ -package alicloud - -import ( - "fmt" - "log" - "strings" - "sync" - - "net/http" - "os" - "strconv" - "time" - - "net/url" - - "regexp" - - "github.com/aliyun/alibaba-cloud-sdk-go/sdk" - "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth" - "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials" - "github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints" - "github.com/aliyun/alibaba-cloud-sdk-go/sdk/resource" - "github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils" - "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" - "github.com/aliyun/alibaba-cloud-sdk-go/services/cloudapi" - "github.com/aliyun/alibaba-cloud-sdk-go/services/cms" - "github.com/aliyun/alibaba-cloud-sdk-go/services/dds" - "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" - "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" - "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" - "github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz" - "github.com/aliyun/alibaba-cloud-sdk-go/services/r-kvstore" - "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" - "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" - "github.com/aliyun/alibaba-cloud-sdk-go/services/sts" - "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" - "github.com/aliyun/aliyun-datahub-sdk-go/datahub" - "github.com/aliyun/aliyun-log-go-sdk" - "github.com/aliyun/aliyun-oss-go-sdk/oss" - "github.com/aliyun/fc-go-sdk" - "github.com/denverdino/aliyungo/cdn" - "github.com/denverdino/aliyungo/common" - "github.com/denverdino/aliyungo/cs" - "github.com/denverdino/aliyungo/dns" - "github.com/denverdino/aliyungo/kms" - "github.com/denverdino/aliyungo/location" - "github.com/denverdino/aliyungo/ram" - "github.com/dxh031/ali_mns" - "github.com/hashicorp/terraform/terraform" -) - -// Config of aliyun -type Config struct { - AccessKey string - SecretKey string - Region common.Region - RegionId string - SecurityToken string - OtsInstanceName string - LogEndpoint string - AccountId string - FcEndpoint string - MNSEndpoint string -} - -// AliyunClient of aliyun -type AliyunClient struct { - config *Config - Region common.Region - RegionId string - //In order to build ots table client, add accesskey and secretkey in aliyunclient temporarily. - AccessKey string - SecretKey string - SecurityToken string - OtsInstanceName string - accountIdMutex sync.RWMutex // Mutex used to initialize and access accountId. - accountId string // Do not access to this field directly, please use the AccountId() function instead. - ecsconn *ecs.Client - essconn *ess.Client - rdsconn *rds.Client - vpcconn *vpc.Client - slbconn *slb.Client - ossconn *oss.Client - dnsconn *dns.Client - ramconn ram.RamClientInterface - csconn *cs.Client - cdnconn *cdn.CdnClient - kmsconn *kms.Client - otsconn *ots.Client - cmsconn *cms.Client - logconn *sls.Client - fcconnMutex sync.RWMutex // Mutex used to initialize and access fcconn. - fcconn *fc.Client // Do not access to this field directly, please use the Fcconn() function instead. - cenconn *cbn.Client - pvtzconn *pvtz.Client - ddsconn *dds.Client - stsconn *sts.Client - rkvconn *r_kvstore.Client - dhconn *datahub.DataHub - mnsconn *ali_mns.MNSClient - cloudapiconn *cloudapi.Client -} - -// Client for AliyunClient -func (c *Config) Client() (*AliyunClient, error) { - err := c.loadAndValidate() - if err != nil { - return nil, err - } - - ecsconn, err := c.ecsConn() - if err != nil { - return nil, err - } - - rdsconn, err := c.rdsConn() - if err != nil { - return nil, err - } - - slbconn, err := c.slbConn() - if err != nil { - return nil, err - } - - vpcconn, err := c.vpcConn() - if err != nil { - return nil, err - } - - essconn, err := c.essConn() - if err != nil { - return nil, err - } - - ossconn, err := c.ossConn() - if err != nil { - return nil, err - } - - dnsconn, err := c.dnsConn() - if err != nil { - return nil, err - } - - ramconn, err := c.ramConn() - if err != nil { - return nil, err - } - - csconn, err := c.csConn() - if err != nil { - return nil, err - } - - cdnconn, err := c.cdnConn() - if err != nil { - return nil, err - } - - kmsconn, err := c.kmsConn() - if err != nil { - return nil, err - } - - otsconn, err := c.otsConn() - if err != nil { - return nil, err - } - - cmsconn, err := c.cmsConn() - if err != nil { - return nil, err - } - - pvtzconn, err := c.pvtzConn() - if err != nil { - return nil, err - } - - ddsconn, err := c.ddsConn() - if err != nil { - return nil, err - } - - stsconn, err := c.stsConn() - rkvconn, err := c.rkvConn() - if err != nil { - return nil, err - } - - cenconn, err := c.cenConn() - if err != nil { - return nil, err - } - - cloudapiconn, err := c.cloudapiConn() - if err != nil { - return nil, err - } - - dhconn, err := c.dhConn() - if err != nil { - return nil, err - } - return &AliyunClient{ - config: c, - Region: c.Region, - RegionId: c.RegionId, - AccessKey: c.AccessKey, - SecretKey: c.SecretKey, - SecurityToken: c.SecurityToken, - OtsInstanceName: c.OtsInstanceName, - accountId: c.AccountId, - ecsconn: ecsconn, - vpcconn: vpcconn, - slbconn: slbconn, - rdsconn: rdsconn, - essconn: essconn, - ossconn: ossconn, - dnsconn: dnsconn, - ramconn: ramconn, - csconn: csconn, - cdnconn: cdnconn, - kmsconn: kmsconn, - otsconn: otsconn, - cmsconn: cmsconn, - logconn: c.logConn(), - ddsconn: ddsconn, - cenconn: cenconn, - pvtzconn: pvtzconn, - stsconn: stsconn, - rkvconn: rkvconn, - cloudapiconn: cloudapiconn, - dhconn: dhconn, - }, nil -} - -const BusinessInfoKey = "Terraform" - -func (c *Config) loadAndValidate() error { - err := c.validateRegion() - if err != nil { - return err - } - - return nil -} - -func (c *Config) validateRegion() error { - - for _, valid := range common.ValidRegions { - if c.Region == valid { - return nil - } - } - - return fmt.Errorf("Not a valid region: %s", c.Region) -} - -func (c *Config) ecsConn() (client *ecs.Client, err error) { - endpoint := LoadEndpoint(c.RegionId, ECSCode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, string(ECSCode), endpoint) - } - client, err = ecs.NewClientWithOptions(c.RegionId, getSdkConfig().WithTimeout(60000000000), c.getAuthCredential(true)) - if err != nil { - return - } - - if _, err := client.DescribeRegions(ecs.CreateDescribeRegionsRequest()); err != nil { - return nil, err - } - - return client, nil -} - -func (c *Config) rdsConn() (*rds.Client, error) { - endpoint := LoadEndpoint(c.RegionId, RDSCode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, string(RDSCode), endpoint) - } - return rds.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(true)) -} - -func (c *Config) slbConn() (*slb.Client, error) { - endpoint := LoadEndpoint(c.RegionId, SLBCode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, string(SLBCode), endpoint) - } - return slb.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(true)) -} - -func (c *Config) vpcConn() (*vpc.Client, error) { - endpoint := LoadEndpoint(c.RegionId, VPCCode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, string(VPCCode), endpoint) - } - return vpc.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(true)) - -} - -func (c *Config) cenConn() (*cbn.Client, error) { - endpoint := LoadEndpoint(c.RegionId, CENCode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, string(CENCode), endpoint) - } - return cbn.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(true)) -} - -func (c *Config) essConn() (*ess.Client, error) { - endpoint := LoadEndpoint(c.RegionId, ESSCode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, string(ESSCode), endpoint) - } - return ess.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(true)) -} -func (c *Config) ossConn() (*oss.Client, error) { - - endpointClient := location.NewClient(c.AccessKey, c.SecretKey) - endpointClient.SetSecurityToken(c.SecurityToken) - endpoint := LoadEndpoint(c.RegionId, OSSCode) - if endpoint == "" { - args := &location.DescribeEndpointsArgs{ - Id: c.Region, - ServiceCode: "oss", - Type: "openAPI", - } - invoker := NewInvoker() - var endpoints *location.DescribeEndpointsResponse - if err := invoker.Run(func() error { - es, err := endpointClient.DescribeEndpoints(args) - if err != nil { - return err - } - endpoints = es - return nil - }); err != nil { - log.Printf("[DEBUG] Describe endpoint using region: %#v got an error: %#v.", c.Region, err) - } else { - if endpoints != nil && len(endpoints.Endpoints.Endpoint) > 0 { - endpoint = strings.ToLower(endpoints.Endpoints.Endpoint[0].Protocols.Protocols[0]) + "://" + endpoints.Endpoints.Endpoint[0].Endpoint - } else { - endpoint = fmt.Sprintf("http://oss-%s.aliyuncs.com", c.Region) - } - } - } - - log.Printf("[DEBUG] Instantiate OSS client using endpoint: %#v", endpoint) - clientOptions := []oss.ClientOption{oss.UserAgent(getUserAgent())} - proxyUrl := getHttpProxyUrl() - if proxyUrl != nil { - clientOptions = append(clientOptions, oss.Proxy(proxyUrl.String())) - } - client, err := oss.New(endpoint, c.AccessKey, c.SecretKey, clientOptions...) - - return client, err -} - -func (c *Config) dnsConn() (*dns.Client, error) { - client := dns.NewClientNew(c.AccessKey, c.SecretKey) - client.SetBusinessInfo(BusinessInfoKey) - client.SetUserAgent(getUserAgent()) - client.SetSecurityToken(c.SecurityToken) - return client, nil -} - -func (c *Config) ramConn() (ram.RamClientInterface, error) { - client := ram.NewClientWithSecurityToken(c.AccessKey, c.SecretKey, c.SecurityToken) - client.SetUserAgent(getUserAgent()) - return client, nil -} - -func (c *Config) csConn() (*cs.Client, error) { - client := cs.NewClientForAussumeRole(c.AccessKey, c.SecretKey, c.SecurityToken) - client.SetUserAgent(getUserAgent()) - return client, nil -} - -func (c *Config) cdnConn() (*cdn.CdnClient, error) { - client := cdn.NewClient(c.AccessKey, c.SecretKey) - client.SetBusinessInfo(BusinessInfoKey) - client.SetUserAgent(getUserAgent()) - client.SetSecurityToken(c.SecurityToken) - return client, nil -} - -func (c *Config) kmsConn() (*kms.Client, error) { - client := kms.NewECSClientWithSecurityToken(c.AccessKey, c.SecretKey, c.SecurityToken, c.Region) - client.SetBusinessInfo(BusinessInfoKey) - client.SetUserAgent(getUserAgent()) - return client, nil -} - -func (c *Config) otsConn() (*ots.Client, error) { - endpoint := LoadEndpoint(c.RegionId, OTSCode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, string(OTSCode), endpoint) - } - return ots.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(true)) -} - -func (c *Config) cmsConn() (*cms.Client, error) { - return cms.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(false)) -} - -func (c *Config) pvtzConn() (*pvtz.Client, error) { - endpoint := LoadEndpoint(c.RegionId, PVTZCode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, string(PVTZCode), endpoint) - } else { - endpoints.AddEndpointMapping(c.RegionId, string(PVTZCode), "pvtz.aliyuncs.com") - } - return pvtz.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(true)) -} - -func (c *Config) stsConn() (*sts.Client, error) { - endpoint := LoadEndpoint(c.RegionId, STSCode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, string(STSCode), endpoint) - } - return sts.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(true)) -} - -func (c *Config) logConn() *sls.Client { - endpoint := c.LogEndpoint - if endpoint == "" { - endpoint = LoadEndpoint(c.RegionId, LOGCode) - if endpoint == "" { - endpoint = fmt.Sprintf("%s.log.aliyuncs.com", c.RegionId) - } - } - - return &sls.Client{ - AccessKeyID: c.AccessKey, - AccessKeySecret: c.SecretKey, - Endpoint: endpoint, - SecurityToken: c.SecurityToken, - UserAgent: getUserAgent(), - } -} - -func (c *Config) ddsConn() (*dds.Client, error) { - endpoint := LoadEndpoint(c.RegionId, DDSCode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, string(DDSCode), endpoint) - } - return dds.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(true)) -} - -func (c *Config) rkvConn() (*r_kvstore.Client, error) { - endpoint := LoadEndpoint(c.RegionId, KVSTORECode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, fmt.Sprintf("R-%s", string(KVSTORECode)), endpoint) - } - return r_kvstore.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(true)) -} - -func (c *Config) cloudapiConn() (*cloudapi.Client, error) { - endpoint := LoadEndpoint(c.RegionId, CLOUDAPICode) - if endpoint != "" { - endpoints.AddEndpointMapping(c.RegionId, fmt.Sprintf("R-%s", string(CLOUDAPICode)), endpoint) - } - return cloudapi.NewClientWithOptions(c.RegionId, getSdkConfig(), c.getAuthCredential(true)) -} - -func (c *Config) dhConn() (*datahub.DataHub, error) { - endpoint := LoadEndpoint(c.RegionId, DATAHUBCode) - if endpoint == "" { - endpoint = fmt.Sprintf("https://dh-%s.aliyuncs.com", c.RegionId) - } - account := datahub.NewStsCredential(c.AccessKey, c.SecretKey, c.SecurityToken) - config := &datahub.Config{ - UserAgent: getUserAgent(), - } - return datahub.NewClientWithConfig(endpoint, config, account), nil -} - -func getSdkConfig() *sdk.Config { - // Fix bug "open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory" which happened in windows. - if data, ok := resource.GetTZData("GMT"); ok { - utils.TZData = data - utils.LoadLocationFromTZData = time.LoadLocationFromTZData - } - return sdk.NewConfig(). - WithMaxRetryTime(5). - WithTimeout(time.Duration(30000000000)). - WithUserAgent(getUserAgent()). - WithGoRoutinePoolSize(10). - WithDebug(false). - WithHttpTransport(getTransport()) -} - -func (c *Config) getAuthCredential(stsSupported bool) auth.Credential { - if stsSupported { - return credentials.NewStsTokenCredential(c.AccessKey, c.SecretKey, c.SecurityToken) - } - - return credentials.NewAccessKeyCredential(c.AccessKey, c.SecretKey) -} - -func (client *AliyunClient) AccountId() (string, error) { - client.accountIdMutex.Lock() - defer client.accountIdMutex.Unlock() - - if client.accountId == "" { - log.Printf("[DEBUG] account_id not provided, attempting to retrieve it automatically...") - identity, err := client.GetCallerIdentity() - if err != nil { - return "", err - } - if identity.AccountId == "" { - return "", GetNotFoundErrorFromString("Caller identity doesn't contain any AccountId.") - } - log.Printf("[DEBUG] account_id retrieved with success.") - client.accountId = identity.AccountId - } - return client.accountId, nil -} - -func (client *AliyunClient) Fcconn() (*fc.Client, error) { - client.fcconnMutex.Lock() - defer client.fcconnMutex.Unlock() - - if client.fcconn == nil { - endpoint := client.config.FcEndpoint - if endpoint == "" { - endpoint = LoadEndpoint(client.config.RegionId, FCCode) - if endpoint == "" { - endpoint = fmt.Sprintf("%s.fc.aliyuncs.com", client.config.RegionId) - } - } - - accountId, err := client.AccountId() - if err != nil { - return nil, err - } - config := getSdkConfig() - client.fcconn, err = fc.NewClient(fmt.Sprintf("%s%s%s", accountId, DOT_SEPARATED, endpoint), ApiVersion20160815, client.config.AccessKey, client.config.SecretKey, fc.WithTransport(config.HttpTransport)) - if err != nil { - return nil, err - } - client.fcconn.Config.UserAgent = getUserAgent() - client.fcconn.Config.SecurityToken = client.config.SecurityToken - - if err != nil { - return nil, err - } - } - return client.fcconn, nil -} - -func (client *AliyunClient) Mnsconn() (*ali_mns.MNSClient, error) { - if client.mnsconn == nil { - endpoint := client.config.MNSEndpoint - if endpoint == "" { - endpoint = LoadEndpoint(client.config.RegionId, MNSCode) - if endpoint == "" { - endpoint = fmt.Sprintf("%s.aliyuncs.com", client.config.RegionId) - } - } - accountId, err := client.AccountId() - if err != nil { - return nil, err - } - url := fmt.Sprintf("http://%s.mns.%s", accountId, endpoint) - - mnsClient := ali_mns.NewAliMNSClient(url, client.config.AccessKey, client.config.SecretKey) - - client.mnsconn = &mnsClient - } - return client.mnsconn, nil -} - -func getUserAgent() string { - return fmt.Sprintf("HashiCorp-Terraform-v%s", strings.TrimSuffix(terraform.VersionString(), "-dev")) -} - -func getTransport() *http.Transport { - handshakeTimeout, err := strconv.Atoi(os.Getenv("TLSHandshakeTimeout")) - if err != nil { - handshakeTimeout = 120 - } - transport := &http.Transport{} - transport.TLSHandshakeTimeout = time.Duration(handshakeTimeout) * time.Second - - // After building a new transport and it need to set http proxy to support proxy. - proxyUrl := getHttpProxyUrl() - if proxyUrl != nil { - transport.Proxy = http.ProxyURL(proxyUrl) - } - return transport -} - -func getHttpProxyUrl() *url.URL { - for _, v := range []string{"HTTPS_PROXY", "https_proxy", "HTTP_PROXY", "http_proxy"} { - if value := Trim(os.Getenv(v)); value != "" { - if !regexp.MustCompile(`^http(s)?://`).MatchString(value) { - value = fmt.Sprintf("http://%s", value) - } - proxyUrl, err := url.Parse(value) - if err == nil { - return proxyUrl - } - break - } - } - return nil -} diff --git a/alicloud/connectivity/client.go b/alicloud/connectivity/client.go new file mode 100644 index 00000000000..9a4a6e49ee8 --- /dev/null +++ b/alicloud/connectivity/client.go @@ -0,0 +1,832 @@ +package connectivity + +import ( + "fmt" + "log" + "net/http" + "os" + "strconv" + "strings" + "time" + + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" + + "net/url" + + "regexp" + + "sync" + + "github.com/aliyun/alibaba-cloud-sdk-go/sdk" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/endpoints" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/resource" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils" + "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" + "github.com/aliyun/alibaba-cloud-sdk-go/services/cloudapi" + "github.com/aliyun/alibaba-cloud-sdk-go/services/cms" + "github.com/aliyun/alibaba-cloud-sdk-go/services/dds" + "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" + "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" + "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" + "github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz" + "github.com/aliyun/alibaba-cloud-sdk-go/services/r-kvstore" + "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" + "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" + "github.com/aliyun/alibaba-cloud-sdk-go/services/sts" + "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" + "github.com/aliyun/aliyun-datahub-sdk-go/datahub" + "github.com/aliyun/aliyun-log-go-sdk" + "github.com/aliyun/aliyun-oss-go-sdk/oss" + "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore" + "github.com/aliyun/fc-go-sdk" + "github.com/denverdino/aliyungo/cdn" + "github.com/denverdino/aliyungo/common" + "github.com/denverdino/aliyungo/cs" + "github.com/denverdino/aliyungo/dns" + "github.com/denverdino/aliyungo/kms" + "github.com/denverdino/aliyungo/location" + "github.com/denverdino/aliyungo/ram" + "github.com/dxh031/ali_mns" + "github.com/hashicorp/terraform/terraform" +) + +// AliyunClient of aliyun +type AliyunClient struct { + Region common.Region + RegionId string + //In order to build ots table client, add accesskey and secretkey in aliyunclient temporarily. + AccessKey string + SecretKey string + SecurityToken string + OtsInstanceName string + accountIdMutex sync.RWMutex + config *Config + accountId string + ecsconn *ecs.Client + essconn *ess.Client + rdsconn *rds.Client + vpcconn *vpc.Client + slbconn *slb.Client + ossconn *oss.Client + dnsconn *dns.Client + ramconn ram.RamClientInterface + csconn *cs.Client + cdnconn *cdn.CdnClient + kmsconn *kms.Client + otsconn *ots.Client + cmsconn *cms.Client + logconn *sls.Client + fcconn *fc.Client + cenconn *cbn.Client + pvtzconn *pvtz.Client + ddsconn *dds.Client + stsconn *sts.Client + rkvconn *r_kvstore.Client + dhconn *datahub.DataHub + mnsconn *ali_mns.MNSClient + cloudapiconn *cloudapi.Client + tablestoreconnByInstanceName map[string]*tablestore.TableStoreClient + csprojectconnByKey map[string]*cs.ProjectClient +} + +type ApiVersion string + +const ( + ApiVersion20140526 = ApiVersion("2014-05-26") + ApiVersion20160815 = ApiVersion("2016-08-15") + ApiVersion20140515 = ApiVersion("2014-05-15") +) + +const businessInfoKey = "Terraform" + +var goSdkMutex = sync.RWMutex{} // The Go SDK is not thread-safe + +// Client for AliyunClient +func (c *Config) Client() (*AliyunClient, error) { + err := c.loadAndValidate() + if err != nil { + return nil, err + } + + return &AliyunClient{ + config: c, + Region: c.Region, + RegionId: c.RegionId, + AccessKey: c.AccessKey, + SecretKey: c.SecretKey, + SecurityToken: c.SecurityToken, + OtsInstanceName: c.OtsInstanceName, + accountId: c.AccountId, + tablestoreconnByInstanceName: make(map[string]*tablestore.TableStoreClient), + csprojectconnByKey: make(map[string]*cs.ProjectClient), + }, nil +} + +func (client *AliyunClient) WithEcsClient(do func(*ecs.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the ECS client if necessary + if client.ecsconn == nil { + endpoint := loadEndpoint(client.config.RegionId, ECSCode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, string(ECSCode), endpoint) + } + ecsconn, err := ecs.NewClientWithOptions(client.config.RegionId, client.getSdkConfig().WithTimeout(60000000000), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the ECS client: %#v", err) + } + + if _, err := ecsconn.DescribeRegions(ecs.CreateDescribeRegionsRequest()); err != nil { + return nil, err + } + client.ecsconn = ecsconn + } + + return do(client.ecsconn) +} + +func (client *AliyunClient) WithRdsClient(do func(*rds.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the RDS client if necessary + if client.rdsconn == nil { + endpoint := loadEndpoint(client.config.RegionId, RDSCode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, string(RDSCode), endpoint) + } + rdsconn, err := rds.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the RDS client: %#v", err) + } + + client.rdsconn = rdsconn + } + + return do(client.rdsconn) +} + +func (client *AliyunClient) WithSlbClient(do func(*slb.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the SLB client if necessary + if client.slbconn == nil { + endpoint := loadEndpoint(client.config.RegionId, SLBCode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, string(SLBCode), endpoint) + } + slbconn, err := slb.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the SLB client: %#v", err) + } + + client.slbconn = slbconn + } + + return do(client.slbconn) +} + +func (client *AliyunClient) WithVpcClient(do func(*vpc.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the VPC client if necessary + if client.vpcconn == nil { + endpoint := loadEndpoint(client.config.RegionId, VPCCode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, string(VPCCode), endpoint) + } + vpcconn, err := vpc.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the VPC client: %#v", err) + } + + client.vpcconn = vpcconn + } + + return do(client.vpcconn) +} + +func (client *AliyunClient) WithCenClient(do func(*cbn.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the CEN client if necessary + if client.cenconn == nil { + endpoint := loadEndpoint(client.config.RegionId, CENCode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, string(CENCode), endpoint) + } + cenconn, err := cbn.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the CEN client: %#v", err) + } + + client.cenconn = cenconn + } + + return do(client.cenconn) +} + +func (client *AliyunClient) WithEssClient(do func(*ess.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the ESS client if necessary + if client.essconn == nil { + endpoint := loadEndpoint(client.config.RegionId, ESSCode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, string(ESSCode), endpoint) + } + essconn, err := ess.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the ESS client: %#v", err) + } + + client.essconn = essconn + } + + return do(client.essconn) +} + +func (client *AliyunClient) WithOssClient(do func(*oss.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the OSS client if necessary + if client.ossconn == nil { + endpointClient := location.NewClient(client.config.AccessKey, client.config.SecretKey) + endpointClient.SetSecurityToken(client.config.SecurityToken) + endpoint := loadEndpoint(client.config.RegionId, OSSCode) + if endpoint == "" { + endpointItem := client.describeEndpointForService(OSSCode) + if endpointItem != nil { + endpoint = strings.ToLower(endpointItem.Protocols.Protocols[0]) + "://" + endpointItem.Endpoint + } else { + endpoint = fmt.Sprintf("http://oss-%s.aliyuncs.com", client.RegionId) + } + } + + log.Printf("[DEBUG] Instantiate OSS client using endpoint: %#v", endpoint) + clientOptions := []oss.ClientOption{oss.UserAgent(client.getUserAgent())} + proxyUrl := client.getHttpProxyUrl() + if proxyUrl != nil { + clientOptions = append(clientOptions, oss.Proxy(proxyUrl.String())) + } + + ossconn, err := oss.New(endpoint, client.config.AccessKey, client.config.SecretKey, clientOptions...) + if err != nil { + return nil, fmt.Errorf("unable to initialize the OSS client: %#v", err) + } + + client.ossconn = ossconn + } + + return do(client.ossconn) +} + +func (client *AliyunClient) WithOssBucketByName(bucketName string, do func(*oss.Bucket) (interface{}, error)) (interface{}, error) { + return client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + bucket, err := client.ossconn.Bucket(bucketName) + if err != nil { + return nil, fmt.Errorf("unable to get the bucket %s: %#v", bucketName, err) + } + return do(bucket) + }) +} + +func (client *AliyunClient) WithDnsClient(do func(*dns.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the DNS client if necessary + if client.dnsconn == nil { + dnsconn := dns.NewClientNew(client.config.AccessKey, client.config.SecretKey) + dnsconn.SetBusinessInfo(businessInfoKey) + dnsconn.SetUserAgent(client.getUserAgent()) + dnsconn.SetSecurityToken(client.config.SecurityToken) + + client.dnsconn = dnsconn + } + + return do(client.dnsconn) +} + +func (client *AliyunClient) WithRamClient(do func(ram.RamClientInterface) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the RAM client if necessary + if client.ramconn == nil { + ramconn := ram.NewClientWithSecurityToken(client.config.AccessKey, client.config.SecretKey, client.config.SecurityToken) + client.ramconn = ramconn + } + + return do(client.ramconn) +} + +func (client *AliyunClient) WithCsClient(do func(*cs.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the CS client if necessary + if client.csconn == nil { + csconn := cs.NewClientForAussumeRole(client.config.AccessKey, client.config.SecretKey, client.config.SecurityToken) + csconn.SetUserAgent(client.getUserAgent()) + client.csconn = csconn + } + + return do(client.csconn) +} + +func (client *AliyunClient) WithCdnClient(do func(*cdn.CdnClient) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the CDN client if necessary + if client.cdnconn == nil { + cdnconn := cdn.NewClient(client.config.AccessKey, client.config.SecretKey) + cdnconn.SetBusinessInfo(businessInfoKey) + cdnconn.SetUserAgent(client.getUserAgent()) + cdnconn.SetSecurityToken(client.config.SecurityToken) + client.cdnconn = cdnconn + } + + return do(client.cdnconn) +} + +func (client *AliyunClient) WithKmsClient(do func(*kms.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the KMS client if necessary + if client.kmsconn == nil { + kmsconn := kms.NewECSClientWithSecurityToken(client.config.AccessKey, client.config.SecretKey, client.config.SecurityToken, client.config.Region) + kmsconn.SetBusinessInfo(businessInfoKey) + kmsconn.SetUserAgent(client.getUserAgent()) + client.kmsconn = kmsconn + } + + return do(client.kmsconn) +} + +func (client *AliyunClient) WithOtsClient(do func(*ots.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the OTS client if necessary + if client.otsconn == nil { + endpoint := loadEndpoint(client.config.RegionId, OTSCode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, string(OTSCode), endpoint) + } + otsconn, err := ots.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the OTS client: %#v", err) + } + + client.otsconn = otsconn + } + + return do(client.otsconn) +} + +func (client *AliyunClient) WithCmsClient(do func(*cms.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the CMS client if necessary + if client.cmsconn == nil { + cmsconn, err := cms.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(false)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the CMS client: %#v", err) + } + + client.cmsconn = cmsconn + } + + return do(client.cmsconn) +} + +func (client *AliyunClient) WithPvtzClient(do func(*pvtz.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the PVTZ client if necessary + if client.pvtzconn == nil { + endpoint := loadEndpoint(client.config.RegionId, PVTZCode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, string(PVTZCode), endpoint) + } else { + endpoints.AddEndpointMapping(client.config.RegionId, string(PVTZCode), "pvtz.aliyuncs.com") + } + pvtzconn, err := pvtz.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the PVTZ client: %#v", err) + } + + client.pvtzconn = pvtzconn + } + + return do(client.pvtzconn) +} + +func (client *AliyunClient) WithStsClient(do func(*sts.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the STS client if necessary + if client.stsconn == nil { + endpoint := loadEndpoint(client.config.RegionId, STSCode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, string(STSCode), endpoint) + } + stsconn, err := sts.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the STS client: %#v", err) + } + + client.stsconn = stsconn + } + + return do(client.stsconn) +} + +func (client *AliyunClient) WithLogClient(do func(*sls.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the LOG client if necessary + if client.logconn == nil { + endpoint := client.config.LogEndpoint + if endpoint == "" { + endpoint = loadEndpoint(client.config.RegionId, LOGCode) + if endpoint == "" { + endpoint = fmt.Sprintf("%s.log.aliyuncs.com", client.config.RegionId) + } + } + + client.logconn = &sls.Client{ + AccessKeyID: client.config.AccessKey, + AccessKeySecret: client.config.SecretKey, + Endpoint: endpoint, + SecurityToken: client.config.SecurityToken, + UserAgent: client.getUserAgent(), + } + } + + return do(client.logconn) +} + +func (client *AliyunClient) WithDdsClient(do func(*dds.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the DDS client if necessary + if client.ddsconn == nil { + endpoint := loadEndpoint(client.config.RegionId, DDSCode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, string(DDSCode), endpoint) + } + ddsconn, err := dds.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the DDS client: %#v", err) + } + + client.ddsconn = ddsconn + } + + return do(client.ddsconn) +} + +func (client *AliyunClient) WithRkvClient(do func(*r_kvstore.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the RKV client if necessary + if client.rkvconn == nil { + endpoint := loadEndpoint(client.config.RegionId, KVSTORECode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, fmt.Sprintf("R-%s", string(KVSTORECode)), endpoint) + } + rkvconn, err := r_kvstore.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the RKV client: %#v", err) + } + + client.rkvconn = rkvconn + } + + return do(client.rkvconn) +} + +func (client *AliyunClient) WithFcClient(do func(*fc.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the FC client if necessary + if client.fcconn == nil { + endpoint := client.config.LogEndpoint + if endpoint == "" { + endpoint = loadEndpoint(client.config.RegionId, FCCode) + if endpoint == "" { + endpoint = fmt.Sprintf("%s.fc.aliyuncs.com", client.config.RegionId) + } + } + + accountId, err := client.AccountId() + if err != nil { + return nil, err + } + + config := client.getSdkConfig() + fcconn, err := fc.NewClient( + fmt.Sprintf("%s.%s", accountId, endpoint), + string(ApiVersion20160815), + client.config.AccessKey, + client.config.SecretKey, + fc.WithTransport(config.HttpTransport)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the FC client: %#v", err) + } + + fcconn.Config.UserAgent = client.getUserAgent() + fcconn.Config.SecurityToken = client.config.SecurityToken + client.fcconn = fcconn + } + + return do(client.fcconn) +} + +func (client *AliyunClient) WithCloudApiClient(do func(*cloudapi.Client) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the Cloud API client if necessary + if client.cloudapiconn == nil { + endpoint := loadEndpoint(client.RegionId, CLOUDAPICode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.RegionId, fmt.Sprintf("R-%s", string(CLOUDAPICode)), endpoint) + } + cloudapiconn, err := cloudapi.NewClientWithOptions(client.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the CloudAPI client: %#v", err) + } + + client.cloudapiconn = cloudapiconn + } + + return do(client.cloudapiconn) +} + +func (client *AliyunClient) WithDataHubClient(do func(*datahub.DataHub) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the DataHub client if necessary + if client.dhconn == nil { + endpoint := loadEndpoint(client.RegionId, DATAHUBCode) + if endpoint == "" { + endpoint = fmt.Sprintf("https://dh-%s.aliyuncs.com", client.RegionId) + } + account := datahub.NewStsCredential(client.AccessKey, client.SecretKey, client.SecurityToken) + config := &datahub.Config{ + UserAgent: client.getUserAgent(), + } + + client.dhconn = datahub.NewClientWithConfig(endpoint, config, account) + } + + return do(client.dhconn) +} + +func (client *AliyunClient) WithMnsClient(do func(*ali_mns.MNSClient) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the MNS client if necessary + if client.mnsconn == nil { + endpoint := client.config.MNSEndpoint + if endpoint == "" { + endpoint = loadEndpoint(client.config.RegionId, MNSCode) + if endpoint == "" { + endpoint = fmt.Sprintf("%s.aliyuncs.com", client.config.RegionId) + } + } + + accountId, err := client.AccountId() + if err != nil { + return nil, err + } + mnsUrl := fmt.Sprintf("http://%s.mns.%s", accountId, endpoint) + + mnsClient := ali_mns.NewAliMNSClient(mnsUrl, client.config.AccessKey, client.config.SecretKey) + + client.mnsconn = &mnsClient + } + + return do(client.mnsconn) +} + +func (client *AliyunClient) WithMnsQueueManager(do func(ali_mns.AliQueueManager) (interface{}, error)) (interface{}, error) { + return client.WithMnsClient(func(mnsClient *ali_mns.MNSClient) (interface{}, error) { + queueManager := ali_mns.NewMNSQueueManager(*mnsClient) + return do(queueManager) + }) +} + +func (client *AliyunClient) WithMnsTopicManager(do func(ali_mns.AliTopicManager) (interface{}, error)) (interface{}, error) { + return client.WithMnsClient(func(mnsClient *ali_mns.MNSClient) (interface{}, error) { + topicManager := ali_mns.NewMNSTopicManager(*mnsClient) + return do(topicManager) + }) +} + +func (client *AliyunClient) WithMnsSubscriptionManagerByTopicName(topicName string, do func(ali_mns.AliMNSTopic) (interface{}, error)) (interface{}, error) { + return client.WithMnsClient(func(mnsClient *ali_mns.MNSClient) (interface{}, error) { + subscriptionManager := ali_mns.NewMNSTopic(topicName, *mnsClient) + return do(subscriptionManager) + }) +} + +func (client *AliyunClient) WithTableStoreClient(instanceName string, do func(*tablestore.TableStoreClient) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the TABLESTORE client if necessary + tableStoreClient, ok := client.tablestoreconnByInstanceName[instanceName] + if !ok { + endpoint := loadEndpoint(client.RegionId, OTSCode) + if endpoint == "" { + endpoint = fmt.Sprintf("%s.%s.ots.aliyuncs.com", instanceName, client.RegionId) + } + if !strings.HasPrefix(endpoint, "https") && !strings.HasPrefix(endpoint, "http") { + endpoint = "https://" + endpoint + } + tableStoreClient = tablestore.NewClient(endpoint, instanceName, client.AccessKey, client.SecretKey) + client.tablestoreconnByInstanceName[instanceName] = tableStoreClient + } + + return do(tableStoreClient) +} + +func (client *AliyunClient) WithCsProjectClient(clusterId, endpoint string, clusterCerts cs.ClusterCerts, do func(*cs.ProjectClient) (interface{}, error)) (interface{}, error) { + goSdkMutex.Lock() + defer goSdkMutex.Unlock() + + // Initialize the PROJECT client if necessary + key := fmt.Sprintf("%s|%s|%s|%s|%s", clusterId, endpoint, clusterCerts.CA, clusterCerts.Cert, clusterCerts.Key) + csProjectClient, ok := client.csprojectconnByKey[key] + if !ok { + var err error + csProjectClient, err = cs.NewProjectClient(clusterId, endpoint, clusterCerts) + if err != nil { + return nil, fmt.Errorf("Getting Application Client failed by cluster id %s: %#v.", clusterCerts, err) + } + csProjectClient.SetDebug(false) + csProjectClient.SetUserAgent(client.getUserAgent()) + client.csprojectconnByKey[key] = csProjectClient + } + + return do(csProjectClient) +} + +func (client *AliyunClient) NewCommonRequest(serviceCode ServiceCode, apiVersion ApiVersion) *requests.CommonRequest { + request := requests.NewCommonRequest() + endpoint := loadEndpoint(client.RegionId, serviceCode) + if endpoint == "" { + endpointItem := client.describeEndpointForService(serviceCode) + if endpointItem != nil { + endpoint = endpointItem.Endpoint + } + } + if endpoint == "" { + switch serviceCode { + case ECSCode: + endpoint = "ecs.aliyuncs.com" + case VPCCode: + endpoint = fmt.Sprintf("vpc.%s.aliyuncs.com", client.RegionId) + case SLBCode: + endpoint = fmt.Sprintf("slb.%s.aliyuncs.com", client.RegionId) + case ESSCode: + endpoint = "ess.aliyuncs.com" + } + } + request.Domain = endpoint + request.Version = string(apiVersion) + request.RegionId = client.RegionId + return request +} + +func (client *AliyunClient) AccountId() (string, error) { + client.accountIdMutex.Lock() + defer client.accountIdMutex.Unlock() + + if client.accountId == "" { + log.Printf("[DEBUG] account_id not provided, attempting to retrieve it automatically...") + identity, err := client.getCallerIdentity() + if err != nil { + return "", err + } + if identity.AccountId == "" { + return "", fmt.Errorf("caller identity doesn't contain any AccountId") + } + client.accountId = identity.AccountId + } + return client.accountId, nil +} + +func (client *AliyunClient) getSdkConfig() *sdk.Config { + // Fix bug "open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory" which happened in windows. + if data, ok := resource.GetTZData("GMT"); ok { + utils.TZData = data + utils.LoadLocationFromTZData = time.LoadLocationFromTZData + } + return sdk.NewConfig(). + WithMaxRetryTime(5). + WithTimeout(time.Duration(30000000000)). + WithUserAgent(client.getUserAgent()). + WithGoRoutinePoolSize(10). + WithDebug(false). + WithHttpTransport(client.getTransport()) +} + +func (client *AliyunClient) getUserAgent() string { + return fmt.Sprintf("HashiCorp-Terraform-v%s", strings.TrimSuffix(terraform.VersionString(), "-dev")) +} + +func (client *AliyunClient) getTransport() *http.Transport { + handshakeTimeout, err := strconv.Atoi(os.Getenv("TLSHandshakeTimeout")) + if err != nil { + handshakeTimeout = 120 + } + transport := &http.Transport{} + transport.TLSHandshakeTimeout = time.Duration(handshakeTimeout) * time.Second + + // After building a new transport and it need to set http proxy to support proxy. + proxyUrl := client.getHttpProxyUrl() + if proxyUrl != nil { + transport.Proxy = http.ProxyURL(proxyUrl) + } + return transport +} + +func (client *AliyunClient) getHttpProxyUrl() *url.URL { + for _, v := range []string{"HTTPS_PROXY", "https_proxy", "HTTP_PROXY", "http_proxy"} { + value := strings.Trim(os.Getenv(v), " ") + if value != "" { + if !regexp.MustCompile(`^http(s)?://`).MatchString(value) { + value = fmt.Sprintf("http://%s", value) + } + proxyUrl, err := url.Parse(value) + if err == nil { + return proxyUrl + } + break + } + } + return nil +} + +func (client *AliyunClient) describeEndpointForService(serviceCode ServiceCode) *location.EndpointItem { + args := &location.DescribeEndpointsArgs{ + Id: common.Region(client.RegionId), + ServiceCode: strings.ToLower(string(serviceCode)), + Type: "openAPI", + } + locationClient := location.NewClient(client.AccessKey, client.SecretKey) + locationClient.SetSecurityToken(client.SecurityToken) + endpointsResponse, err := locationClient.DescribeEndpoints(args) + if err != nil { + log.Printf("[DEBUG] Describe %s endpoint using region: %#v got an error: %#v.", serviceCode, client.RegionId, err) + } else if endpointsResponse != nil && len(endpointsResponse.Endpoints.Endpoint) > 0 { + endpointItem := endpointsResponse.Endpoints.Endpoint + return &endpointItem[0] + } + return nil +} + +func (client *AliyunClient) getCallerIdentity() (*sts.GetCallerIdentityResponse, error) { + args := sts.CreateGetCallerIdentityRequest() + args.Scheme = "https" + + endpoint := loadEndpoint(client.config.RegionId, STSCode) + if endpoint != "" { + endpoints.AddEndpointMapping(client.config.RegionId, string(STSCode), endpoint) + } + stsClient, err := sts.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(), client.config.getAuthCredential(true)) + if err != nil { + return nil, fmt.Errorf("unable to initialize the STS client: %#v", err) + } + + identity, err := stsClient.GetCallerIdentity(args) + if err != nil { + return nil, err + } + if identity == nil { + return nil, fmt.Errorf("caller identity not found") + } + return identity, err +} diff --git a/alicloud/connectivity/config.go b/alicloud/connectivity/config.go new file mode 100644 index 00000000000..d6197e4c85a --- /dev/null +++ b/alicloud/connectivity/config.go @@ -0,0 +1,52 @@ +package connectivity + +import ( + "fmt" + + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials" + + "github.com/denverdino/aliyungo/common" +) + +// Config of aliyun +type Config struct { + AccessKey string + SecretKey string + Region common.Region + RegionId string + SecurityToken string + OtsInstanceName string + LogEndpoint string + AccountId string + FcEndpoint string + MNSEndpoint string +} + +func (c *Config) loadAndValidate() error { + err := c.validateRegion() + if err != nil { + return err + } + + return nil +} + +func (c *Config) validateRegion() error { + + for _, valid := range common.ValidRegions { + if c.Region == valid { + return nil + } + } + + return fmt.Errorf("Not a valid region: %s", c.Region) +} + +func (c *Config) getAuthCredential(stsSupported bool) auth.Credential { + if stsSupported { + return credentials.NewStsTokenCredential(c.AccessKey, c.SecretKey, c.SecurityToken) + } + + return credentials.NewAccessKeyCredential(c.AccessKey, c.SecretKey) +} diff --git a/alicloud/connectivity/endpoint.go b/alicloud/connectivity/endpoint.go new file mode 100644 index 00000000000..61a4e6dfce3 --- /dev/null +++ b/alicloud/connectivity/endpoint.go @@ -0,0 +1,95 @@ +package connectivity + +import ( + "encoding/xml" + "fmt" + "io/ioutil" + "os" + "strings" +) + +// Load endpoints from endpoints.xml or environment variables to meet specified application scenario, like private cloud. +type ServiceCode string + +const ( + ECSCode = ServiceCode("ECS") + ESSCode = ServiceCode("ESS") + RAMCode = ServiceCode("RAM") + VPCCode = ServiceCode("VPC") + SLBCode = ServiceCode("SLB") + RDSCode = ServiceCode("RDS") + OSSCode = ServiceCode("OSS") + CONTAINCode = ServiceCode("CS") + DOMAINCode = ServiceCode("DOMAIN") + CDNCode = ServiceCode("CDN") + CMSCode = ServiceCode("CMS") + KMSCode = ServiceCode("KMS") + OTSCode = ServiceCode("OTS") + PVTZCode = ServiceCode("PVTZ") + LOGCode = ServiceCode("LOG") + FCCode = ServiceCode("FC") + DDSCode = ServiceCode("DDS") + STSCode = ServiceCode("STS") + CENCode = ServiceCode("CEN") + KVSTORECode = ServiceCode("KVSTORE") + DATAHUBCode = ServiceCode("DATAHUB") + MNSCode = ServiceCode("MNS") + CLOUDAPICode = ServiceCode("CLOUDAPI") +) + +//xml +type Endpoints struct { + Endpoint []Endpoint `xml:"Endpoint"` +} + +type Endpoint struct { + Name string `xml:"name,attr"` + RegionIds RegionIds `xml:"RegionIds"` + Products Products `xml:"Products"` +} + +type RegionIds struct { + RegionId string `xml:"RegionId"` +} + +type Products struct { + Product []Product `xml:"Product"` +} + +type Product struct { + ProductName string `xml:"ProductName"` + DomainName string `xml:"DomainName"` +} + +func loadEndpoint(region string, serviceCode ServiceCode) string { + endpoint := strings.TrimSpace(os.Getenv(fmt.Sprintf("%s_ENDPOINT", string(serviceCode)))) + if endpoint != "" { + return endpoint + } + + // Load current path endpoint file endpoints.xml, if failed, it will load from environment variables TF_ENDPOINT_PATH + data, err := ioutil.ReadFile("./endpoints.xml") + if err != nil || len(data) <= 0 { + d, e := ioutil.ReadFile(os.Getenv("TF_ENDPOINT_PATH")) + if e != nil { + return "" + } + data = d + } + var endpoints Endpoints + err = xml.Unmarshal(data, &endpoints) + if err != nil { + return "" + } + for _, endpoint := range endpoints.Endpoint { + if endpoint.RegionIds.RegionId == string(region) { + for _, product := range endpoint.Products.Product { + if strings.ToLower(product.ProductName) == strings.ToLower(string(serviceCode)) { + return product.DomainName + } + } + } + } + + return "" +} diff --git a/alicloud/data_source_alicloud_account.go b/alicloud/data_source_alicloud_account.go index 1ba0e994a21..3fc8b0bf796 100644 --- a/alicloud/data_source_alicloud_account.go +++ b/alicloud/data_source_alicloud_account.go @@ -4,6 +4,7 @@ import ( "log" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudAccount() *schema.Resource { @@ -21,7 +22,7 @@ func dataSourceAlicloudAccount() *schema.Resource { } func dataSourceAlicloudAccountRead(d *schema.ResourceData, meta interface{}) error { - accountId, err := meta.(*AliyunClient).AccountId() + accountId, err := meta.(*connectivity.AliyunClient).AccountId() if err != nil { return err diff --git a/alicloud/data_source_alicloud_api_gateway_groups.go b/alicloud/data_source_alicloud_api_gateway_groups.go index acde40c146a..0b0859a3829 100644 --- a/alicloud/data_source_alicloud_api_gateway_groups.go +++ b/alicloud/data_source_alicloud_api_gateway_groups.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/cloudapi" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudApiGatewayGroups() *schema.Resource { @@ -77,20 +78,23 @@ func dataSourceAlicloudApiGatewayGroups() *schema.Resource { } } func dataSourceAlicloudApigatewayGroupsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).cloudapiconn + client := meta.(*connectivity.AliyunClient) args := cloudapi.CreateDescribeApiGroupsRequest() - args.RegionId = getRegionId(d, meta) + args.RegionId = client.RegionId args.PageSize = requests.NewInteger(PageSizeLarge) args.PageNumber = requests.NewInteger(1) var allGroups []cloudapi.ApiGroupAttribute for { - resp, err := conn.DescribeApiGroups(args) + raw, err := client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) { + return cloudApiClient.DescribeApiGroups(args) + }) if err != nil { return err } + resp, _ := raw.(*cloudapi.DescribeApiGroupsResponse) if resp == nil { break diff --git a/alicloud/data_source_alicloud_cen_bandwidth_limits.go b/alicloud/data_source_alicloud_cen_bandwidth_limits.go index a2037b6929c..ace2bd3d181 100644 --- a/alicloud/data_source_alicloud_cen_bandwidth_limits.go +++ b/alicloud/data_source_alicloud_cen_bandwidth_limits.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudCenBandwidthLimits() *schema.Resource { @@ -89,7 +90,7 @@ func dataSourceAlicloudCenBandwidthLimitsRead(d *schema.ResourceData, meta inter } func getCenBandwidthLimits(instanceId string, meta interface{}) ([]cbn.CenInterRegionBandwidthLimit, error) { - conn := meta.(*AliyunClient).cenconn + client := meta.(*connectivity.AliyunClient) args := cbn.CreateDescribeCenInterRegionBandwidthLimitsRequest() args.PageSize = requests.NewInteger(PageSizeLarge) @@ -101,10 +102,13 @@ func getCenBandwidthLimits(instanceId string, meta interface{}) ([]cbn.CenInterR var allCenBwLimits []cbn.CenInterRegionBandwidthLimit for { - resp, err := conn.DescribeCenInterRegionBandwidthLimits(args) + raw, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DescribeCenInterRegionBandwidthLimits(args) + }) if err != nil { return allCenBwLimits, err } + resp, _ := raw.(*cbn.DescribeCenInterRegionBandwidthLimitsResponse) if resp == nil || len(resp.CenInterRegionBandwidthLimits.CenInterRegionBandwidthLimit) < 1 { break diff --git a/alicloud/data_source_alicloud_cen_bandwidth_packages.go b/alicloud/data_source_alicloud_cen_bandwidth_packages.go index d675bd9384d..b72bcf5295d 100644 --- a/alicloud/data_source_alicloud_cen_bandwidth_packages.go +++ b/alicloud/data_source_alicloud_cen_bandwidth_packages.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudCenBandwidthPackages() *schema.Resource { @@ -118,7 +119,7 @@ func dataSourceAlicloudCensBandwidthPackagesRead(d *schema.ResourceData, meta in } func doRequestCenBandwidthPackages(filters []cbn.DescribeCenBandwidthPackagesFilter, d *schema.ResourceData, meta interface{}) ([]cbn.CenBandwidthPackage, error) { - conn := meta.(*AliyunClient).cenconn + client := meta.(*connectivity.AliyunClient) args := cbn.CreateDescribeCenBandwidthPackagesRequest() args.PageSize = requests.NewInteger(PageSizeLarge) @@ -146,10 +147,13 @@ func doRequestCenBandwidthPackages(filters []cbn.DescribeCenBandwidthPackagesFil var allCenBwps []cbn.CenBandwidthPackage for { - resp, err := conn.DescribeCenBandwidthPackages(args) + raw, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DescribeCenBandwidthPackages(args) + }) if err != nil { return allCenBwps, err } + resp, _ := raw.(*cbn.DescribeCenBandwidthPackagesResponse) if resp == nil || len(resp.CenBandwidthPackages.CenBandwidthPackage) < 1 { break diff --git a/alicloud/data_source_alicloud_cen_instances.go b/alicloud/data_source_alicloud_cen_instances.go index 30619bf65f0..534b5b71a89 100644 --- a/alicloud/data_source_alicloud_cen_instances.go +++ b/alicloud/data_source_alicloud_cen_instances.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudCenInstances() *schema.Resource { @@ -98,7 +99,7 @@ func dataSourceAlicloudCenInstancesRead(d *schema.ResourceData, meta interface{} } func getCenInstances(filters []cbn.DescribeCensFilter, d *schema.ResourceData, meta interface{}) ([]cbn.Cen, error) { - conn := meta.(*AliyunClient).cenconn + client := meta.(*connectivity.AliyunClient) args := cbn.CreateDescribeCensRequest() args.PageSize = requests.NewInteger(PageSizeLarge) @@ -116,10 +117,13 @@ func getCenInstances(filters []cbn.DescribeCensFilter, d *schema.ResourceData, m var allCens []cbn.Cen for { - resp, err := conn.DescribeCens(args) + raw, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DescribeCens(args) + }) if err != nil { return allCens, err } + resp, _ := raw.(*cbn.DescribeCensResponse) if resp == nil || len(resp.Cens.Cen) < 1 { break @@ -221,7 +225,7 @@ func censDescriptionAttributes(d *schema.ResourceData, cenSetTypes []cbn.Cen, me } func censDescribeCenAttachedChildInstances(d *schema.ResourceData, cenId string, meta interface{}) ([]string, error) { - + client := meta.(*connectivity.AliyunClient) var instanceIds []string args := cbn.CreateDescribeCenAttachedChildInstancesRequest() @@ -230,10 +234,13 @@ func censDescribeCenAttachedChildInstances(d *schema.ResourceData, cenId string, args.PageNumber = requests.NewInteger(1) for { - resp, err := meta.(*AliyunClient).cenconn.DescribeCenAttachedChildInstances(args) + raw, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DescribeCenAttachedChildInstances(args) + }) if err != nil { return nil, fmt.Errorf("DescribeCenAttachedChildInstances got an error: %#v.", err) } + resp, _ := raw.(*cbn.DescribeCenAttachedChildInstancesResponse) if resp != nil && len(resp.ChildInstances.ChildInstance) > 0 { for _, inst := range resp.ChildInstances.ChildInstance { diff --git a/alicloud/data_source_alicloud_cen_route_entries.go b/alicloud/data_source_alicloud_cen_route_entries.go index 81f811c82fc..b76ccf72d37 100644 --- a/alicloud/data_source_alicloud_cen_route_entries.go +++ b/alicloud/data_source_alicloud_cen_route_entries.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudCenRouteEntries() *schema.Resource { @@ -105,8 +106,8 @@ func dataSourceAlicloudCenRouteEntries() *schema.Resource { } func dataSourceAlicloudCenPublishedRouteEntriesRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.cenconn + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} args := cbn.CreateDescribePublishedRouteEntriesRequest() args.CenId = d.Get("instance_id").(string) @@ -115,7 +116,7 @@ func dataSourceAlicloudCenPublishedRouteEntriesRead(d *schema.ResourceData, meta args.DestinationCidrBlock = v.(string) } - childInstanceId, childInstanceType, err := client.createCenRouteEntryParas(args.ChildInstanceRouteTableId) + childInstanceId, childInstanceType, err := cenService.CreateCenRouteEntryParas(args.ChildInstanceRouteTableId) if err != nil { return fmt.Errorf("Query route entry encounter an error, CEN %s vtb %s region_id %s, error info: %#v.", args.CenId, args.ChildInstanceRouteTableId, client.RegionId, err) @@ -129,11 +130,14 @@ func dataSourceAlicloudCenPublishedRouteEntriesRead(d *schema.ResourceData, meta var allPublishedRouteEntries []cbn.PublishedRouteEntry for pageNumber := 1; ; pageNumber++ { args.PageNumber = requests.NewInteger(pageNumber) - resp, err := conn.DescribePublishedRouteEntries(args) + raw, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DescribePublishedRouteEntries(args) + }) if err != nil { return err } + resp, _ := raw.(*cbn.DescribePublishedRouteEntriesResponse) if resp == nil || len(resp.PublishedRouteEntries.PublishedRouteEntry) < 1 { break diff --git a/alicloud/data_source_alicloud_db_instances.go b/alicloud/data_source_alicloud_db_instances.go index 4a0a9bc151a..891ed351d66 100644 --- a/alicloud/data_source_alicloud_db_instances.go +++ b/alicloud/data_source_alicloud_db_instances.go @@ -6,6 +6,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudDBInstances() *schema.Resource { @@ -165,11 +166,11 @@ func dataSourceAlicloudDBInstances() *schema.Resource { } func dataSourceAlicloudDBInstancesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).rdsconn + client := meta.(*connectivity.AliyunClient) args := rds.CreateDescribeDBInstancesRequest() - args.RegionId = getRegionId(d, meta) + args.RegionId = client.RegionId args.Engine = d.Get("engine").(string) args.DBInstanceStatus = d.Get("status").(string) args.DBInstanceType = d.Get("db_type").(string) @@ -189,11 +190,13 @@ func dataSourceAlicloudDBInstancesRead(d *schema.ResourceData, meta interface{}) } for { - resp, err := conn.DescribeDBInstances(args) + raw, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DescribeDBInstances(args) + }) if err != nil { return err } - + resp, _ := raw.(*rds.DescribeDBInstancesResponse) if resp == nil || len(resp.Items.DBInstance) < 1 { break } diff --git a/alicloud/data_source_alicloud_disks.go b/alicloud/data_source_alicloud_disks.go index 3fb41806511..de37b399c9f 100644 --- a/alicloud/data_source_alicloud_disks.go +++ b/alicloud/data_source_alicloud_disks.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudDisks() *schema.Resource { @@ -140,7 +141,7 @@ func dataSourceAlicloudDisks() *schema.Resource { } func dataSourceAlicloudDisksRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) args := ecs.CreateDescribeDisksRequest() @@ -179,10 +180,13 @@ func dataSourceAlicloudDisksRead(d *schema.ResourceData, meta interface{}) error args.PageSize = requests.NewInteger(PageSizeLarge) args.PageNumber = requests.NewInteger(1) for { - resp, err := client.ecsconn.DescribeDisks(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeDisks(args) + }) if err != nil { return err } + resp, _ := raw.(*ecs.DescribeDisksResponse) if resp == nil || len(resp.Disks.Disk) < 1 { break diff --git a/alicloud/data_source_alicloud_dns_domains.go b/alicloud/data_source_alicloud_dns_domains.go index a150ff1c189..9913282458e 100644 --- a/alicloud/data_source_alicloud_dns_domains.go +++ b/alicloud/data_source_alicloud_dns_domains.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/dns" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudDnsDomains() *schema.Resource { @@ -96,7 +97,7 @@ func dataSourceAlicloudDnsDomains() *schema.Resource { } } func dataSourceAlicloudDnsDomainsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.DescribeDomainsArgs{} @@ -104,10 +105,13 @@ func dataSourceAlicloudDnsDomainsRead(d *schema.ResourceData, meta interface{}) pagination := getPagination(1, 50) for { args.Pagination = pagination - domains, err := conn.DescribeDomains(args) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomains(args) + }) if err != nil { return err } + domains, _ := raw.([]dns.DomainType) allDomains = append(allDomains, domains...) if len(domains) < pagination.PageSize { diff --git a/alicloud/data_source_alicloud_dns_groups.go b/alicloud/data_source_alicloud_dns_groups.go index 14a9bcf0c74..7e96e6b2cff 100644 --- a/alicloud/data_source_alicloud_dns_groups.go +++ b/alicloud/data_source_alicloud_dns_groups.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/dns" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudDnsGroups() *schema.Resource { @@ -46,7 +47,7 @@ func dataSourceAlicloudDnsGroups() *schema.Resource { } func dataSourceAlicloudDnsGroupsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.DescribeDomainGroupsArgs{} @@ -54,10 +55,13 @@ func dataSourceAlicloudDnsGroupsRead(d *schema.ResourceData, meta interface{}) e pagination := getPagination(1, 50) for { args.Pagination = pagination - groups, err := conn.DescribeDomainGroups(args) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainGroups(args) + }) if err != nil { return err } + groups, _ := raw.([]dns.DomainGroupType) allGroups = append(allGroups, groups...) if len(groups) < pagination.PageSize { diff --git a/alicloud/data_source_alicloud_dns_records.go b/alicloud/data_source_alicloud_dns_records.go index 0d01015d78e..30ba8042ca6 100644 --- a/alicloud/data_source_alicloud_dns_records.go +++ b/alicloud/data_source_alicloud_dns_records.go @@ -8,6 +8,7 @@ import ( "github.com/denverdino/aliyungo/dns" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudDnsRecords() *schema.Resource { @@ -118,7 +119,7 @@ func dataSourceAlicloudDnsRecords() *schema.Resource { } func dataSourceAlicloudDnsRecordsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.DescribeDomainRecordsNewArgs{ DomainName: d.Get("domain_name").(string), @@ -132,10 +133,13 @@ func dataSourceAlicloudDnsRecordsRead(d *schema.ResourceData, meta interface{}) pagination := getPagination(1, 50) for { args.Pagination = pagination - resp, err := conn.DescribeDomainRecordsNew(args) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainRecordsNew(args) + }) if err != nil { return err } + resp, _ := raw.(*dns.DescribeDomainRecordsNewResponse) records := resp.DomainRecords.Record allRecords = append(allRecords, records...) diff --git a/alicloud/data_source_alicloud_eips.go b/alicloud/data_source_alicloud_eips.go index e959868e92e..eef7cc0ae67 100644 --- a/alicloud/data_source_alicloud_eips.go +++ b/alicloud/data_source_alicloud_eips.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudEips() *schema.Resource { @@ -83,10 +84,10 @@ func dataSourceAlicloudEips() *schema.Resource { } } func dataSourceAlicloudEipsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) args := vpc.CreateDescribeEipAddressesRequest() - args.RegionId = string(getRegion(d, meta)) + args.RegionId = string(client.Region) args.PageSize = requests.NewInteger(PageSizeLarge) idsMap := make(map[string]string) @@ -108,11 +109,13 @@ func dataSourceAlicloudEipsRead(d *schema.ResourceData, meta interface{}) error var allEips []vpc.EipAddress for { - resp, err := conn.DescribeEipAddresses(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeEipAddresses(args) + }) if err != nil { return err } - + resp, _ := raw.(*vpc.DescribeEipAddressesResponse) if resp == nil || len(resp.EipAddresses.EipAddress) < 1 { break } diff --git a/alicloud/data_source_alicloud_fc_functions.go b/alicloud/data_source_alicloud_fc_functions.go index 83d8fcacd32..26b5d7440d4 100644 --- a/alicloud/data_source_alicloud_fc_functions.go +++ b/alicloud/data_source_alicloud_fc_functions.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/fc-go-sdk" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudFcFunctions() *schema.Resource { @@ -88,12 +89,7 @@ func dataSourceAlicloudFcFunctions() *schema.Resource { } func dataSourceAlicloudFcFunctionsRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - - fcconn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) serviceName := d.Get("service_name").(string) @@ -106,10 +102,13 @@ func dataSourceAlicloudFcFunctionsRead(d *schema.ResourceData, meta interface{}) args.NextToken = &nextToken } - resp, err := fcconn.ListFunctions(args) + raw, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.ListFunctions(args) + }) if err != nil { return err } + resp, _ := raw.(*fc.ListFunctionsOutput) if resp.Functions == nil || len(resp.Functions) < 1 { break diff --git a/alicloud/data_source_alicloud_fc_services.go b/alicloud/data_source_alicloud_fc_services.go index 1610c1b9425..8a0d622e1cf 100644 --- a/alicloud/data_source_alicloud_fc_services.go +++ b/alicloud/data_source_alicloud_fc_services.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/fc-go-sdk" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudFcServices() *schema.Resource { @@ -109,12 +110,7 @@ func dataSourceAlicloudFcServices() *schema.Resource { } func dataSourceAlicloudFcServicesRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - - fcconn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) var ids []string var serviceMappings []map[string]interface{} @@ -125,10 +121,13 @@ func dataSourceAlicloudFcServicesRead(d *schema.ResourceData, meta interface{}) args.NextToken = &nextToken } - resp, err := fcconn.ListServices(args) + raw, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.ListServices(args) + }) if err != nil { return err } + resp, _ := raw.(*fc.ListServicesOutput) if resp.Services == nil || len(resp.Services) < 1 { break diff --git a/alicloud/data_source_alicloud_fc_triggers.go b/alicloud/data_source_alicloud_fc_triggers.go index 33681d99d90..491795c091d 100644 --- a/alicloud/data_source_alicloud_fc_triggers.go +++ b/alicloud/data_source_alicloud_fc_triggers.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/fc-go-sdk" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudFcTriggers() *schema.Resource { @@ -79,12 +80,7 @@ func dataSourceAlicloudFcTriggers() *schema.Resource { } func dataSourceAlicloudFcTriggersRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - - fcconn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) serviceName := d.Get("service_name").(string) functionName := d.Get("function_name").(string) @@ -98,10 +94,13 @@ func dataSourceAlicloudFcTriggersRead(d *schema.ResourceData, meta interface{}) args.NextToken = &nextToken } - resp, err := fcconn.ListTriggers(args) + raw, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.ListTriggers(args) + }) if err != nil { return err } + resp, _ := raw.(*fc.ListTriggersOutput) if resp.Triggers == nil || len(resp.Triggers) < 1 { break diff --git a/alicloud/data_source_alicloud_images.go b/alicloud/data_source_alicloud_images.go index be7e79fea1b..96528f35114 100644 --- a/alicloud/data_source_alicloud_images.go +++ b/alicloud/data_source_alicloud_images.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudImages() *schema.Resource { @@ -162,7 +163,7 @@ func dataSourceAlicloudImages() *schema.Resource { // dataSourceAlicloudImagesDescriptionRead performs the Alicloud Image lookup. func dataSourceAlicloudImagesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ecsconn + client := meta.(*connectivity.AliyunClient) nameRegex, nameRegexOk := d.GetOk("name_regex") owners, ownersOk := d.GetOk("owners") @@ -183,10 +184,13 @@ func dataSourceAlicloudImagesRead(d *schema.ResourceData, meta interface{}) erro var allImages []ecs.Image for { - resp, err := conn.DescribeImages(params) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeImages(params) + }) if err != nil { return err } + resp, _ := raw.(*ecs.DescribeImagesResponse) if resp == nil || len(resp.Images.Image) < 1 { break } @@ -330,9 +334,10 @@ func imageDiskDeviceMappings(m []ecs.DiskDeviceMapping) []map[string]interface{} //Returns a mapping of image tags func imageTagsMappings(d *schema.ResourceData, imageId string, meta interface{}) map[string]string { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} - tags, err := client.DescribeTags(imageId, TagResourceImage) + tags, err := ecsService.DescribeTags(imageId, TagResourceImage) if err != nil { log.Printf("[ERROR] DescribeTags for image got error: %#v", err) diff --git a/alicloud/data_source_alicloud_instance_types.go b/alicloud/data_source_alicloud_instance_types.go index ad3ad6e01ad..9fad0184f17 100644 --- a/alicloud/data_source_alicloud_instance_types.go +++ b/alicloud/data_source_alicloud_instance_types.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudInstanceTypes() *schema.Resource { @@ -155,9 +156,10 @@ func dataSourceAlicloudInstanceTypes() *schema.Resource { } func dataSourceAlicloudInstanceTypesRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} - zoneId, validZones, err := client.DescribeAvailableResources(d, meta, InstanceTypeResource) + zoneId, validZones, err := ecsService.DescribeAvailableResources(d, meta, InstanceTypeResource) if err != nil { return err } @@ -189,10 +191,13 @@ func dataSourceAlicloudInstanceTypesRead(d *schema.ResourceData, meta interface{ req := ecs.CreateDescribeInstanceTypesRequest() req.InstanceTypeFamily = family - resp, err := client.ecsconn.DescribeInstanceTypes(req) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstanceTypes(req) + }) if err != nil { return err } + resp, _ := raw.(*ecs.DescribeInstanceTypesResponse) if resp == nil || len(resp.InstanceTypes.InstanceType) < 1 { return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.") } diff --git a/alicloud/data_source_alicloud_instances.go b/alicloud/data_source_alicloud_instances.go index ed55fff7bc3..b341b5958f9 100644 --- a/alicloud/data_source_alicloud_instances.go +++ b/alicloud/data_source_alicloud_instances.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudInstances() *schema.Resource { @@ -183,7 +184,7 @@ func dataSourceAlicloudInstances() *schema.Resource { } } func dataSourceAlicloudInstancesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ecsconn + client := meta.(*connectivity.AliyunClient) args := ecs.CreateDescribeInstancesRequest() args.Status = d.Get("status").(string) @@ -217,11 +218,13 @@ func dataSourceAlicloudInstancesRead(d *schema.ResourceData, meta interface{}) e args.PageNumber = requests.NewInteger(1) for { - resp, err := conn.DescribeInstances(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstances(args) + }) if err != nil { return err } - + resp, _ := raw.(*ecs.DescribeInstancesResponse) if resp == nil || len(resp.Instances.Instance) < 1 { break } @@ -324,16 +327,19 @@ func instancessDescriptionAttributes(d *schema.ResourceData, instances []ecs.Ins //Returns a mapping of instance disks func instanceDisksMappings(d *schema.ResourceData, instanceId string, meta interface{}) []map[string]interface{} { - + client := meta.(*connectivity.AliyunClient) req := ecs.CreateDescribeDisksRequest() req.InstanceId = instanceId - resp, err := meta.(*AliyunClient).ecsconn.DescribeDisks(req) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeDisks(req) + }) if err != nil { log.Printf("[ERROR] DescribeDisks for instance got error: %#v", err) return nil } + resp, _ := raw.(*ecs.DescribeDisksResponse) if resp == nil || len(resp.Disks.Disk) < 1 { return nil } diff --git a/alicloud/data_source_alicloud_key_pairs.go b/alicloud/data_source_alicloud_key_pairs.go index cb096d109b1..6ab0a467211 100644 --- a/alicloud/data_source_alicloud_key_pairs.go +++ b/alicloud/data_source_alicloud_key_pairs.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudKeyPairs() *schema.Resource { @@ -63,7 +64,7 @@ func dataSourceAlicloudKeyPairs() *schema.Resource { } func dataSourceAlicloudKeyPairsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ecsconn + client := meta.(*connectivity.AliyunClient) var regex *regexp.Regexp if name, ok := d.GetOk("name_regex"); ok { @@ -80,10 +81,13 @@ func dataSourceAlicloudKeyPairsRead(d *schema.ResourceData, meta interface{}) er keyPairsAttach := make(map[string][]map[string]interface{}) for true { - results, err := conn.DescribeKeyPairs(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeKeyPairs(args) + }) if err != nil { return fmt.Errorf("Error DescribekeyPairs: %#v", err) } + results, _ := raw.(*ecs.DescribeKeyPairsResponse) if results == nil || len(results.KeyPairs.KeyPair) < 1 { break } @@ -108,10 +112,13 @@ func dataSourceAlicloudKeyPairsRead(d *schema.ResourceData, meta interface{}) er req.PageSize = requests.NewInteger(PageSizeLarge) for true { - resp, err := conn.DescribeInstances(req) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstances(req) + }) if err != nil { return fmt.Errorf("Error DescribeInstances: %#v", err) } + resp, _ := raw.(*ecs.DescribeInstancesResponse) if resp == nil || len(resp.Instances.Instance) < 1 { break } diff --git a/alicloud/data_source_alicloud_kms_keys.go b/alicloud/data_source_alicloud_kms_keys.go index d5d8d6936fa..5c97575f002 100644 --- a/alicloud/data_source_alicloud_kms_keys.go +++ b/alicloud/data_source_alicloud_kms_keys.go @@ -6,6 +6,7 @@ import ( "github.com/denverdino/aliyungo/kms" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudKmsKeys() *schema.Resource { @@ -82,7 +83,7 @@ func dataSourceAlicloudKmsKeys() *schema.Resource { } func dataSourceAlicloudKmsKeysRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).kmsconn + client := meta.(*connectivity.AliyunClient) args := &kms.ListKeysArgs{} @@ -97,10 +98,13 @@ func dataSourceAlicloudKmsKeysRead(d *schema.ResourceData, meta interface{}) err pagination := getPagination(1, 50) for true { args.Pagination = pagination - results, err := conn.ListKeys(args) + raw, err := client.WithKmsClient(func(kmsClient *kms.Client) (interface{}, error) { + return kmsClient.ListKeys(args) + }) if err != nil { return fmt.Errorf("Error ListKeys: %#v", err) } + results, _ := raw.(*kms.ListKeysResponse) for _, key := range results.Keys.Key { if idsMap != nil { if _, ok := idsMap[key.KeyId]; ok { @@ -130,11 +134,13 @@ func dataSourceAlicloudKmsKeysRead(d *schema.ResourceData, meta interface{}) err status, statusOk := d.GetOk("status") for _, k := range keyIds { - key, err := conn.DescribeKey(k) + raw, err := client.WithKmsClient(func(kmsClient *kms.Client) (interface{}, error) { + return kmsClient.DescribeKey(k) + }) if err != nil { return fmt.Errorf("DescribeKey got an error: %#v", err) } - + key, _ := raw.(*kms.DescribeKeyResponse) if r != nil && !r.MatchString(key.KeyMetadata.Description) { continue } diff --git a/alicloud/data_source_alicloud_kvstore_instances.go b/alicloud/data_source_alicloud_kvstore_instances.go index 801112ca382..707b9059500 100644 --- a/alicloud/data_source_alicloud_kvstore_instances.go +++ b/alicloud/data_source_alicloud_kvstore_instances.go @@ -6,6 +6,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/r-kvstore" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudKVStoreInstances() *schema.Resource { @@ -144,10 +145,10 @@ func dataSourceAlicloudKVStoreInstances() *schema.Resource { } func dataSourceAlicloudKVStoreInstancesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).rkvconn + client := meta.(*connectivity.AliyunClient) args := r_kvstore.CreateDescribeInstancesRequest() - args.RegionId = getRegionId(d, meta) + args.RegionId = client.RegionId args.VpcId = d.Get("vpc_id").(string) args.VSwitchId = d.Get("vswitch_id").(string) args.InstanceType = d.Get("instance_type").(string) @@ -164,11 +165,13 @@ func dataSourceAlicloudKVStoreInstancesRead(d *schema.ResourceData, meta interfa } for { - resp, err := conn.DescribeInstances(args) + raw, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.DescribeInstances(args) + }) if err != nil { return err } - + resp, _ := raw.(*r_kvstore.DescribeInstancesResponse) if resp == nil || len(resp.Instances.KVStoreInstance) < 1 { break } diff --git a/alicloud/data_source_alicloud_mns_queue.go b/alicloud/data_source_alicloud_mns_queue.go index 3c8fff48281..24c446965f5 100644 --- a/alicloud/data_source_alicloud_mns_queue.go +++ b/alicloud/data_source_alicloud_mns_queue.go @@ -5,6 +5,7 @@ import ( "github.com/dxh031/ali_mns" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudMNSQueues() *schema.Resource { @@ -62,11 +63,7 @@ func dataSourceAlicloudMNSQueues() *schema.Resource { } func dataSourceAlicloudMNSQueueRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - queueManager, err := client.MnsQueueManager() - if err != nil { - return fmt.Errorf("Creating alicoudMNSQueue error: %#v", err) - } + client := meta.(*connectivity.AliyunClient) var namePrefix string if v, ok := d.GetOk("name_prefix"); ok { @@ -76,10 +73,13 @@ func dataSourceAlicloudMNSQueueRead(d *schema.ResourceData, meta interface{}) er var queueAttr []ali_mns.QueueAttribute for { var nextMaker string - queueDetails, err := queueManager.ListQueueDetail(nextMaker, 1000, namePrefix) + raw, err := client.WithMnsQueueManager(func(queueManager ali_mns.AliQueueManager) (interface{}, error) { + return queueManager.ListQueueDetail(nextMaker, 1000, namePrefix) + }) if err != nil { return fmt.Errorf("Get queueDetails error: %#v", err) } + queueDetails, _ := raw.(ali_mns.QueueDetails) for _, attr := range queueDetails.Attrs { queueAttr = append(queueAttr, attr) } diff --git a/alicloud/data_source_alicloud_mns_topic.go b/alicloud/data_source_alicloud_mns_topic.go index ab00ee8e732..7b27c963db5 100644 --- a/alicloud/data_source_alicloud_mns_topic.go +++ b/alicloud/data_source_alicloud_mns_topic.go @@ -5,6 +5,7 @@ import ( "github.com/dxh031/ali_mns" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudMNSTopics() *schema.Resource { @@ -51,11 +52,7 @@ func dataSourceAlicloudMNSTopics() *schema.Resource { } func dataSourceAlicloudMNSTopicRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - topicManager, err := client.MnsTopicManager() - if err != nil { - return fmt.Errorf("Creating alicoudMNSTopicManager error: %#v", err) - } + client := meta.(*connectivity.AliyunClient) var namePrefix string if v, ok := d.GetOk("name_prefix"); ok { @@ -65,10 +62,13 @@ func dataSourceAlicloudMNSTopicRead(d *schema.ResourceData, meta interface{}) er var topicAttr []ali_mns.TopicAttribute for { var nextMaker string - topicDetails, err := topicManager.ListTopicDetail(nextMaker, 1000, namePrefix) + raw, err := client.WithMnsTopicManager(func(topicManager ali_mns.AliTopicManager) (interface{}, error) { + return topicManager.ListTopicDetail(nextMaker, 1000, namePrefix) + }) if err != nil { return fmt.Errorf("Get topicDetails error: %#v", err) } + topicDetails, _ := raw.(ali_mns.TopicDetails) for _, attr := range topicDetails.Attrs { topicAttr = append(topicAttr, attr) } diff --git a/alicloud/data_source_alicloud_mns_topic_subscription.go b/alicloud/data_source_alicloud_mns_topic_subscription.go index 9217787ec9d..e054d865fd9 100644 --- a/alicloud/data_source_alicloud_mns_topic_subscription.go +++ b/alicloud/data_source_alicloud_mns_topic_subscription.go @@ -5,6 +5,7 @@ import ( "github.com/dxh031/ali_mns" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudMNSTopicSubscriptions() *schema.Resource { @@ -69,12 +70,8 @@ func dataSourceAlicloudMNSTopicSubscriptions() *schema.Resource { } func dataSourceAlicloudMNSTopicSubscriptionRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) topicName := d.Get("topic_name").(string) - subscriptionManager, err := client.MnsSubscriptionManager(topicName) - if err != nil { - return fmt.Errorf("Creating mns subscription client error: %#v", err) - } var namePrefix string if v, ok := d.GetOk("name_prefix"); ok { namePrefix = v.(string) @@ -83,10 +80,13 @@ func dataSourceAlicloudMNSTopicSubscriptionRead(d *schema.ResourceData, meta int var subscriptionAttr []ali_mns.SubscriptionAttribute for { var nextMaker string - subscriptionDetails, err := subscriptionManager.ListSubscriptionDetailByTopic(nextMaker, 1000, namePrefix) + raw, err := client.WithMnsSubscriptionManagerByTopicName(topicName, func(subscriptionManager ali_mns.AliMNSTopic) (interface{}, error) { + return subscriptionManager.ListSubscriptionDetailByTopic(nextMaker, 1000, namePrefix) + }) if err != nil { return fmt.Errorf("Getting alicoudMNSSubscription error: %#v", err) } + subscriptionDetails, _ := raw.(ali_mns.SubscriptionDetails) for _, attr := range subscriptionDetails.Attrs { subscriptionAttr = append(subscriptionAttr, attr) } diff --git a/alicloud/data_source_alicloud_mongo_instances.go b/alicloud/data_source_alicloud_mongo_instances.go index b7cad9a2588..b160d8e5c62 100644 --- a/alicloud/data_source_alicloud_mongo_instances.go +++ b/alicloud/data_source_alicloud_mongo_instances.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/dds" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudMongoInstances() *schema.Resource { @@ -164,11 +165,11 @@ func dataSourceAlicloudMongoInstances() *schema.Resource { } func dataSourceAlicloudMongoInstancesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ddsconn + client := meta.(*connectivity.AliyunClient) args := dds.CreateDescribeDBInstancesRequest() - args.RegionId = getRegionId(d, meta) + args.RegionId = client.RegionId args.DBInstanceType = d.Get("instance_type").(string) args.PageSize = requests.NewInteger(PageSizeLarge) args.PageNumber = requests.NewInteger(1) @@ -193,11 +194,13 @@ func dataSourceAlicloudMongoInstancesRead(d *schema.ResourceData, meta interface } for { - resp, err := conn.DescribeDBInstances(args) + raw, err := client.WithDdsClient(func(ddsClient *dds.Client) (interface{}, error) { + return ddsClient.DescribeDBInstances(args) + }) if err != nil { return err } - + resp, _ := raw.(*dds.DescribeDBInstancesResponse) if resp == nil || len(resp.DBInstances.DBInstance) < 1 { break } diff --git a/alicloud/data_source_alicloud_oss_bucket_objects.go b/alicloud/data_source_alicloud_oss_bucket_objects.go index cf576836e8a..6b44b26fa8b 100644 --- a/alicloud/data_source_alicloud_oss_bucket_objects.go +++ b/alicloud/data_source_alicloud_oss_bucket_objects.go @@ -7,8 +7,11 @@ import ( "strings" "time" + "net/http" + "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudOssBucketObjects() *schema.Resource { @@ -99,14 +102,9 @@ func dataSourceAlicloudOssBucketObjects() *schema.Resource { } func dataSourceAlicloudOssBucketObjectsRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) - // Get the bucket bucketName := d.Get("bucket_name").(string) - bucket, err := client.ossconn.Bucket(bucketName) - if err != nil { - return fmt.Errorf("unable to get the bucket %s: %#v", bucketName, err) - } // List bucket objects var initialOptions []oss.Option @@ -124,10 +122,13 @@ func dataSourceAlicloudOssBucketObjectsRead(d *schema.ResourceData, meta interfa options = append(options, oss.Marker(nextMarker)) } - resp, err := bucket.ListObjects(options...) + raw, err := client.WithOssBucketByName(bucketName, func(bucket *oss.Bucket) (interface{}, error) { + return bucket.ListObjects(options...) + }) if err != nil { return err } + resp, _ := raw.(oss.ListObjectsResult) if resp.Objects == nil || len(resp.Objects) < 1 { break @@ -162,10 +163,11 @@ func dataSourceAlicloudOssBucketObjectsRead(d *schema.ResourceData, meta interfa return fmt.Errorf("your query returned no results, please change your search criteria and try again") } log.Printf("[DEBUG] alicloud_oss_bucket_objects - Bucket objects found: %#v", filteredObjectsTemp) - return bucketObjectsDescriptionAttributes(d, bucket, filteredObjectsTemp, meta) + return bucketObjectsDescriptionAttributes(d, bucketName, filteredObjectsTemp, meta) } -func bucketObjectsDescriptionAttributes(d *schema.ResourceData, bucket *oss.Bucket, objects []oss.ObjectProperties, meta interface{}) error { +func bucketObjectsDescriptionAttributes(d *schema.ResourceData, bucketName string, objects []oss.ObjectProperties, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) var ids []string var s []map[string]interface{} for _, object := range objects { @@ -177,10 +179,13 @@ func bucketObjectsDescriptionAttributes(d *schema.ResourceData, bucket *oss.Buck } // Add metadata information - objectHeader, err := bucket.GetObjectDetailedMeta(object.Key) + raw, err := client.WithOssBucketByName(bucketName, func(bucket *oss.Bucket) (interface{}, error) { + return bucket.GetObjectDetailedMeta(object.Key) + }) if err != nil { log.Printf("[ERROR] Unable to get metadata for the object %s: %v", object.Key, err) } else { + objectHeader, _ := raw.(http.Header) mapping["content_type"] = objectHeader.Get("Content-Type") mapping["content_length"] = objectHeader.Get("Content-Length") mapping["cache_control"] = objectHeader.Get("Cache-Control") @@ -191,10 +196,13 @@ func bucketObjectsDescriptionAttributes(d *schema.ResourceData, bucket *oss.Buck mapping["server_side_encryption"] = objectHeader.Get("ServerSideEncryption") } // Add ACL information - objectACL, err := bucket.GetObjectACL(object.Key) + raw, err = client.WithOssBucketByName(bucketName, func(bucket *oss.Bucket) (interface{}, error) { + return bucket.GetObjectACL(object.Key) + }) if err != nil { log.Printf("[ERROR] Unable to get ACL for the object %s: %v", object.Key, err) } else { + objectACL, _ := raw.(oss.GetObjectACLResult) mapping["acl"] = objectACL.ACL } diff --git a/alicloud/data_source_alicloud_oss_buckets.go b/alicloud/data_source_alicloud_oss_buckets.go index d87300526c2..0222d1d421f 100644 --- a/alicloud/data_source_alicloud_oss_buckets.go +++ b/alicloud/data_source_alicloud_oss_buckets.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudOssBuckets() *schema.Resource { @@ -198,7 +199,7 @@ func dataSourceAlicloudOssBuckets() *schema.Resource { } func dataSourceAlicloudOssBucketsRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) var allBuckets []oss.BucketProperties nextMarker := "" @@ -208,10 +209,13 @@ func dataSourceAlicloudOssBucketsRead(d *schema.ResourceData, meta interface{}) options = append(options, oss.Marker(nextMarker)) } - resp, err := client.ossconn.ListBuckets(options...) + raw, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.ListBuckets(options...) + }) if err != nil { return err } + resp, _ := raw.(oss.ListBucketsResult) if resp.Buckets == nil || len(resp.Buckets) < 1 { break @@ -252,7 +256,7 @@ func dataSourceAlicloudOssBucketsRead(d *schema.ResourceData, meta interface{}) } func bucketsDescriptionAttributes(d *schema.ResourceData, buckets []oss.BucketProperties, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) var ids []string var s []map[string]interface{} @@ -265,8 +269,11 @@ func bucketsDescriptionAttributes(d *schema.ResourceData, buckets []oss.BucketPr } // Add additional information - resp, err := client.ossconn.GetBucketInfo(bucket.Name) + raw, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketInfo(bucket.Name) + }) if err == nil { + resp, _ := raw.(oss.GetBucketInfoResult) mapping["acl"] = resp.BucketInfo.ACL mapping["extranet_endpoint"] = resp.BucketInfo.ExtranetEndpoint mapping["intranet_endpoint"] = resp.BucketInfo.IntranetEndpoint @@ -277,28 +284,36 @@ func bucketsDescriptionAttributes(d *schema.ResourceData, buckets []oss.BucketPr // Add CORS rule information var ruleMappings []map[string]interface{} - cors, err := client.ossconn.GetBucketCORS(bucket.Name) + raw, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketCORS(bucket.Name) + }) if err != nil && !IsExceptedErrors(err, []string{NoSuchCORSConfiguration}) { log.Printf("[WARN] Unable to get CORS information for the bucket %s: %v", bucket.Name, err) - } else if err == nil && cors.CORSRules != nil { - for _, rule := range cors.CORSRules { - ruleMapping := make(map[string]interface{}) - ruleMapping["allowed_headers"] = rule.AllowedHeader - ruleMapping["allowed_methods"] = rule.AllowedMethod - ruleMapping["allowed_origins"] = rule.AllowedOrigin - ruleMapping["expose_headers"] = rule.ExposeHeader - ruleMapping["max_age_seconds"] = rule.MaxAgeSeconds - ruleMappings = append(ruleMappings, ruleMapping) + } else if err == nil { + cors, _ := raw.(oss.GetBucketCORSResult) + if cors.CORSRules != nil { + for _, rule := range cors.CORSRules { + ruleMapping := make(map[string]interface{}) + ruleMapping["allowed_headers"] = rule.AllowedHeader + ruleMapping["allowed_methods"] = rule.AllowedMethod + ruleMapping["allowed_origins"] = rule.AllowedOrigin + ruleMapping["expose_headers"] = rule.ExposeHeader + ruleMapping["max_age_seconds"] = rule.MaxAgeSeconds + ruleMappings = append(ruleMappings, ruleMapping) + } } } mapping["cors_rules"] = ruleMappings // Add website configuration var websiteMappings []map[string]interface{} - ws, err := client.ossconn.GetBucketWebsite(bucket.Name) + raw, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketWebsite(bucket.Name) + }) if err != nil && !IsExceptedErrors(err, []string{NoSuchWebsiteConfiguration}) { log.Printf("[WARN] Unable to get website information for the bucket %s: %v", bucket.Name, err) - } else if err == nil && &ws != nil { + } else if err == nil { + ws, _ := raw.(oss.GetBucketWebsiteResult) websiteMapping := make(map[string]interface{}) if v := &ws.IndexDocument; v != nil { websiteMapping["index_document"] = v.Suffix @@ -312,24 +327,32 @@ func bucketsDescriptionAttributes(d *schema.ResourceData, buckets []oss.BucketPr // Add logging information var loggingMappings []map[string]interface{} - logging, err := client.ossconn.GetBucketLogging(bucket.Name) + raw, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketLogging(bucket.Name) + }) if err != nil { log.Printf("[WARN] Unable to get logging information for the bucket %s: %v", bucket.Name, err) - } else if logging.LoggingEnabled.TargetBucket != "" || logging.LoggingEnabled.TargetPrefix != "" { - loggingMapping := map[string]interface{}{ - "target_bucket": logging.LoggingEnabled.TargetBucket, - "target_prefix": logging.LoggingEnabled.TargetPrefix, + } else { + logging, _ := raw.(oss.GetBucketLoggingResult) + if logging.LoggingEnabled.TargetBucket != "" || logging.LoggingEnabled.TargetPrefix != "" { + loggingMapping := map[string]interface{}{ + "target_bucket": logging.LoggingEnabled.TargetBucket, + "target_prefix": logging.LoggingEnabled.TargetPrefix, + } + loggingMappings = append(loggingMappings, loggingMapping) } - loggingMappings = append(loggingMappings, loggingMapping) } mapping["logging"] = loggingMappings // Add referer information var refererMappings []map[string]interface{} - referer, err := client.ossconn.GetBucketReferer(bucket.Name) + raw, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketReferer(bucket.Name) + }) if err != nil { log.Printf("[WARN] Unable to get referer information for the bucket %s: %v", bucket.Name, err) } else { + referer, _ := raw.(oss.GetBucketRefererResult) refererMapping := map[string]interface{}{ "allow_empty": referer.AllowEmptyReferer, "referers": referer.RefererList, @@ -340,30 +363,35 @@ func bucketsDescriptionAttributes(d *schema.ResourceData, buckets []oss.BucketPr // Add lifecycle information var lifecycleRuleMappings []map[string]interface{} - lifecycle, err := client.ossconn.GetBucketLifecycle(bucket.Name) + raw, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketLifecycle(bucket.Name) + }) if err != nil { log.Printf("[WARN] Unable to get lifecycle information for the bucket %s: %v", bucket.Name, err) - } else if len(lifecycle.Rules) > 0 { - for _, lifecycleRule := range lifecycle.Rules { - ruleMapping := make(map[string]interface{}) - ruleMapping["id"] = lifecycleRule.ID - ruleMapping["prefix"] = lifecycleRule.Prefix - if LifecycleRuleStatus(lifecycleRule.Status) == ExpirationStatusEnabled { - ruleMapping["enabled"] = true - } else { - ruleMapping["enabled"] = false - } - - // Expiration - expirationMapping := make(map[string]interface{}) - if !lifecycleRule.Expiration.Date.IsZero() { - expirationMapping["date"] = (lifecycleRule.Expiration.Date).Format("2006-01-02") - } - if &lifecycleRule.Expiration.Days != nil { - expirationMapping["days"] = int(lifecycleRule.Expiration.Days) + } else { + lifecycle, _ := raw.(oss.GetBucketLifecycleResult) + if len(lifecycle.Rules) > 0 { + for _, lifecycleRule := range lifecycle.Rules { + ruleMapping := make(map[string]interface{}) + ruleMapping["id"] = lifecycleRule.ID + ruleMapping["prefix"] = lifecycleRule.Prefix + if LifecycleRuleStatus(lifecycleRule.Status) == ExpirationStatusEnabled { + ruleMapping["enabled"] = true + } else { + ruleMapping["enabled"] = false + } + + // Expiration + expirationMapping := make(map[string]interface{}) + if !lifecycleRule.Expiration.Date.IsZero() { + expirationMapping["date"] = (lifecycleRule.Expiration.Date).Format("2006-01-02") + } + if &lifecycleRule.Expiration.Days != nil { + expirationMapping["days"] = int(lifecycleRule.Expiration.Days) + } + ruleMapping["expiration"] = []map[string]interface{}{expirationMapping} + lifecycleRuleMappings = append(lifecycleRuleMappings, ruleMapping) } - ruleMapping["expiration"] = []map[string]interface{}{expirationMapping} - lifecycleRuleMappings = append(lifecycleRuleMappings, ruleMapping) } } mapping["lifecycle_rule"] = lifecycleRuleMappings diff --git a/alicloud/data_source_alicloud_pvtz_zone_records.go b/alicloud/data_source_alicloud_pvtz_zone_records.go index 5a12ee520b7..8d56239922e 100644 --- a/alicloud/data_source_alicloud_pvtz_zone_records.go +++ b/alicloud/data_source_alicloud_pvtz_zone_records.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudPvtzZoneRecords() *schema.Resource { @@ -67,7 +68,7 @@ func dataSourceAlicloudPvtzZoneRecords() *schema.Resource { } func dataSourceAlicloudPvtzZoneRecordsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).pvtzconn + client := meta.(*connectivity.AliyunClient) args := pvtz.CreateDescribeZoneRecordsRequest() if zoneId, ok := d.GetOk("zone_id"); ok { args.ZoneId = zoneId.(string) @@ -84,12 +85,14 @@ func dataSourceAlicloudPvtzZoneRecordsRead(d *schema.ResourceData, meta interfac recordIds := []string{} for true { - results, err := conn.DescribeZoneRecords(args) + raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.DescribeZoneRecords(args) + }) if err != nil { return fmt.Errorf("Error DescribeZoneRecords: %#v", err) } - + results, _ := raw.(*pvtz.DescribeZoneRecordsResponse) if results == nil || len(results.Records.Record) < 1 { break } diff --git a/alicloud/data_source_alicloud_pvtz_zones.go b/alicloud/data_source_alicloud_pvtz_zones.go index f370610a31c..262c9c23260 100644 --- a/alicloud/data_source_alicloud_pvtz_zones.go +++ b/alicloud/data_source_alicloud_pvtz_zones.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudPvtzZones() *schema.Resource { @@ -69,7 +70,7 @@ func dataSourceAlicloudPvtzZones() *schema.Resource { } func dataSourceAlicloudPvtzZonesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).pvtzconn + client := meta.(*connectivity.AliyunClient) args := pvtz.CreateDescribeZonesRequest() if keyword, ok := d.GetOk("keyword"); ok { @@ -83,11 +84,13 @@ func dataSourceAlicloudPvtzZonesRead(d *schema.ResourceData, meta interface{}) e pvtzZoneBindVpcs := make(map[string][]map[string]interface{}) for { - results, err := conn.DescribeZones(args) + raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.DescribeZones(args) + }) if err != nil { return fmt.Errorf("Error DescribeZones: %#v", err) } - + results, _ := raw.(*pvtz.DescribeZonesResponse) if results == nil || len(results.Zones.Zone) < 1 { break } @@ -98,11 +101,14 @@ func dataSourceAlicloudPvtzZonesRead(d *schema.ResourceData, meta interface{}) e request := pvtz.CreateDescribeZoneInfoRequest() request.ZoneId = key.ZoneId - response, errZoneInfo := conn.DescribeZoneInfo(request) + raw, errZoneInfo := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.DescribeZoneInfo(request) + }) if errZoneInfo != nil { return fmt.Errorf("Error DescribeZoneInfo: %#v", errZoneInfo) } + response, _ := raw.(*pvtz.DescribeZoneInfoResponse) var vpcs []map[string]interface{} for _, vpc := range response.BindVpcs.Vpc { diff --git a/alicloud/data_source_alicloud_ram_account_alias.go b/alicloud/data_source_alicloud_ram_account_alias.go index 795cb1b64db..b5ed4b02a4a 100644 --- a/alicloud/data_source_alicloud_ram_account_alias.go +++ b/alicloud/data_source_alicloud_ram_account_alias.go @@ -1,7 +1,9 @@ package alicloud import ( + "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudRamAccountAlias() *schema.Resource { @@ -22,12 +24,15 @@ func dataSourceAlicloudRamAccountAlias() *schema.Resource { } func dataSourceAlicloudRamAccountAliasRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) - resp, err := conn.GetAccountAlias() + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetAccountAlias() + }) if err != nil { return err } + resp, _ := raw.(ram.AccountAliasResponse) d.SetId(resp.AccountAlias) d.Set("account_alias", resp.AccountAlias) diff --git a/alicloud/data_source_alicloud_ram_groups.go b/alicloud/data_source_alicloud_ram_groups.go index 42c05e65ee0..423dc4343ec 100644 --- a/alicloud/data_source_alicloud_ram_groups.go +++ b/alicloud/data_source_alicloud_ram_groups.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudRamGroups() *schema.Resource { @@ -64,7 +65,8 @@ func dataSourceAlicloudRamGroups() *schema.Resource { } func dataSourceAlicloudRamGroupsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) + ramService := RamService{client} allGroups := []interface{}{} allGroupsMap := make(map[string]interface{}) @@ -85,10 +87,13 @@ func dataSourceAlicloudRamGroupsRead(d *schema.ResourceData, meta interface{}) e // groups filtered by name_regex args := ram.GroupListRequest{} for { - resp, err := conn.ListGroup(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListGroup(args) + }) if err != nil { return fmt.Errorf("ListGroup got an error: %#v", err) } + resp, _ := raw.(ram.GroupListResponse) for _, v := range resp.Groups.Group { if nameRegexOk { r := regexp.MustCompile(nameRegex.(string)) @@ -106,11 +111,13 @@ func dataSourceAlicloudRamGroupsRead(d *schema.ResourceData, meta interface{}) e // groups for user if userNameOk { - resp, err := conn.ListGroupsForUser(ram.UserQueryRequest{UserName: userName.(string)}) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListGroupsForUser(ram.UserQueryRequest{UserName: userName.(string)}) + }) if err != nil { return fmt.Errorf("ListGroupsForUser got an error: %#v", err) } - + resp, _ := raw.(ram.GroupListResponse) for _, v := range resp.Groups.Group { userFilterGroupsMap[v.GroupName] = v } @@ -123,11 +130,13 @@ func dataSourceAlicloudRamGroupsRead(d *schema.ResourceData, meta interface{}) e if policyTypeOk { pType = ram.Type(policyType.(string)) } - resp, err := conn.ListEntitiesForPolicy(ram.PolicyRequest{PolicyName: policyName.(string), PolicyType: pType}) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListEntitiesForPolicy(ram.PolicyRequest{PolicyName: policyName.(string), PolicyType: pType}) + }) if err != nil { return fmt.Errorf("ListEntitiesForPolicy got an error: %#v", err) } - + resp, _ := raw.(ram.PolicyListEntitiesResponse) for _, v := range resp.Groups.Group { policyFilterGroupsMap[v.GroupName] = v } @@ -135,7 +144,7 @@ func dataSourceAlicloudRamGroupsRead(d *schema.ResourceData, meta interface{}) e } // GetIntersection of each map - allGroups = GetIntersection(dataMap, allGroupsMap) + allGroups = ramService.GetIntersection(dataMap, allGroupsMap) if len(allGroups) < 1 { return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.") diff --git a/alicloud/data_source_alicloud_ram_policies.go b/alicloud/data_source_alicloud_ram_policies.go index a43593e22cf..60a403fdb9d 100644 --- a/alicloud/data_source_alicloud_ram_policies.go +++ b/alicloud/data_source_alicloud_ram_policies.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudRamPolicies() *schema.Resource { @@ -94,7 +95,8 @@ func dataSourceAlicloudRamPolicies() *schema.Resource { } func dataSourceAlicloudRamPoliciesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) + ramService := RamService{client} allPolicies := []interface{}{} allPoliciesMap := make(map[string]interface{}) @@ -113,10 +115,13 @@ func dataSourceAlicloudRamPoliciesRead(d *schema.ResourceData, meta interface{}) // policies filtered by name_regex and type args := ram.PolicyQueryRequest{} for { - resp, err := conn.ListPolicies(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPolicies(args) + }) if err != nil { return fmt.Errorf("ListPolicies got an error: %#v", err) } + resp, _ := raw.(ram.PolicyQueryResponse) for _, v := range resp.Policies.Policy { if policyTypeOk && policyType.(string) != v.PolicyType { continue @@ -137,11 +142,13 @@ func dataSourceAlicloudRamPoliciesRead(d *schema.ResourceData, meta interface{}) // policies for user if userNameOk { - resp, err := conn.ListPoliciesForUser(ram.UserQueryRequest{UserName: userName.(string)}) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForUser(ram.UserQueryRequest{UserName: userName.(string)}) + }) if err != nil { return fmt.Errorf("ListPoliciesForUser got an error: %#v", err) } - + resp, _ := raw.(ram.PolicyListResponse) for _, v := range resp.Policies.Policy { userFilterPoliciesMap[v.PolicyType+v.PolicyName] = v } @@ -150,11 +157,13 @@ func dataSourceAlicloudRamPoliciesRead(d *schema.ResourceData, meta interface{}) // policies for group if groupNameOk { - resp, err := conn.ListPoliciesForGroup(ram.GroupQueryRequest{GroupName: groupName.(string)}) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForGroup(ram.GroupQueryRequest{GroupName: groupName.(string)}) + }) if err != nil { return fmt.Errorf("ListPoliciesForGroup got an error: %#v", err) } - + resp, _ := raw.(ram.PolicyListResponse) for _, v := range resp.Policies.Policy { groupFilterPoliciesMap[v.PolicyType+v.PolicyName] = v } @@ -163,11 +172,13 @@ func dataSourceAlicloudRamPoliciesRead(d *schema.ResourceData, meta interface{}) // policies for role if roleNameOk { - resp, err := conn.ListPoliciesForRole(ram.RoleQueryRequest{RoleName: roleName.(string)}) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForRole(ram.RoleQueryRequest{RoleName: roleName.(string)}) + }) if err != nil { return fmt.Errorf("ListPoliciesForRole got an error: %#v", err) } - + resp, _ := raw.(ram.PolicyListResponse) for _, v := range resp.Policies.Policy { roleFilterPoliciesMap[v.PolicyType+v.PolicyName] = v } @@ -175,7 +186,7 @@ func dataSourceAlicloudRamPoliciesRead(d *schema.ResourceData, meta interface{}) } // GetIntersection of each map - allPolicies = GetIntersection(dataMap, allPoliciesMap) + allPolicies = ramService.GetIntersection(dataMap, allPoliciesMap) if len(allPolicies) < 1 { return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.") @@ -187,20 +198,22 @@ func dataSourceAlicloudRamPoliciesRead(d *schema.ResourceData, meta interface{}) } func ramPoliciesDescriptionAttributes(d *schema.ResourceData, policies []interface{}, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) var ids []string var s []map[string]interface{} for _, v := range policies { policy := v.(ram.Policy) - resp, err := conn.GetPolicyVersionNew(ram.PolicyRequest{ - PolicyName: policy.PolicyName, - PolicyType: ram.Type(policy.PolicyType), - VersionId: policy.DefaultVersion, + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetPolicyVersionNew(ram.PolicyRequest{ + PolicyName: policy.PolicyName, + PolicyType: ram.Type(policy.PolicyType), + VersionId: policy.DefaultVersion, + }) }) if err != nil { return err } - + resp, _ := raw.(ram.PolicyVersionResponseNew) mapping := map[string]interface{}{ "name": policy.PolicyName, "type": policy.PolicyType, diff --git a/alicloud/data_source_alicloud_ram_roles.go b/alicloud/data_source_alicloud_ram_roles.go index fc938a6e773..1df001ee967 100644 --- a/alicloud/data_source_alicloud_ram_roles.go +++ b/alicloud/data_source_alicloud_ram_roles.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudRamRoles() *schema.Resource { @@ -82,7 +83,8 @@ func dataSourceAlicloudRamRoles() *schema.Resource { } func dataSourceAlicloudRamRolesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) + ramService := RamService{client} allRoles := []interface{}{} allRolesMap := make(map[string]interface{}) @@ -99,10 +101,13 @@ func dataSourceAlicloudRamRolesRead(d *schema.ResourceData, meta interface{}) er } // all roles - resp, err := conn.ListRoles() + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListRoles() + }) if err != nil { return fmt.Errorf("ListRoles got an error: %#v", err) } + resp, _ := raw.(ram.ListRoleResponse) for _, v := range resp.Roles.Role { if nameRegexOk { r := regexp.MustCompile(nameRegex.(string)) @@ -119,11 +124,13 @@ func dataSourceAlicloudRamRolesRead(d *schema.ResourceData, meta interface{}) er if policyTypeOk { pType = ram.Type(policyType.(string)) } - resp, err := conn.ListEntitiesForPolicy(ram.PolicyRequest{PolicyName: policyName.(string), PolicyType: pType}) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListEntitiesForPolicy(ram.PolicyRequest{PolicyName: policyName.(string), PolicyType: pType}) + }) if err != nil { return fmt.Errorf("ListEntitiesForPolicy got an error: %#v", err) } - + resp, _ := raw.(ram.PolicyListEntitiesResponse) for _, v := range resp.Roles.Role { policyFilterRolesMap[v.RoleName] = v } @@ -131,7 +138,7 @@ func dataSourceAlicloudRamRolesRead(d *schema.ResourceData, meta interface{}) er } // GetIntersection of each map - allRoles = GetIntersection(dataMap, allRolesMap) + allRoles = ramService.GetIntersection(dataMap, allRolesMap) if len(allRoles) < 1 { return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.") @@ -143,12 +150,15 @@ func dataSourceAlicloudRamRolesRead(d *schema.ResourceData, meta interface{}) er } func ramRolesDescriptionAttributes(d *schema.ResourceData, meta interface{}, roles []interface{}) error { + client := meta.(*connectivity.AliyunClient) var ids []string var s []map[string]interface{} for _, v := range roles { role := v.(ram.Role) - conn := meta.(*AliyunClient).ramconn - resp, _ := conn.GetRole(ram.RoleQueryRequest{RoleName: role.RoleName}) + raw, _ := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetRole(ram.RoleQueryRequest{RoleName: role.RoleName}) + }) + resp, _ := raw.(ram.RoleResponse) mapping := map[string]interface{}{ "id": role.RoleId, "name": role.RoleName, diff --git a/alicloud/data_source_alicloud_ram_users.go b/alicloud/data_source_alicloud_ram_users.go index b85939f9877..74964d7c1d4 100644 --- a/alicloud/data_source_alicloud_ram_users.go +++ b/alicloud/data_source_alicloud_ram_users.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudRamUsers() *schema.Resource { @@ -72,7 +73,8 @@ func dataSourceAlicloudRamUsers() *schema.Resource { } func dataSourceAlicloudRamUsersRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) + ramService := RamService{client} allUsers := []interface{}{} allUsersMap := make(map[string]interface{}) @@ -93,10 +95,13 @@ func dataSourceAlicloudRamUsersRead(d *schema.ResourceData, meta interface{}) er // all users args := ram.ListUserRequest{} for { - resp, err := conn.ListUsers(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListUsers(args) + }) if err != nil { return fmt.Errorf("ListUsers got an error: %#v", err) } + resp, _ := raw.(ram.ListUserResponse) for _, v := range resp.Users.User { if nameRegexOk { r := regexp.MustCompile(nameRegex.(string)) @@ -114,11 +119,13 @@ func dataSourceAlicloudRamUsersRead(d *schema.ResourceData, meta interface{}) er // users for group if groupNameOk { - resp, err := conn.ListUsersForGroup(ram.GroupQueryRequest{GroupName: groupName.(string)}) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListUsersForGroup(ram.GroupQueryRequest{GroupName: groupName.(string)}) + }) if err != nil { return fmt.Errorf("ListUsersForGroup got an error: %#v", err) } - + resp, _ := raw.(ram.ListUserResponse) for _, v := range resp.Users.User { groupFilterUsersMap[v.UserName] = v } @@ -131,11 +138,13 @@ func dataSourceAlicloudRamUsersRead(d *schema.ResourceData, meta interface{}) er if policyTypeOk { pType = ram.Type(policyType.(string)) } - resp, err := conn.ListEntitiesForPolicy(ram.PolicyRequest{PolicyName: policyName.(string), PolicyType: pType}) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListEntitiesForPolicy(ram.PolicyRequest{PolicyName: policyName.(string), PolicyType: pType}) + }) if err != nil { return fmt.Errorf("ListEntitiesForPolicy got an error: %#v", err) } - + resp, _ := raw.(ram.PolicyListEntitiesResponse) for _, v := range resp.Users.User { policyFilterUsersMap[v.UserName] = v } @@ -143,7 +152,7 @@ func dataSourceAlicloudRamUsersRead(d *schema.ResourceData, meta interface{}) er } // GetIntersection of each map - allUsers = GetIntersection(dataMap, allUsersMap) + allUsers = ramService.GetIntersection(dataMap, allUsersMap) if len(allUsers) < 1 { return fmt.Errorf("Your query returned no results. Please change your search criteria and try again.") diff --git a/alicloud/data_source_alicloud_regions.go b/alicloud/data_source_alicloud_regions.go index 43d6a98a94b..56c1d59fa78 100644 --- a/alicloud/data_source_alicloud_regions.go +++ b/alicloud/data_source_alicloud_regions.go @@ -6,6 +6,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudRegions() *schema.Resource { @@ -55,13 +56,16 @@ func dataSourceAlicloudRegions() *schema.Resource { } func dataSourceAlicloudRegionsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ecsconn - currentRegion := getRegionId(d, meta) + client := meta.(*connectivity.AliyunClient) + currentRegion := client.RegionId - resp, err := conn.DescribeRegions(ecs.CreateDescribeRegionsRequest()) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeRegions(ecs.CreateDescribeRegionsRequest()) + }) if err != nil { return err } + resp, _ := raw.(*ecs.DescribeRegionsResponse) if resp == nil || len(resp.Regions.Region) == 0 { return fmt.Errorf("no matching regions found") } diff --git a/alicloud/data_source_alicloud_router_interfaces.go b/alicloud/data_source_alicloud_router_interfaces.go index 0a90f2ff611..fd86b7f7547 100644 --- a/alicloud/data_source_alicloud_router_interfaces.go +++ b/alicloud/data_source_alicloud_router_interfaces.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudRouterInterfaces() *schema.Resource { @@ -148,10 +149,10 @@ func dataSourceAlicloudRouterInterfaces() *schema.Resource { } } func dataSourceAlicloudRouterInterfacesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) args := vpc.CreateDescribeRouterInterfacesRequest() - args.RegionId = string(getRegion(d, meta)) + args.RegionId = string(client.Region) args.PageSize = requests.NewInteger(PageSizeLarge) args.PageNumber = requests.NewInteger(1) var filters []vpc.DescribeRouterInterfacesFilter @@ -173,11 +174,13 @@ func dataSourceAlicloudRouterInterfacesRead(d *schema.ResourceData, meta interfa for { var response *vpc.DescribeRouterInterfacesResponse if err := invoker.Run(func() error { - resp, err := conn.DescribeRouterInterfaces(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeRouterInterfaces(args) + }) if err != nil { return err } - response = resp + response, _ = raw.(*vpc.DescribeRouterInterfacesResponse) return nil }); err != nil { return err diff --git a/alicloud/data_source_alicloud_security_group_rules.go b/alicloud/data_source_alicloud_security_group_rules.go index 706f32d19fe..a89f4813100 100644 --- a/alicloud/data_source_alicloud_security_group_rules.go +++ b/alicloud/data_source_alicloud_security_group_rules.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudSecurityGroupRules() *schema.Resource { @@ -116,17 +117,19 @@ func dataSourceAlicloudSecurityGroupRules() *schema.Resource { } func dataSourceAlicloudSecurityGroupRulesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ecsconn + client := meta.(*connectivity.AliyunClient) req := ecs.CreateDescribeSecurityGroupAttributeRequest() req.SecurityGroupId = d.Get("group_id").(string) req.NicType = d.Get("nic_type").(string) req.Direction = d.Get("direction").(string) - attr, err := conn.DescribeSecurityGroupAttribute(req) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeSecurityGroupAttribute(req) + }) if err != nil { return fmt.Errorf("DescribeSecurityGroupAttribute got an error: %#v", err) } - + attr, _ := raw.(*ecs.DescribeSecurityGroupAttributeResponse) var rules []map[string]interface{} if attr == nil { diff --git a/alicloud/data_source_alicloud_security_groups.go b/alicloud/data_source_alicloud_security_groups.go index f9a5fd8fda5..facb9a1983e 100644 --- a/alicloud/data_source_alicloud_security_groups.go +++ b/alicloud/data_source_alicloud_security_groups.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) type SecurityGroup struct { @@ -76,8 +77,8 @@ func dataSourceAlicloudSecurityGroups() *schema.Resource { } func dataSourceAlicloudSecurityGroupsRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.ecsconn + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} args := ecs.CreateDescribeSecurityGroupsRequest() args.VpcId = d.Get("vpc_id").(string) @@ -104,10 +105,13 @@ func dataSourceAlicloudSecurityGroupsRead(d *schema.ResourceData, meta interface args.Tag = &tags } for { - resp, err := conn.DescribeSecurityGroups(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeSecurityGroups(args) + }) if err != nil { return fmt.Errorf("DescribeSecurityGroups: %#v", err) } + resp, _ := raw.(*ecs.DescribeSecurityGroupsResponse) if resp == nil || len(resp.SecurityGroups.SecurityGroup) < 1 { break } @@ -119,7 +123,7 @@ func dataSourceAlicloudSecurityGroupsRead(d *schema.ResourceData, meta interface } } - attr, err := client.DescribeSecurityGroupAttribute(item.SecurityGroupId) + attr, err := ecsService.DescribeSecurityGroupAttribute(item.SecurityGroupId) if err != nil { return fmt.Errorf("DescribeSecurityGroupAttribute: %#v", err) } diff --git a/alicloud/data_source_alicloud_slb_attachments.go b/alicloud/data_source_alicloud_slb_attachments.go index 9ca31670f66..d92e13aff86 100644 --- a/alicloud/data_source_alicloud_slb_attachments.go +++ b/alicloud/data_source_alicloud_slb_attachments.go @@ -6,6 +6,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudSlbAttachments() *schema.Resource { @@ -47,7 +48,7 @@ func dataSourceAlicloudSlbAttachments() *schema.Resource { } func dataSourceAlicloudSlbAttachmentsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) args := slb.CreateDescribeLoadBalancerAttributeRequest() args.LoadBalancerId = d.Get("load_balancer_id").(string) @@ -59,10 +60,13 @@ func dataSourceAlicloudSlbAttachmentsRead(d *schema.ResourceData, meta interface } } - resp, err := conn.DescribeLoadBalancerAttribute(args) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeLoadBalancerAttribute(args) + }) if err != nil { return fmt.Errorf("DescribeLoadBalancerAttribute got an error: %#v", err) } + resp, _ := raw.(*slb.DescribeLoadBalancerAttributeResponse) if resp == nil { return fmt.Errorf("there is no SLB with the ID %s. Please change your search criteria and try again", args.LoadBalancerId) } diff --git a/alicloud/data_source_alicloud_slb_listeners.go b/alicloud/data_source_alicloud_slb_listeners.go index 9d773f3bb6e..200d0eaebd3 100644 --- a/alicloud/data_source_alicloud_slb_listeners.go +++ b/alicloud/data_source_alicloud_slb_listeners.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudSlbListeners() *schema.Resource { @@ -176,15 +177,18 @@ func dataSourceAlicloudSlbListeners() *schema.Resource { } func dataSourceAlicloudSlbListenersRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) args := slb.CreateDescribeLoadBalancerAttributeRequest() args.LoadBalancerId = d.Get("load_balancer_id").(string) - resp, err := conn.DescribeLoadBalancerAttribute(args) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeLoadBalancerAttribute(args) + }) if err != nil { return fmt.Errorf("DescribeLoadBalancerAttribute got an error: %#v", err) } + resp, _ := raw.(*slb.DescribeLoadBalancerAttributeResponse) if resp == nil { return fmt.Errorf("there is no SLB with the ID %s. Please change your search criteria and try again", args.LoadBalancerId) } @@ -223,7 +227,7 @@ func dataSourceAlicloudSlbListenersRead(d *schema.ResourceData, meta interface{} } func slbListenersDescriptionAttributes(d *schema.ResourceData, listeners []slb.ListenerPortAndProtocol, meta interface{}) error { - conn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) var ids []string var s []map[string]interface{} @@ -240,8 +244,11 @@ func slbListenersDescriptionAttributes(d *schema.ResourceData, listeners []slb.L args := slb.CreateDescribeLoadBalancerHTTPListenerAttributeRequest() args.LoadBalancerId = loadBalancerId args.ListenerPort = requests.NewInteger(listener.ListenerPort) - resp, err := conn.DescribeLoadBalancerHTTPListenerAttribute(args) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeLoadBalancerHTTPListenerAttribute(args) + }) if err == nil { + resp, _ := raw.(*slb.DescribeLoadBalancerHTTPListenerAttributeResponse) mapping["backend_port"] = resp.BackendServerPort mapping["status"] = resp.Status mapping["bandwidth"] = resp.Bandwidth @@ -272,8 +279,11 @@ func slbListenersDescriptionAttributes(d *schema.ResourceData, listeners []slb.L args := slb.CreateDescribeLoadBalancerHTTPSListenerAttributeRequest() args.LoadBalancerId = loadBalancerId args.ListenerPort = requests.NewInteger(listener.ListenerPort) - resp, err := conn.DescribeLoadBalancerHTTPSListenerAttribute(args) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeLoadBalancerHTTPSListenerAttribute(args) + }) if err == nil { + resp, _ := raw.(*slb.DescribeLoadBalancerHTTPSListenerAttributeResponse) mapping["backend_port"] = resp.BackendServerPort mapping["status"] = resp.Status mapping["security_status"] = resp.SecurityStatus @@ -307,8 +317,11 @@ func slbListenersDescriptionAttributes(d *schema.ResourceData, listeners []slb.L args := slb.CreateDescribeLoadBalancerTCPListenerAttributeRequest() args.LoadBalancerId = loadBalancerId args.ListenerPort = requests.NewInteger(listener.ListenerPort) - resp, err := conn.DescribeLoadBalancerTCPListenerAttribute(args) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeLoadBalancerTCPListenerAttribute(args) + }) if err == nil { + resp, _ := raw.(*slb.DescribeLoadBalancerTCPListenerAttributeResponse) mapping["backend_port"] = resp.BackendServerPort mapping["status"] = resp.Status mapping["bandwidth"] = resp.Bandwidth @@ -334,8 +347,11 @@ func slbListenersDescriptionAttributes(d *schema.ResourceData, listeners []slb.L args := slb.CreateDescribeLoadBalancerUDPListenerAttributeRequest() args.LoadBalancerId = loadBalancerId args.ListenerPort = requests.NewInteger(listener.ListenerPort) - resp, err := conn.DescribeLoadBalancerUDPListenerAttribute(args) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeLoadBalancerUDPListenerAttribute(args) + }) if err == nil { + resp, _ := raw.(*slb.DescribeLoadBalancerUDPListenerAttributeResponse) mapping["backend_port"] = resp.BackendServerPort mapping["status"] = resp.Status mapping["bandwidth"] = resp.Bandwidth diff --git a/alicloud/data_source_alicloud_slb_rules.go b/alicloud/data_source_alicloud_slb_rules.go index bfd9666d937..f7ed8403bc7 100644 --- a/alicloud/data_source_alicloud_slb_rules.go +++ b/alicloud/data_source_alicloud_slb_rules.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudSlbRules() *schema.Resource { @@ -71,7 +72,7 @@ func dataSourceAlicloudSlbRules() *schema.Resource { } func dataSourceAlicloudSlbRulesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) args := slb.CreateDescribeRulesRequest() args.LoadBalancerId = d.Get("load_balancer_id").(string) @@ -84,10 +85,13 @@ func dataSourceAlicloudSlbRulesRead(d *schema.ResourceData, meta interface{}) er } } - resp, err := conn.DescribeRules(args) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeRules(args) + }) if err != nil { return fmt.Errorf("DescribeRules got an error: %#v", err) } + resp, _ := raw.(*slb.DescribeRulesResponse) if resp == nil { return fmt.Errorf("there is no SLB with the ID %s. Please change your search criteria and try again", args.LoadBalancerId) } diff --git a/alicloud/data_source_alicloud_slb_server_groups.go b/alicloud/data_source_alicloud_slb_server_groups.go index c6376fbaf02..2e2a323c987 100644 --- a/alicloud/data_source_alicloud_slb_server_groups.go +++ b/alicloud/data_source_alicloud_slb_server_groups.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudSlbServerGroups() *schema.Resource { @@ -70,7 +71,7 @@ func dataSourceAlicloudSlbServerGroups() *schema.Resource { } func dataSourceAlicloudSlbServerGroupsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) args := slb.CreateDescribeVServerGroupsRequest() args.LoadBalancerId = d.Get("load_balancer_id").(string) @@ -82,10 +83,13 @@ func dataSourceAlicloudSlbServerGroupsRead(d *schema.ResourceData, meta interfac } } - resp, err := conn.DescribeVServerGroups(args) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeVServerGroups(args) + }) if err != nil { return fmt.Errorf("DescribeVServerGroups got an error: %#v", err) } + resp, _ := raw.(*slb.DescribeVServerGroupsResponse) if resp == nil { return fmt.Errorf("there is no SLB with the ID %s. Please change your search criteria and try again", args.LoadBalancerId) } @@ -123,7 +127,7 @@ func dataSourceAlicloudSlbServerGroupsRead(d *schema.ResourceData, meta interfac } func slbServerGroupsDescriptionAttributes(d *schema.ResourceData, serverGroups []slb.VServerGroup, meta interface{}) error { - conn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) var ids []string var s []map[string]interface{} @@ -136,17 +140,22 @@ func slbServerGroupsDescriptionAttributes(d *schema.ResourceData, serverGroups [ args := slb.CreateDescribeVServerGroupAttributeRequest() args.VServerGroupId = serverGroup.VServerGroupId - resp, err := conn.DescribeVServerGroupAttribute(args) - if err == nil && resp != nil && len(resp.BackendServers.BackendServer) > 0 { - var backendServerMappings []map[string]interface{} - for _, backendServer := range resp.BackendServers.BackendServer { - backendServerMapping := map[string]interface{}{ - "instance_id": backendServer.ServerId, - "weight": backendServer.Weight, + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeVServerGroupAttribute(args) + }) + if err == nil { + resp, _ := raw.(*slb.DescribeVServerGroupAttributeResponse) + if resp != nil && len(resp.BackendServers.BackendServer) > 0 { + var backendServerMappings []map[string]interface{} + for _, backendServer := range resp.BackendServers.BackendServer { + backendServerMapping := map[string]interface{}{ + "instance_id": backendServer.ServerId, + "weight": backendServer.Weight, + } + backendServerMappings = append(backendServerMappings, backendServerMapping) } - backendServerMappings = append(backendServerMappings, backendServerMapping) + mapping["servers"] = backendServerMappings } - mapping["servers"] = backendServerMappings } log.Printf("[DEBUG] alicloud_slb_server_groups - adding slb_server_group mapping: %v", mapping) diff --git a/alicloud/data_source_alicloud_slbs.go b/alicloud/data_source_alicloud_slbs.go index 364bc126f6a..79fc7e718c0 100644 --- a/alicloud/data_source_alicloud_slbs.go +++ b/alicloud/data_source_alicloud_slbs.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudSlbs() *schema.Resource { @@ -122,7 +123,7 @@ func dataSourceAlicloudSlbs() *schema.Resource { } func dataSourceAlicloudSlbsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) args := slb.CreateDescribeLoadBalancersRequest() @@ -156,11 +157,13 @@ func dataSourceAlicloudSlbsRead(d *schema.ResourceData, meta interface{}) error args.PageSize = requests.NewInteger(PageSizeLarge) args.PageNumber = requests.NewInteger(1) for { - resp, err := conn.DescribeLoadBalancers(args) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeLoadBalancers(args) + }) if err != nil { return err } - + resp, _ := raw.(*slb.DescribeLoadBalancersResponse) if resp == nil || len(resp.LoadBalancers.LoadBalancer) < 1 { break } diff --git a/alicloud/data_source_alicloud_vpcs.go b/alicloud/data_source_alicloud_vpcs.go index 841d696cd4c..dc5456a1921 100644 --- a/alicloud/data_source_alicloud_vpcs.go +++ b/alicloud/data_source_alicloud_vpcs.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudVpcs() *schema.Resource { @@ -104,21 +105,23 @@ func dataSourceAlicloudVpcs() *schema.Resource { } } func dataSourceAlicloudVpcsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) args := vpc.CreateDescribeVpcsRequest() - args.RegionId = string(getRegion(d, meta)) + args.RegionId = string(client.Region) args.PageSize = requests.NewInteger(PageSizeLarge) args.PageNumber = requests.NewInteger(1) var allVpcs []vpc.Vpc for { - resp, err := conn.DescribeVpcs(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVpcs(args) + }) if err != nil { return err } - + resp, _ := raw.(*vpc.DescribeVpcsResponse) if resp == nil || len(resp.Vpcs.Vpc) < 1 { break } @@ -165,12 +168,15 @@ func dataSourceAlicloudVpcsRead(d *schema.ResourceData, meta interface{}) error request := vpc.CreateDescribeVRoutersRequest() request.VRouterId = v.VRouterId - request.RegionId = string(getRegion(d, meta)) + request.RegionId = string(client.Region) - vrs, err := conn.DescribeVRouters(request) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVRouters(request) + }) if err != nil { return fmt.Errorf("Error DescribVRouters by vrouter_id %s: %#v", v.VRouterId, err) } + vrs, _ := raw.(*vpc.DescribeVRoutersResponse) if vrs != nil && len(vrs.VRouters.VRouter) > 0 { route_tables = append(route_tables, vrs.VRouters.VRouter[0].RouteTableIds.RouteTableId[0]) } else { diff --git a/alicloud/data_source_alicloud_vpn_connections.go b/alicloud/data_source_alicloud_vpn_connections.go index d38d58f1fa3..a155d55a2f0 100644 --- a/alicloud/data_source_alicloud_vpn_connections.go +++ b/alicloud/data_source_alicloud_vpn_connections.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudVpnConnections() *schema.Resource { @@ -170,10 +171,10 @@ func dataSourceAlicloudVpnConnections() *schema.Resource { } func dataSourceAlicloudVpnConnectionsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) args := vpc.CreateDescribeVpnConnectionsRequest() - args.RegionId = string(getRegion(d, meta)) + args.RegionId = string(client.Region) args.PageSize = requests.NewInteger(PageSizeLarge) args.PageNumber = requests.NewInteger(1) var allVpnConns []vpc.VpnConnection @@ -187,10 +188,13 @@ func dataSourceAlicloudVpnConnectionsRead(d *schema.ResourceData, meta interface } for { - resp, err := conn.DescribeVpnConnections(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVpnConnections(args) + }) if err != nil { return err } + resp, _ := raw.(*vpc.DescribeVpnConnectionsResponse) if resp == nil || len(resp.VpnConnections.VpnConnection) < 1 { break @@ -248,6 +252,8 @@ func dataSourceAlicloudVpnConnectionsRead(d *schema.ResourceData, meta interface } func vpnConnectionsDecriptionAttributes(d *schema.ResourceData, vpnSetTypes []vpc.VpnConnection, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} var ids []string var s []map[string]interface{} for _, conn := range vpnSetTypes { @@ -261,8 +267,8 @@ func vpnConnectionsDecriptionAttributes(d *schema.ResourceData, vpnSetTypes []vp "create_time": conn.CreateTime, "effect_immediately": conn.EffectImmediately, "status": conn.Status, - "ike_config": ParseIkeConfig(conn.IkeConfig), - "ipsec_config": ParseIpsecConfig(conn.IpsecConfig), + "ike_config": vpnGatewayService.ParseIkeConfig(conn.IkeConfig), + "ipsec_config": vpnGatewayService.ParseIpsecConfig(conn.IpsecConfig), } log.Printf("[DEBUG] alicloud_vpn - adding vpn connection: %v", mapping) ids = append(ids, conn.VpnConnectionId) diff --git a/alicloud/data_source_alicloud_vpn_customer_gateways.go b/alicloud/data_source_alicloud_vpn_customer_gateways.go index 20bda01236d..47b2e60b3c1 100644 --- a/alicloud/data_source_alicloud_vpn_customer_gateways.go +++ b/alicloud/data_source_alicloud_vpn_customer_gateways.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudVpnCustomerGateways() *schema.Resource { @@ -70,18 +71,21 @@ func dataSourceAlicloudVpnCustomerGateways() *schema.Resource { } func dataSourceAlicloudVpnCgwsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) args := vpc.CreateDescribeCustomerGatewaysRequest() - args.RegionId = getRegionId(d, meta) + args.RegionId = client.RegionId args.PageSize = requests.NewInteger(PageSizeLarge) args.PageNumber = requests.NewInteger(1) var allCgws []vpc.CustomerGateway for { - resp, err := conn.DescribeCustomerGateways(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeCustomerGateways(args) + }) if err != nil { return err } + resp, _ := raw.(*vpc.DescribeCustomerGatewaysResponse) if resp == nil || len(resp.CustomerGateways.CustomerGateway) < 1 { break } diff --git a/alicloud/data_source_alicloud_vpn_gateways.go b/alicloud/data_source_alicloud_vpn_gateways.go index eca606139b9..a010ab878ee 100644 --- a/alicloud/data_source_alicloud_vpn_gateways.go +++ b/alicloud/data_source_alicloud_vpn_gateways.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudVpnGateways() *schema.Resource { @@ -130,10 +131,10 @@ func dataSourceAlicloudVpnGateways() *schema.Resource { } func dataSourceAlicloudVpnsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) args := vpc.CreateDescribeVpnGatewaysRequest() - args.RegionId = getRegionId(d, meta) + args.RegionId = client.RegionId args.PageSize = requests.NewInteger(PageSizeLarge) args.PageNumber = requests.NewInteger(1) @@ -152,10 +153,13 @@ func dataSourceAlicloudVpnsRead(d *schema.ResourceData, meta interface{}) error } for { - resp, err := conn.DescribeVpnGateways(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVpnGateways(args) + }) if err != nil { return err } + resp, _ := raw.(*vpc.DescribeVpnGatewaysResponse) if resp == nil || len(resp.VpnGateways.VpnGateway) < 1 { break diff --git a/alicloud/data_source_alicloud_vswitches.go b/alicloud/data_source_alicloud_vswitches.go index 4c5e554b898..7a9c9b425ac 100644 --- a/alicloud/data_source_alicloud_vswitches.go +++ b/alicloud/data_source_alicloud_vswitches.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func dataSourceAlicloudVSwitches() *schema.Resource { @@ -97,10 +98,10 @@ func dataSourceAlicloudVSwitches() *schema.Resource { } } func dataSourceAlicloudVSwitchesRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) args := vpc.CreateDescribeVSwitchesRequest() - args.RegionId = string(getRegion(d, meta)) + args.RegionId = string(client.Region) args.PageSize = requests.NewInteger(PageSizeLarge) if v, ok := d.GetOk("zone_id"); ok { args.ZoneId = Trim(v.(string)) @@ -117,11 +118,13 @@ func dataSourceAlicloudVSwitchesRead(d *schema.ResourceData, meta interface{}) e } } for { - resp, err := conn.DescribeVSwitches(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVSwitches(args) + }) if err != nil { return err } - + resp, _ := raw.(*vpc.DescribeVSwitchesResponse) if resp == nil || len(resp.VSwitches.VSwitch) < 1 { break } @@ -160,6 +163,7 @@ func dataSourceAlicloudVSwitchesRead(d *schema.ResourceData, meta interface{}) e } func VSwitchesDecriptionAttributes(d *schema.ResourceData, vsws []vpc.VSwitch, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) var ids []string var s []map[string]interface{} instReq := ecs.CreateDescribeInstancesRequest() @@ -178,10 +182,13 @@ func VSwitchesDecriptionAttributes(d *schema.ResourceData, vsws []vpc.VSwitch, m instReq.VpcId = vsw.VpcId instReq.VSwitchId = vsw.VSwitchId instReq.ZoneId = vsw.ZoneId - resp, err := meta.(*AliyunClient).ecsconn.DescribeInstances(instReq) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstances(instReq) + }) if err != nil { return fmt.Errorf("DescribeInstances got an error: %#v.", err) } + resp, _ := raw.(*ecs.DescribeInstancesResponse) if resp != nil && len(resp.Instances.Instance) > 0 { instance_ids := make([]string, len(resp.Instances.Instance)) if len(instance_ids) > 0 { diff --git a/alicloud/data_source_alicloud_zones.go b/alicloud/data_source_alicloud_zones.go index 0b929faddac..615162adbef 100644 --- a/alicloud/data_source_alicloud_zones.go +++ b/alicloud/data_source_alicloud_zones.go @@ -8,8 +8,10 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/r-kvstore" "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" //"github.com/denverdino/aliyungo/ecs" + "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/schema" ) @@ -112,43 +114,53 @@ func dataSourceAlicloudZones() *schema.Resource { } func dataSourceAlicloudZonesRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} + resType, _ := d.Get("available_resource_creation").(string) multi := d.Get("multi").(bool) - client := meta.(*AliyunClient) var zoneIds []string rdsZones := make(map[string]string) rkvZones := make(map[string]string) if strings.ToLower(Trim(resType)) == strings.ToLower(string(ResourceTypeRds)) { request := rds.CreateDescribeRegionsRequest() - if regions, err := client.rdsconn.DescribeRegions(request); err != nil { + raw, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DescribeRegions(request) + }) + if err != nil { return fmt.Errorf("[ERROR] DescribeRegions got an error: %#v", err) - } else if len(regions.Regions.RDSRegion) <= 0 { + } + regions, _ := raw.(*rds.DescribeRegionsResponse) + if len(regions.Regions.RDSRegion) <= 0 { return fmt.Errorf("[ERROR] There is no available region for RDS.") - } else { - for _, r := range regions.Regions.RDSRegion { - if multi && strings.Contains(r.ZoneId, MULTI_IZ_SYMBOL) && r.RegionId == string(getRegion(d, meta)) { - zoneIds = append(zoneIds, r.ZoneId) - continue - } - rdsZones[r.ZoneId] = r.RegionId + } + for _, r := range regions.Regions.RDSRegion { + if multi && strings.Contains(r.ZoneId, MULTI_IZ_SYMBOL) && r.RegionId == string(client.Region) { + zoneIds = append(zoneIds, r.ZoneId) + continue } + rdsZones[r.ZoneId] = r.RegionId } } if strings.ToLower(Trim(resType)) == strings.ToLower(string(ResourceTypeRkv)) { request := r_kvstore.CreateDescribeRegionsRequest() - if regions, err := client.rkvconn.DescribeRegions(request); err != nil { + raw, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.DescribeRegions(request) + }) + if err != nil { return fmt.Errorf("[ERROR] DescribeRegions got an error: %#v", err) - } else if len(regions.RegionIds.KVStoreRegion) <= 0 { + } + regions, _ := raw.(*r_kvstore.DescribeRegionsResponse) + if len(regions.RegionIds.KVStoreRegion) <= 0 { return fmt.Errorf("[ERROR] There is no available region for KVStore") - } else { - for _, r := range regions.RegionIds.KVStoreRegion { - for _, zoneID := range r.ZoneIdList.ZoneId { - if multi && strings.Contains(zoneID, MULTI_IZ_SYMBOL) && r.RegionId == string(getRegion(d, meta)) { - zoneIds = append(zoneIds, zoneID) - continue - } - rkvZones[zoneID] = r.RegionId + } + for _, r := range regions.RegionIds.KVStoreRegion { + for _, zoneID := range r.ZoneIdList.ZoneId { + if multi && strings.Contains(zoneID, MULTI_IZ_SYMBOL) && r.RegionId == string(client.Region) { + zoneIds = append(zoneIds, zoneID) + continue } + rkvZones[zoneID] = r.RegionId } } } @@ -156,10 +168,10 @@ func dataSourceAlicloudZonesRead(d *schema.ResourceData, meta interface{}) error sort.Strings(zoneIds) return multiZonesDescriptionAttributes(d, zoneIds) } else if multi { - return fmt.Errorf("There is no multi zones in the current region %s. Please change region and try again.", getRegion(d, meta)) + return fmt.Errorf("There is no multi zones in the current region %s. Please change region and try again.", client.Region) } - _, validZones, err := client.DescribeAvailableResources(d, meta, ZoneResource) + _, validZones, err := ecsService.DescribeAvailableResources(d, meta, ZoneResource) if err != nil { return err } @@ -172,13 +184,15 @@ func dataSourceAlicloudZonesRead(d *schema.ResourceData, meta interface{}) error req.SpotStrategy = v.(string) } - resp, err := client.ecsconn.DescribeZones(req) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeZones(req) + }) if err != nil { return fmt.Errorf("DescribeZones got an error: %#v", err) } - + resp, _ := raw.(*ecs.DescribeZonesResponse) if resp == nil || len(resp.Zones.Zone) < 1 { - return fmt.Errorf("There are no availability zones in the region: %#v.", getRegion(d, meta)) + return fmt.Errorf("There are no availability zones in the region: %#v.", client.Region) } mapZones := make(map[string]ecs.Zone) diff --git a/alicloud/extension_ess.go b/alicloud/extension_ess.go index 38388e861dc..7fab720ed13 100644 --- a/alicloud/extension_ess.go +++ b/alicloud/extension_ess.go @@ -1,7 +1,5 @@ package alicloud -import "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" - const UserId = "userId" const ScalingGroup = "scaling_group" @@ -81,9 +79,3 @@ const ( Priority = MultiAzPolicy("PRIORITY") Balance = MultiAzPolicy("BALANCE") ) - -func EssCommonRequestInit(region string, code ServiceCode, domain CommonRequestDomain) *requests.CommonRequest { - request := CommonRequestInit(region, code, domain) - request.Version = ApiVersion20140828 - return request -} diff --git a/alicloud/provider.go b/alicloud/provider.go index 3ab71757dc3..2c7bb6f3d4f 100644 --- a/alicloud/provider.go +++ b/alicloud/provider.go @@ -7,6 +7,7 @@ import ( "github.com/hashicorp/terraform/helper/mutexkv" "github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) // Provider returns a schema.Provider for alicloud @@ -240,7 +241,7 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) { region = DEFAULT_REGION } } - config := Config{ + config := connectivity.Config{ AccessKey: d.Get("access_key").(string), SecretKey: d.Get("secret_key").(string), Region: common.Region(region.(string)), diff --git a/alicloud/resource_alicloud_api_gateway_group.go b/alicloud/resource_alicloud_api_gateway_group.go index 9b7705cc03f..f629e94310c 100644 --- a/alicloud/resource_alicloud_api_gateway_group.go +++ b/alicloud/resource_alicloud_api_gateway_group.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cloudapi" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunApigatewayGroup() *schema.Resource { @@ -34,20 +35,23 @@ func resourceAliyunApigatewayGroup() *schema.Resource { } func resourceAliyunApigatewayGroupCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) args := cloudapi.CreateCreateApiGroupRequest() args.GroupName = d.Get("name").(string) args.Description = d.Get("description").(string) if err := resource.Retry(5*time.Minute, func() *resource.RetryError { - resp, err := client.cloudapiconn.CreateApiGroup(args) + raw, err := client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) { + return cloudApiClient.CreateApiGroup(args) + }) if err != nil { if IsExceptedError(err, RepeatedCommit) { return resource.RetryableError(fmt.Errorf("Create api group got an error: %#v.", err)) } return resource.NonRetryableError(fmt.Errorf("Create api group got an error: %#v.", err)) } + resp, _ := raw.(*cloudapi.CreateApiGroupResponse) d.SetId(resp.GroupId) return nil }); err != nil { @@ -58,7 +62,9 @@ func resourceAliyunApigatewayGroupCreate(d *schema.ResourceData, meta interface{ } func resourceAliyunApigatewayGroupRead(d *schema.ResourceData, meta interface{}) error { - apiGroup, err := meta.(*AliyunClient).DescribeApiGroup(d.Id()) + client := meta.(*connectivity.AliyunClient) + cloudApiService := CloudApiService{client} + apiGroup, err := cloudApiService.DescribeApiGroup(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -74,14 +80,16 @@ func resourceAliyunApigatewayGroupRead(d *schema.ResourceData, meta interface{}) } func resourceAliyunApigatewayGroupUpdate(d *schema.ResourceData, meta interface{}) error { - - cloudapiconn := meta.(*AliyunClient).cloudapiconn + client := meta.(*connectivity.AliyunClient) if d.HasChange("name") || d.HasChange("description") { req := cloudapi.CreateModifyApiGroupRequest() req.Description = d.Get("description").(string) req.GroupName = d.Get("name").(string) - if _, err := cloudapiconn.ModifyApiGroup(req); err != nil { + _, err := client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) { + return cloudApiClient.ModifyApiGroup(req) + }) + if err != nil { return fmt.Errorf("ModifyApiGroup got an error: %#v", err) } } @@ -89,17 +97,20 @@ func resourceAliyunApigatewayGroupUpdate(d *schema.ResourceData, meta interface{ } func resourceAliyunApigatewayGroupDelete(d *schema.ResourceData, meta interface{}) error { - - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cloudApiService := CloudApiService{client} req := cloudapi.CreateDeleteApiGroupRequest() req.GroupId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := client.cloudapiconn.DeleteApiGroup(req); err != nil { + _, err := client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) { + return cloudApiClient.DeleteApiGroup(req) + }) + if err != nil { return resource.NonRetryableError(fmt.Errorf("Error deleting ApiGroup failed: %#v", err)) } - if _, err := client.DescribeApiGroup(d.Id()); err != nil { + if _, err := cloudApiService.DescribeApiGroup(d.Id()); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_api_gateway_group_test.go b/alicloud/resource_alicloud_api_gateway_group_test.go index a4ae73f1ba6..fec8d825ca6 100644 --- a/alicloud/resource_alicloud_api_gateway_group_test.go +++ b/alicloud/resource_alicloud_api_gateway_group_test.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cloudapi" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -20,11 +21,11 @@ func init() { } func testSweepApiGatewayGroup(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testacc", @@ -32,10 +33,13 @@ func testSweepApiGatewayGroup(region string) error { } req := cloudapi.CreateDescribeApiGroupsRequest() - apiGroups, err := conn.cloudapiconn.DescribeApiGroups(req) + raw, err := client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) { + return cloudApiClient.DescribeApiGroups(req) + }) if err != nil { return fmt.Errorf("Error Describe Api Groups: %s", err) } + apiGroups, _ := raw.(*cloudapi.DescribeApiGroupsResponse) sweeped := false @@ -59,7 +63,10 @@ func testSweepApiGatewayGroup(region string) error { req := cloudapi.CreateDeleteApiGroupRequest() req.GroupId = id - if _, err := conn.cloudapiconn.DeleteApiGroup(req); err != nil { + _, err := client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) { + return cloudApiClient.DeleteApiGroup(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Api Group (%s): %s", name, err) } } @@ -100,11 +107,11 @@ func testAccCheckAlicloudApigatewayGroupExists(n string, d *cloudapi.DescribeApi return fmt.Errorf("No Apigroup ID is set") } - fmt.Println(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cloudApiService := CloudApiService{client} - resp, err := testAccProvider.Meta().(*AliyunClient).DescribeApiGroup(rs.Primary.ID) + resp, err := cloudApiService.DescribeApiGroup(rs.Primary.ID) if err != nil { - return fmt.Errorf("Error Describe Apigroup: %#v", err) } @@ -114,14 +121,15 @@ func testAccCheckAlicloudApigatewayGroupExists(n string, d *cloudapi.DescribeApi } func testAccCheckAlicloudApigatewayGroupDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cloudApiService := CloudApiService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_api_gateway_group" { continue } - _, err := client.DescribeApiGroup(rs.Primary.ID) + _, err := cloudApiService.DescribeApiGroup(rs.Primary.ID) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_cdn_domain.go b/alicloud/resource_alicloud_cdn_domain.go index bbeff772455..84bda1b3cfb 100644 --- a/alicloud/resource_alicloud_cdn_domain.go +++ b/alicloud/resource_alicloud_cdn_domain.go @@ -9,6 +9,7 @@ import ( "github.com/denverdino/aliyungo/cdn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudCdnDomain() *schema.Resource { @@ -259,7 +260,7 @@ func resourceAlicloudCdnDomain() *schema.Resource { } func resourceAlicloudCdnDomainCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).cdnconn + client := meta.(*connectivity.AliyunClient) args := cdn.AddDomainRequest{ DomainName: d.Get("domain_name").(string), @@ -285,7 +286,9 @@ func resourceAlicloudCdnDomainCreate(d *schema.ResourceData, meta interface{}) e return fmt.Errorf("SourceType is required when 'cdn_type' is not 'liveStream'.") } } - _, err := conn.AddCdnDomain(args) + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.AddCdnDomain(args) + }) if err != nil { return fmt.Errorf("AddCdnDomain got an error: %#v", err) } @@ -295,7 +298,7 @@ func resourceAlicloudCdnDomainCreate(d *schema.ResourceData, meta interface{}) e } func resourceAlicloudCdnDomainUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).cdnconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -322,7 +325,9 @@ func resourceAlicloudCdnDomainUpdate(d *schema.ResourceData, meta interface{}) e attributeUpdate = true } if attributeUpdate { - _, err := conn.ModifyCdnDomain(args) + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.ModifyCdnDomain(args) + }) if err != nil { return fmt.Errorf("ModifyCdnDomain got an error: %#v", err) } @@ -330,7 +335,7 @@ func resourceAlicloudCdnDomainUpdate(d *schema.ResourceData, meta interface{}) e } // set optimize_enable 、range_enable、page_compress_enable and video_seek_enable - if err := enableConfigUpdate(conn, d); err != nil { + if err := enableConfigUpdate(client, d); err != nil { return err } @@ -338,43 +343,46 @@ func resourceAlicloudCdnDomainUpdate(d *schema.ResourceData, meta interface{}) e d.SetPartial("block_ips") blockIps := expandStringList(d.Get("block_ips").(*schema.Set).List()) args := cdn.IpBlackRequest{DomainName: d.Id(), BlockIps: strings.Join(blockIps, ",")} - if _, err := conn.SetIpBlackListConfig(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetIpBlackListConfig(args) + }) + if err != nil { return err } } if d.HasChange("parameter_filter_config") { - if err := queryStringConfigUpdate(conn, d); err != nil { + if err := queryStringConfigUpdate(client, d); err != nil { return err } } if d.HasChange("page_404_config") { - if err := page404ConfigUpdate(conn, d); err != nil { + if err := page404ConfigUpdate(client, d); err != nil { return err } } if d.HasChange("refer_config") { - if err := referConfigUpdate(conn, d); err != nil { + if err := referConfigUpdate(client, d); err != nil { return err } } if d.HasChange("auth_config") { - if err := authConfigUpdate(conn, d); err != nil { + if err := authConfigUpdate(client, d); err != nil { return err } } if d.HasChange("http_header_config") { - if err := httpHeaderConfigUpdate(conn, d); err != nil { + if err := httpHeaderConfigUpdate(client, d); err != nil { return err } } if d.HasChange("cache_config") { - if err := cacheConfigUpdate(conn, d); err != nil { + if err := cacheConfigUpdate(client, d); err != nil { return err } } @@ -384,16 +392,18 @@ func resourceAlicloudCdnDomainUpdate(d *schema.ResourceData, meta interface{}) e } func resourceAlicloudCdnDomainRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).cdnconn + client := meta.(*connectivity.AliyunClient) args := cdn.DescribeDomainRequest{ DomainName: d.Id(), } - response, err := conn.DescribeCdnDomainDetail(args) + raw, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.DescribeCdnDomainDetail(args) + }) if err != nil { return fmt.Errorf("DescribeCdnDomainDetail got an error: %#v", err) } - + response, _ := raw.(cdn.DomainResponse) domain := response.GetDomainDetailModel d.Set("domain_name", domain.DomainName) d.Set("sources", domain.Sources.Source) @@ -405,10 +415,13 @@ func resourceAlicloudCdnDomainRead(d *schema.ResourceData, meta interface{}) err describeConfigArgs := cdn.DomainConfigRequest{ DomainName: d.Id(), } - resp, err := conn.DescribeDomainConfigs(describeConfigArgs) + raw, err = client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.DescribeDomainConfigs(describeConfigArgs) + }) if err != nil { return fmt.Errorf("DescribeDomainConfigs got an error: %#v", err) } + resp, _ := raw.(cdn.DomainConfigResponse) configs := resp.DomainConfigs queryStringConfig := configs.IgnoreQueryStringConfig @@ -499,13 +512,16 @@ func resourceAlicloudCdnDomainRead(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudCdnDomainDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).cdnconn + client := meta.(*connectivity.AliyunClient) args := cdn.DescribeDomainRequest{ DomainName: d.Id(), } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DeleteCdnDomain(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.DeleteCdnDomain(args) + }) + if err != nil { if IsExceptedError(err, ServiceBusy) { return resource.RetryableError(fmt.Errorf("The specified Domain is configuring, please retry later.")) } @@ -515,15 +531,18 @@ func resourceAlicloudCdnDomainDelete(d *schema.ResourceData, meta interface{}) e }) } -func enableConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { +func enableConfigUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { type configFunc func(req cdn.ConfigRequest) (cdn.CdnCommonResponse, error) - relation := map[string]configFunc{ - "optimize_enable": conn.SetOptimizeConfig, - "range_enable": conn.SetRangeConfig, - "page_compress_enable": conn.SetPageCompressConfig, - "video_seek_enable": conn.SetVideoSeekConfig, - } + raw, _ := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return map[string]configFunc{ + "optimize_enable": cdnClient.SetOptimizeConfig, + "range_enable": cdnClient.SetRangeConfig, + "page_compress_enable": cdnClient.SetPageCompressConfig, + "video_seek_enable": cdnClient.SetVideoSeekConfig, + }, nil + }) + relation, _ := raw.(map[string]configFunc) for key, fn := range relation { if d.HasChange(key) { @@ -540,13 +559,16 @@ func enableConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { return nil } -func queryStringConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { +func queryStringConfigUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { valSet := d.Get("parameter_filter_config").(*schema.Set) args := cdn.QueryStringConfigRequest{DomainName: d.Id()} if valSet == nil || valSet.Len() == 0 { args.Enable = "off" - if _, err := conn.SetIgnoreQueryStringConfig(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetIgnoreQueryStringConfig(args) + }) + if err != nil { return err } return nil @@ -559,19 +581,25 @@ func queryStringConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error hashKeyArgs := expandStringList(v.([]interface{})) args.HashKeyArgs = strings.Join(hashKeyArgs, ",") } - if _, err := conn.SetIgnoreQueryStringConfig(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetIgnoreQueryStringConfig(args) + }) + if err != nil { return err } return nil } -func page404ConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { +func page404ConfigUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { valSet := d.Get("page_404_config").(*schema.Set) args := cdn.ErrorPageConfigRequest{DomainName: d.Id()} if valSet == nil || valSet.Len() == 0 { args.PageType = "default" - if _, err := conn.SetErrorPageConfig(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetErrorPageConfig(args) + }) + if err != nil { return err } return nil @@ -595,20 +623,26 @@ func page404ConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { return fmt.Errorf("If 'page_type' value is 'other', you must set the value of 'custom_page_url'.") } - if _, err := conn.SetErrorPageConfig(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetErrorPageConfig(args) + }) + if err != nil { return err } return nil } -func referConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { +func referConfigUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { valSet := d.Get("refer_config").(*schema.Set) args := cdn.ReferConfigRequest{DomainName: d.Id()} if valSet == nil || valSet.Len() == 0 { args.ReferType = "block" args.AllowEmpty = "on" - if _, err := conn.SetRefererConfig(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetRefererConfig(args) + }) + if err != nil { return err } return nil @@ -622,20 +656,26 @@ func referConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { referList := expandStringList(v.([]interface{})) args.ReferList = strings.Join(referList, ",") } - if _, err := conn.SetRefererConfig(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetRefererConfig(args) + }) + if err != nil { return err } return nil } -func authConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { +func authConfigUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { ov, nv := d.GetChange("auth_config") oldConfig, newConfig := ov.(*schema.Set), nv.(*schema.Set) args := cdn.ReqAuthConfigRequest{DomainName: d.Id()} if newConfig == nil || newConfig.Len() == 0 { args.AuthType = "no_auth" - if _, err := conn.SetReqAuthConfig(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetReqAuthConfig(args) + }) + if err != nil { return err } return nil @@ -672,13 +712,16 @@ func authConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { } } - if _, err := conn.SetReqAuthConfig(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetReqAuthConfig(args) + }) + if err != nil { return err } return nil } -func httpHeaderConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { +func httpHeaderConfigUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { ov, nv := d.GetChange("http_header_config") oldConfigs := ov.(*schema.Set).List() newConfigs := nv.(*schema.Set).List() @@ -689,7 +732,10 @@ func httpHeaderConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { DomainName: d.Id(), ConfigID: configId, } - if _, err := conn.DeleteHttpHeaderConfig(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.DeleteHttpHeaderConfig(args) + }) + if err != nil { return err } } @@ -704,7 +750,9 @@ func httpHeaderConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { HeaderKey: v.(map[string]interface{})["header_key"].(string), HeaderValue: v.(map[string]interface{})["header_value"].(string), } - _, err := conn.SetHttpHeaderConfig(args) + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetHttpHeaderConfig(args) + }) if err != nil { return fmt.Errorf("SetHttpHeaderConfig got an error: %#v", err) } @@ -713,7 +761,7 @@ func httpHeaderConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { return nil } -func cacheConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { +func cacheConfigUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { ov, nv := d.GetChange("cache_config") oldConfigs := ov.(*schema.Set).List() newConfigs := nv.(*schema.Set).List() @@ -726,7 +774,10 @@ func cacheConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { ConfigID: configId, CacheType: val["cache_type"].(string), } - if _, err := conn.DeleteCacheExpiredConfig(args); err != nil { + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.DeleteCacheExpiredConfig(args) + }) + if err != nil { return fmt.Errorf("DeleteCacheExpiredConfig got an error: %#v", err) } } @@ -743,7 +794,7 @@ func cacheConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { TTL: strconv.Itoa(val["ttl"].(int)), Weight: strconv.Itoa(val["weight"].(int)), } - if err := setCacheExpiredConfig(args, val["cache_type"].(string), conn); err != nil { + if err := setCacheExpiredConfig(args, val["cache_type"].(string), client); err != nil { return err } } @@ -751,11 +802,15 @@ func cacheConfigUpdate(conn *cdn.CdnClient, d *schema.ResourceData) error { return nil } -func setCacheExpiredConfig(req cdn.CacheConfigRequest, cacheType string, conn *cdn.CdnClient) (err error) { +func setCacheExpiredConfig(req cdn.CacheConfigRequest, cacheType string, client *connectivity.AliyunClient) (err error) { if cacheType == "suffix" { - _, err = conn.SetFileCacheExpiredConfig(req) + _, err = client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetFileCacheExpiredConfig(req) + }) } else { - _, err = conn.SetPathCacheExpiredConfig(req) + _, err = client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.SetPathCacheExpiredConfig(req) + }) } return } diff --git a/alicloud/resource_alicloud_cdn_domain_test.go b/alicloud/resource_alicloud_cdn_domain_test.go index 2c2d6b23f88..a0b6f1bfcb8 100644 --- a/alicloud/resource_alicloud_cdn_domain_test.go +++ b/alicloud/resource_alicloud_cdn_domain_test.go @@ -8,6 +8,7 @@ import ( "github.com/denverdino/aliyungo/cdn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudCdnDomain_basic(t *testing.T) { @@ -50,17 +51,19 @@ func testAccCheckCdnDomainExists(n string, domain *cdn.DomainDetail) resource.Te return fmt.Errorf("No Domain ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.cdnconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := cdn.DescribeDomainRequest{ DomainName: rs.Primary.Attributes["domain_name"], } - response, err := conn.DescribeCdnDomainDetail(request) + raw, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.DescribeCdnDomainDetail(request) + }) log.Printf("[WARN] Domain id %#v", rs.Primary.ID) if err == nil { + response, _ := raw.(cdn.DomainResponse) *domain = response.GetDomainDetailModel return nil } @@ -76,14 +79,15 @@ func testAccCheckCdnDomainDestroy(s *terraform.State) error { } // Try to find the domain - client := testAccProvider.Meta().(*AliyunClient) - conn := client.cdnconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := cdn.DescribeDomainRequest{ DomainName: rs.Primary.Attributes["domain_name"], } - _, err := conn.DescribeCdnDomainDetail(request) + _, err := client.WithCdnClient(func(cdnClient *cdn.CdnClient) (interface{}, error) { + return cdnClient.DescribeCdnDomainDetail(request) + }) if err != nil && !IsExceptedErrors(err, []string{InvalidDomainNotFound}) { return fmt.Errorf("Error Domain still exist.") diff --git a/alicloud/resource_alicloud_cen_bandwidth_limit.go b/alicloud/resource_alicloud_cen_bandwidth_limit.go index 71813cdf3be..879d0e3d688 100644 --- a/alicloud/resource_alicloud_cen_bandwidth_limit.go +++ b/alicloud/resource_alicloud_cen_bandwidth_limit.go @@ -7,6 +7,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudCenBandwidthLimit() *schema.Resource { @@ -67,8 +68,9 @@ func resourceAlicloudCenBandwidthLimitCreate(d *schema.ResourceData, meta interf } func resourceAlicloudCenBandwidthLimitRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - paras, err := getCenAndRegionIds(d.Id()) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} + paras, err := cenService.GetCenAndRegionIds(d.Id()) if err != nil { return err } @@ -80,7 +82,7 @@ func resourceAlicloudCenBandwidthLimitRead(d *schema.ResourceData, meta interfac d.SetId(cenId + COLON_SEPARATED + oppositeRegionId + COLON_SEPARATED + localRegionId) } - resp, err := client.DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId) + resp, err := cenService.DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId) if err != nil { if NotFoundError(err) { d.SetId("") @@ -101,7 +103,8 @@ func resourceAlicloudCenBandwidthLimitRead(d *schema.ResourceData, meta interfac } func resourceAlicloudCenBandwidthLimitUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} cenId := d.Get("instance_id").(string) regionIds := d.Get("region_ids").(*schema.Set).List() localRegionId := regionIds[0].(string) @@ -120,7 +123,7 @@ func resourceAlicloudCenBandwidthLimitUpdate(d *schema.ResourceData, meta interf if attributeUpdate { err := resource.Retry(5*time.Minute, func() *resource.RetryError { - err := client.SetCenInterRegionBandwidthLimit(cenId, localRegionId, oppositeRegionId, bandwidthLimit) + err := cenService.SetCenInterRegionBandwidthLimit(cenId, localRegionId, oppositeRegionId, bandwidthLimit) if err != nil { if IsExceptedError(err, InvalidCenInstanceStatus) { return resource.RetryableError(err) @@ -135,7 +138,7 @@ func resourceAlicloudCenBandwidthLimitUpdate(d *schema.ResourceData, meta interf cenId, localRegionId, oppositeRegionId, err) } - if err = client.WaitForCenInterRegionBandwidthLimitActive(cenId, localRegionId, oppositeRegionId, DefaultCenTimeout); err != nil { + if err = cenService.WaitForCenInterRegionBandwidthLimitActive(cenId, localRegionId, oppositeRegionId, DefaultCenTimeout); err != nil { return err } } @@ -144,14 +147,15 @@ func resourceAlicloudCenBandwidthLimitUpdate(d *schema.ResourceData, meta interf } func resourceAlicloudCenBandwidthLimitDelete(d *schema.ResourceData, meta interface{}) error { - client := (meta).(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} cenId := d.Get("instance_id").(string) regionIds := d.Get("region_ids").(*schema.Set).List() localRegionId := regionIds[0].(string) oppositeRegionId := regionIds[1].(string) err := resource.Retry(5*time.Minute, func() *resource.RetryError { - err := client.SetCenInterRegionBandwidthLimit(cenId, localRegionId, oppositeRegionId, 0) + err := cenService.SetCenInterRegionBandwidthLimit(cenId, localRegionId, oppositeRegionId, 0) if err != nil { if IsExceptedError(err, InvalidCenInstanceStatus) { return resource.RetryableError(err) @@ -165,7 +169,7 @@ func resourceAlicloudCenBandwidthLimitDelete(d *schema.ResourceData, meta interf cenId, localRegionId, oppositeRegionId, err) } - if err := client.WaitForCenInterRegionBandwidthLimitDestroy(cenId, localRegionId, oppositeRegionId, DefaultCenTimeout); err != nil { + if err := cenService.WaitForCenInterRegionBandwidthLimitDestroy(cenId, localRegionId, oppositeRegionId, DefaultCenTimeout); err != nil { return err } diff --git a/alicloud/resource_alicloud_cen_bandwidth_limit_test.go b/alicloud/resource_alicloud_cen_bandwidth_limit_test.go index a1d2fb6dfd3..5f4ef27b4ab 100644 --- a/alicloud/resource_alicloud_cen_bandwidth_limit_test.go +++ b/alicloud/resource_alicloud_cen_bandwidth_limit_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudCenBandwidthLimit_basic(t *testing.T) { @@ -118,16 +119,17 @@ func testAccCheckCenBandwidthLimitExists(n string, cenBwpLimit *cbn.CenInterRegi return fmt.Errorf("No CEN bandwidth limit ID is set") } - params, err := getCenAndRegionIds(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cenService := CenService{client} + + params, err := cenService.GetCenAndRegionIds(rs.Primary.ID) if err != nil { return err } cenId := params[0] localRegionId := params[1] oppositeRegionId := params[2] - - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId) + instance, err := cenService.DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId) if err != nil { return err } @@ -138,14 +140,15 @@ func testAccCheckCenBandwidthLimitExists(n string, cenBwpLimit *cbn.CenInterRegi } func testAccCheckCenBandwidthLimitDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cenService := CenService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_cen_bandwidth_limit" { continue } - params, err := getCenAndRegionIds(rs.Primary.ID) + params, err := cenService.GetCenAndRegionIds(rs.Primary.ID) if err != nil { return err } @@ -153,7 +156,7 @@ func testAccCheckCenBandwidthLimitDestroy(s *terraform.State) error { localRegionId := params[1] oppositeRegionId := params[2] - instance, err := client.DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId) + instance, err := cenService.DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_cen_bandwidth_package.go b/alicloud/resource_alicloud_cen_bandwidth_package.go index fbf1f1cdcf6..aa33c8a0003 100644 --- a/alicloud/resource_alicloud_cen_bandwidth_package.go +++ b/alicloud/resource_alicloud_cen_bandwidth_package.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudCenBandwidthPackage() *schema.Resource { @@ -124,17 +125,21 @@ func resourceAlicloudCenBandwidthPackage() *schema.Resource { } func resourceAlicloudCenBandwidthPackageCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} var cenbwp *cbn.CreateCenBandwidthPackageResponse err := resource.Retry(3*time.Minute, func() *resource.RetryError { args := buildAliCloudCenBandwidthPackageArgs(d, meta) - resp, err := client.cenconn.CreateCenBandwidthPackage(args) + raw, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.CreateCenBandwidthPackage(args) + }) if err != nil { if IsExceptedError(err, OperationBlocking) { return resource.RetryableError(fmt.Errorf("Create CEN bandwidth package timeout and got an error: %#v.", err)) } return resource.NonRetryableError(err) } + resp, _ := raw.(*cbn.CreateCenBandwidthPackageResponse) cenbwp = resp return nil }) @@ -144,7 +149,7 @@ func resourceAlicloudCenBandwidthPackageCreate(d *schema.ResourceData, meta inte d.SetId(cenbwp.CenBandwidthPackageId) - err = client.WaitForCenBandwidthPackage(d.Id(), Idle, DefaultCenTimeout) + err = cenService.WaitForCenBandwidthPackage(d.Id(), Idle, DefaultCenTimeout) if err != nil { return fmt.Errorf("Timeout when WaitForCenBandwidthPackageIdle, bandwidth package ID %s", err) } @@ -153,8 +158,9 @@ func resourceAlicloudCenBandwidthPackageCreate(d *schema.ResourceData, meta inte } func resourceAlicloudCenBandwidthPackageRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - resp, err := client.DescribeCenBandwidthPackage(d.Id()) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} + resp, err := cenService.DescribeCenBandwidthPackage(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -186,7 +192,8 @@ func resourceAlicloudCenBandwidthPackageRead(d *schema.ResourceData, meta interf func resourceAlicloudCenBandwidthPackageUpdate(d *schema.ResourceData, meta interface{}) error { d.Partial(true) - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} attributeUpdate := false request1 := cbn.CreateModifyCenBandwidthPackageAttributeRequest() request1.CenBandwidthPackageId = d.Id() @@ -202,7 +209,10 @@ func resourceAlicloudCenBandwidthPackageUpdate(d *schema.ResourceData, meta inte } if attributeUpdate { - if _, err := client.cenconn.ModifyCenBandwidthPackageAttribute(request1); err != nil { + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.ModifyCenBandwidthPackageAttribute(request1) + }) + if err != nil { return err } d.SetPartial("name") @@ -215,11 +225,14 @@ func resourceAlicloudCenBandwidthPackageUpdate(d *schema.ResourceData, meta inte request2.CenBandwidthPackageId = d.Id() request2.Bandwidth = requests.NewInteger(bandwidth) - if _, err := client.cenconn.ModifyCenBandwidthPackageSpec(request2); err != nil { + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.ModifyCenBandwidthPackageSpec(request2) + }) + if err != nil { return err } /* modify function may delay for a while */ - if err := client.WaitForCenBandwidthPackageUpdate(d.Id(), bandwidth, DefaultCenTimeout); err != nil { + if err := cenService.WaitForCenBandwidthPackageUpdate(d.Id(), bandwidth, DefaultCenTimeout); err != nil { return err } d.SetPartial("bandwidth") @@ -231,13 +244,16 @@ func resourceAlicloudCenBandwidthPackageUpdate(d *schema.ResourceData, meta inte } func resourceAlicloudCenBandwidthPackageDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} cenBwpId := d.Id() request := cbn.CreateDeleteCenBandwidthPackageRequest() request.CenBandwidthPackageId = cenBwpId return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.cenconn.DeleteCenBandwidthPackage(request) + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DeleteCenBandwidthPackage(request) + }) if err != nil { if IsExceptedErrors(err, []string{ForbiddenRelease, InvalidCenBandwidthLimitsNotZero}) { return resource.NonRetryableError(err) @@ -248,7 +264,7 @@ func resourceAlicloudCenBandwidthPackageDelete(d *schema.ResourceData, meta inte return resource.RetryableError(fmt.Errorf("Delete CEN bandwidth package %s timeout and got an error: %#v.", cenBwpId, err)) } - if _, err := client.DescribeCenBandwidthPackage(cenBwpId); err != nil { + if _, err := cenService.DescribeCenBandwidthPackage(cenBwpId); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_cen_bandwidth_package_attachment.go b/alicloud/resource_alicloud_cen_bandwidth_package_attachment.go index 6a5a60ecaa2..77785e77e10 100644 --- a/alicloud/resource_alicloud_cen_bandwidth_package_attachment.go +++ b/alicloud/resource_alicloud_cen_bandwidth_package_attachment.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudCenBandwidthPackageAttachment() *schema.Resource { @@ -34,7 +35,8 @@ func resourceAlicloudCenBandwidthPackageAttachment() *schema.Resource { } func resourceAlicloudCenBandwidthPackageAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} cenId := d.Get("instance_id").(string) cenBwpId := d.Get("bandwidth_package_id").(string) @@ -44,7 +46,9 @@ func resourceAlicloudCenBandwidthPackageAttachmentCreate(d *schema.ResourceData, request.CenBandwidthPackageId = cenBwpId err := resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.cenconn.AssociateCenBandwidthPackage(request) + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.AssociateCenBandwidthPackage(request) + }) if err != nil { if IsExceptedErrors(err, []string{InvalidBwpInstanceStatus, InvalidBwpBusinessStatus, InvalidCenInstanceStatus}) { return resource.RetryableError(fmt.Errorf("Associate bandwidth package %s to CEN %s timeout and got an error: %#v", cenBwpId, cenId, err)) @@ -57,7 +61,7 @@ func resourceAlicloudCenBandwidthPackageAttachmentCreate(d *schema.ResourceData, return fmt.Errorf("Associate bandwidth package %s to CEN %s got an error: %#v.", cenBwpId, cenId, err) } - if err := client.WaitForCenBandwidthPackageAttachment(cenBwpId, InUse, DefaultCenTimeout); err != nil { + if err := cenService.WaitForCenBandwidthPackageAttachment(cenBwpId, InUse, DefaultCenTimeout); err != nil { return fmt.Errorf("Timeout when WaitForCenBandwidthPackageAttachment, CEN ID %s, bandwidth package ID %s, error info %#v.", cenId, cenBwpId, err) } @@ -67,9 +71,10 @@ func resourceAlicloudCenBandwidthPackageAttachmentCreate(d *schema.ResourceData, } func resourceAlicloudCenBandwidthPackageAttachmentRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} - resp, err := client.DescribeCenBandwidthPackageById(d.Id()) + resp, err := cenService.DescribeCenBandwidthPackageById(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -85,7 +90,8 @@ func resourceAlicloudCenBandwidthPackageAttachmentRead(d *schema.ResourceData, m } func resourceAlicloudCenBandwidthPackageAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} cenId := d.Get("instance_id").(string) cenBwpId := d.Get("bandwidth_package_id").(string) @@ -94,7 +100,9 @@ func resourceAlicloudCenBandwidthPackageAttachmentDelete(d *schema.ResourceData, request.CenBandwidthPackageId = cenBwpId err := resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.cenconn.UnassociateCenBandwidthPackage(request) + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.UnassociateCenBandwidthPackage(request) + }) if err != nil { if IsExceptedErrors(err, []string{InvalidBwpInstanceStatus, InvalidBwpBusinessStatus, InvalidCenInstanceStatus}) { return resource.RetryableError(fmt.Errorf("Unassociate bandwidth package %s from CEN %s timeout and got an error: %#v", cenBwpId, cenId, err)) @@ -110,7 +118,7 @@ func resourceAlicloudCenBandwidthPackageAttachmentDelete(d *schema.ResourceData, return fmt.Errorf("Unassociate bandwidth %s from CEN %s got an error: %#v.", cenBwpId, cenId, err) } - if err := client.WaitForCenBandwidthPackageAttachment(cenBwpId, Idle, DefaultCenTimeout); err != nil { + if err := cenService.WaitForCenBandwidthPackageAttachment(cenBwpId, Idle, DefaultCenTimeout); err != nil { return fmt.Errorf("Timeout when WaitForCenBandwidthPackageAttachment, CEN ID %s, bandwidth package ID %s, error %#v", cenId, cenBwpId, err) } diff --git a/alicloud/resource_alicloud_cen_bandwidth_package_attachment_test.go b/alicloud/resource_alicloud_cen_bandwidth_package_attachment_test.go index 849d3588330..e75fcfc1cc3 100644 --- a/alicloud/resource_alicloud_cen_bandwidth_package_attachment_test.go +++ b/alicloud/resource_alicloud_cen_bandwidth_package_attachment_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudCenBandwidthPackageAttachment_basic(t *testing.T) { @@ -43,9 +44,10 @@ func testAccCheckCenBandwidthPackageAttachmentExists(n string, cenBwp *cbn.CenBa return fmt.Errorf("No CenBandwidthPackage ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cenService := CenService{client} - instance, err := client.DescribeCenBandwidthPackageById(rs.Primary.ID) + instance, err := cenService.DescribeCenBandwidthPackageById(rs.Primary.ID) if err != nil { return err } @@ -56,14 +58,15 @@ func testAccCheckCenBandwidthPackageAttachmentExists(n string, cenBwp *cbn.CenBa } func testAccCheckCenBandwidthPackageAttachmentDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cenService := CenService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_cen_bandwidth_package_attachment" { continue } - instance, err := client.DescribeCenBandwidthPackageById(rs.Primary.ID) + instance, err := cenService.DescribeCenBandwidthPackageById(rs.Primary.ID) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_cen_bandwidth_package_test.go b/alicloud/resource_alicloud_cen_bandwidth_package_test.go index 213d2699cff..efed6126f91 100644 --- a/alicloud/resource_alicloud_cen_bandwidth_package_test.go +++ b/alicloud/resource_alicloud_cen_bandwidth_package_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepCenBandwidthPackage(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -34,14 +35,17 @@ func testSweepCenBandwidthPackage(region string) error { var insts []cbn.CenBandwidthPackage req := cbn.CreateDescribeCenBandwidthPackagesRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.cenconn.DescribeCenBandwidthPackages(req) + raw, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DescribeCenBandwidthPackages(req) + }) if err != nil { return fmt.Errorf("Error retrieving CEN Bandwidth Package: %s", err) } + resp, _ := raw.(*cbn.DescribeCenBandwidthPackagesResponse) if resp == nil || len(resp.CenBandwidthPackages.CenBandwidthPackage) < 1 { break } @@ -77,7 +81,10 @@ func testSweepCenBandwidthPackage(region string) error { log.Printf("[INFO] Deleting CEN bandwidth package: %s (%s)", name, id) req := cbn.CreateDeleteCenBandwidthPackageRequest() req.CenBandwidthPackageId = id - if _, err := conn.cenconn.DeleteCenBandwidthPackage(req); err != nil { + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DeleteCenBandwidthPackage(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete CEN bandwidth package (%s (%s)): %s", name, id, err) } } @@ -229,8 +236,9 @@ func testAccCheckCenBandwidthPackageExists(n string, cenBwp *cbn.CenBandwidthPac return fmt.Errorf("No CEN bandwidth package ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeCenBandwidthPackage(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cenService := CenService{client} + instance, err := cenService.DescribeCenBandwidthPackage(rs.Primary.ID) if err != nil { return err } @@ -241,7 +249,8 @@ func testAccCheckCenBandwidthPackageExists(n string, cenBwp *cbn.CenBandwidthPac } func testAccCheckCenBandwidthPackageDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cenService := CenService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_cen_bandwidth_package" { @@ -249,7 +258,7 @@ func testAccCheckCenBandwidthPackageDestroy(s *terraform.State) error { } // Try to find the CEN - instance, err := client.DescribeCenBandwidthPackage(rs.Primary.ID) + instance, err := cenService.DescribeCenBandwidthPackage(rs.Primary.ID) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_cen_instance.go b/alicloud/resource_alicloud_cen_instance.go index 2d7a1ac6c13..1aa7eb16773 100644 --- a/alicloud/resource_alicloud_cen_instance.go +++ b/alicloud/resource_alicloud_cen_instance.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudCenInstance() *schema.Resource { @@ -59,13 +60,15 @@ func resourceAlicloudCenInstance() *schema.Resource { } func resourceAlicloudCenInstanceCreate(d *schema.ResourceData, meta interface{}) error { - - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} var cen *cbn.CreateCenResponse err := resource.Retry(3*time.Minute, func() *resource.RetryError { args := buildAliCloudCenArgs(d, meta) - resp, err := client.cenconn.CreateCen(args) + raw, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.CreateCen(args) + }) if err != nil { if IsExceptedError(err, CenQuotaExceeded) { return resource.NonRetryableError(fmt.Errorf("Create CEN instance, the number of CEN instance exceeds the limit, got an error: %#v", err)) @@ -76,7 +79,7 @@ func resourceAlicloudCenInstanceCreate(d *schema.ResourceData, meta interface{}) return resource.NonRetryableError(err) } - cen = resp + cen, _ = raw.(*cbn.CreateCenResponse) return nil }) if err != nil { @@ -84,7 +87,7 @@ func resourceAlicloudCenInstanceCreate(d *schema.ResourceData, meta interface{}) } d.SetId(cen.CenId) - err = client.WaitForCenInstance(d.Id(), Active, DefaultCenTimeout) + err = cenService.WaitForCenInstance(d.Id(), Active, DefaultCenTimeout) if err != nil { return fmt.Errorf("WaitForCenInstanceAvailable and got an error, CEN ID %s, error info: %#v", d.Id(), err) } @@ -93,9 +96,8 @@ func resourceAlicloudCenInstanceCreate(d *schema.ResourceData, meta interface{}) } func resourceAlicloudCenInstanceRead(d *schema.ResourceData, meta interface{}) error { - - client := meta.(*AliyunClient) - resp, err := client.DescribeCenInstance(d.Id()) + cenService := CenService{meta.(*connectivity.AliyunClient)} + resp, err := cenService.DescribeCenInstance(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -126,7 +128,11 @@ func resourceAlicloudCenInstanceUpdate(d *schema.ResourceData, meta interface{}) } if attributeUpdate { - if _, err := meta.(*AliyunClient).cenconn.ModifyCenAttribute(request); err != nil { + client := meta.(*connectivity.AliyunClient) + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.ModifyCenAttribute(request) + }) + if err != nil { return err } } @@ -135,12 +141,15 @@ func resourceAlicloudCenInstanceUpdate(d *schema.ResourceData, meta interface{}) } func resourceAlicloudCenInstanceDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} request := cbn.CreateDeleteCenRequest() request.CenId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.cenconn.DeleteCen(request) + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DeleteCen(request) + }) if err != nil { if IsExceptedError(err, ParameterCenInstanceIdNotExist) { @@ -149,7 +158,7 @@ func resourceAlicloudCenInstanceDelete(d *schema.ResourceData, meta interface{}) return resource.RetryableError(fmt.Errorf("Delete CEN Instance timeout and got an error: %#v.", err)) } - if _, err := client.DescribeCenInstance(d.Id()); err != nil { + if _, err := cenService.DescribeCenInstance(d.Id()); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_cen_instance_attachment.go b/alicloud/resource_alicloud_cen_instance_attachment.go index 44b2a425359..5e4afe91495 100644 --- a/alicloud/resource_alicloud_cen_instance_attachment.go +++ b/alicloud/resource_alicloud_cen_instance_attachment.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudCenInstanceAttachment() *schema.Resource { @@ -39,11 +40,12 @@ func resourceAlicloudCenInstanceAttachment() *schema.Resource { } func resourceAlicloudCenInstanceAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} cenId := d.Get("instance_id").(string) instanceId := d.Get("child_instance_id").(string) instanceRegionId := d.Get("child_instance_region_id").(string) - instanceType, err := getCenInstanceType(instanceId) + instanceType, err := cenService.GetCenInstanceType(instanceId) if err != nil { return err } @@ -55,7 +57,9 @@ func resourceAlicloudCenInstanceAttachmentCreate(d *schema.ResourceData, meta in request.ChildInstanceRegionId = instanceRegionId err = resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.cenconn.AttachCenChildInstance(request) + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.AttachCenChildInstance(request) + }) if err != nil { if IsExceptedErrors(err, []string{InvalidCenInstanceStatus, InvalidChildInstanceStatus}) { return resource.RetryableError(fmt.Errorf("Attach CEN child instance timeout and got an error: %#v", err)) @@ -72,7 +76,7 @@ func resourceAlicloudCenInstanceAttachmentCreate(d *schema.ResourceData, meta in if instanceType == ChildInstanceTypeVbr { waitTime = DefaultCenTimeoutLong } - if err := client.WaitForCenChildInstanceAttached(instanceId, cenId, Status("Attached"), waitTime); err != nil { + if err := cenService.WaitForCenChildInstanceAttached(instanceId, cenId, Status("Attached"), waitTime); err != nil { return fmt.Errorf("Timeout when WaitForCenChildInstanceAttached, CEN ID %s, child instance ID %s, error info %#v.", cenId, instanceId, err) } @@ -82,13 +86,14 @@ func resourceAlicloudCenInstanceAttachmentCreate(d *schema.ResourceData, meta in } func resourceAlicloudCenInstanceAttachmentRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - cenId, instanceId, err := getCenIdAndAnotherId(d.Id()) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} + cenId, instanceId, err := cenService.GetCenIdAndAnotherId(d.Id()) if err != nil { return err } - resp, err := client.DescribeCenAttachedChildInstanceById(instanceId, cenId) + resp, err := cenService.DescribeCenAttachedChildInstanceById(instanceId, cenId) if err != nil { if NotFoundError(err) { d.SetId("") @@ -105,13 +110,14 @@ func resourceAlicloudCenInstanceAttachmentRead(d *schema.ResourceData, meta inte } func resourceAlicloudCenInstanceAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} instanceRegionId := d.Get("child_instance_region_id").(string) - cenId, instanceId, err := getCenIdAndAnotherId(d.Id()) + cenId, instanceId, err := cenService.GetCenIdAndAnotherId(d.Id()) if err != nil { return err } - instanceType, err := getCenInstanceType(instanceId) + instanceType, err := cenService.GetCenInstanceType(instanceId) if err != nil { return err } @@ -124,7 +130,9 @@ func resourceAlicloudCenInstanceAttachmentDelete(d *schema.ResourceData, meta in err = resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err = client.cenconn.DetachCenChildInstance(request) + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DetachCenChildInstance(request) + }) if err != nil { if IsExceptedError(err, ParameterInstanceIdNotExist) { return nil @@ -136,7 +144,7 @@ func resourceAlicloudCenInstanceAttachmentDelete(d *schema.ResourceData, meta in return resource.NonRetryableError(err) } - _, err := client.DescribeCenAttachedChildInstanceById(instanceId, cenId) + _, err = cenService.DescribeCenAttachedChildInstanceById(instanceId, cenId) if err != nil { if NotFoundError(err) { return nil @@ -156,7 +164,7 @@ func resourceAlicloudCenInstanceAttachmentDelete(d *schema.ResourceData, meta in waitTime = DefaultCenTimeoutLong } - if err := client.WaitForCenChildInstanceDetached(instanceId, cenId, waitTime); err != nil { + if err := cenService.WaitForCenChildInstanceDetached(instanceId, cenId, waitTime); err != nil { return fmt.Errorf("Timeout when WaitForCenChildInstanceDetached, CEN ID %s, child instance ID %s, error info: %#v", cenId, instanceId, err) } diff --git a/alicloud/resource_alicloud_cen_instance_attachment_test.go b/alicloud/resource_alicloud_cen_instance_attachment_test.go index 0bac062ec98..c4edf335137 100644 --- a/alicloud/resource_alicloud_cen_instance_attachment_test.go +++ b/alicloud/resource_alicloud_cen_instance_attachment_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudCenInstanceAttachment_basic(t *testing.T) { @@ -92,14 +93,15 @@ func testAccCheckCenInstanceAttachmentExists(n string, instance *cbn.ChildInstan return fmt.Errorf("No Cen Child Instance ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cenService := CenService{client} - cenId, instanceId, err := getCenIdAndAnotherId(rs.Primary.ID) + cenId, instanceId, err := cenService.GetCenIdAndAnotherId(rs.Primary.ID) if err != nil { return err } - childInstance, err := client.DescribeCenAttachedChildInstanceById(instanceId, cenId) + childInstance, err := cenService.DescribeCenAttachedChildInstanceById(instanceId, cenId) if err != nil { return err } @@ -114,19 +116,20 @@ func testAccCheckCenInstanceAttachmentExists(n string, instance *cbn.ChildInstan } func testAccCheckCenInstanceAttachmentDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cenService := CenService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_instance_attachment" { continue } - cenId, instanceId, err := getCenIdAndAnotherId(rs.Primary.ID) + cenId, instanceId, err := cenService.GetCenIdAndAnotherId(rs.Primary.ID) if err != nil { return err } - instance, err := client.DescribeCenAttachedChildInstanceById(instanceId, cenId) + instance, err := cenService.DescribeCenAttachedChildInstanceById(instanceId, cenId) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_cen_instance_test.go b/alicloud/resource_alicloud_cen_instance_test.go index 71ec418adba..a5386443acd 100644 --- a/alicloud/resource_alicloud_cen_instance_test.go +++ b/alicloud/resource_alicloud_cen_instance_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepCenInstances(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -33,14 +34,17 @@ func testSweepCenInstances(region string) error { var insts []cbn.Cen req := cbn.CreateDescribeCensRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.cenconn.DescribeCens(req) + raw, err := client.WithCenClient(func(cenClient *cbn.Client) (interface{}, error) { + return cenClient.DescribeCens(req) + }) if err != nil { return fmt.Errorf("Error retrieving CEN Instances: %s", err) } + resp, _ := raw.(*cbn.DescribeCensResponse) if resp == nil || len(resp.Cens.Cen) < 1 { break } @@ -76,7 +80,10 @@ func testSweepCenInstances(region string) error { log.Printf("[INFO] Deleting CEN Instance: %s (%s)", name, id) req := cbn.CreateDeleteCenRequest() req.CenId = id - if _, err := conn.cenconn.DeleteCen(req); err != nil { + _, err := client.WithCenClient(func(cenClient *cbn.Client) (interface{}, error) { + return cenClient.DeleteCen(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete CEN Instance (%s (%s)): %s", name, id, err) } } @@ -194,8 +201,9 @@ func testAccCheckCenInstanceExists(n string, cen *cbn.Cen) resource.TestCheckFun return fmt.Errorf("No CEN ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeCenInstance(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cenService := CenService{client} + instance, err := cenService.DescribeCenInstance(rs.Primary.ID) if err != nil { return err @@ -207,7 +215,7 @@ func testAccCheckCenInstanceExists(n string, cen *cbn.Cen) resource.TestCheckFun } func testAccCheckCenInstanceDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_cen_instance" { @@ -215,7 +223,8 @@ func testAccCheckCenInstanceDestroy(s *terraform.State) error { } // Try to find the CEN - instance, err := client.DescribeCenInstance(rs.Primary.ID) + cenService := CenService{client} + instance, err := cenService.DescribeCenInstance(rs.Primary.ID) if err != nil { if NotFoundError(err) { diff --git a/alicloud/resource_alicloud_cen_route_entry.go b/alicloud/resource_alicloud_cen_route_entry.go index b8a0e8f2d26..f74d346fa2d 100644 --- a/alicloud/resource_alicloud_cen_route_entry.go +++ b/alicloud/resource_alicloud_cen_route_entry.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudCenRouteEntry() *schema.Resource { @@ -40,11 +41,12 @@ func resourceAlicloudCenRouteEntry() *schema.Resource { } func resourceAlicloudCenRouteEntryCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} cenId := d.Get("instance_id").(string) vtbId := d.Get("route_table_id").(string) cidr := d.Get("cidr_block").(string) - childInstanceId, childInstanceType, err := client.createCenRouteEntryParas(vtbId) + childInstanceId, childInstanceType, err := cenService.CreateCenRouteEntryParas(vtbId) if err != nil { return fmt.Errorf("Publish CEN route entry encounter an error when query childInstance ID, CEN %s vtb %s cidr %s, error info: %#v.", cenId, vtbId, cidr, err) } @@ -58,7 +60,9 @@ func resourceAlicloudCenRouteEntryCreate(d *schema.ResourceData, meta interface{ request.DestinationCidrBlock = cidr err = resource.Retry(3*time.Minute, func() *resource.RetryError { - _, err = client.cenconn.PublishRouteEntries(request) + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.PublishRouteEntries(request) + }) if err != nil { if IsExceptedError(err, OperationBlocking) { return resource.RetryableError(fmt.Errorf("Publish CEN route entry timeout and got an error: %#v.", err)) @@ -74,7 +78,7 @@ func resourceAlicloudCenRouteEntryCreate(d *schema.ResourceData, meta interface{ d.SetId(cenId + COLON_SEPARATED + vtbId + COLON_SEPARATED + cidr) - err = client.WaitForRouterEntryPublished(d.Id(), PUBLISHED, DefaultCenTimeout) + err = cenService.WaitForRouterEntryPublished(d.Id(), PUBLISHED, DefaultCenTimeout) if err != nil { return fmt.Errorf("Timeout when WaitForCenAvailable") } @@ -83,7 +87,8 @@ func resourceAlicloudCenRouteEntryCreate(d *schema.ResourceData, meta interface{ } func resourceAlicloudCenRouteEntryRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} parts := strings.Split(d.Id(), COLON_SEPARATED) if len(parts) != 3 { @@ -91,7 +96,7 @@ func resourceAlicloudCenRouteEntryRead(d *schema.ResourceData, meta interface{}) } cenId := parts[0] - resp, err := client.DescribePublishedRouteEntriesById(d.Id()) + resp, err := cenService.DescribePublishedRouteEntriesById(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -114,12 +119,13 @@ func resourceAlicloudCenRouteEntryRead(d *schema.ResourceData, meta interface{}) } func resourceAlicloudCenRouteEntryDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cenService := CenService{client} cenId := d.Get("instance_id").(string) vtbId := d.Get("route_table_id").(string) cidr := d.Get("cidr_block").(string) - childInstanceId, childInstanceType, err := client.createCenRouteEntryParas(vtbId) + childInstanceId, childInstanceType, err := cenService.CreateCenRouteEntryParas(vtbId) if err != nil { if NotFoundError(err) { return nil @@ -136,7 +142,9 @@ func resourceAlicloudCenRouteEntryDelete(d *schema.ResourceData, meta interface{ request.DestinationCidrBlock = cidr err = resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err = client.cenconn.WithdrawPublishedRouteEntries(request) + _, err := client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.WithdrawPublishedRouteEntries(request) + }) if err != nil { if IsExceptedErrors(err, []string{InvalidCenInstanceStatus, InternalError}) { return resource.RetryableError(fmt.Errorf("Withdraw CEN route entries timeout and got an error: %#v", err)) @@ -151,7 +159,7 @@ func resourceAlicloudCenRouteEntryDelete(d *schema.ResourceData, meta interface{ return fmt.Errorf("Withdraw CEN route entry timeout, CEN %s child instance %s vtb %s cidr %s, error info: %#v.", cenId, childInstanceId, vtbId, cidr, err) } - if err := client.WaitForRouterEntryPublished(d.Id(), NOPUBLISHED, DefaultCenTimeout); err != nil { + if err := cenService.WaitForRouterEntryPublished(d.Id(), NOPUBLISHED, DefaultCenTimeout); err != nil { return fmt.Errorf("Timeout when WaitForRouterEntriesNoPublished") } diff --git a/alicloud/resource_alicloud_cen_route_entry_test.go b/alicloud/resource_alicloud_cen_route_entry_test.go index 107290e06f7..7e880208255 100644 --- a/alicloud/resource_alicloud_cen_route_entry_test.go +++ b/alicloud/resource_alicloud_cen_route_entry_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudCenRouteEntry_basic(t *testing.T) { @@ -46,9 +47,10 @@ func testAccCheckCenRouteEntryExists(n string, routeEntry *cbn.PublishedRouteEnt return fmt.Errorf("No Cen Route Entry Publishment ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cenService := CenService{client} - routeEntryItem, err := client.DescribePublishedRouteEntriesById(rs.Primary.ID) + routeEntryItem, err := cenService.DescribePublishedRouteEntriesById(rs.Primary.ID) if err != nil { return err } @@ -63,14 +65,15 @@ func testAccCheckCenRouteEntryExists(n string, routeEntry *cbn.PublishedRouteEnt } func testAccCheckCenRouteEntryDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cenService := CenService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_cen_route_entry" { continue } - routeEntryItem, err := client.DescribePublishedRouteEntriesById(rs.Primary.ID) + routeEntryItem, err := cenService.DescribePublishedRouteEntriesById(rs.Primary.ID) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_cms_alarm.go b/alicloud/resource_alicloud_cms_alarm.go index a2abba556e1..1bdc2503da3 100644 --- a/alicloud/resource_alicloud_cms_alarm.go +++ b/alicloud/resource_alicloud_cms_alarm.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cms" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudCmsAlarm() *schema.Resource { @@ -119,7 +120,7 @@ func resourceAlicloudCmsAlarm() *schema.Resource { } func resourceAlicloudCmsAlarmCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) request := cms.CreateCreateAlarmRequest() @@ -160,20 +161,23 @@ func resourceAlicloudCmsAlarmCreate(d *schema.ResourceData, meta interface{}) er request.Dimensions = string(bytes[:]) } } - response, err := client.cmsconn.CreateAlarm(request) + raw, err := client.WithCmsClient(func(cmsClient *cms.Client) (interface{}, error) { + return cmsClient.CreateAlarm(request) + }) if err != nil { return fmt.Errorf("Creating alarm got an error: %#v", err) } - + response, _ := raw.(*cms.CreateAlarmResponse) d.SetId(response.Data) return resourceAlicloudCmsAlarmUpdate(d, meta) } func resourceAlicloudCmsAlarmRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cmsService := CmsService{client} - alarm, err := client.DescribeAlarm(d.Id()) + alarm, err := cmsService.DescribeAlarm(d.Id()) if err != nil { if NotFoundError(err) { @@ -215,7 +219,8 @@ func resourceAlicloudCmsAlarmRead(d *schema.ResourceData, meta interface{}) erro } func resourceAlicloudCmsAlarmUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cmsService := CmsService{client} d.Partial(true) @@ -223,18 +228,24 @@ func resourceAlicloudCmsAlarmUpdate(d *schema.ResourceData, meta interface{}) er request := cms.CreateEnableAlarmRequest() request.Id = d.Id() - if _, err := client.cmsconn.EnableAlarm(request); err != nil { + _, err := client.WithCmsClient(func(cmsClient *cms.Client) (interface{}, error) { + return cmsClient.EnableAlarm(request) + }) + if err != nil { return fmt.Errorf("Enabling alarm got an error: %#v", err) } } else { request := cms.CreateDisableAlarmRequest() request.Id = d.Id() - if _, err := client.cmsconn.DisableAlarm(request); err != nil { + _, err := client.WithCmsClient(func(cmsClient *cms.Client) (interface{}, error) { + return cmsClient.DisableAlarm(request) + }) + if err != nil { return fmt.Errorf("Disableing alarm got an error: %#v", err) } } - if err := client.WaitForCmsAlarm(d.Id(), d.Get("enabled").(bool), 102); err != nil { + if err := cmsService.WaitForCmsAlarm(d.Id(), d.Get("enabled").(bool), 102); err != nil { return err } @@ -299,7 +310,10 @@ func resourceAlicloudCmsAlarmUpdate(d *schema.ResourceData, meta interface{}) er } if !d.IsNewResource() && update { - if _, err := client.cmsconn.UpdateAlarm(request); err != nil { + _, err := client.WithCmsClient(func(cmsClient *cms.Client) (interface{}, error) { + return cmsClient.UpdateAlarm(request) + }) + if err != nil { return fmt.Errorf("Updating alarm got an error: %#v", err) } } @@ -310,19 +324,22 @@ func resourceAlicloudCmsAlarmUpdate(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudCmsAlarmDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + cmsService := CmsService{client} request := cms.CreateDeleteAlarmRequest() request.Id = d.Id() return resource.Retry(3*time.Minute, func() *resource.RetryError { - _, err := client.cmsconn.DeleteAlarm(request) + _, err := client.WithCmsClient(func(cmsClient *cms.Client) (interface{}, error) { + return cmsClient.DeleteAlarm(request) + }) if err != nil { return resource.NonRetryableError(fmt.Errorf("Deleting alarm rule got an error: %#v", err)) } - resp, err := client.DescribeAlarm(d.Id()) + resp, err := cmsService.DescribeAlarm(d.Id()) if err != nil { if NotFoundError(err) { return nil diff --git a/alicloud/resource_alicloud_cms_alarm_test.go b/alicloud/resource_alicloud_cms_alarm_test.go index 909fe1aa8f4..2ee6a19a8cb 100644 --- a/alicloud/resource_alicloud_cms_alarm_test.go +++ b/alicloud/resource_alicloud_cms_alarm_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cms" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepCMSAlarms(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -37,14 +38,17 @@ func testSweepCMSAlarms(region string) error { var alarms []cms.AlarmInListAlarm req := cms.CreateListAlarmRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.cmsconn.ListAlarm(req) + raw, err := client.WithCmsClient(func(cmsClient *cms.Client) (interface{}, error) { + return cmsClient.ListAlarm(req) + }) if err != nil { return fmt.Errorf("Error retrieving CMS Alarm: %s", err) } + resp, _ := raw.(*cms.ListAlarmResponse) if resp == nil || len(resp.AlarmList.Alarm) < 1 { break } @@ -79,7 +83,10 @@ func testSweepCMSAlarms(region string) error { log.Printf("[INFO] Deleting CMS Alarm: %s (%s)", name, id) req := cms.CreateDeleteAlarmRequest() req.Id = id - if _, err := conn.cmsconn.DeleteAlarm(req); err != nil { + _, err := client.WithCmsClient(func(cmsClient *cms.Client) (interface{}, error) { + return cmsClient.DeleteAlarm(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete CMS Alarm (%s (%s)): %s", name, id, err) } } @@ -185,8 +192,9 @@ func testAccCheckCmsAlarmExists(n string, d *cms.AlarmInListAlarm) resource.Test return fmt.Errorf("No Cloud monitor alarm ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - attr, err := client.DescribeAlarm(alarm.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cmsService := CmsService{client} + attr, err := cmsService.DescribeAlarm(alarm.Primary.ID) log.Printf("[DEBUG] check alarm %s attribute %#v", alarm.Primary.ID, attr) if err != nil { @@ -203,14 +211,15 @@ func testAccCheckCmsAlarmExists(n string, d *cms.AlarmInListAlarm) resource.Test } func testAccCheckCmsAlarmDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + cmsService := CmsService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_cms_alarm" { continue } - alarm, err := client.DescribeAlarm(rs.Primary.ID) + alarm, err := cmsService.DescribeAlarm(rs.Primary.ID) if err != nil { if NotFoundError(err) { diff --git a/alicloud/resource_alicloud_cs_application.go b/alicloud/resource_alicloud_cs_application.go index 01d12368af8..8a3623c779f 100644 --- a/alicloud/resource_alicloud_cs_application.go +++ b/alicloud/resource_alicloud_cs_application.go @@ -8,6 +8,7 @@ import ( "github.com/denverdino/aliyungo/cs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudCSApplication() *schema.Resource { @@ -50,7 +51,7 @@ func resourceAlicloudCSApplication() *schema.Resource { if !d.HasChange("version") { return true } - equal, _ := CompareYmalTemplateAreEquivalent(old, new) + equal, _ := compareYamlTemplateAreEquivalent(old, new) return equal }, ValidateFunc: validateYamlString, @@ -125,9 +126,9 @@ func resourceAlicloudCSApplication() *schema.Resource { } func resourceAlicloudCSApplicationCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + csService := CsService{client} clusterName := Trim(d.Get("cluster_name").(string)) - conn, err := client.GetApplicationClientByClusterName(clusterName) args := &cs.ProjectCreationArgs{ Name: d.Get("name").(string), @@ -145,14 +146,20 @@ func resourceAlicloudCSApplicationCreate(d *schema.ResourceData, meta interface{ } invoker := NewInvoker() if err := invoker.Run(func() error { - return conn.CreateProject(args) + cluster, certs, err := csService.GetContainerClusterAndCertsByName(clusterName) + if err == nil { + _, err = client.WithCsProjectClient(cluster.ClusterID, cluster.MasterURL, *certs, func(csProjectClient *cs.ProjectClient) (interface{}, error) { + return nil, csProjectClient.CreateProject(args) + }) + } + return err }); err != nil { return fmt.Errorf("Creating container application got an error: %#v", err) } d.SetId(fmt.Sprintf("%s%s%s", clusterName, COLON_SEPARATED, args.Name)) - if err = client.WaitForContainerApplication(clusterName, args.Name, Running, DefaultTimeoutMedium); err != nil { + if err := csService.WaitForContainerApplication(clusterName, args.Name, Running, DefaultTimeoutMedium); err != nil { return fmt.Errorf("Waitting for container application %#v got an error: %#v", cs.Running, err) } @@ -162,7 +169,9 @@ func resourceAlicloudCSApplicationCreate(d *schema.ResourceData, meta interface{ func resourceAlicloudCSApplicationRead(d *schema.ResourceData, meta interface{}) error { parts := strings.Split(d.Id(), COLON_SEPARATED) - application, err := meta.(*AliyunClient).DescribeContainerApplication(parts[0], parts[1]) + client := meta.(*connectivity.AliyunClient) + csService := CsService{client} + application, err := csService.DescribeContainerApplication(parts[0], parts[1]) if err != nil { if NotFoundError(err) { @@ -205,12 +214,10 @@ func resourceAlicloudCSApplicationRead(d *schema.ResourceData, meta interface{}) } func resourceAlicloudCSApplicationUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + csService := CsService{client} parts := strings.Split(d.Id(), COLON_SEPARATED) - conn, err := client.GetApplicationClientByClusterName(parts[0]) - if err != nil { - return err - } + clusterName := parts[0] invoker := NewInvoker() args := &cs.ProjectUpdationArgs{ Name: parts[1], @@ -265,21 +272,39 @@ func resourceAlicloudCSApplicationUpdate(d *schema.ResourceData, meta interface{ } if !d.HasChange("version") && !blue_green { - if err := conn.RollBackBlueGreenProject(parts[1], true); err != nil { + cluster, certs, err := csService.GetContainerClusterAndCertsByName(clusterName) + if err == nil { + _, err = client.WithCsProjectClient(cluster.ClusterID, cluster.MasterURL, *certs, func(csProjectClient *cs.ProjectClient) (interface{}, error) { + return nil, csProjectClient.RollBackBlueGreenProject(parts[1], true) + }) + } + if err != nil { return fmt.Errorf("Rollbacking container application blue-green got an error: %#v", err) } } else if update { for { if err := invoker.Run(func() error { - return conn.UpdateProject(args) + cluster, certs, err := csService.GetContainerClusterAndCertsByName(clusterName) + if err == nil { + _, err = client.WithCsProjectClient(cluster.ClusterID, cluster.MasterURL, *certs, func(csProjectClient *cs.ProjectClient) (interface{}, error) { + return nil, csProjectClient.UpdateProject(args) + }) + } + return err }); err != nil { if IsExceptedError(err, ApplicationConfirmConflict) { if err := invoker.Run(func() error { - return conn.RollBackBlueGreenProject(parts[1], true) + cluster, certs, err := csService.GetContainerClusterAndCertsByName(clusterName) + if err == nil { + _, err = client.WithCsProjectClient(cluster.ClusterID, cluster.MasterURL, *certs, func(csProjectClient *cs.ProjectClient) (interface{}, error) { + return nil, csProjectClient.RollBackBlueGreenProject(parts[1], true) + }) + } + return err }); err != nil { return fmt.Errorf("Rollbacking container application blue-green got an error: %#v", err) } - if err := client.WaitForContainerApplication(parts[0], parts[1], Running, DefaultTimeoutMedium); err != nil { + if err := csService.WaitForContainerApplication(parts[0], parts[1], Running, DefaultTimeoutMedium); err != nil { return fmt.Errorf("After rolling back blue-green project, waitting for container application %#v got an error: %#v", Running, err) } continue @@ -293,13 +318,19 @@ func resourceAlicloudCSApplicationUpdate(d *schema.ResourceData, meta interface{ if d.Get("blue_green_confirm").(bool) { if err := invoker.Run(func() error { - return conn.ConfirmBlueGreenProject(parts[1], true) + cluster, certs, err := csService.GetContainerClusterAndCertsByName(clusterName) + if err == nil { + _, err = client.WithCsProjectClient(cluster.ClusterID, cluster.MasterURL, *certs, func(csProjectClient *cs.ProjectClient) (interface{}, error) { + return nil, csProjectClient.ConfirmBlueGreenProject(parts[1], true) + }) + } + return err }); err != nil { return fmt.Errorf("Confirmming container application blue-green got an error: %#v", err) } } - if err := client.WaitForContainerApplication(parts[0], parts[1], Running, DefaultTimeoutMedium); err != nil { + if err := csService.WaitForContainerApplication(parts[0], parts[1], Running, DefaultTimeoutMedium); err != nil { return fmt.Errorf("After updating, waitting for container application %#v got an error: %#v", Running, err) } @@ -309,22 +340,23 @@ func resourceAlicloudCSApplicationUpdate(d *schema.ResourceData, meta interface{ } func resourceAlicloudCSApplicationDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + csService := CsService{client} parts := strings.Split(d.Id(), COLON_SEPARATED) - conn, err := client.GetApplicationClientByClusterName(parts[0]) - if err != nil { - if NotFoundError(err) { - return nil - } - return err - } + clusterName := parts[0] appName := parts[1] invoker := NewInvoker() return resource.Retry(3*time.Minute, func() *resource.RetryError { err := invoker.Run(func() error { - return conn.DeleteProject(appName, true, false) + cluster, certs, err := csService.GetContainerClusterAndCertsByName(clusterName) + if err == nil { + _, err = client.WithCsProjectClient(cluster.ClusterID, cluster.MasterURL, *certs, func(csProjectClient *cs.ProjectClient) (interface{}, error) { + return nil, csProjectClient.DeleteProject(appName, true, false) + }) + } + return err }) if err != nil { if IsExceptedError(err, ApplicationNotFound) { @@ -337,11 +369,17 @@ func resourceAlicloudCSApplicationDelete(d *schema.ResourceData, meta interface{ var project cs.GetProjectResponse if err := invoker.Run(func() error { - resp, e := conn.GetProject(appName) - if e != nil { - return e + cluster, certs, err := csService.GetContainerClusterAndCertsByName(clusterName) + if err != nil { + return err + } + raw, err := client.WithCsProjectClient(cluster.ClusterID, cluster.MasterURL, *certs, func(csProjectClient *cs.ProjectClient) (interface{}, error) { + return csProjectClient.GetProject(appName) + }) + if err != nil { + return err } - project = resp + project, _ = raw.(cs.GetProjectResponse) return nil }); err != nil { if IsExceptedError(err, ApplicationNotFound) || IsExceptedError(err, ApplicationErrorIgnore) { diff --git a/alicloud/resource_alicloud_cs_application_test.go b/alicloud/resource_alicloud_cs_application_test.go index 4055cf38ad8..9cf3e2937ae 100644 --- a/alicloud/resource_alicloud_cs_application_test.go +++ b/alicloud/resource_alicloud_cs_application_test.go @@ -8,6 +8,7 @@ import ( "github.com/denverdino/aliyungo/cs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudCSApplication_swarm(t *testing.T) { @@ -100,8 +101,9 @@ func testAccCheckContainerApplicationExists(n string, d *cs.GetProjectResponse) return fmt.Errorf("No Container cluster ID is set") } parts := strings.Split(cluster.Primary.ID, COLON_SEPARATED) - client := testAccProvider.Meta().(*AliyunClient) - app, err := client.DescribeContainerApplication(parts[0], parts[1]) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + csService := CsService{client} + app, err := csService.DescribeContainerApplication(parts[0], parts[1]) if err != nil { return err @@ -117,7 +119,8 @@ func testAccCheckContainerApplicationExists(n string, d *cs.GetProjectResponse) } func testAccCheckContainerApplicationDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + csService := CsService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_cs_application" { @@ -125,7 +128,7 @@ func testAccCheckContainerApplicationDestroy(s *terraform.State) error { } parts := strings.Split(rs.Primary.ID, COLON_SEPARATED) - app, err := client.DescribeContainerApplication(parts[0], parts[1]) + app, err := csService.DescribeContainerApplication(parts[0], parts[1]) if err != nil { if NotFoundError(err) || diff --git a/alicloud/resource_alicloud_cs_kubernetes.go b/alicloud/resource_alicloud_cs_kubernetes.go index 015bcd574c1..b735ce31eb2 100644 --- a/alicloud/resource_alicloud_cs_kubernetes.go +++ b/alicloud/resource_alicloud_cs_kubernetes.go @@ -16,6 +16,7 @@ import ( "github.com/denverdino/aliyungo/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) const ( @@ -375,8 +376,7 @@ func resourceAlicloudCSKubernetes() *schema.Resource { } func resourceAlicloudCSKubernetesCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.csconn + client := meta.(*connectivity.AliyunClient) invoker := NewInvoker() if isMultiAZ, err := isMultiAZClusterAndCheck(d); err != nil { @@ -387,10 +387,13 @@ func resourceAlicloudCSKubernetesCreate(d *schema.ResourceData, meta interface{} return err } if err := invoker.Run(func() error { - cluster, err := conn.CreateKubernetesMultiAZCluster(getRegion(d, meta), args) + raw, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.CreateKubernetesMultiAZCluster(client.Region, args) + }) if err != nil { return err } + cluster, _ := raw.(cs.ClusterCreationResponse) d.SetId(cluster.ClusterID) return nil }); err != nil { @@ -402,10 +405,13 @@ func resourceAlicloudCSKubernetesCreate(d *schema.ResourceData, meta interface{} return err } if err := invoker.Run(func() error { - cluster, err := conn.CreateKubernetesCluster(getRegion(d, meta), args) + raw, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.CreateKubernetesCluster(client.Region, args) + }) if err != nil { return err } + cluster, _ := raw.(cs.ClusterCreationResponse) d.SetId(cluster.ClusterID) return nil }); err != nil { @@ -414,7 +420,10 @@ func resourceAlicloudCSKubernetesCreate(d *schema.ResourceData, meta interface{} } if err := invoker.Run(func() error { - return conn.WaitForClusterAsyn(d.Id(), cs.Running, 3600) + _, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return nil, csClient.WaitForClusterAsyn(d.Id(), cs.Running, 3600) + }) + return err }); err != nil { return fmt.Errorf("Waitting for kubernetes cluster %#v got an error: %#v", cs.Running, err) } @@ -423,7 +432,7 @@ func resourceAlicloudCSKubernetesCreate(d *schema.ResourceData, meta interface{} } func resourceAlicloudCSKubernetesUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).csconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) invoker := NewInvoker() if d.HasChange("worker_numbers") && !d.IsNewResource() { @@ -449,13 +458,19 @@ func resourceAlicloudCSKubernetesUpdate(d *schema.ResourceData, meta interface{} args.NumOfNodesC = int64(workerNumbers[2]) } if err := invoker.Run(func() error { - return conn.ResizeKubernetesCluster(d.Id(), args) + _, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return nil, csClient.ResizeKubernetesCluster(d.Id(), args) + }) + return err }); err != nil { return fmt.Errorf("Resize Cluster got an error: %#v", err) } if err := invoker.Run(func() error { - return conn.WaitForClusterAsyn(d.Id(), cs.Running, 3600) + _, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return nil, csClient.WaitForClusterAsyn(d.Id(), cs.Running, 3600) + }) + return err }); err != nil { return fmt.Errorf("Waitting for container Cluster %#v got an error: %#v", cs.Running, err) } @@ -470,7 +485,10 @@ func resourceAlicloudCSKubernetesUpdate(d *schema.ResourceData, meta interface{} clusterName = resource.PrefixedUniqueId(d.Get("name_prefix").(string)) } if err := invoker.Run(func() error { - if err := conn.ModifyClusterName(d.Id(), clusterName); err != nil && !IsExceptedError(err, ErrorClusterNameAlreadyExist) { + _, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return nil, csClient.ModifyClusterName(d.Id(), clusterName) + }) + if err != nil && !IsExceptedError(err, ErrorClusterNameAlreadyExist) { return err } return nil @@ -486,16 +504,18 @@ func resourceAlicloudCSKubernetesUpdate(d *schema.ResourceData, meta interface{} } func resourceAlicloudCSKubernetesRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) var cluster cs.KubernetesCluster invoker := NewInvoker() if err := invoker.Run(func() error { - c, e := client.csconn.DescribeKubernetesCluster(d.Id()) + raw, e := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.DescribeKubernetesCluster(d.Id()) + }) if e != nil { return e } - cluster = c + cluster, _ = raw.(cs.KubernetesCluster) return nil }); err != nil { if NotFoundError(err) || IsExceptedError(err, ErrorClusterNotFound) { @@ -578,12 +598,15 @@ func resourceAlicloudCSKubernetesRead(d *schema.ResourceData, meta interface{}) var pagination *cs.PaginationResult if err := invoker.Run(func() error { - r, p, e := client.csconn.GetKubernetesClusterNodes(d.Id(), common.Pagination{PageNumber: pageNumber, PageSize: PageSizeLarge}) + raw, e := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + nodes, paginationResult, err := csClient.GetKubernetesClusterNodes(d.Id(), common.Pagination{PageNumber: pageNumber, PageSize: PageSizeLarge}) + return []interface{}{nodes, paginationResult}, err + }) if e != nil { return e } - result = r - pagination = p + result, _ = raw.([]interface{})[0].([]cs.KubernetesNodeType) + pagination, _ = raw.([]interface{})[1].(*cs.PaginationResult) return nil }); err != nil { return fmt.Errorf("[ERROR] GetKubernetesClusterNodes got an error: %#v.", err) @@ -592,10 +615,14 @@ func resourceAlicloudCSKubernetesRead(d *schema.ResourceData, meta interface{}) if pageNumber == 1 && (len(result) == 0 || result[0].InstanceId == "") { err := resource.Retry(5*time.Minute, func() *resource.RetryError { if err := invoker.Run(func() error { - tmp, _, e := client.csconn.GetKubernetesClusterNodes(d.Id(), common.Pagination{PageNumber: pageNumber, PageSize: PageSizeLarge}) + raw, e := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + nodes, _, err := csClient.GetKubernetesClusterNodes(d.Id(), common.Pagination{PageNumber: pageNumber, PageSize: PageSizeLarge}) + return nodes, err + }) if e != nil { return e } + tmp, _ := raw.([]cs.KubernetesNodeType) if len(tmp) > 0 && tmp[0].InstanceId != "" { result = tmp } @@ -637,10 +664,13 @@ func resourceAlicloudCSKubernetesRead(d *schema.ResourceData, meta interface{}) connection := make(map[string]string) reqSLB := slb.CreateDescribeLoadBalancersRequest() reqSLB.ServerId = masterNodes[0]["id"].(string) - lbs, err := client.slbconn.DescribeLoadBalancers(reqSLB) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeLoadBalancers(reqSLB) + }) if err != nil { return fmt.Errorf("[ERROR] DescribeLoadBalancers by server id %s got an error: %#v.", masterNodes[0]["id"].(string), err) } + lbs, _ := raw.(*slb.DescribeLoadBalancersResponse) for _, lb := range lbs.LoadBalancers.LoadBalancer { if strings.ToLower(lb.AddressType) == strings.ToLower(string(Internet)) { d.Set("slb_internet", lb.LoadBalancerId) @@ -656,17 +686,25 @@ func resourceAlicloudCSKubernetesRead(d *schema.ResourceData, meta interface{}) d.Set("connections", connection) req := vpc.CreateDescribeNatGatewaysRequest() req.VpcId = cluster.VPCID - if nat, err := client.vpcconn.DescribeNatGateways(req); err != nil { + raw, err = client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeNatGateways(req) + }) + if err != nil { return fmt.Errorf("[ERROR] DescribeNatGateways by VPC Id %s: %#v.", cluster.VPCID, err) - } else if nat != nil && len(nat.NatGateways.NatGateway) > 0 { + } + nat, _ := raw.(*vpc.DescribeNatGatewaysResponse) + if nat != nil && len(nat.NatGateways.NatGateway) > 0 { d.Set("nat_gateway_id", nat.NatGateways.NatGateway[0].NatGatewayId) } if err := invoker.Run(func() error { - cert, err := client.csconn.GetClusterCerts(d.Id()) + raw, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.GetClusterCerts(d.Id()) + }) if err != nil { return err } + cert, _ := raw.(cs.ClusterCerts) if ce, ok := d.GetOk("client_cert"); ok && ce.(string) != "" { if err := writeToFile(ce.(string), cert.Cert); err != nil { return err @@ -690,11 +728,13 @@ func resourceAlicloudCSKubernetesRead(d *schema.ResourceData, meta interface{}) var config cs.ClusterConfig if file, ok := d.GetOk("kube_config"); ok && file.(string) != "" { if err := invoker.Run(func() error { - c, e := client.csconn.GetClusterConfig(d.Id()) + raw, e := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.GetClusterConfig(d.Id()) + }) if e != nil { return e } - config = c + config, _ = raw.(cs.ClusterConfig) return nil }); err != nil { return fmt.Errorf("GetClusterConfig got an error: %#v.", err) @@ -708,12 +748,15 @@ func resourceAlicloudCSKubernetesRead(d *schema.ResourceData, meta interface{}) } func resourceAlicloudCSKubernetesDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).csconn + client := meta.(*connectivity.AliyunClient) invoker := NewInvoker() var cluster cs.ClusterType return resource.Retry(5*time.Minute, func() *resource.RetryError { if err := invoker.Run(func() error { - return conn.DeleteCluster(d.Id()) + _, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return nil, csClient.DeleteCluster(d.Id()) + }) + return err }); err != nil { if NotFoundError(err) || IsExceptedError(err, ErrorClusterNotFound) { return nil @@ -722,11 +765,13 @@ func resourceAlicloudCSKubernetesDelete(d *schema.ResourceData, meta interface{} } if err := invoker.Run(func() error { - resp, err := conn.DescribeCluster(d.Id()) + raw, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.DescribeCluster(d.Id()) + }) if err != nil { return err } - cluster = resp + cluster, _ = raw.(cs.ClusterType) return nil }); err != nil { if NotFoundError(err) || IsExceptedError(err, ErrorClusterNotFound) { @@ -771,10 +816,12 @@ func isMultiAZClusterAndCheck(d *schema.ResourceData) (bool, error) { } func buildKubernetesArgs(d *schema.ResourceData, meta interface{}) (*cs.KubernetesCreationArgs, error) { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} + vpcService := VpcService{client} // Ensure instance_type is valid - zoneId, validZones, err := meta.(*AliyunClient).DescribeAvailableResources(d, meta, InstanceTypeResource) + zoneId, validZones, err := ecsService.DescribeAvailableResources(d, meta, InstanceTypeResource) if err != nil { return nil, err } @@ -797,11 +844,11 @@ func buildKubernetesArgs(d *schema.ResourceData, meta interface{}) (*cs.Kubernet workerNumber = 3 } - if err := meta.(*AliyunClient).InstanceTypeValidation(masterInstanceType, zoneId, validZones); err != nil { + if err := ecsService.InstanceTypeValidation(masterInstanceType, zoneId, validZones); err != nil { return nil, err } - if err := meta.(*AliyunClient).InstanceTypeValidation(workerInstanceType, zoneId, validZones); err != nil { + if err := ecsService.InstanceTypeValidation(workerInstanceType, zoneId, validZones); err != nil { return nil, err } @@ -814,7 +861,7 @@ func buildKubernetesArgs(d *schema.ResourceData, meta interface{}) (*cs.Kubernet var vpcId string if vswitchID != "" { - vsw, err := client.DescribeVswitch(vswitchID) + vsw, err := vpcService.DescribeVswitch(vswitchID) if err != nil { return nil, err } @@ -872,10 +919,12 @@ func buildKubernetesArgs(d *schema.ResourceData, meta interface{}) (*cs.Kubernet } func buildKubernetesMultiAZArgs(d *schema.ResourceData, meta interface{}) (*cs.KubernetesMultiAZCreationArgs, error) { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} + vpcService := VpcService{client} // Ensure instance_type is valid - zoneId, validZones, err := client.DescribeAvailableResources(d, meta, InstanceTypeResource) + zoneId, validZones, err := ecsService.DescribeAvailableResources(d, meta, InstanceTypeResource) if err != nil { return nil, err } @@ -883,7 +932,7 @@ func buildKubernetesMultiAZArgs(d *schema.ResourceData, meta interface{}) (*cs.K instanceTypes = append(instanceTypes, expandStringList(d.Get("worker_instance_types").([]interface{}))...) for _, instanceType := range instanceTypes { - if err := meta.(*AliyunClient).InstanceTypeValidation(instanceType, zoneId, validZones); err != nil { + if err := ecsService.InstanceTypeValidation(instanceType, zoneId, validZones); err != nil { return nil, err } } @@ -900,7 +949,7 @@ func buildKubernetesMultiAZArgs(d *schema.ResourceData, meta interface{}) (*cs.K vswitchIDs := expandStringList(d.Get("vswitch_ids").([]interface{})) workerNumbers := expandIntList(d.Get("worker_numbers").([]interface{})) - vsw, err := client.DescribeVswitch(vswitchIDs[0]) + vsw, err := vpcService.DescribeVswitch(vswitchIDs[0]) if err != nil { return nil, err } diff --git a/alicloud/resource_alicloud_cs_kubernetes_test.go b/alicloud/resource_alicloud_cs_kubernetes_test.go index 75ea38a37fd..d04454a7d67 100644 --- a/alicloud/resource_alicloud_cs_kubernetes_test.go +++ b/alicloud/resource_alicloud_cs_kubernetes_test.go @@ -8,6 +8,7 @@ import ( "github.com/denverdino/aliyungo/cs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudCSKubernetes_basic(t *testing.T) { @@ -119,14 +120,16 @@ func TestAccAlicloudCSMultiAZKubernetes_basic(t *testing.T) { } func testAccCheckKubernetesClusterDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient).csconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_cs_kubernetes" { continue } - cluster, err := client.DescribeCluster(rs.Primary.ID) + raw, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.DescribeCluster(rs.Primary.ID) + }) if err != nil { if NotFoundError(err) || IsExceptedError(err, ErrorClusterNotFound) { @@ -134,7 +137,7 @@ func testAccCheckKubernetesClusterDestroy(s *terraform.State) error { } return err } - + cluster, _ := raw.(cs.ClusterType) if cluster.ClusterID != "" { return fmt.Errorf("Error container cluster %s still exists.", rs.Primary.ID) } diff --git a/alicloud/resource_alicloud_cs_swarm.go b/alicloud/resource_alicloud_cs_swarm.go index 5082ef118b3..77b786eace3 100644 --- a/alicloud/resource_alicloud_cs_swarm.go +++ b/alicloud/resource_alicloud_cs_swarm.go @@ -9,6 +9,7 @@ import ( "github.com/denverdino/aliyungo/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudCSSwarm() *schema.Resource { @@ -155,15 +156,16 @@ func resourceAlicloudCSSwarm() *schema.Resource { } func resourceAlicloudCSSwarmCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.csconn + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} + vpcService := VpcService{client} // Ensure instance_type is valid - zoneId, validZones, err := meta.(*AliyunClient).DescribeAvailableResources(d, meta, InstanceTypeResource) + zoneId, validZones, err := ecsService.DescribeAvailableResources(d, meta, InstanceTypeResource) if err != nil { return err } - if err := meta.(*AliyunClient).InstanceTypeValidation(d.Get("instance_type").(string), zoneId, validZones); err != nil { + if err := ecsService.InstanceTypeValidation(d.Get("instance_type").(string), zoneId, validZones); err != nil { return err } @@ -189,7 +191,7 @@ func resourceAlicloudCSSwarmCreate(d *schema.ResourceData, meta interface{}) err NeedSLB: d.Get("need_slb").(bool), } - vsw, err := client.DescribeVswitch(args.VSwitchID) + vsw, err := vpcService.DescribeVswitch(args.VSwitchID) if err != nil { return fmt.Errorf("Error DescribeVSwitches: %#v", err) } @@ -201,23 +203,27 @@ func resourceAlicloudCSSwarmCreate(d *schema.ResourceData, meta interface{}) err args.VPCID = vsw.VpcId if imageId, ok := d.GetOk("image_id"); ok { - if _, err := client.DescribeImageById(imageId.(string)); err != nil { + if _, err := ecsService.DescribeImageById(imageId.(string)); err != nil { return err } args.ECSImageID = imageId.(string) } - region := getRegion(d, meta) - cluster, err := conn.CreateCluster(region, args) + region := client.Region + raw, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.CreateCluster(region, args) + }) if err != nil { return fmt.Errorf("Creating container Cluster got an error: %#v", err) } - + cluster, _ := raw.(cs.ClusterCreationResponse) d.SetId(cluster.ClusterID) - err = conn.WaitForClusterAsyn(cluster.ClusterID, cs.Running, 500) + _, err = client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return nil, csClient.WaitForClusterAsyn(cluster.ClusterID, cs.Running, 500) + }) if err != nil { return fmt.Errorf("Waitting for container Cluster %#v got an error: %#v", cs.Running, err) @@ -227,7 +233,7 @@ func resourceAlicloudCSSwarmCreate(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudCSSwarmUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).csconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) if d.HasChange("node_number") && !d.IsNewResource() { o, n := d.GetChange("node_number") @@ -237,20 +243,24 @@ func resourceAlicloudCSSwarmUpdate(d *schema.ResourceData, meta interface{}) err return fmt.Errorf("The node number must greater than the current. The cluster's current node number is %d.", oi) } d.SetPartial("node_number") - err := conn.ResizeCluster(d.Id(), &cs.ClusterResizeArgs{ - Size: int64(ni), - InstanceType: d.Get("instance_type").(string), - Password: d.Get("password").(string), - DataDiskCategory: ecs.DiskCategory(d.Get("disk_category").(string)), - DataDiskSize: int64(d.Get("disk_size").(int)), - ECSImageID: d.Get("image_id").(string), - IOOptimized: ecs.IoOptimized("true"), + _, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return nil, csClient.ResizeCluster(d.Id(), &cs.ClusterResizeArgs{ + Size: int64(ni), + InstanceType: d.Get("instance_type").(string), + Password: d.Get("password").(string), + DataDiskCategory: ecs.DiskCategory(d.Get("disk_category").(string)), + DataDiskSize: int64(d.Get("disk_size").(int)), + ECSImageID: d.Get("image_id").(string), + IOOptimized: ecs.IoOptimized("true"), + }) }) if err != nil { return fmt.Errorf("Resize Cluster got an error: %#v", err) } - err = conn.WaitForClusterAsyn(d.Id(), cs.Running, 500) + _, err = client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return nil, csClient.WaitForClusterAsyn(d.Id(), cs.Running, 500) + }) if err != nil { return fmt.Errorf("Waitting for container Cluster %#v got an error: %#v", cs.Running, err) @@ -264,7 +274,10 @@ func resourceAlicloudCSSwarmUpdate(d *schema.ResourceData, meta interface{}) err } else { clusterName = resource.PrefixedUniqueId(d.Get("name_prefix").(string)) } - if err := conn.ModifyClusterName(d.Id(), clusterName); err != nil && !IsExceptedError(err, ErrorClusterNameAlreadyExist) { + _, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return nil, csClient.ModifyClusterName(d.Id(), clusterName) + }) + if err != nil && !IsExceptedError(err, ErrorClusterNameAlreadyExist) { return fmt.Errorf("Modify Cluster Name got an error: %#v", err) } d.SetPartial("name") @@ -277,9 +290,13 @@ func resourceAlicloudCSSwarmUpdate(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudCSSwarmRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + csService := CsService{client} + ecsService := EcsService{client} - cluster, err := client.csconn.DescribeCluster(d.Id()) + raw, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.DescribeCluster(d.Id()) + }) if err != nil { if NotFoundError(err) { @@ -288,7 +305,7 @@ func resourceAlicloudCSSwarmRead(d *schema.ResourceData, meta interface{}) error } return err } - + cluster, _ := raw.(cs.ClusterType) d.Set("name", cluster.Name) d.Set("node_number", cluster.Size) d.Set("vpc_id", cluster.VPCID) @@ -297,11 +314,17 @@ func resourceAlicloudCSSwarmRead(d *schema.ResourceData, meta interface{}) error d.Set("slb_id", cluster.ExternalLoadbalancerID) d.Set("agent_version", cluster.AgentVersion) - project, err := client.GetApplicationClientByClusterName(cluster.Name) - resp, err := project.GetSwarmClusterNodes() + pcluster, certs, err := csService.GetContainerClusterAndCertsByName(cluster.Name) if err != nil { return err } + raw, err = client.WithCsProjectClient(pcluster.ClusterID, pcluster.MasterURL, *certs, func(csProjectClient *cs.ProjectClient) (interface{}, error) { + return csProjectClient.GetSwarmClusterNodes() + }) + if err != nil { + return err + } + resp, _ := raw.(cs.GetSwarmClusterNodesResponse) var nodes []map[string]interface{} var oneNode newsdk.Instance @@ -312,7 +335,7 @@ func resourceAlicloudCSSwarmRead(d *schema.ResourceData, meta interface{}) error "private_ip": node.IP, "status": node.Status, } - if inst, err := client.DescribeInstanceById(node.InstanceId); err != nil { + if inst, err := ecsService.DescribeInstanceById(node.InstanceId); err != nil { return fmt.Errorf("[ERROR] QueryInstancesById %s: %#v.", node.InstanceId, err) } else { mapping["eip"] = inst.EipAddress.IpAddress @@ -325,7 +348,7 @@ func resourceAlicloudCSSwarmRead(d *schema.ResourceData, meta interface{}) error d.Set("nodes", nodes) d.Set("instance_type", oneNode.InstanceType) - if disks, err := client.DescribeDisksByType(oneNode.InstanceId, DiskTypeData); err != nil { + if disks, err := ecsService.DescribeDisksByType(oneNode.InstanceId, DiskTypeData); err != nil { return fmt.Errorf("[ERROR] DescribeDisks By Id %s: %#v.", resp[0].InstanceId, err) } else { for _, disk := range disks { @@ -338,10 +361,12 @@ func resourceAlicloudCSSwarmRead(d *schema.ResourceData, meta interface{}) error } func resourceAlicloudCSSwarmDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).csconn + client := meta.(*connectivity.AliyunClient) return resource.Retry(3*time.Minute, func() *resource.RetryError { - err := conn.DeleteCluster(d.Id()) + _, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return nil, csClient.DeleteCluster(d.Id()) + }) if err != nil { if NotFoundError(err) || IsExceptedError(err, ErrorClusterNotFound) { return nil @@ -349,13 +374,16 @@ func resourceAlicloudCSSwarmDelete(d *schema.ResourceData, meta interface{}) err return resource.RetryableError(fmt.Errorf("Deleting container cluster got an error: %#v", err)) } - resp, err := conn.DescribeCluster(d.Id()) + raw, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.DescribeCluster(d.Id()) + }) if err != nil { if NotFoundError(err) || IsExceptedError(err, ErrorClusterNotFound) { return nil } return resource.NonRetryableError(fmt.Errorf("Describe container cluster got an error: %#v", err)) } + resp, _ := raw.(cs.ClusterType) if resp.ClusterID == "" { return nil } diff --git a/alicloud/resource_alicloud_cs_swarm_test.go b/alicloud/resource_alicloud_cs_swarm_test.go index 0db0da199b0..805bb7cb5d6 100644 --- a/alicloud/resource_alicloud_cs_swarm_test.go +++ b/alicloud/resource_alicloud_cs_swarm_test.go @@ -11,6 +11,7 @@ import ( "github.com/denverdino/aliyungo/cs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepCSSwarms(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -35,11 +36,13 @@ func testSweepCSSwarms(region string) error { "testAcc", } - clusters, err := conn.csconn.DescribeClusters("") + raw, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.DescribeClusters("") + }) if err != nil { return fmt.Errorf("Error retrieving CS Swarm Clusters: %s", err) } - + clusters, _ := raw.([]cs.ClusterType) sweeped := false for _, v := range clusters { @@ -58,13 +61,16 @@ func testSweepCSSwarms(region string) error { } sweeped = true log.Printf("[INFO] Deleting CS Swarm Clusters: %s (%s)", name, id) - if err := conn.csconn.DeleteCluster(id); err != nil { + _, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return nil, csClient.DeleteCluster(id) + }) + if err != nil { log.Printf("[ERROR] Failed to delete CS Swarm Clusters (%s (%s)): %s", name, id, err) } } if sweeped { - // Waiting 5 minutes to eusure these swarms have been deleted. - time.Sleep(5 * time.Minute) + // Waiting 2 minutes to eusure these swarms have been deleted. + time.Sleep(2 * time.Minute) } return nil } @@ -173,14 +179,16 @@ func testAccCheckContainerClusterExists(n string, d *cs.ClusterType) resource.Te return fmt.Errorf("No Container cluster ID is set") } - client := testAccProvider.Meta().(*AliyunClient).csconn - attr, err := client.DescribeCluster(cluster.Primary.ID) - log.Printf("[DEBUG] check cluster %s attribute %#v", cluster.Primary.ID, attr) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + raw, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.DescribeCluster(cluster.Primary.ID) + }) + log.Printf("[DEBUG] check cluster %s attribute %#v", cluster.Primary.ID, raw) if err != nil { return err } - + attr, _ := raw.(cs.ClusterType) if attr.ClusterID == "" { return fmt.Errorf("Container cluster not found") } @@ -191,14 +199,16 @@ func testAccCheckContainerClusterExists(n string, d *cs.ClusterType) resource.Te } func testAccCheckSwarmClusterDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient).csconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_cs_swarm" { continue } - cluster, err := client.DescribeCluster(rs.Primary.ID) + raw, err := client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.DescribeCluster(rs.Primary.ID) + }) if err != nil { if NotFoundError(err) || IsExceptedError(err, ErrorClusterNotFound) { @@ -206,7 +216,7 @@ func testAccCheckSwarmClusterDestroy(s *terraform.State) error { } return err } - + cluster, _ := raw.(cs.ClusterType) if cluster.ClusterID != "" { return fmt.Errorf("Error container cluster %s still exists.", rs.Primary.ID) } diff --git a/alicloud/resource_alicloud_datahub_project.go b/alicloud/resource_alicloud_datahub_project.go index 5bcd74bc4f9..b8221995576 100644 --- a/alicloud/resource_alicloud_datahub_project.go +++ b/alicloud/resource_alicloud_datahub_project.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudDatahubProject() *schema.Resource { @@ -53,12 +54,14 @@ func resourceAlicloudDatahubProject() *schema.Resource { } func resourceAliyunDatahubProjectCreate(d *schema.ResourceData, meta interface{}) error { - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) projectName := d.Get("name").(string) projectComment := d.Get("comment").(string) - err := dh.CreateProject(projectName, projectComment) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return nil, dataHubClient.CreateProject(projectName, projectComment) + }) if err != nil { return fmt.Errorf("failed to create project '%s' with error: %s", projectName, err) } @@ -68,16 +71,19 @@ func resourceAliyunDatahubProjectCreate(d *schema.ResourceData, meta interface{} } func resourceAliyunDatahubProjectRead(d *schema.ResourceData, meta interface{}) error { - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) projectName := d.Id() - project, err := dh.GetProject(projectName) + raw, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetProject(projectName) + }) if err != nil { if isDatahubNotExistError(err) { d.SetId("") } return fmt.Errorf("failed to create project '%s' with error: %s", projectName, err) } + project, _ := raw.(*datahub.Project) d.SetId(strings.ToLower(projectName)) @@ -89,12 +95,14 @@ func resourceAliyunDatahubProjectRead(d *schema.ResourceData, meta interface{}) } func resourceAliyunDatahubProjectUpdate(d *schema.ResourceData, meta interface{}) error { - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) if d.HasChange("comment") { projectName := d.Id() projectComment := d.Get("comment").(string) - err := dh.UpdateProject(projectName, projectComment) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return nil, dataHubClient.UpdateProject(projectName, projectComment) + }) if err != nil { return fmt.Errorf("failed to update project '%s' with error: %s", projectName, err) } @@ -104,11 +112,13 @@ func resourceAliyunDatahubProjectUpdate(d *schema.ResourceData, meta interface{} } func resourceAliyunDatahubProjectDelete(d *schema.ResourceData, meta interface{}) error { - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) projectName := d.Id() return resource.Retry(3*time.Minute, func() *resource.RetryError { - _, err := dh.GetProject(projectName) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetProject(projectName) + }) if err != nil { if isDatahubNotExistError(err) { return nil @@ -119,7 +129,9 @@ func resourceAliyunDatahubProjectDelete(d *schema.ResourceData, meta interface{} return resource.NonRetryableError(fmt.Errorf("when deleting project '%s', failed to access it with error: %s", projectName, err)) } - err = dh.DeleteProject(projectName) + _, err = client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return nil, dataHubClient.DeleteProject(projectName) + }) if err == nil || isDatahubNotExistError(err) { return nil } diff --git a/alicloud/resource_alicloud_datahub_project_test.go b/alicloud/resource_alicloud_datahub_project_test.go index c4a415d0e71..1074d26c216 100644 --- a/alicloud/resource_alicloud_datahub_project_test.go +++ b/alicloud/resource_alicloud_datahub_project_test.go @@ -5,8 +5,10 @@ import ( "log" "testing" + "github.com/aliyun/aliyun-datahub-sdk-go/datahub" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -17,17 +19,20 @@ func init() { } func testSweepDatahubProject(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - dh := client.(*AliyunClient).dhconn + client := rawClient.(*connectivity.AliyunClient) // List projects - projects, err := dh.ListProjects() + raw, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.ListProjects() + }) if err != nil { return fmt.Errorf("error listing Datahub projects: %s", err) } + projects, _ := raw.(*datahub.Projects) for _, projectName := range projects.Names { // a testing project? @@ -38,26 +43,34 @@ func testSweepDatahubProject(region string) error { log.Printf("[INFO] Deleting project: %s", projectName) // List topics - topics, err := dh.ListTopics(projectName) + raw, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.ListTopics(projectName) + }) if err != nil { return fmt.Errorf("error listing Datahub topics: %s", err) } + topics, _ := raw.(*datahub.Topics) for _, topicName := range topics.Names { log.Printf("[INFO] Deleting topic: %s/%s", projectName, topicName) // List subscriptions - subscriptions, err := dh.ListSubscriptions(projectName, topicName) + raw, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.ListSubscriptions(projectName, topicName) + }) if err != nil { return fmt.Errorf("error listing Datahub subscriptions: %s", err) } + subscriptions, _ := raw.(*datahub.Subscriptions) for _, subscription := range subscriptions.Subscriptions { log.Printf("[INFO] Deleting subscription: %s/%s/%s", projectName, topicName, subscription.SubId) // Delete subscription - err := dh.DeleteSubscription(projectName, topicName, subscription.SubId) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return nil, dataHubClient.DeleteSubscription(projectName, topicName, subscription.SubId) + }) if err != nil { log.Printf("[ERROR] Failed to delete Datahub subscriptions: %s/%s/%s", projectName, topicName, subscription.SubId) return fmt.Errorf("error deleting Datahub subscriptions: %s/%s/%s", projectName, topicName, subscription.SubId) @@ -65,7 +78,9 @@ func testSweepDatahubProject(region string) error { } // Delete topic - err = dh.DeleteTopic(projectName, topicName) + _, err = client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return nil, dataHubClient.DeleteTopic(projectName, topicName) + }) if err != nil { log.Printf("[ERROR] Failed to delete Datahub topic: %s/%s", projectName, topicName) return fmt.Errorf("[ERROR] Failed to delete Datahub topic: %s/%s", projectName, topicName) @@ -73,7 +88,9 @@ func testSweepDatahubProject(region string) error { } // Delete project - err = dh.DeleteProject(projectName) + _, err = client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return nil, dataHubClient.DeleteProject(projectName) + }) if err != nil { log.Printf("[ERROR] Failed to delete Datahub project: %s", projectName) return fmt.Errorf("[ERROR] Failed to delete Datahub project: %s", projectName) @@ -156,8 +173,10 @@ func testAccCheckDatahubProjectExist(n string) resource.TestCheckFunc { return fmt.Errorf("no Datahub project ID is set") } - dh := testAccProvider.Meta().(*AliyunClient).dhconn - _, err := dh.GetProject(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetProject(rs.Primary.ID) + }) if err != nil { return err @@ -172,8 +191,10 @@ func testAccCheckDatahubProjectDestroy(s *terraform.State) error { continue } - dh := testAccProvider.Meta().(*AliyunClient).dhconn - _, err := dh.GetProject(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetProject(rs.Primary.ID) + }) if err != nil && isDatahubNotExistError(err) { continue diff --git a/alicloud/resource_alicloud_datahub_subscription.go b/alicloud/resource_alicloud_datahub_subscription.go index 00af3a349be..ce8590badcb 100644 --- a/alicloud/resource_alicloud_datahub_subscription.go +++ b/alicloud/resource_alicloud_datahub_subscription.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudDatahubSubscription() *schema.Resource { @@ -66,16 +67,19 @@ func resourceAlicloudDatahubSubscription() *schema.Resource { } func resourceAliyunDatahubSubscriptionCreate(d *schema.ResourceData, meta interface{}) error { - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) projectName := d.Get("project_name").(string) topicName := d.Get("topic_name").(string) subComment := d.Get("comment").(string) - subId, err := dh.CreateSubscription(projectName, topicName, subComment) + raw, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.CreateSubscription(projectName, topicName, subComment) + }) if err != nil { return fmt.Errorf("failed to create subscription under '%s/%s' with error: %s", projectName, topicName, err) } + subId, _ := raw.(string) d.SetId(fmt.Sprintf("%s%s%s%s%s", strings.ToLower(projectName), COLON_SEPARATED, strings.ToLower(topicName), COLON_SEPARATED, subId)) return resourceAliyunDatahubSubscriptionRead(d, meta) @@ -100,15 +104,18 @@ func resourceAliyunDatahubSubscriptionRead(d *schema.ResourceData, meta interfac return err } - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) + raw, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetSubscription(projectName, topicName, subId) + }) - sub, err := dh.GetSubscription(projectName, topicName, subId) if err != nil { if isDatahubNotExistError(err) { d.SetId("") } return fmt.Errorf("failed to get subscription %s with error: %s", subId, err) } + sub, _ := raw.(*datahub.Subscription) d.SetId(fmt.Sprintf("%s%s%s%s%s", strings.ToLower(projectName), COLON_SEPARATED, strings.ToLower(sub.TopicName), COLON_SEPARATED, sub.SubId)) @@ -127,12 +134,14 @@ func resourceAliyunDatahubSubscriptionUpdate(d *schema.ResourceData, meta interf return err } - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) if d.HasChange("comment") { subComment := d.Get("comment").(string) - err := dh.UpdateSubscription(projectName, topicName, subId, subComment) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return nil, dataHubClient.UpdateSubscription(projectName, topicName, subId, subComment) + }) if err != nil { return fmt.Errorf("failed to update subscription %s's comment with error: %s", subId, err) } @@ -147,10 +156,12 @@ func resourceAliyunDatahubSubscriptionDelete(d *schema.ResourceData, meta interf return err } - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) return resource.Retry(3*time.Minute, func() *resource.RetryError { - _, err := dh.GetSubscription(projectName, topicName, subId) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetSubscription(projectName, topicName, subId) + }) if err != nil { if isDatahubNotExistError(err) { return nil @@ -161,7 +172,9 @@ func resourceAliyunDatahubSubscriptionDelete(d *schema.ResourceData, meta interf return resource.NonRetryableError(fmt.Errorf("while deleting subscription '%s', failed to get it with error: %s", subId, err)) } - err = dh.DeleteSubscription(projectName, topicName, subId) + _, err = client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return nil, dataHubClient.DeleteSubscription(projectName, topicName, subId) + }) if err == nil || isDatahubNotExistError(err) { return nil } diff --git a/alicloud/resource_alicloud_datahub_subscription_test.go b/alicloud/resource_alicloud_datahub_subscription_test.go index 4385c5252c1..19cac5becdf 100644 --- a/alicloud/resource_alicloud_datahub_subscription_test.go +++ b/alicloud/resource_alicloud_datahub_subscription_test.go @@ -5,8 +5,10 @@ import ( "strings" "testing" + "github.com/aliyun/aliyun-datahub-sdk-go/datahub" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudDatahubSubscription_Basic(t *testing.T) { @@ -96,13 +98,15 @@ func testAccCheckDatahubSubscriptionExist(n string) resource.TestCheckFunc { return fmt.Errorf("no Datahub Subscription ID is set") } - dh := testAccProvider.Meta().(*AliyunClient).dhconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) split := strings.Split(rs.Primary.ID, COLON_SEPARATED) projectName := split[0] topicName := split[1] subId := split[2] - _, err := dh.GetSubscription(projectName, topicName, subId) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetSubscription(projectName, topicName, subId) + }) if err == nil || isDatahubNotExistError(err) { return nil @@ -117,13 +121,15 @@ func testAccCheckDatahubSubscriptionDestroy(s *terraform.State) error { continue } - dh := testAccProvider.Meta().(*AliyunClient).dhconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) split := strings.Split(rs.Primary.ID, COLON_SEPARATED) projectName := split[0] topicName := split[1] subId := split[2] - _, err := dh.GetSubscription(projectName, topicName, subId) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetSubscription(projectName, topicName, subId) + }) if err != nil && isDatahubNotExistError(err) { continue diff --git a/alicloud/resource_alicloud_datahub_topic.go b/alicloud/resource_alicloud_datahub_topic.go index a06f7dac189..0e45b004d94 100644 --- a/alicloud/resource_alicloud_datahub_topic.go +++ b/alicloud/resource_alicloud_datahub_topic.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudDatahubTopic() *schema.Resource { @@ -88,7 +89,7 @@ func resourceAlicloudDatahubTopic() *schema.Resource { } func resourceAliyunDatahubTopicCreate(d *schema.ResourceData, meta interface{}) error { - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) t := &datahub.Topic{ ProjectName: d.Get("project_name").(string), @@ -111,7 +112,9 @@ func resourceAliyunDatahubTopicCreate(d *schema.ResourceData, meta interface{}) t.RecordType = datahub.BLOB } - err := dh.CreateTopic(t) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return nil, dataHubClient.CreateTopic(t) + }) if err != nil { return fmt.Errorf("failed to create topic'%s/%s' with error: %s", t.ProjectName, t.TopicName, err) } @@ -138,15 +141,18 @@ func resourceAliyunDatahubTopicRead(d *schema.ResourceData, meta interface{}) er return err } - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) - topic, err := dh.GetTopic(projectName, topicName) + raw, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetTopic(projectName, topicName) + }) if err != nil { if isDatahubNotExistError(err) { d.SetId("") } return fmt.Errorf("failed to access topic '%s/%s' with error: %s", projectName, topicName, err) } + topic, _ := raw.(*datahub.Topic) d.SetId(strings.ToLower(fmt.Sprintf("%s%s%s", topic.ProjectName, COLON_SEPARATED, topic.TopicName))) @@ -168,13 +174,15 @@ func resourceAliyunDatahubTopicUpdate(d *schema.ResourceData, meta interface{}) return err } - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) if d.HasChange("life_cycle") || d.HasChange("comment") { lifeCycle := d.Get("life_cycle").(int) topicComment := d.Get("comment").(string) - err = dh.UpdateTopic(projectName, topicName, lifeCycle, topicComment) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return nil, dataHubClient.UpdateTopic(projectName, topicName, lifeCycle, topicComment) + }) if err != nil { return fmt.Errorf("failed to update topic '%s/%s' with error: %s", projectName, topicName, err) } @@ -189,10 +197,12 @@ func resourceAliyunDatahubTopicDelete(d *schema.ResourceData, meta interface{}) return err } - dh := meta.(*AliyunClient).dhconn + client := meta.(*connectivity.AliyunClient) return resource.Retry(3*time.Minute, func() *resource.RetryError { - _, err := dh.GetTopic(projectName, topicName) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetTopic(projectName, topicName) + }) if err != nil { if isDatahubNotExistError(err) { @@ -204,7 +214,9 @@ func resourceAliyunDatahubTopicDelete(d *schema.ResourceData, meta interface{}) return resource.NonRetryableError(fmt.Errorf("while deleting '%s/%s', failed to access it with error: %s", projectName, topicName, err)) } - err = dh.DeleteTopic(projectName, topicName) + _, err = client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return nil, dataHubClient.DeleteTopic(projectName, topicName) + }) if err == nil || isDatahubNotExistError(err) { return nil } diff --git a/alicloud/resource_alicloud_datahub_topic_test.go b/alicloud/resource_alicloud_datahub_topic_test.go index a728f56fd09..55e29a3895a 100644 --- a/alicloud/resource_alicloud_datahub_topic_test.go +++ b/alicloud/resource_alicloud_datahub_topic_test.go @@ -5,8 +5,10 @@ import ( "strings" "testing" + "github.com/aliyun/aliyun-datahub-sdk-go/datahub" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudDatahubTopic_Basic(t *testing.T) { @@ -115,12 +117,14 @@ func testAccCheckDatahubTopicExist(n string) resource.TestCheckFunc { return fmt.Errorf("no Datahub topic ID is set") } - dh := testAccProvider.Meta().(*AliyunClient).dhconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) split := strings.Split(rs.Primary.ID, COLON_SEPARATED) projectName := split[0] topicName := split[1] - _, err := dh.GetTopic(projectName, topicName) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetTopic(projectName, topicName) + }) if err != nil { return err @@ -135,12 +139,14 @@ func testAccCheckDatahubTopicDestroy(s *terraform.State) error { continue } - dh := testAccProvider.Meta().(*AliyunClient).dhconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) split := strings.Split(rs.Primary.ID, COLON_SEPARATED) projectName := split[0] topicName := split[1] - _, err := dh.GetTopic(projectName, topicName) + _, err := client.WithDataHubClient(func(dataHubClient *datahub.DataHub) (interface{}, error) { + return dataHubClient.GetTopic(projectName, topicName) + }) if err != nil && isDatahubNotExistError(err) { continue diff --git a/alicloud/resource_alicloud_db_account.go b/alicloud/resource_alicloud_db_account.go index 9c7eb81d85b..56d8ed2a72c 100644 --- a/alicloud/resource_alicloud_db_account.go +++ b/alicloud/resource_alicloud_db_account.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudDBAccount() *schema.Resource { @@ -55,7 +56,8 @@ func resourceAlicloudDBAccount() *schema.Resource { } func resourceAlicloudDBAccountCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} request := rds.CreateCreateAccountRequest() request.DBInstanceId = d.Get("instance_id").(string) request.AccountName = d.Get("name").(string) @@ -66,12 +68,15 @@ func resourceAlicloudDBAccountCreate(d *schema.ResourceData, meta interface{}) e request.AccountDescription = v.(string) } // wait instance running before modifying - if err := client.WaitForDBInstance(request.DBInstanceId, Running, 500); err != nil { + if err := rdsService.WaitForDBInstance(request.DBInstanceId, Running, 500); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } err := resource.Retry(5*time.Minute, func() *resource.RetryError { args := request - if _, err := client.rdsconn.CreateAccount(args); err != nil { + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.CreateAccount(args) + }) + if err != nil { if IsExceptedError(err, InvalidAccountNameDuplicate) { return resource.NonRetryableError(fmt.Errorf("The account %s has already existed. Please import it using ID '%s:%s' or specify a new 'name' and try again.", args.AccountName, args.DBInstanceId, args.AccountName)) @@ -90,7 +95,7 @@ func resourceAlicloudDBAccountCreate(d *schema.ResourceData, meta interface{}) e d.SetId(fmt.Sprintf("%s%s%s", request.DBInstanceId, COLON_SEPARATED, request.AccountName)) - if err := client.WaitForAccount(request.DBInstanceId, request.AccountName, Available, 500); err != nil { + if err := rdsService.WaitForAccount(request.DBInstanceId, request.AccountName, Available, 500); err != nil { return fmt.Errorf("Wait db account %s got an error: %#v.", Available, err) } @@ -98,11 +103,12 @@ func resourceAlicloudDBAccountCreate(d *schema.ResourceData, meta interface{}) e } func resourceAlicloudDBAccountRead(d *schema.ResourceData, meta interface{}) error { - + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} parts := strings.Split(d.Id(), COLON_SEPARATED) - account, err := meta.(*AliyunClient).DescribeDatabaseAccount(parts[0], parts[1]) + account, err := rdsService.DescribeDatabaseAccount(parts[0], parts[1]) if err != nil { - if NotFoundDBInstance(err) { + if rdsService.NotFoundDBInstance(err) { d.SetId("") return nil } @@ -118,7 +124,7 @@ func resourceAlicloudDBAccountRead(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudDBAccountUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) d.Partial(true) parts := strings.Split(d.Id(), COLON_SEPARATED) instanceId := parts[0] @@ -131,7 +137,10 @@ func resourceAlicloudDBAccountUpdate(d *schema.ResourceData, meta interface{}) e request.AccountName = accountName request.AccountDescription = d.Get("description").(string) - if _, err := meta.(*AliyunClient).rdsconn.ModifyAccountDescription(request); err != nil { + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.ModifyAccountDescription(request) + }) + if err != nil { return fmt.Errorf("ModifyAccountDescription got an error: %#v", err) } d.SetPartial("description") @@ -144,7 +153,10 @@ func resourceAlicloudDBAccountUpdate(d *schema.ResourceData, meta interface{}) e request.AccountName = accountName request.AccountPassword = d.Get("password").(string) - if _, err := client.rdsconn.ResetAccountPassword(request); err != nil { + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.ResetAccountPassword(request) + }) + if err != nil { return fmt.Errorf("Error reset db account password error: %#v", err) } d.SetPartial("password") @@ -155,6 +167,8 @@ func resourceAlicloudDBAccountUpdate(d *schema.ResourceData, meta interface{}) e } func resourceAlicloudDBAccountDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} parts := strings.Split(d.Id(), COLON_SEPARATED) request := rds.CreateDeleteAccountRequest() @@ -162,16 +176,19 @@ func resourceAlicloudDBAccountDelete(d *schema.ResourceData, meta interface{}) e request.AccountName = parts[1] return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := meta.(*AliyunClient).rdsconn.DeleteAccount(request); err != nil { + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DeleteAccount(request) + }) + if err != nil { if IsExceptedError(err, InvalidAccountNameNotFound) { return nil } return resource.RetryableError(fmt.Errorf("Delete database account got an error: %#v.", err)) } - resp, err := meta.(*AliyunClient).DescribeDatabaseAccount(parts[0], parts[1]) + resp, err := rdsService.DescribeDatabaseAccount(parts[0], parts[1]) if err != nil { - if NotFoundDBInstance(err) { + if rdsService.NotFoundDBInstance(err) { return nil } return resource.NonRetryableError(err) diff --git a/alicloud/resource_alicloud_db_account_privilege.go b/alicloud/resource_alicloud_db_account_privilege.go index 09284d5aa7e..a20cf011b00 100644 --- a/alicloud/resource_alicloud_db_account_privilege.go +++ b/alicloud/resource_alicloud_db_account_privilege.go @@ -7,6 +7,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudDBAccountPrivilege() *schema.Resource { @@ -51,18 +52,20 @@ func resourceAlicloudDBAccountPrivilege() *schema.Resource { } func resourceAlicloudDBAccountPrivilegeCreate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + rsdService := RdsService{client} instanceId := d.Get("instance_id").(string) account := d.Get("account_name").(string) privilege := d.Get("privilege").(string) dbList := d.Get("db_names").(*schema.Set).List() // wait instance running before granting - if err := meta.(*AliyunClient).WaitForDBInstance(instanceId, Running, 1800); err != nil { + if err := rsdService.WaitForDBInstance(instanceId, Running, 1800); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } if len(dbList) > 0 { for _, db := range dbList { if err := resource.Retry(10*time.Minute, func() *resource.RetryError { - if e := meta.(*AliyunClient).GrantAccountPrivilege(instanceId, account, db.(string), privilege); e != nil { + if e := rsdService.GrantAccountPrivilege(instanceId, account, db.(string), privilege); e != nil { if IsExceptedErrors(e, OperationDeniedDBStatus) { return resource.RetryableError(fmt.Errorf("Grant Account %s Privilege %s fot DB %s timeout and got an error: %#v", account, privilege, db.(string), e)) } @@ -81,11 +84,12 @@ func resourceAlicloudDBAccountPrivilegeCreate(d *schema.ResourceData, meta inter } func resourceAlicloudDBAccountPrivilegeRead(d *schema.ResourceData, meta interface{}) error { - + client := meta.(*connectivity.AliyunClient) + rsdService := RdsService{client} parts := strings.Split(d.Id(), COLON_SEPARATED) - account, err := meta.(*AliyunClient).DescribeDatabaseAccount(parts[0], parts[1]) + account, err := rsdService.DescribeDatabaseAccount(parts[0], parts[1]) if err != nil { - if NotFoundDBInstance(err) { + if rsdService.NotFoundDBInstance(err) { d.SetId("") return nil } @@ -107,7 +111,8 @@ func resourceAlicloudDBAccountPrivilegeRead(d *schema.ResourceData, meta interfa } func resourceAlicloudDBAccountPrivilegeUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + rsdService := RdsService{client} d.Partial(true) if d.HasChange("db_names") && !d.IsNewResource() { @@ -121,11 +126,11 @@ func resourceAlicloudDBAccountPrivilegeUpdate(d *schema.ResourceData, meta inter if len(remove) > 0 { // wait instance running before revoking - if err := client.WaitForDBInstance(parts[0], Running, 500); err != nil { + if err := rsdService.WaitForDBInstance(parts[0], Running, 500); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } for _, db := range remove { - if err := client.RevokeAccountPrivilege(parts[0], parts[1], db.(string)); err != nil { + if err := rsdService.RevokeAccountPrivilege(parts[0], parts[1], db.(string)); err != nil { return err } } @@ -133,11 +138,11 @@ func resourceAlicloudDBAccountPrivilegeUpdate(d *schema.ResourceData, meta inter if len(add) > 0 { // wait instance running before granting - if err := client.WaitForDBInstance(parts[0], Running, 500); err != nil { + if err := rsdService.WaitForDBInstance(parts[0], Running, 500); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } for _, db := range add { - if err := client.GrantAccountPrivilege(parts[0], parts[1], db.(string), parts[2]); err != nil { + if err := rsdService.GrantAccountPrivilege(parts[0], parts[1], db.(string), parts[2]); err != nil { return err } } @@ -150,12 +155,13 @@ func resourceAlicloudDBAccountPrivilegeUpdate(d *schema.ResourceData, meta inter } func resourceAlicloudDBAccountPrivilegeDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + rsdService := RdsService{client} parts := strings.Split(d.Id(), COLON_SEPARATED) - account, err := client.DescribeDatabaseAccount(parts[0], parts[1]) + account, err := rsdService.DescribeDatabaseAccount(parts[0], parts[1]) if err != nil { - if NotFoundDBInstance(err) { + if rsdService.NotFoundDBInstance(err) { return nil } return fmt.Errorf("Describe db account got an error: %#v", err) @@ -165,15 +171,15 @@ func resourceAlicloudDBAccountPrivilegeDelete(d *schema.ResourceData, meta inter if len(account.DatabasePrivileges.DatabasePrivilege) > 0 { for _, pri := range account.DatabasePrivileges.DatabasePrivilege { if pri.AccountPrivilege == parts[2] { - if err := client.RevokeAccountPrivilege(parts[0], parts[1], pri.DBName); err != nil { + if err := rsdService.RevokeAccountPrivilege(parts[0], parts[1], pri.DBName); err != nil { return resource.NonRetryableError(fmt.Errorf("Revoke DB %s account %s privilege got an error: %#v.", pri.DBName, account, err)) } } } } - account, err := client.DescribeDatabaseAccount(parts[0], parts[1]) + account, err := rsdService.DescribeDatabaseAccount(parts[0], parts[1]) if err != nil { - if NotFoundDBInstance(err) { + if rsdService.NotFoundDBInstance(err) { return nil } return resource.NonRetryableError(fmt.Errorf("Describe db account got an error: %#v", err)) diff --git a/alicloud/resource_alicloud_db_account_privilege_test.go b/alicloud/resource_alicloud_db_account_privilege_test.go index 7346c37f1cd..dd6f950a599 100644 --- a/alicloud/resource_alicloud_db_account_privilege_test.go +++ b/alicloud/resource_alicloud_db_account_privilege_test.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudDBAccountPrivilege_basic(t *testing.T) { @@ -50,9 +51,10 @@ func testAccCheckDBAccountPrivilegeExists(n string, d *rds.DBInstanceAccount) re return fmt.Errorf("No DB account ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rsdService := RdsService{client} parts := strings.Split(rs.Primary.ID, COLON_SEPARATED) - account, err := client.DescribeDatabaseAccount(parts[0], parts[1]) + account, err := rsdService.DescribeDatabaseAccount(parts[0], parts[1]) if err != nil { return err @@ -68,7 +70,8 @@ func testAccCheckDBAccountPrivilegeExists(n string, d *rds.DBInstanceAccount) re } func testAccCheckDBAccountPrivilegeDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rsdService := RdsService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_db_account_privilege" { @@ -77,7 +80,7 @@ func testAccCheckDBAccountPrivilegeDestroy(s *terraform.State) error { parts := strings.Split(rs.Primary.ID, COLON_SEPARATED) - account, err := client.DescribeDatabaseAccount(parts[0], parts[1]) + account, err := rsdService.DescribeDatabaseAccount(parts[0], parts[1]) // Verify the error is what we want if err != nil { diff --git a/alicloud/resource_alicloud_db_account_test.go b/alicloud/resource_alicloud_db_account_test.go index 2ad7a3e2667..7ec5fe629ca 100644 --- a/alicloud/resource_alicloud_db_account_test.go +++ b/alicloud/resource_alicloud_db_account_test.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudDBAccount_basic(t *testing.T) { @@ -48,9 +49,10 @@ func testAccCheckDBAccountExists(n string, d *rds.DBInstanceAccount) resource.Te return fmt.Errorf("No DB account ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rdsService := RdsService{client} parts := strings.Split(rs.Primary.ID, COLON_SEPARATED) - account, err := client.DescribeDatabaseAccount(parts[0], parts[1]) + account, err := rdsService.DescribeDatabaseAccount(parts[0], parts[1]) if err != nil { return err @@ -66,7 +68,8 @@ func testAccCheckDBAccountExists(n string, d *rds.DBInstanceAccount) resource.Te } func testAccCheckDBAccountDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rdsService := RdsService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_db_account" { @@ -75,7 +78,7 @@ func testAccCheckDBAccountDestroy(s *terraform.State) error { parts := strings.Split(rs.Primary.ID, COLON_SEPARATED) - account, err := client.DescribeDatabaseAccount(parts[0], parts[1]) + account, err := rdsService.DescribeDatabaseAccount(parts[0], parts[1]) // Verify the error is what we want if err != nil { diff --git a/alicloud/resource_alicloud_db_backup_policy.go b/alicloud/resource_alicloud_db_backup_policy.go index eb34a46abdf..f1eaed72b3a 100644 --- a/alicloud/resource_alicloud_db_backup_policy.go +++ b/alicloud/resource_alicloud_db_backup_policy.go @@ -8,6 +8,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudDBBackupPolicy() *schema.Resource { @@ -75,10 +76,11 @@ func resourceAlicloudDBBackupPolicyCreate(d *schema.ResourceData, meta interface } func resourceAlicloudDBBackupPolicyRead(d *schema.ResourceData, meta interface{}) error { - - resp, err := meta.(*AliyunClient).DescribeBackupPolicy(d.Id()) + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} + resp, err := rdsService.DescribeBackupPolicy(d.Id()) if err != nil { - if NotFoundDBInstance(err) { + if rdsService.NotFoundDBInstance(err) { d.SetId("") return nil } @@ -98,7 +100,8 @@ func resourceAlicloudDBBackupPolicyRead(d *schema.ResourceData, meta interface{} func resourceAlicloudDBBackupPolicyUpdate(d *schema.ResourceData, meta interface{}) error { d.Partial(true) - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} update := false periodList := expandStringList(d.Get("backup_period").(*schema.Set).List()) @@ -141,11 +144,11 @@ func resourceAlicloudDBBackupPolicyUpdate(d *schema.ResourceData, meta interface if update { // wait instance running before modifying - if err := client.WaitForDBInstance(d.Id(), Running, 500); err != nil { + if err := rdsService.WaitForDBInstance(d.Id(), Running, 500); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } if err := resource.Retry(5*time.Minute, func() *resource.RetryError { - if err := client.ModifyDBBackupPolicy(d.Id(), backupTime, backupPeriod, retentionPeriod, backupLog, logBackupRetentionPeriod); err != nil { + if err := rdsService.ModifyDBBackupPolicy(d.Id(), backupTime, backupPeriod, retentionPeriod, backupLog, logBackupRetentionPeriod); err != nil { if IsExceptedErrors(err, OperationDeniedDBStatus) { return resource.RetryableError(fmt.Errorf("ModifyBackupPolicy got an error: %#v.", err)) } @@ -163,7 +166,8 @@ func resourceAlicloudDBBackupPolicyUpdate(d *schema.ResourceData, meta interface } func resourceAlicloudDBBackupPolicyDelete(d *schema.ResourceData, meta interface{}) error { - + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} backupTime := "02:00Z-03:00Z" backupPeriod := "Tuesday,Thursday,Saturday" retentionPeriod := "7" @@ -171,7 +175,7 @@ func resourceAlicloudDBBackupPolicyDelete(d *schema.ResourceData, meta interface logBackupRetentionPeriod := "7" return resource.Retry(5*time.Minute, func() *resource.RetryError { - if err := meta.(*AliyunClient).ModifyDBBackupPolicy(d.Id(), backupTime, backupPeriod, retentionPeriod, backupLog, logBackupRetentionPeriod); err != nil { + if err := rdsService.ModifyDBBackupPolicy(d.Id(), backupTime, backupPeriod, retentionPeriod, backupLog, logBackupRetentionPeriod); err != nil { return resource.RetryableError(fmt.Errorf("ModifyBackupPolicy got an error: %#v", err)) } diff --git a/alicloud/resource_alicloud_db_backup_policy_test.go b/alicloud/resource_alicloud_db_backup_policy_test.go index aac2718d297..6b3c2eff3c0 100644 --- a/alicloud/resource_alicloud_db_backup_policy_test.go +++ b/alicloud/resource_alicloud_db_backup_policy_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudDBBackupPolicy_basic(t *testing.T) { @@ -47,8 +48,9 @@ func testAccCheckDBBackupPolicyExists(n string, d *rds.DescribeBackupPolicyRespo if rs.Primary.ID == "" { return fmt.Errorf("No DB account ID is set") } - - resp, err := testAccProvider.Meta().(*AliyunClient).DescribeBackupPolicy(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rdsService := RdsService{client} + resp, err := rdsService.DescribeBackupPolicy(rs.Primary.ID) if err != nil { return fmt.Errorf("Error Describe DB backup policy: %#v", err) @@ -64,15 +66,17 @@ func testAccCheckDBBackupPolicyExists(n string, d *rds.DescribeBackupPolicyRespo } func testAccCheckDBBackupPolicyDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_db_account" { continue } - _, err := client.rdsconn.DescribeBackupPolicy(&rds.DescribeBackupPolicyRequest{ - DBInstanceId: rs.Primary.ID, + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DescribeBackupPolicy(&rds.DescribeBackupPolicyRequest{ + DBInstanceId: rs.Primary.ID, + }) }) if err != nil { if IsExceptedError(err, InvalidDBInstanceIdNotFound) || IsExceptedError(err, InvalidDBInstanceNameNotFound) { diff --git a/alicloud/resource_alicloud_db_connection.go b/alicloud/resource_alicloud_db_connection.go index 6d0b8871f9d..9fd216ffb08 100644 --- a/alicloud/resource_alicloud_db_connection.go +++ b/alicloud/resource_alicloud_db_connection.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) const dbConnectionSuffixRegex = "\\.mysql\\.([a-zA-Z0-9\\-]+\\.){0,1}rds\\.aliyuncs\\.com" @@ -59,14 +60,15 @@ func resourceAlicloudDBConnection() *schema.Resource { } func resourceAlicloudDBConnectionCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} instance_id := d.Get("instance_id").(string) prefix, ok := d.GetOk("connection_prefix") if !ok || prefix.(string) == "" { prefix = fmt.Sprintf("%stf", instance_id) } - if err := client.AllocateDBPublicConnection(instance_id, prefix.(string), d.Get("port").(string)); err != nil { + if err := rdsService.AllocateDBPublicConnection(instance_id, prefix.(string), d.Get("port").(string)); err != nil { return fmt.Errorf("AllocateInstancePublicConnection got an error: %#v", err) } @@ -83,10 +85,12 @@ func resourceAlicloudDBConnectionRead(d *schema.ResourceData, meta interface{}) parts := strings.Split(d.Id(), COLON_SEPARATED) - conn, err := meta.(*AliyunClient).DescribeDBInstanceNetInfoByIpType(parts[0], Public) + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} + conn, err := rdsService.DescribeDBInstanceNetInfoByIpType(parts[0], Public) if err != nil { - if NotFoundDBInstance(err) { + if rdsService.NotFoundDBInstance(err) { d.SetId("") return nil } @@ -103,7 +107,8 @@ func resourceAlicloudDBConnectionRead(d *schema.ResourceData, meta interface{}) } func resourceAlicloudDBConnectionUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} d.Partial(true) submatch := dbConnectionIdWithSuffixRegexp.FindStringSubmatch(d.Id()) @@ -125,12 +130,15 @@ func resourceAlicloudDBConnectionUpdate(d *schema.ResourceData, meta interface{} request.Port = d.Get("port").(string) // wait instance running before modifying - if err := client.WaitForDBInstance(request.DBInstanceId, Running, 500); err != nil { + if err := rdsService.WaitForDBInstance(request.DBInstanceId, Running, 500); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } if err := resource.Retry(3*time.Minute, func() *resource.RetryError { - if _, err := client.rdsconn.ModifyDBInstanceConnectionString(request); err != nil { + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.ModifyDBInstanceConnectionString(request) + }) + if err != nil { if IsExceptedErrors(err, OperationDeniedDBStatus) { return resource.RetryableError(fmt.Errorf("Modify DBInstance Connection Port got an error: %#v.", err)) } @@ -142,7 +150,7 @@ func resourceAlicloudDBConnectionUpdate(d *schema.ResourceData, meta interface{} } // wait instance running after modifying - if err := client.WaitForDBInstance(request.DBInstanceId, Running, 500); err != nil { + if err := rdsService.WaitForDBInstance(request.DBInstanceId, Running, 500); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } @@ -155,7 +163,8 @@ func resourceAlicloudDBConnectionUpdate(d *schema.ResourceData, meta interface{} } func resourceAlicloudDBConnectionDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} submatch := dbConnectionIdWithSuffixRegexp.FindStringSubmatch(d.Id()) if len(submatch) > 1 { @@ -169,7 +178,7 @@ func resourceAlicloudDBConnectionDelete(d *schema.ResourceData, meta interface{} if err != nil { return resource.NonRetryableError(fmt.Errorf("getCurrentConnectionString got error: %#v", err)) } - err = client.ReleaseDBPublicConnection(parts[0], connectionString) + err = rdsService.ReleaseDBPublicConnection(parts[0], connectionString) if err != nil { if IsExceptedError(err, InvalidCurrentConnectionStringNotFound) || IsExceptedError(err, AtLeastOneNetTypeExists) { @@ -177,10 +186,10 @@ func resourceAlicloudDBConnectionDelete(d *schema.ResourceData, meta interface{} } return resource.RetryableError(fmt.Errorf("Release DB connection timeout and got an error: %#v.", err)) } - conn, err := meta.(*AliyunClient).DescribeDBInstanceNetInfoByIpType(parts[0], Public) + conn, err := rdsService.DescribeDBInstanceNetInfoByIpType(parts[0], Public) if err != nil { - if NotFoundDBInstance(err) || IsExceptedError(err, InvalidCurrentConnectionStringNotFound) { + if rdsService.NotFoundDBInstance(err) || IsExceptedError(err, InvalidCurrentConnectionStringNotFound) { return nil } return resource.NonRetryableError(fmt.Errorf("Release DB connection got an error: %#v.", err)) @@ -196,7 +205,10 @@ func resourceAlicloudDBConnectionDelete(d *schema.ResourceData, meta interface{} } func getCurrentConnectionString(dbInstanceId string, meta interface{}) (string, error) { - resp, err := meta.(*AliyunClient).DescribeDBInstanceNetInfoByIpType(dbInstanceId, Public) + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} + + resp, err := rdsService.DescribeDBInstanceNetInfoByIpType(dbInstanceId, Public) if err != nil { return "", err } diff --git a/alicloud/resource_alicloud_db_connection_test.go b/alicloud/resource_alicloud_db_connection_test.go index 8bff6e62b47..7075e1991e5 100644 --- a/alicloud/resource_alicloud_db_connection_test.go +++ b/alicloud/resource_alicloud_db_connection_test.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudDBConnection_basic(t *testing.T) { @@ -72,9 +73,10 @@ func testAccCheckDBConnectionExists(n string, d *rds.DBInstanceNetInfo) resource return fmt.Errorf("No DB connection ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rdsService := RdsService{client} parts := strings.Split(rs.Primary.ID, COLON_SEPARATED) - conn, err := client.DescribeDBInstanceNetInfoByIpType(parts[0], Public) + conn, err := rdsService.DescribeDBInstanceNetInfoByIpType(parts[0], Public) if err != nil { return err @@ -90,7 +92,8 @@ func testAccCheckDBConnectionExists(n string, d *rds.DBInstanceNetInfo) resource } func testAccCheckDBConnectionDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rdsService := RdsService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_db_connection" { @@ -99,7 +102,7 @@ func testAccCheckDBConnectionDestroy(s *terraform.State) error { parts := strings.Split(rs.Primary.ID, COLON_SEPARATED) - conn, err := client.DescribeDBInstanceNetInfoByIpType(parts[0], Public) + conn, err := rdsService.DescribeDBInstanceNetInfoByIpType(parts[0], Public) if err != nil { if NotFoundError(err) || IsExceptedError(err, InvalidDBInstanceIdNotFound) || IsExceptedError(err, InvalidCurrentConnectionStringNotFound) { diff --git a/alicloud/resource_alicloud_db_database.go b/alicloud/resource_alicloud_db_database.go index 4666ee2ebdb..8b802b0f5e5 100644 --- a/alicloud/resource_alicloud_db_database.go +++ b/alicloud/resource_alicloud_db_database.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudDBDatabase() *schema.Resource { @@ -51,7 +52,8 @@ func resourceAlicloudDBDatabase() *schema.Resource { func resourceAlicloudDBDatabaseCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + rsdService := RdsService{client} request := rds.CreateCreateDatabaseRequest() request.DBInstanceId = d.Get("instance_id").(string) request.DBName = d.Get("name").(string) @@ -61,7 +63,7 @@ func resourceAlicloudDBDatabaseCreate(d *schema.ResourceData, meta interface{}) request.DBDescription = v.(string) } - if inst, err := client.DescribeDBInstanceById(request.DBInstanceId); err != nil { + if inst, err := rsdService.DescribeDBInstanceById(request.DBInstanceId); err != nil { return fmt.Errorf("DescribeDBInstance got an error: %#v", err) } else if inst.Engine == string(PostgreSQL) || inst.Engine == string(PPAS) { return fmt.Errorf("At present, it does not support creating 'PostgreSQL' and 'PPAS' database. Please login DB instance to create.") @@ -69,7 +71,10 @@ func resourceAlicloudDBDatabaseCreate(d *schema.ResourceData, meta interface{}) err := resource.Retry(5*time.Minute, func() *resource.RetryError { ag := request - if _, err := client.rdsconn.CreateDatabase(ag); err != nil { + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.CreateDatabase(ag) + }) + if err != nil { if IsExceptedErrors(err, OperationDeniedDBStatus) { return resource.RetryableError(fmt.Errorf("Create database got an error: %#v.", err)) } @@ -89,8 +94,10 @@ func resourceAlicloudDBDatabaseCreate(d *schema.ResourceData, meta interface{}) } func resourceAlicloudDBDatabaseRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + rsdService := RdsService{client} parts := strings.Split(d.Id(), COLON_SEPARATED) - db, err := meta.(*AliyunClient).DescribeDatabaseByName(parts[0], parts[1]) + db, err := rsdService.DescribeDatabaseByName(parts[0], parts[1]) if err != nil { if NotFoundError(err) { d.SetId("") @@ -108,7 +115,7 @@ func resourceAlicloudDBDatabaseRead(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudDBDatabaseUpdate(d *schema.ResourceData, meta interface{}) error { - + client := meta.(*connectivity.AliyunClient) d.Partial(true) if d.HasChange("description") && !d.IsNewResource() { @@ -118,7 +125,10 @@ func resourceAlicloudDBDatabaseUpdate(d *schema.ResourceData, meta interface{}) request.DBName = parts[1] request.DBDescription = d.Get("description").(string) - if _, err := meta.(*AliyunClient).rdsconn.ModifyDBDescription(request); err != nil { + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.ModifyDBDescription(request) + }) + if err != nil { return fmt.Errorf("ModifyDatabaseDescription got an error: %#v", err) } d.SetPartial("description") @@ -129,24 +139,28 @@ func resourceAlicloudDBDatabaseUpdate(d *schema.ResourceData, meta interface{}) } func resourceAlicloudDBDatabaseDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).rdsconn + client := meta.(*connectivity.AliyunClient) + rsdService := RdsService{client} parts := strings.Split(d.Id(), COLON_SEPARATED) request := rds.CreateDeleteDatabaseRequest() request.DBInstanceId = parts[0] request.DBName = parts[1] // wait instance status is running before deleting database - if err := meta.(*AliyunClient).WaitForDBInstance(parts[0], Running, 1800); err != nil { + if err := rsdService.WaitForDBInstance(parts[0], Running, 1800); err != nil { return fmt.Errorf("While deleting database, WaitForInstance %s got error: %#v", Running, err) } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DeleteDatabase(request); err != nil { - if NotFoundDBInstance(err) || IsExceptedError(err, InvalidDBNameNotFound) { + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DeleteDatabase(request) + }) + if err != nil { + if rsdService.NotFoundDBInstance(err) || IsExceptedError(err, InvalidDBNameNotFound) { return nil } return resource.RetryableError(fmt.Errorf("Delete database %s timeout and got an error: %#v.", parts[1], err)) } - if _, err := meta.(*AliyunClient).DescribeDatabaseByName(parts[0], parts[1]); err != nil { + if _, err := rsdService.DescribeDatabaseByName(parts[0], parts[1]); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_db_database_test.go b/alicloud/resource_alicloud_db_database_test.go index e1f2bc7df3a..8e769a2f35f 100644 --- a/alicloud/resource_alicloud_db_database_test.go +++ b/alicloud/resource_alicloud_db_database_test.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudDBDatabase_basic(t *testing.T) { @@ -48,9 +49,10 @@ func testAccCheckDBDatabaseExists(n string, d *rds.Database) resource.TestCheckF return fmt.Errorf("No DB ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rdsService := RdsService{client} parts := strings.Split(rs.Primary.ID, COLON_SEPARATED) - db, err := client.DescribeDatabaseByName(parts[0], parts[1]) + db, err := rdsService.DescribeDatabaseByName(parts[0], parts[1]) if err != nil { return err @@ -62,7 +64,8 @@ func testAccCheckDBDatabaseExists(n string, d *rds.Database) resource.TestCheckF } func testAccCheckDBDatabaseDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rdsService := RdsService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_db_database" { @@ -71,7 +74,7 @@ func testAccCheckDBDatabaseDestroy(s *terraform.State) error { parts := strings.Split(rs.Primary.ID, COLON_SEPARATED) - if _, err := client.DescribeDatabaseByName(parts[0], parts[1]); err != nil { + if _, err := rdsService.DescribeDatabaseByName(parts[0], parts[1]); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_db_instance.go b/alicloud/resource_alicloud_db_instance.go index dcd270d01a0..0181227303c 100644 --- a/alicloud/resource_alicloud_db_instance.go +++ b/alicloud/resource_alicloud_db_instance.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/go-uuid" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudDBInstance() *schema.Resource { @@ -224,24 +225,26 @@ func resourceAlicloudDBInstance() *schema.Resource { } func resourceAlicloudDBInstanceCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.rdsconn + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} request, err := buildDBCreateRequest(d, meta) if err != nil { return err } - resp, err := conn.CreateDBInstance(request) + raw, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.CreateDBInstance(request) + }) if err != nil { return fmt.Errorf("Error creating Alicloud db instance: %#v", err) } - + resp, _ := raw.(*rds.CreateDBInstanceResponse) d.SetId(resp.DBInstanceId) // wait instance status change from Creating to running - if err := client.WaitForDBInstance(d.Id(), Running, DefaultLongTimeout); err != nil { + if err := rdsService.WaitForDBInstance(d.Id(), Running, DefaultLongTimeout); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } @@ -249,8 +252,8 @@ func resourceAlicloudDBInstanceCreate(d *schema.ResourceData, meta interface{}) } func resourceAlicloudDBInstanceUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.rdsconn + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} d.Partial(true) if d.HasChange("security_ips") && !d.IsNewResource() { @@ -262,7 +265,7 @@ func resourceAlicloudDBInstanceUpdate(d *schema.ResourceData, meta interface{}) ipstr = LOCAL_HOST_IP } - if err := client.ModifyDBSecurityIps(d.Id(), ipstr); err != nil { + if err := rdsService.ModifyDBSecurityIps(d.Id(), ipstr); err != nil { return fmt.Errorf("Moodify DB security ips %s got an error: %#v", ipstr, err) } d.SetPartial("security_ips") @@ -287,14 +290,17 @@ func resourceAlicloudDBInstanceUpdate(d *schema.ResourceData, meta interface{}) if update { // wait instance status is running before modifying - if err := client.WaitForDBInstance(d.Id(), Running, 500); err != nil { + if err := rdsService.WaitForDBInstance(d.Id(), Running, 500); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } - if _, err := conn.ModifyDBInstanceSpec(request); err != nil { + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.ModifyDBInstanceSpec(request) + }) + if err != nil { return err } // wait instance status is running after modifying - if err := client.WaitForDBInstance(d.Id(), Running, 1800); err != nil { + if err := rdsService.WaitForDBInstance(d.Id(), Running, 1800); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } } @@ -304,7 +310,10 @@ func resourceAlicloudDBInstanceUpdate(d *schema.ResourceData, meta interface{}) request.DBInstanceId = d.Id() request.DBInstanceDescription = d.Get("instance_name").(string) - if _, err := conn.ModifyDBInstanceDescription(request); err != nil { + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.ModifyDBInstanceDescription(request) + }) + if err != nil { return fmt.Errorf("ModifyDBInstanceDescription got an error: %#v", err) } } @@ -314,18 +323,19 @@ func resourceAlicloudDBInstanceUpdate(d *schema.ResourceData, meta interface{}) } func resourceAlicloudDBInstanceRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} - instance, err := client.DescribeDBInstanceById(d.Id()) + instance, err := rdsService.DescribeDBInstanceById(d.Id()) if err != nil { - if NotFoundDBInstance(err) { + if rdsService.NotFoundDBInstance(err) { d.SetId("") return nil } return fmt.Errorf("Error Describe DB InstanceAttribute: %#v", err) } - ips, err := client.GetSecurityIps(d.Id()) + ips, err := rdsService.GetSecurityIps(d.Id()) if err != nil { return fmt.Errorf("[ERROR] Describe DB security ips error: %#v", err) } @@ -348,11 +358,12 @@ func resourceAlicloudDBInstanceRead(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudDBInstanceDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + rdsService := RdsService{client} - instance, err := client.DescribeDBInstanceById(d.Id()) + instance, err := rdsService.DescribeDBInstanceById(d.Id()) if err != nil { - if NotFoundDBInstance(err) { + if rdsService.NotFoundDBInstance(err) { return nil } return fmt.Errorf("Error Describe DB InstanceAttribute: %#v", err) @@ -365,16 +376,18 @@ func resourceAlicloudDBInstanceDelete(d *schema.ResourceData, meta interface{}) request.DBInstanceId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.rdsconn.DeleteDBInstance(request) + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DeleteDBInstance(request) + }) if err != nil { - if NotFoundDBInstance(err) { + if rdsService.NotFoundDBInstance(err) { return nil } return resource.RetryableError(fmt.Errorf("Delete DB instance timeout and got an error: %#v.", err)) } - instance, err := client.DescribeDBInstanceById(d.Id()) + instance, err := rdsService.DescribeDBInstanceById(d.Id()) if err != nil { if NotFoundError(err) || IsExceptedError(err, InvalidDBInstanceNameNotFound) { return nil @@ -390,9 +403,10 @@ func resourceAlicloudDBInstanceDelete(d *schema.ResourceData, meta interface{}) } func buildDBCreateRequest(d *schema.ResourceData, meta interface{}) (*rds.CreateDBInstanceRequest, error) { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} request := rds.CreateCreateDBInstanceRequest() - request.RegionId = string(getRegion(d, meta)) + request.RegionId = string(client.Region) request.EngineVersion = Trim(d.Get("engine_version").(string)) request.Engine = Trim(d.Get("engine").(string)) request.DBInstanceStorage = requests.NewInteger(d.Get("instance_storage").(int)) @@ -412,7 +426,7 @@ func buildDBCreateRequest(d *schema.ResourceData, meta interface{}) (*rds.Create request.InstanceNetworkType = strings.ToUpper(string(Vpc)) // check vswitchId in zone - vsw, err := client.DescribeVswitch(vswitchId) + vsw, err := vpcService.DescribeVswitch(vswitchId) if err != nil { return nil, fmt.Errorf("DescribeVSwitche got an error: %#v.", err) } diff --git a/alicloud/resource_alicloud_db_instance_test.go b/alicloud/resource_alicloud_db_instance_test.go index 78e9bd59f3e..381393a2297 100644 --- a/alicloud/resource_alicloud_db_instance_test.go +++ b/alicloud/resource_alicloud_db_instance_test.go @@ -12,6 +12,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -22,11 +23,11 @@ func init() { } func testSweepDBInstances(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -38,14 +39,17 @@ func testSweepDBInstances(region string) error { var insts []rds.DBInstance req := rds.CreateDescribeDBInstancesRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.rdsconn.DescribeDBInstances(req) + raw, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DescribeDBInstances(req) + }) if err != nil { return fmt.Errorf("Error retrieving RDS Instances: %s", err) } + resp, _ := raw.(*rds.DescribeDBInstancesResponse) if resp == nil || len(resp.Items.DBInstance) < 1 { break } @@ -82,7 +86,10 @@ func testSweepDBInstances(region string) error { log.Printf("[INFO] Deleting RDS Instance: %s (%s)", name, id) req := rds.CreateDeleteDBInstanceRequest() req.DBInstanceId = id - if _, err := conn.rdsconn.DeleteDBInstance(req); err != nil { + _, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DeleteDBInstance(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete RDS Instance (%s (%s)): %s", name, id, err) } } @@ -288,7 +295,9 @@ func testAccCheckSecurityIpExists(n string, ips []map[string]interface{}) resour return fmt.Errorf("No DB Instance ID is set") } - resp, err := testAccProvider.Meta().(*AliyunClient).DescribeDBSecurityIps(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rdsService := RdsService{client} + resp, err := rdsService.DescribeDBSecurityIps(rs.Primary.ID) log.Printf("[DEBUG] check instance %s security ip %#v", rs.Primary.ID, resp) if err != nil { @@ -299,7 +308,7 @@ func testAccCheckSecurityIpExists(n string, ips []map[string]interface{}) resour return fmt.Errorf("DB security ip not found") } - ips = flattenDBSecurityIPs(resp) + ips = rdsService.flattenDBSecurityIPs(resp) return nil } } @@ -324,8 +333,9 @@ func testAccCheckDBInstanceExists(n string, d *rds.DBInstanceAttribute) resource return fmt.Errorf("No DB Instance ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - attr, err := client.DescribeDBInstanceById(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rdsService := RdsService{client} + attr, err := rdsService.DescribeDBInstanceById(rs.Primary.ID) log.Printf("[DEBUG] check instance %s attribute %#v", rs.Primary.ID, attr) if err != nil { @@ -353,14 +363,15 @@ func testAccCheckKeyValueInMaps(ps []map[string]interface{}, propName, key, valu } func testAccCheckDBInstanceDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + rdsService := RdsService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_db_instance" { continue } - ins, err := client.DescribeDBInstanceById(rs.Primary.ID) + ins, err := rdsService.DescribeDBInstanceById(rs.Primary.ID) if ins != nil { return fmt.Errorf("Error DB Instance still exist") diff --git a/alicloud/resource_alicloud_disk.go b/alicloud/resource_alicloud_disk.go index 70d575df33b..b5c7581ba01 100644 --- a/alicloud/resource_alicloud_disk.go +++ b/alicloud/resource_alicloud_disk.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunDisk() *schema.Resource { @@ -74,11 +75,10 @@ func resourceAliyunDisk() *schema.Resource { } func resourceAliyunDiskCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} - conn := client.ecsconn - - availabilityZone, err := client.DescribeZone(d.Get("availability_zone").(string)) + availabilityZone, err := ecsService.DescribeZone(d.Get("availability_zone").(string)) if err != nil { return err } @@ -88,7 +88,7 @@ func resourceAliyunDiskCreate(d *schema.ResourceData, meta interface{}) error { if v, ok := d.GetOk("category"); ok && v.(string) != "" { category := DiskCategory(v.(string)) - if err := client.DiskAvailable(availabilityZone, category); err != nil { + if err := ecsService.DiskAvailable(availabilityZone, category); err != nil { return err } args.DiskCategory = v.(string) @@ -130,17 +130,20 @@ func resourceAliyunDiskCreate(d *schema.ResourceData, meta interface{}) error { args.Encrypted = requests.NewBoolean(v.(bool)) } args.ClientToken = buildClientToken("TF-CreateDisk") - resp, err := conn.CreateDisk(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.CreateDisk(args) + }) if err != nil { return fmt.Errorf("CreateDisk got a error: %#v", err) } + resp, _ := raw.(*ecs.CreateDiskResponse) if resp == nil { return fmt.Errorf("CreateDisk got a nil response: %#v", resp) } d.SetId(resp.DiskId) - if err := client.WaitForEcsDisk(d.Id(), Available, DefaultTimeout); err != nil { + if err := ecsService.WaitForEcsDisk(d.Id(), Available, DefaultTimeout); err != nil { return fmt.Errorf("Waitting for disk %s got an error: %#v.", Available, err) } @@ -148,8 +151,9 @@ func resourceAliyunDiskCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunDiskRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - disk, err := client.DescribeDiskById("", d.Id()) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} + disk, err := ecsService.DescribeDiskById("", d.Id()) if err != nil { if NotFoundError(err) { @@ -168,7 +172,7 @@ func resourceAliyunDiskRead(d *schema.ResourceData, meta interface{}) error { d.Set("snapshot_id", disk.SourceSnapshotId) d.Set("encrypted", disk.Encrypted) - tags, err := client.DescribeTags(d.Id(), TagResourceDisk) + tags, err := ecsService.DescribeTags(d.Id(), TagResourceDisk) if err != nil && !NotFoundError(err) { return fmt.Errorf("[ERROR] DescribeTags for disk got error: %#v", err) } @@ -180,8 +184,7 @@ func resourceAliyunDiskRead(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunDiskUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.ecsconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -210,7 +213,10 @@ func resourceAliyunDiskUpdate(d *schema.ResourceData, meta interface{}) error { attributeUpdate = true } if attributeUpdate { - if _, err := conn.ModifyDiskAttribute(args); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ModifyDiskAttribute(args) + }) + if err != nil { return err } } @@ -221,13 +227,16 @@ func resourceAliyunDiskUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunDiskDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} req := ecs.CreateDeleteDiskRequest() req.DiskId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.ecsconn.DeleteDisk(req) + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DeleteDisk(req) + }) if err != nil { if NotFoundError(err) { return nil @@ -238,7 +247,7 @@ func resourceAliyunDiskDelete(d *schema.ResourceData, meta interface{}) error { return resource.NonRetryableError(err) } - disk, descErr := client.DescribeDiskById("", d.Id()) + disk, descErr := ecsService.DescribeDiskById("", d.Id()) if descErr != nil { if NotFoundError(descErr) { diff --git a/alicloud/resource_alicloud_disk_attachment.go b/alicloud/resource_alicloud_disk_attachment.go index 8d996989977..a6c1de71869 100644 --- a/alicloud/resource_alicloud_disk_attachment.go +++ b/alicloud/resource_alicloud_disk_attachment.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunDiskAttachment() *schema.Resource { @@ -40,7 +41,8 @@ func resourceAliyunDiskAttachment() *schema.Resource { } func resourceAliyunDiskAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} diskID := d.Get("disk_id").(string) instanceID := d.Get("instance_id").(string) @@ -50,7 +52,9 @@ func resourceAliyunDiskAttachmentCreate(d *schema.ResourceData, meta interface{} args.DiskId = diskID err := resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.ecsconn.AttachDisk(args) + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.AttachDisk(args) + }) if err != nil { if IsExceptedErrors(err, DiskInvalidOperation) { @@ -64,7 +68,7 @@ func resourceAliyunDiskAttachmentCreate(d *schema.ResourceData, meta interface{} return fmt.Errorf("Attaching disk %s to instance %s got an error: %#v.", diskID, instanceID, err) } - if err := client.WaitForEcsDisk(diskID, DiskInUse, DefaultTimeout); err != nil { + if err := ecsService.WaitForEcsDisk(diskID, DiskInUse, DefaultTimeout); err != nil { return fmt.Errorf("Waitting for disk %s %s got an error: %#v.", diskID, DiskInUse, err) } @@ -74,12 +78,14 @@ func resourceAliyunDiskAttachmentCreate(d *schema.ResourceData, meta interface{} } func resourceAliyunDiskAttachmentRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} diskId, instanceId, err := getDiskIDAndInstanceID(d, meta) if err != nil { return err } - disk, err := meta.(*AliyunClient).DescribeDiskById(instanceId, diskId) + disk, err := ecsService.DescribeDiskById(instanceId, diskId) if err != nil { if NotFoundError(err) { @@ -97,7 +103,8 @@ func resourceAliyunDiskAttachmentRead(d *schema.ResourceData, meta interface{}) } func resourceAliyunDiskAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} diskID, instanceID, err := getDiskIDAndInstanceID(d, meta) if err != nil { return err @@ -108,7 +115,7 @@ func resourceAliyunDiskAttachmentDelete(d *schema.ResourceData, meta interface{} req.DiskId = diskID return resource.Retry(5*time.Minute, func() *resource.RetryError { - disk, err := client.DescribeDiskById(instanceID, diskID) + disk, err := ecsService.DescribeDiskById(instanceID, diskID) if err != nil { if NotFoundError(err) { @@ -121,7 +128,9 @@ func resourceAliyunDiskAttachmentDelete(d *schema.ResourceData, meta interface{} return nil } - _, err = client.ecsconn.DetachDisk(req) + _, err = client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DetachDisk(req) + }) if err != nil { if IsExceptedErrors(err, DiskInvalidOperation) { time.Sleep(3 * time.Second) diff --git a/alicloud/resource_alicloud_disk_attachment_test.go b/alicloud/resource_alicloud_disk_attachment_test.go index be1794e3c33..7779294198e 100644 --- a/alicloud/resource_alicloud_disk_attachment_test.go +++ b/alicloud/resource_alicloud_disk_attachment_test.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudDiskAttachment(t *testing.T) { @@ -106,10 +107,11 @@ func testAccCheckDiskAttachmentExists(n string, instance *ecs.Instance, disk *ec return fmt.Errorf("No Disk ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} return resource.Retry(3*time.Minute, func() *resource.RetryError { - d, err := client.DescribeDiskById(instance.InstanceId, rs.Primary.Attributes["disk_id"]) + d, err := ecsService.DescribeDiskById(instance.InstanceId, rs.Primary.Attributes["disk_id"]) if err != nil { return resource.NonRetryableError(err) } @@ -130,9 +132,10 @@ func testAccCheckDiskAttachmentDestroy(s *terraform.State) error { continue } // Try to find the Disk - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - disk, err := client.DescribeDiskById(split[1], split[0]) + disk, err := ecsService.DescribeDiskById(split[1], split[0]) if err != nil { if NotFoundError(err) { diff --git a/alicloud/resource_alicloud_disk_test.go b/alicloud/resource_alicloud_disk_test.go index 72c43444494..256866baa78 100644 --- a/alicloud/resource_alicloud_disk_test.go +++ b/alicloud/resource_alicloud_disk_test.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -20,11 +21,11 @@ func init() { } func testSweepDisks(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -36,14 +37,17 @@ func testSweepDisks(region string) error { var disks []ecs.Disk req := ecs.CreateDescribeDisksRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.ecsconn.DescribeDisks(req) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeDisks(req) + }) if err != nil { return fmt.Errorf("Error retrieving Disks: %s", err) } + resp, _ := raw.(*ecs.DescribeDisksResponse) if resp == nil || len(resp.Disks.Disk) < 1 { break } @@ -77,7 +81,10 @@ func testSweepDisks(region string) error { log.Printf("[INFO] Deleting Disk: %s (%s)", name, id) req := ecs.CreateDeleteDiskRequest() req.DiskId = id - if _, err := conn.ecsconn.DeleteDisk(req); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DeleteDisk(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Disk (%s (%s)): %s", name, id, err) } } @@ -201,9 +208,10 @@ func testAccCheckDiskExists(n string, disk *ecs.Disk) resource.TestCheckFunc { return fmt.Errorf("No Disk ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} - d, err := client.DescribeDiskById("", rs.Primary.ID) + d, err := ecsService.DescribeDiskById("", rs.Primary.ID) if err != nil { return fmt.Errorf("While checking disk existing, describing disk got an error: %#v.", err) @@ -222,9 +230,10 @@ func testAccCheckDiskDestroy(s *terraform.State) error { } // Try to find the Disk - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} - d, err := client.DescribeDiskById("", rs.Primary.ID) + d, err := ecsService.DescribeDiskById("", rs.Primary.ID) if err != nil { if NotFoundError(err) { diff --git a/alicloud/resource_alicloud_dns.go b/alicloud/resource_alicloud_dns.go index 4250b16952d..81d483841d5 100644 --- a/alicloud/resource_alicloud_dns.go +++ b/alicloud/resource_alicloud_dns.go @@ -8,6 +8,7 @@ import ( "github.com/denverdino/aliyungo/dns" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudDns() *schema.Resource { @@ -42,23 +43,25 @@ func resourceAlicloudDns() *schema.Resource { } func resourceAlicloudDnsCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.AddDomainArgs{ DomainName: d.Get("name").(string), } - response, err := conn.AddDomain(args) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.AddDomain(args) + }) if err != nil { return fmt.Errorf("AddDomain got an error: %#v", err) } - + response, _ := raw.(*dns.AddDomainResponse) d.SetId(response.DomainName) return resourceAlicloudDnsUpdate(d, meta) } func resourceAlicloudDnsUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -70,7 +73,9 @@ func resourceAlicloudDnsUpdate(d *schema.ResourceData, meta interface{}) error { d.SetPartial("group_id") args.GroupId = d.Get("group_id").(string) - _, err := conn.ChangeDomainGroup(args) + _, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.ChangeDomainGroup(args) + }) if err != nil { return fmt.Errorf("ChangeDomainGroup got an error: %#v", err) } @@ -81,13 +86,15 @@ func resourceAlicloudDnsUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceAlicloudDnsRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.DescribeDomainInfoArgs{ DomainName: d.Id(), } - domain, err := conn.DescribeDomainInfo(args) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainInfo(args) + }) if err != nil { if NotFoundError(err) { d.SetId("") @@ -95,7 +102,7 @@ func resourceAlicloudDnsRead(d *schema.ResourceData, meta interface{}) error { } return fmt.Errorf("DescribeDomainInfo got an error: %#v", err) } - + domain, _ := raw.(dns.DomainType) d.Set("group_id", domain.GroupId) d.Set("name", domain.DomainName) d.Set("dns_server", domain.DnsServers.DnsServer) @@ -103,14 +110,16 @@ func resourceAlicloudDnsRead(d *schema.ResourceData, meta interface{}) error { } func resourceAlicloudDnsDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.DeleteDomainArgs{ DomainName: d.Id(), } return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := conn.DeleteDomain(args) + _, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DeleteDomain(args) + }) if err != nil { e, _ := err.(*common.Error) if e.ErrorResponse.Code == RecordForbiddenDNSChange { diff --git a/alicloud/resource_alicloud_dns_group.go b/alicloud/resource_alicloud_dns_group.go index 23572bff19a..341a0be3449 100644 --- a/alicloud/resource_alicloud_dns_group.go +++ b/alicloud/resource_alicloud_dns_group.go @@ -8,6 +8,7 @@ import ( "github.com/denverdino/aliyungo/dns" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudDnsGroup() *schema.Resource { @@ -27,23 +28,25 @@ func resourceAlicloudDnsGroup() *schema.Resource { } func resourceAlicloudDnsGroupCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.AddDomainGroupArgs{ GroupName: d.Get("name").(string), } - response, err := conn.AddDomainGroup(args) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.AddDomainGroup(args) + }) if err != nil { return fmt.Errorf("AddDomainGroup got a error: %#v", err) } - + response, _ := raw.(*dns.AddDomainGroupResponse) d.SetId(response.GroupId) d.Set("name", response.GroupName) return resourceAlicloudDnsGroupUpdate(d, meta) } func resourceAlicloudDnsGroupUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) args := &dns.UpdateDomainGroupArgs{ @@ -53,7 +56,10 @@ func resourceAlicloudDnsGroupUpdate(d *schema.ResourceData, meta interface{}) er if d.HasChange("name") && !d.IsNewResource() { d.SetPartial("name") args.GroupName = d.Get("name").(string) - if _, err := conn.UpdateDomainGroup(args); err != nil { + _, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.UpdateDomainGroup(args) + }) + if err != nil { return fmt.Errorf("UpdateDomainGroup got an error: %#v", err) } } @@ -63,17 +69,19 @@ func resourceAlicloudDnsGroupUpdate(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudDnsGroupRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.DescribeDomainGroupsArgs{ KeyWord: d.Get("name").(string), } - groups, err := conn.DescribeDomainGroups(args) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainGroups(args) + }) if err != nil { return err } - + groups, _ := raw.([]dns.DomainGroupType) if groups == nil || len(groups) <= 0 { return fmt.Errorf("No domain groups found.") } @@ -89,14 +97,16 @@ func resourceAlicloudDnsGroupRead(d *schema.ResourceData, meta interface{}) erro } func resourceAlicloudDnsGroupDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.DeleteDomainGroupArgs{ GroupId: d.Id(), } return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := conn.DeleteDomainGroup(args) + _, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DeleteDomainGroup(args) + }) if err != nil { e, _ := err.(*common.Error) if e.ErrorResponse.Code == FobiddenNotEmptyGroup { diff --git a/alicloud/resource_alicloud_dns_group_test.go b/alicloud/resource_alicloud_dns_group_test.go index 70c737f744f..164b230631b 100644 --- a/alicloud/resource_alicloud_dns_group_test.go +++ b/alicloud/resource_alicloud_dns_group_test.go @@ -8,6 +8,7 @@ import ( "github.com/denverdino/aliyungo/dns" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudDnsGroup_basic(t *testing.T) { @@ -51,17 +52,19 @@ func testAccCheckDnsGroupExists(n string, group *dns.DomainGroupType) resource.T return fmt.Errorf("No Domain group ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.dnsconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := &dns.DescribeDomainGroupsArgs{ KeyWord: rs.Primary.Attributes["name"], } - response, err := conn.DescribeDomainGroups(request) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainGroups(request) + }) log.Printf("[WARN] Group id %#v", rs.Primary.ID) if err == nil { + response, _ := raw.([]dns.DomainGroupType) if response != nil && len(response) > 0 { *group = response[0] return nil @@ -79,15 +82,16 @@ func testAccCheckDnsGroupDestroy(s *terraform.State) error { } // Try to find the domain group - client := testAccProvider.Meta().(*AliyunClient) - conn := client.dnsconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := &dns.DescribeDomainGroupsArgs{ KeyWord: rs.Primary.Attributes["name"], } - response, err := conn.DescribeDomainGroups(request) - + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainGroups(request) + }) + response, _ := raw.([]dns.DomainGroupType) if response != nil && len(response) > 0 { return fmt.Errorf("Error groups still exist") } diff --git a/alicloud/resource_alicloud_dns_record.go b/alicloud/resource_alicloud_dns_record.go index 8c7d22e212f..cf0fa4bfda7 100644 --- a/alicloud/resource_alicloud_dns_record.go +++ b/alicloud/resource_alicloud_dns_record.go @@ -8,6 +8,7 @@ import ( "github.com/denverdino/aliyungo/dns" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudDnsRecord() *schema.Resource { @@ -69,7 +70,7 @@ func resourceAlicloudDnsRecord() *schema.Resource { } func resourceAlicloudDnsRecordCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.AddDomainRecordArgs{ DomainName: d.Get("name").(string), @@ -87,16 +88,19 @@ func resourceAlicloudDnsRecordCreate(d *schema.ResourceData, meta interface{}) e return fmt.Errorf("The ForwordURLRecord only support default line.") } - response, err := conn.AddDomainRecord(args) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.AddDomainRecord(args) + }) if err != nil { return fmt.Errorf("AddDomainRecord got a error: %#v", err) } + response, _ := raw.(*dns.AddDomainRecordResponse) d.SetId(response.RecordId) return resourceAlicloudDnsRecordUpdate(d, meta) } func resourceAlicloudDnsRecordUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) attributeUpdate := false @@ -135,7 +139,10 @@ func resourceAlicloudDnsRecordUpdate(d *schema.ResourceData, meta interface{}) e } if attributeUpdate { - if _, err := conn.UpdateDomainRecord(args); err != nil { + _, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.UpdateDomainRecord(args) + }) + if err != nil { return fmt.Errorf("UpdateDomainRecord got an error: %#v", err) } } @@ -146,12 +153,14 @@ func resourceAlicloudDnsRecordUpdate(d *schema.ResourceData, meta interface{}) e } func resourceAlicloudDnsRecordRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.DescribeDomainRecordInfoNewArgs{ RecordId: d.Id(), } - response, err := conn.DescribeDomainRecordInfoNew(args) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainRecordInfoNew(args) + }) if err != nil { if NotFoundError(err) { d.SetId("") @@ -159,7 +168,7 @@ func resourceAlicloudDnsRecordRead(d *schema.ResourceData, meta interface{}) err } return err } - + response, _ := raw.(*dns.DescribeDomainRecordInfoNewResponse) record := response.RecordTypeNew d.Set("ttl", record.TTL) d.Set("priority", record.Priority) @@ -175,12 +184,14 @@ func resourceAlicloudDnsRecordRead(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudDnsRecordDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).dnsconn + client := meta.(*connectivity.AliyunClient) args := &dns.DeleteDomainRecordArgs{ RecordId: d.Id(), } return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := conn.DeleteDomainRecord(args) + _, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DeleteDomainRecord(args) + }) if err != nil { e, _ := err.(*common.Error) if e.ErrorResponse.Code == RecordForbiddenDNSChange { @@ -189,8 +200,10 @@ func resourceAlicloudDnsRecordDelete(d *schema.ResourceData, meta interface{}) e return resource.NonRetryableError(fmt.Errorf("Error deleting domain record %s: %#v", d.Id(), err)) } - response, err := conn.DescribeDomainRecordInfoNew(&dns.DescribeDomainRecordInfoNewArgs{ - RecordId: d.Id(), + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainRecordInfoNew(&dns.DescribeDomainRecordInfoNewArgs{ + RecordId: d.Id(), + }) }) if err != nil { if NotFoundError(err) || IsExceptedError(err, DomainRecordNotBelongToUser) { @@ -198,7 +211,7 @@ func resourceAlicloudDnsRecordDelete(d *schema.ResourceData, meta interface{}) e } return resource.NonRetryableError(fmt.Errorf("Describe domain record got an error: %#v.", err)) } - + response, _ := raw.(*dns.DescribeDomainRecordInfoNewResponse) if response == nil { return nil } diff --git a/alicloud/resource_alicloud_dns_record_test.go b/alicloud/resource_alicloud_dns_record_test.go index 7c4197af771..95d3b39254b 100644 --- a/alicloud/resource_alicloud_dns_record_test.go +++ b/alicloud/resource_alicloud_dns_record_test.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudDnsRecord_basic(t *testing.T) { @@ -52,17 +53,19 @@ func testAccCheckDnsRecordExists(n string, record *dns.RecordTypeNew) resource.T return fmt.Errorf("No Domain Record ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.dnsconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := &dns.DescribeDomainRecordInfoNewArgs{ RecordId: rs.Primary.ID, } - response, err := conn.DescribeDomainRecordInfoNew(request) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainRecordInfoNew(request) + }) log.Printf("[WARN] Domain record id %#v", rs.Primary.ID) if err == nil { + response, _ := raw.(*dns.DescribeDomainRecordInfoNewResponse) *record = response.RecordTypeNew return nil } @@ -108,17 +111,19 @@ func testAccCheckDnsRecordDestroy(s *terraform.State) error { } // Try to find the domain record - client := testAccProvider.Meta().(*AliyunClient) - conn := client.dnsconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := &dns.DescribeDomainRecordInfoNewArgs{ RecordId: rs.Primary.ID, } - response, err := conn.DescribeDomainRecordInfoNew(request) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainRecordInfoNew(request) + }) if err != nil { return err } + response, _ := raw.(*dns.DescribeDomainRecordInfoNewResponse) if response.RecordId != "" { return fmt.Errorf("Error Domain record still exist.") } diff --git a/alicloud/resource_alicloud_dns_test.go b/alicloud/resource_alicloud_dns_test.go index 6c94bef8968..8930f5f9725 100644 --- a/alicloud/resource_alicloud_dns_test.go +++ b/alicloud/resource_alicloud_dns_test.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudDns_basic(t *testing.T) { @@ -53,17 +54,19 @@ func testAccCheckDnsExists(n string, domain *dns.DomainType) resource.TestCheckF return fmt.Errorf("No Domain ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.dnsconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := &dns.DescribeDomainInfoArgs{ DomainName: rs.Primary.Attributes["name"], } - response, err := conn.DescribeDomainInfo(request) + raw, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainInfo(request) + }) log.Printf("[WARN] Domain id %#v", rs.Primary.ID) if err == nil { + response, _ := raw.(dns.DomainType) *domain = response return nil } @@ -79,14 +82,15 @@ func testAccCheckDnsDestroy(s *terraform.State) error { } // Try to find the domain - client := testAccProvider.Meta().(*AliyunClient) - conn := client.dnsconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := &dns.DescribeDomainInfoArgs{ DomainName: rs.Primary.Attributes["name"], } - _, err := conn.DescribeDomainInfo(request) + _, err := client.WithDnsClient(func(dnsClient *dns.Client) (interface{}, error) { + return dnsClient.DescribeDomainInfo(request) + }) if err != nil && !IsExceptedErrors(err, []string{InvalidDomainNameNoExist}) { return fmt.Errorf("Error Domain still exist.") diff --git a/alicloud/resource_alicloud_eip.go b/alicloud/resource_alicloud_eip.go index 0a987412dc9..30db82b67e7 100644 --- a/alicloud/resource_alicloud_eip.go +++ b/alicloud/resource_alicloud_eip.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunEip() *schema.Resource { @@ -79,10 +80,11 @@ func resourceAliyunEip() *schema.Resource { } func resourceAliyunEipCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} request := vpc.CreateAllocateEipAddressRequest() - request.RegionId = string(getRegion(d, meta)) + request.RegionId = string(client.Region) request.Bandwidth = strconv.Itoa(d.Get("bandwidth").(int)) request.InternetChargeType = d.Get("internet_charge_type").(string) request.InstanceChargeType = d.Get("instance_charge_type").(string) @@ -98,15 +100,17 @@ func resourceAliyunEipCreate(d *schema.ResourceData, meta interface{}) error { } request.ClientToken = buildClientToken("TF-AllocateEip") - eip, err := client.vpcconn.AllocateEipAddress(request) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.AllocateEipAddress(request) + }) if err != nil { if IsExceptedError(err, COMMODITYINVALID_COMPONENT) && request.InternetChargeType == string(PayByBandwidth) { return fmt.Errorf("Your account is international and it can only create '%s' elastic IP. Please change it and try again.", PayByTraffic) } return err } - - err = client.WaitForEip(eip.AllocationId, Available, 60) + eip, _ := raw.(*vpc.AllocateEipAddressResponse) + err = vpcService.WaitForEip(eip.AllocationId, Available, 60) if err != nil { return fmt.Errorf("Error Waitting for EIP available: %#v", err) } @@ -117,9 +121,10 @@ func resourceAliyunEipCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunEipRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - eip, err := client.DescribeEipAddress(d.Id()) + eip, err := vpcService.DescribeEipAddress(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -148,7 +153,7 @@ func resourceAliyunEipRead(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunEipUpdate(d *schema.ResourceData, meta interface{}) error { - + client := meta.(*connectivity.AliyunClient) d.Partial(true) update := false @@ -171,7 +176,10 @@ func resourceAliyunEipUpdate(d *schema.ResourceData, meta interface{}) error { d.SetPartial("description") } if update { - if _, err := meta.(*AliyunClient).vpcconn.ModifyEipAddressAttribute(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyEipAddressAttribute(request) + }) + if err != nil { return err } } @@ -182,13 +190,17 @@ func resourceAliyunEipUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunEipDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} request := vpc.CreateReleaseEipAddressRequest() request.AllocationId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := client.vpcconn.ReleaseEipAddress(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ReleaseEipAddress(request) + }) + if err != nil { if IsExceptedError(err, EipIncorrectStatus) { return resource.RetryableError(fmt.Errorf("Delete EIP timeout and got an error:%#v.", err)) } @@ -196,7 +208,7 @@ func resourceAliyunEipDelete(d *schema.ResourceData, meta interface{}) error { } - eip, descErr := client.DescribeEipAddress(d.Id()) + eip, descErr := vpcService.DescribeEipAddress(d.Id()) if descErr != nil { if NotFoundError(descErr) { diff --git a/alicloud/resource_alicloud_eip_association.go b/alicloud/resource_alicloud_eip_association.go index 49ddea8fa79..6e1c4f49dba 100644 --- a/alicloud/resource_alicloud_eip_association.go +++ b/alicloud/resource_alicloud_eip_association.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunEipAssociation() *schema.Resource { @@ -35,8 +36,8 @@ func resourceAliyunEipAssociation() *schema.Resource { } func resourceAliyunEipAssociationCreate(d *schema.ResourceData, meta interface{}) error { - - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} args := vpc.CreateAssociateEipAddressRequest() args.AllocationId = Trim(d.Get("allocation_id").(string)) @@ -52,7 +53,10 @@ func resourceAliyunEipAssociationCreate(d *schema.ResourceData, meta interface{} if err := resource.Retry(3*time.Minute, func() *resource.RetryError { ar := args - if _, err := client.vpcconn.AssociateEipAddress(ar); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.AssociateEipAddress(ar) + }) + if err != nil { if IsExceptedError(err, TaskConflict) { return resource.RetryableError(fmt.Errorf("AssociateEip got an error: %#v", err)) } @@ -63,7 +67,7 @@ func resourceAliyunEipAssociationCreate(d *schema.ResourceData, meta interface{} return err } - if err := client.WaitForEip(args.AllocationId, InUse, 60); err != nil { + if err := vpcService.WaitForEip(args.AllocationId, InUse, 60); err != nil { return fmt.Errorf("Error Waitting for EIP allocated: %#v", err) } // There is at least 30 seconds delay for ecs instance @@ -77,14 +81,15 @@ func resourceAliyunEipAssociationCreate(d *schema.ResourceData, meta interface{} } func resourceAliyunEipAssociationRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} allocationId, instanceId, err := getAllocationIdAndInstanceId(d, meta) if err != nil { return err } - eip, err := client.DescribeEipAddress(allocationId) + eip, err := vpcService.DescribeEipAddress(allocationId) if err != nil { if NotFoundError(err) { @@ -105,8 +110,8 @@ func resourceAliyunEipAssociationRead(d *schema.ResourceData, meta interface{}) } func resourceAliyunEipAssociationDelete(d *schema.ResourceData, meta interface{}) error { - - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} allocationId, instanceId, err := getAllocationIdAndInstanceId(d, meta) if err != nil { @@ -125,7 +130,10 @@ func resourceAliyunEipAssociationDelete(d *schema.ResourceData, meta interface{} request.InstanceType = Nat } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := client.vpcconn.UnassociateEipAddress(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.UnassociateEipAddress(request) + }) + if err != nil { if IsExceptedError(err, InstanceIncorrectStatus) || IsExceptedError(err, HaVipIncorrectStatus) || IsExceptedError(err, TaskConflict) { @@ -133,7 +141,7 @@ func resourceAliyunEipAssociationDelete(d *schema.ResourceData, meta interface{} } } - eip, descErr := client.DescribeEipAddress(allocationId) + eip, descErr := vpcService.DescribeEipAddress(allocationId) if descErr != nil { if NotFoundError(err) { return nil diff --git a/alicloud/resource_alicloud_eip_association_test.go b/alicloud/resource_alicloud_eip_association_test.go index 7e63f5e4f18..2b33cc10cc9 100644 --- a/alicloud/resource_alicloud_eip_association_test.go +++ b/alicloud/resource_alicloud_eip_association_test.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudEIPAssociation(t *testing.T) { @@ -85,9 +86,10 @@ func testAccCheckEIPAssociationExists(n string, instance *ecs.Instance, eip *vpc return fmt.Errorf("No EIP Association ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} return resource.Retry(3*time.Minute, func() *resource.RetryError { - d, err := client.DescribeEipAddress(rs.Primary.Attributes["allocation_id"]) + d, err := vpcService.DescribeEipAddress(rs.Primary.Attributes["allocation_id"]) if err != nil { return resource.NonRetryableError(err) @@ -115,9 +117,10 @@ func testAccCheckEIPAssociationSlbExists(n string, slb *slb.DescribeLoadBalancer return fmt.Errorf("No EIP Association ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} return resource.Retry(3*time.Minute, func() *resource.RetryError { - d, err := client.DescribeEipAddress(rs.Primary.Attributes["allocation_id"]) + d, err := vpcService.DescribeEipAddress(rs.Primary.Attributes["allocation_id"]) if err != nil { return resource.NonRetryableError(err) @@ -136,7 +139,8 @@ func testAccCheckEIPAssociationSlbExists(n string, slb *slb.DescribeLoadBalancer } func testAccCheckEIPAssociationDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_eip_association" { @@ -148,7 +152,7 @@ func testAccCheckEIPAssociationDestroy(s *terraform.State) error { } // Try to find the EIP - eip, err := client.DescribeEipAddress(rs.Primary.Attributes["allocation_id"]) + eip, err := vpcService.DescribeEipAddress(rs.Primary.Attributes["allocation_id"]) // Verify the error is what we want if err != nil { diff --git a/alicloud/resource_alicloud_eip_test.go b/alicloud/resource_alicloud_eip_test.go index c5e364c78b9..9c53aa5248a 100644 --- a/alicloud/resource_alicloud_eip_test.go +++ b/alicloud/resource_alicloud_eip_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepEips(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -37,14 +38,17 @@ func testSweepEips(region string) error { var eips []vpc.EipAddress req := vpc.CreateDescribeEipAddressesRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.vpcconn.DescribeEipAddresses(req) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeEipAddresses(req) + }) if err != nil { return fmt.Errorf("Error retrieving EIPs: %s", err) } + resp, _ := raw.(*vpc.DescribeEipAddressesResponse) if resp == nil || len(resp.EipAddresses.EipAddress) < 1 { break } @@ -78,7 +82,10 @@ func testSweepEips(region string) error { log.Printf("[INFO] Deleting EIP: %s (%s)", name, id) req := vpc.CreateReleaseEipAddressRequest() req.AllocationId = id - if _, err := conn.vpcconn.ReleaseEipAddress(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ReleaseEipAddress(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete EIP (%s (%s)): %s", name, id, err) } } @@ -135,8 +142,9 @@ func testAccCheckEIPExists(n string, eip *vpc.EipAddress) resource.TestCheckFunc return fmt.Errorf("No EIP ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - d, err := client.DescribeEipAddress(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} + d, err := vpcService.DescribeEipAddress(rs.Primary.ID) log.Printf("[WARN] eip id %#v", rs.Primary.ID) @@ -164,14 +172,15 @@ func testAccCheckEIPAttributes(eip *vpc.EipAddress) resource.TestCheckFunc { } func testAccCheckEIPDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_eip" { continue } - d, err := client.DescribeEipAddress(rs.Primary.ID) + d, err := vpcService.DescribeEipAddress(rs.Primary.ID) // Verify the error is what we want if err != nil { diff --git a/alicloud/resource_alicloud_ess_alarm.go b/alicloud/resource_alicloud_ess_alarm.go index 630c9f410e8..2b5fc2d0b38 100644 --- a/alicloud/resource_alicloud_ess_alarm.go +++ b/alicloud/resource_alicloud_ess_alarm.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudEssAlarm() *schema.Resource { @@ -116,21 +117,23 @@ func resourceAlicloudEssAlarm() *schema.Resource { func resourceAliyunEssAlarmCreate(d *schema.ResourceData, meta interface{}) error { - args, error := buildAlicloudEssAlarmArgs(d) - if error != nil { - return error + args, err := buildAlicloudEssAlarmArgs(d) + if err != nil { + return err } - essconn := meta.(*AliyunClient).essconn - + client := meta.(*connectivity.AliyunClient) if err := resource.Retry(5*time.Minute, func() *resource.RetryError { - alarm, err := essconn.CreateAlarm(args) + raw, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.CreateAlarm(args) + }) if err != nil { if IsExceptedError(err, EssThrottling) { return resource.RetryableError(fmt.Errorf("CreateAlarm timeout and got an error: %#v.", err)) } return resource.NonRetryableError(fmt.Errorf("CreateAlarm got an error: %#v.", err)) } + alarm, _ := raw.(*ess.CreateAlarmResponse) d.SetId(alarm.AlarmTaskId) return nil }); err != nil { @@ -141,9 +144,10 @@ func resourceAliyunEssAlarmCreate(d *schema.ResourceData, meta interface{}) erro } func resourceAliyunEssAlarmRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} - alarm, err := client.DescribeEssAlarmById(d.Id()) + alarm, err := essService.DescribeEssAlarmById(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -164,7 +168,7 @@ func resourceAliyunEssAlarmRead(d *schema.ResourceData, meta interface{}) error d.Set("comparison_operator", alarm.ComparisonOperator) d.Set("evaluation_count", alarm.EvaluationCount) d.Set("state", alarm.State) - if err := d.Set("dimensions", flattenDimensionsToMap(alarm.Dimensions.Dimension)); err != nil { + if err := d.Set("dimensions", essService.flattenDimensionsToMap(alarm.Dimensions.Dimension)); err != nil { return err } @@ -172,7 +176,7 @@ func resourceAliyunEssAlarmRead(d *schema.ResourceData, meta interface{}) error } func resourceAliyunEssAlarmUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) args := ess.CreateModifyAlarmRequest() args.AlarmTaskId = d.Id() @@ -193,7 +197,10 @@ func resourceAliyunEssAlarmUpdate(d *schema.ResourceData, meta interface{}) erro } } - if _, err := client.essconn.ModifyAlarm(args); err != nil { + _, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.ModifyAlarm(args) + }) + if err != nil { return err } @@ -201,21 +208,23 @@ func resourceAliyunEssAlarmUpdate(d *schema.ResourceData, meta interface{}) erro } func resourceAliyunEssAlarmDelete(d *schema.ResourceData, meta interface{}) error { - - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} id := d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { req := ess.CreateDeleteAlarmRequest() req.AlarmTaskId = id - _, err := client.essconn.DeleteAlarm(req) + _, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DeleteAlarm(req) + }) if err != nil { if IsExceptedErrors(err, []string{InvalidEssAlarmTaskNotFound}) { return nil } return resource.RetryableError(fmt.Errorf("Delete ess alarm timeout and got an error:%#v.", err)) } - _, err = client.DescribeEssAlarmById(id) + _, err = essService.DescribeEssAlarmById(id) if err != nil { if NotFoundError(err) { return nil @@ -263,9 +272,9 @@ func buildAlicloudEssAlarmArgs(d *schema.ResourceData) (*ess.CreateAlarmRequest, } if v, ok := d.GetOk("threshold"); ok { - threshold, error := strconv.ParseFloat(v.(string), 32) - if error != nil { - return nil, error + threshold, err := strconv.ParseFloat(v.(string), 32) + if err != nil { + return nil, err } args.Threshold = requests.NewFloat(threshold) } diff --git a/alicloud/resource_alicloud_ess_alarm_test.go b/alicloud/resource_alicloud_ess_alarm_test.go index c7be4db4860..b1c42203051 100644 --- a/alicloud/resource_alicloud_ess_alarm_test.go +++ b/alicloud/resource_alicloud_ess_alarm_test.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudEssAlarm_basic(t *testing.T) { @@ -158,8 +159,9 @@ func testAccCheckEssAlarmExists(n string, d *ess.Alarm) resource.TestCheckFunc { return fmt.Errorf("No ESS Alarm ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - attr, err := client.DescribeEssAlarmById(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} + attr, err := essService.DescribeEssAlarmById(rs.Primary.ID) log.Printf("[DEBUG] check ess alarm %s attribute %#v", rs.Primary.ID, attr) if err != nil { @@ -172,13 +174,14 @@ func testAccCheckEssAlarmExists(n string, d *ess.Alarm) resource.TestCheckFunc { } func testAccCheckEssAlarmDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_ess_alarm" { continue } - if _, err := client.DescribeEssAlarmById(rs.Primary.ID); err != nil { + if _, err := essService.DescribeEssAlarmById(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_ess_attachment.go b/alicloud/resource_alicloud_ess_attachment.go index 2931f1e73ad..d28dde33302 100644 --- a/alicloud/resource_alicloud_ess_attachment.go +++ b/alicloud/resource_alicloud_ess_attachment.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudEssAttachment() *schema.Resource { @@ -53,19 +54,20 @@ func resourceAliyunEssAttachmentCreate(d *schema.ResourceData, meta interface{}) } func resourceAliyunEssAttachmentUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} d.Partial(true) groupId := d.Id() if d.HasChange("instance_ids") { - group, err := client.DescribeScalingGroupById(groupId) + group, err := essService.DescribeScalingGroupById(groupId) if err != nil { return fmt.Errorf("DescribeScalingGroupById %s error: %#v", groupId, err) } if group.LifecycleState == string(Inactive) { return fmt.Errorf("Scaling group current status is %s, please active it before attaching or removing ECS instances.", group.LifecycleState) } else { - if err := client.WaitForScalingGroup(group.ScalingGroupId, Active, DefaultTimeout); err != nil { + if err := essService.WaitForScalingGroup(group.ScalingGroupId, Active, DefaultTimeout); err != nil { return fmt.Errorf("****WaitForScalingGroup is %#v got an error: %#v.", Active, err) } } @@ -85,9 +87,12 @@ func resourceAliyunEssAttachmentUpdate(d *schema.ResourceData, meta interface{}) s.FieldByName(fmt.Sprintf("InstanceId%d", i+1)).Set(reflect.ValueOf(id)) } - if _, err := client.essconn.AttachInstances(req); err != nil { + _, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.AttachInstances(req) + }) + if err != nil { if IsExceptedError(err, IncorrectCapacityMaxSize) { - instances, err := client.DescribeScalingInstances(d.Id(), "", make([]string, 0), "") + instances, err := essService.DescribeScalingInstances(d.Id(), "", make([]string, 0), "") if err != nil { return resource.NonRetryableError(fmt.Errorf("DescribeScalingInstances got an error: %#v", err)) } @@ -108,7 +113,7 @@ func resourceAliyunEssAttachmentUpdate(d *schema.ResourceData, meta interface{}) if len(autoAdded) > 0 { if d.Get("force").(bool) { - if err := client.EssRemoveInstances(groupId, autoAdded); err != nil { + if err := essService.EssRemoveInstances(groupId, autoAdded); err != nil { return resource.NonRetryableError(err) } time.Sleep(5) @@ -137,7 +142,7 @@ func resourceAliyunEssAttachmentUpdate(d *schema.ResourceData, meta interface{}) if err := resource.Retry(3*time.Minute, func() *resource.RetryError { - instances, err := client.DescribeScalingInstances(d.Id(), "", add, "") + instances, err := essService.DescribeScalingInstances(d.Id(), "", add, "") if err != nil { return resource.NonRetryableError(err) } @@ -156,7 +161,7 @@ func resourceAliyunEssAttachmentUpdate(d *schema.ResourceData, meta interface{}) } } if len(remove) > 0 { - if err := client.EssRemoveInstances(groupId, convertArrayInterfaceToArrayString(remove)); err != nil { + if err := essService.EssRemoveInstances(groupId, convertArrayInterfaceToArrayString(remove)); err != nil { return err } } @@ -170,8 +175,9 @@ func resourceAliyunEssAttachmentUpdate(d *schema.ResourceData, meta interface{}) } func resourceAliyunEssAttachmentRead(d *schema.ResourceData, meta interface{}) error { - - instances, err := meta.(*AliyunClient).DescribeScalingInstances(d.Id(), "", make([]string, 0), string(Attached)) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} + instances, err := essService.DescribeScalingInstances(d.Id(), "", make([]string, 0), string(Attached)) if err != nil { if NotFoundError(err) { @@ -198,9 +204,10 @@ func resourceAliyunEssAttachmentRead(d *schema.ResourceData, meta interface{}) e } func resourceAliyunEssAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} - group, err := client.DescribeScalingGroupById(d.Id()) + group, err := essService.DescribeScalingGroupById(d.Id()) if err != nil { return fmt.Errorf("DescribeScalingGroupById %s error: %#v", d.Id(), err) } @@ -208,7 +215,7 @@ func resourceAliyunEssAttachmentDelete(d *schema.ResourceData, meta interface{}) return fmt.Errorf("Scaling group current status is %s, please active it before attaching or removing ECS instances.", group.LifecycleState) } - return client.EssRemoveInstances(d.Id(), convertArrayInterfaceToArrayString(d.Get("instance_ids").(*schema.Set).List())) + return essService.EssRemoveInstances(d.Id(), convertArrayInterfaceToArrayString(d.Get("instance_ids").(*schema.Set).List())) } func convertArrayInterfaceToArrayString(elm []interface{}) (arr []string) { diff --git a/alicloud/resource_alicloud_ess_attachment_test.go b/alicloud/resource_alicloud_ess_attachment_test.go index 8386c78a5e4..82dedc8dc0d 100644 --- a/alicloud/resource_alicloud_ess_attachment_test.go +++ b/alicloud/resource_alicloud_ess_attachment_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudEssAttachment_basic(t *testing.T) { @@ -48,13 +49,14 @@ func testAccCheckEssAttachmentExists(n string, d *ess.ScalingGroup) resource.Tes return fmt.Errorf("No ESS attachment ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - group, err := client.DescribeScalingGroupById(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} + group, err := essService.DescribeScalingGroupById(rs.Primary.ID) if err != nil { return fmt.Errorf("Error Describe scaling group: %#v", err) } - instances, err := client.DescribeScalingInstances(rs.Primary.ID, "", make([]string, 0), string(Attached)) + instances, err := essService.DescribeScalingInstances(rs.Primary.ID, "", make([]string, 0), string(Attached)) if err != nil { return fmt.Errorf("Error Describe scaling instances: %#v", err) @@ -70,14 +72,15 @@ func testAccCheckEssAttachmentExists(n string, d *ess.ScalingGroup) resource.Tes } func testAccCheckEssAttachmentDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_ess_scaling_configuration" { continue } - _, err := client.DescribeScalingGroupById(rs.Primary.ID) + _, err := essService.DescribeScalingGroupById(rs.Primary.ID) if err != nil { if NotFoundError(err) || IsExceptedError(err, InvalidScalingGroupIdNotFound) { continue @@ -85,7 +88,7 @@ func testAccCheckEssAttachmentDestroy(s *terraform.State) error { return fmt.Errorf("Error Describe scaling group: %#v", err) } - instances, err := client.DescribeScalingInstances(rs.Primary.ID, "", make([]string, 0), string(Attached)) + instances, err := essService.DescribeScalingInstances(rs.Primary.ID, "", make([]string, 0), string(Attached)) if err != nil && !IsExceptedError(err, InvalidScalingGroupIdNotFound) { return fmt.Errorf("Error Describe scaling instances: %#v", err) diff --git a/alicloud/resource_alicloud_ess_lifecyclehook.go b/alicloud/resource_alicloud_ess_lifecyclehook.go index 8aa0dba5884..62b6fc0009d 100644 --- a/alicloud/resource_alicloud_ess_lifecyclehook.go +++ b/alicloud/resource_alicloud_ess_lifecyclehook.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudEssLifecycleHook() *schema.Resource { @@ -65,16 +66,19 @@ func resourceAlicloudEssLifecycleHook() *schema.Resource { func resourceAliyunEssLifeCycleHookCreate(d *schema.ResourceData, meta interface{}) error { args := buildAlicloudEssLifeCycleHookArgs(d) - essconn := meta.(*AliyunClient).essconn + client := meta.(*connectivity.AliyunClient) if err := resource.Retry(5*time.Minute, func() *resource.RetryError { - hook, err := essconn.CreateLifecycleHook(args) + raw, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.CreateLifecycleHook(args) + }) if err != nil { if IsExceptedError(err, EssThrottling) { return resource.RetryableError(fmt.Errorf("CreateLifecycleHook timeout and got an error: %#v.", err)) } return resource.NonRetryableError(fmt.Errorf("CreateLifecycleHook got an error: %#v.", err)) } + hook, _ := raw.(*ess.CreateLifecycleHookResponse) d.SetId(hook.LifecycleHookId) return nil }); err != nil { @@ -86,9 +90,10 @@ func resourceAliyunEssLifeCycleHookCreate(d *schema.ResourceData, meta interface func resourceAliyunEssLifeCycleHookRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} - hook, err := client.DescribeLifecycleHookById(d.Id()) + hook, err := essService.DescribeLifecycleHookById(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -110,7 +115,7 @@ func resourceAliyunEssLifeCycleHookRead(d *schema.ResourceData, meta interface{} func resourceAliyunEssLifeCycleHookUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).essconn + client := meta.(*connectivity.AliyunClient) args := ess.CreateModifyLifecycleHookRequest() args.LifecycleHookId = d.Id() @@ -134,7 +139,10 @@ func resourceAliyunEssLifeCycleHookUpdate(d *schema.ResourceData, meta interface args.NotificationMetadata = d.Get("notification_metadata").(string) } - if _, err := conn.ModifyLifecycleHook(args); err != nil { + _, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.ModifyLifecycleHook(args) + }) + if err != nil { return err } @@ -143,20 +151,23 @@ func resourceAliyunEssLifeCycleHookUpdate(d *schema.ResourceData, meta interface func resourceAliyunEssLifeCycleHookDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} id := d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { req := ess.CreateDeleteLifecycleHookRequest() req.LifecycleHookId = id - _, err := client.essconn.DeleteLifecycleHook(req) + _, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DeleteLifecycleHook(req) + }) if err != nil { if IsExceptedErrors(err, []string{InvalidLifecycleHookIdNotFound}) { return nil } return resource.RetryableError(fmt.Errorf("Delete lifecycle hook timeout and got an error:%#v.", err)) } - _, err = client.DescribeLifecycleHookById(id) + _, err = essService.DescribeLifecycleHookById(id) if err != nil { if NotFoundError(err) { return nil diff --git a/alicloud/resource_alicloud_ess_lifecyclehook_test.go b/alicloud/resource_alicloud_ess_lifecyclehook_test.go index 65af5c548ad..346f6425f35 100644 --- a/alicloud/resource_alicloud_ess_lifecyclehook_test.go +++ b/alicloud/resource_alicloud_ess_lifecyclehook_test.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudEssLifecycleHook_basic(t *testing.T) { @@ -86,8 +87,9 @@ func testAccCheckEssLifecycleHookExists(n string, d *ess.LifecycleHook) resource return fmt.Errorf("No ESS Lifecycle Hook ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - attr, err := client.DescribeLifecycleHookById(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} + attr, err := essService.DescribeLifecycleHookById(rs.Primary.ID) log.Printf("[DEBUG] check lifecycle hook %s attribute %#v", rs.Primary.ID, attr) if err != nil { @@ -100,13 +102,14 @@ func testAccCheckEssLifecycleHookExists(n string, d *ess.LifecycleHook) resource } func testAccCheckEssLifecycleHookDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_ess_lifecycle_hook" { continue } - if _, err := client.DescribeLifecycleHookById(rs.Primary.ID); err != nil { + if _, err := essService.DescribeLifecycleHookById(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_ess_scalingconfiguration.go b/alicloud/resource_alicloud_ess_scalingconfiguration.go index 0bcd7532aff..31facf2a646 100644 --- a/alicloud/resource_alicloud_ess_scalingconfiguration.go +++ b/alicloud/resource_alicloud_ess_scalingconfiguration.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudEssScalingConfiguration() *schema.Resource { @@ -182,11 +183,13 @@ func resourceAlicloudEssScalingConfiguration() *schema.Resource { func resourceAliyunEssScalingConfigurationCreate(d *schema.ResourceData, meta interface{}) error { // Ensure instance_type is generation three - zoneId, validZones, err := meta.(*AliyunClient).DescribeAvailableResources(d, meta, InstanceTypeResource) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} + zoneId, validZones, err := ecsService.DescribeAvailableResources(d, meta, InstanceTypeResource) if err != nil { return err } - if err := meta.(*AliyunClient).InstanceTypeValidation(d.Get("instance_type").(string), zoneId, validZones); err != nil { + if err := ecsService.InstanceTypeValidation(d.Get("instance_type").(string), zoneId, validZones); err != nil { return err } @@ -200,16 +203,17 @@ func resourceAliyunEssScalingConfigurationCreate(d *schema.ResourceData, meta in args.IoOptimized = string(NoneOptimized) } - essconn := meta.(*AliyunClient).essconn - if err := resource.Retry(5*time.Minute, func() *resource.RetryError { - scaling, err := essconn.CreateScalingConfiguration(args) + raw, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.CreateScalingConfiguration(args) + }) if err != nil { if IsExceptedError(err, EssThrottling) || IsExceptedError(err, IncorrectScalingGroupStatus) { return resource.RetryableError(fmt.Errorf("Error Create Scaling Configuration: %#v.", err)) } return resource.NonRetryableError(fmt.Errorf("Error Create Scaling Configuration: %#v.", err)) } + scaling, _ := raw.(*ess.CreateScalingConfigurationResponse) d.SetId(scaling.ScalingConfigurationId) return nil }); err != nil { @@ -220,14 +224,15 @@ func resourceAliyunEssScalingConfigurationCreate(d *schema.ResourceData, meta in } func resourceAliyunEssScalingConfigurationUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} d.Partial(true) if strings.Contains(d.Id(), COLON_SEPARATED) { d.SetId(strings.Split(d.Id(), COLON_SEPARATED)[1]) } if d.HasChange("active") { - c, err := client.DescribeScalingConfigurationById(d.Id()) + c, err := essService.DescribeScalingConfigurationById(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -241,7 +246,7 @@ func resourceAliyunEssScalingConfigurationUpdate(d *schema.ResourceData, meta in if active { if c.LifecycleState == string(Inactive) { - err := client.ActiveScalingConfigurationById(c.ScalingGroupId, d.Id()) + err := essService.ActiveScalingConfigurationById(c.ScalingGroupId, d.Id()) if err != nil { return fmt.Errorf("Active scaling configuration %s err: %#v", d.Id(), err) } @@ -267,11 +272,12 @@ func resourceAliyunEssScalingConfigurationUpdate(d *schema.ResourceData, meta in } func enableEssScalingConfiguration(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} if d.HasChange("enable") { sgId := d.Get("scaling_group_id").(string) - group, err := client.DescribeScalingGroupById(sgId) + group, err := essService.DescribeScalingGroupById(sgId) if err != nil { return fmt.Errorf("DescribeScalingGroupById %s error: %#v", sgId, err) } @@ -280,7 +286,7 @@ func enableEssScalingConfiguration(d *schema.ResourceData, meta interface{}) err if enable { if group.LifecycleState == string(Inactive) { - cs, err := client.DescribeScalingConfifurations(sgId) + cs, err := essService.DescribeScalingConfifurations(sgId) if err != nil { return fmt.Errorf("Describe ScalingConfigurations by scaling group %s got an error: %#v", sgId, err) @@ -303,10 +309,13 @@ func enableEssScalingConfiguration(d *schema.ResourceData, meta interface{}) err req.ScalingGroupId = sgId req.ActiveScalingConfigurationId = activeConfig - if _, err := client.essconn.EnableScalingGroup(req); err != nil { + _, err = client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.EnableScalingGroup(req) + }) + if err != nil { return fmt.Errorf("EnableScalingGroup %s got an error: %#v", sgId, err) } - if err := client.WaitForScalingGroup(sgId, Active, DefaultTimeout); err != nil { + if err := essService.WaitForScalingGroup(sgId, Active, DefaultTimeout); err != nil { return fmt.Errorf("WaitForScalingGroup is %#v got an error: %#v.", Active, err) } @@ -316,10 +325,13 @@ func enableEssScalingConfiguration(d *schema.ResourceData, meta interface{}) err if group.LifecycleState == string(Active) { req := ess.CreateDisableScalingGroupRequest() req.ScalingGroupId = sgId - if _, err := client.essconn.DisableScalingGroup(req); err != nil { + _, err = client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DisableScalingGroup(req) + }) + if err != nil { return fmt.Errorf("DisableScalingGroup %s got an error: %#v", sgId, err) } - if err := client.WaitForScalingGroup(sgId, Inactive, DefaultTimeout); err != nil { + if err := essService.WaitForScalingGroup(sgId, Inactive, DefaultTimeout); err != nil { return fmt.Errorf("WaitForScalingGroup is %#v got an error: %#v.", Inactive, err) } } @@ -332,11 +344,12 @@ func enableEssScalingConfiguration(d *schema.ResourceData, meta interface{}) err func resourceAliyunEssScalingConfigurationRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} if strings.Contains(d.Id(), COLON_SEPARATED) { d.SetId(strings.Split(d.Id(), COLON_SEPARATED)[1]) } - c, err := client.DescribeScalingConfigurationById(d.Id()) + c, err := essService.DescribeScalingConfigurationById(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -355,7 +368,7 @@ func resourceAliyunEssScalingConfigurationRead(d *schema.ResourceData, meta inte d.Set("internet_max_bandwidth_in", c.InternetMaxBandwidthIn) d.Set("internet_max_bandwidth_out", c.InternetMaxBandwidthOut) d.Set("system_disk_category", c.SystemDiskCategory) - d.Set("data_disk", flattenDataDiskMappings(c.DataDisks.DataDisk)) + d.Set("data_disk", essService.flattenDataDiskMappings(c.DataDisks.DataDisk)) d.Set("role_name", c.RamRoleName) d.Set("key_name", c.KeyPairName) d.Set("user_data", userDataHashSum(c.UserData)) @@ -367,13 +380,14 @@ func resourceAliyunEssScalingConfigurationRead(d *schema.ResourceData, meta inte } func resourceAliyunEssScalingConfigurationDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} if strings.Contains(d.Id(), COLON_SEPARATED) { d.SetId(strings.Split(d.Id(), COLON_SEPARATED)[1]) } - c, err := client.DescribeScalingConfigurationById(d.Id()) + c, err := essService.DescribeScalingConfigurationById(d.Id()) if err != nil { if NotFoundError(err) { return nil @@ -384,13 +398,16 @@ func resourceAliyunEssScalingConfigurationDelete(d *schema.ResourceData, meta in req := ess.CreateDescribeScalingConfigurationsRequest() req.ScalingGroupId = c.ScalingGroupId - resp, err := client.essconn.DescribeScalingConfigurations(req) + raw, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeScalingConfigurations(req) + }) + resp, _ := raw.(*ess.DescribeScalingConfigurationsResponse) if resp == nil || len(resp.ScalingConfigurations.ScalingConfiguration) < 1 { return nil } if len(resp.ScalingConfigurations.ScalingConfiguration) == 1 { if d.Get("force_delete").(bool) { - return client.DeleteScalingGroupById(c.ScalingGroupId) + return essService.DeleteScalingGroupById(c.ScalingGroupId) } return fmt.Errorf("Current scaling configuration %s is the last configuration for the scaling group %s. Please launch a new "+ "active scaling configuration or set 'force_delete' to 'true' to delete it with deleting its scaling group.", d.Id(), c.ScalingGroupId) @@ -401,7 +418,9 @@ func resourceAliyunEssScalingConfigurationDelete(d *schema.ResourceData, meta in req := ess.CreateDeleteScalingConfigurationRequest() req.ScalingConfigurationId = d.Id() - _, err := client.essconn.DeleteScalingConfiguration(req) + _, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DeleteScalingConfiguration(req) + }) if err != nil { if IsExceptedErrors(err, []string{IncorrectScalingConfigurationLifecycleState}) { @@ -414,7 +433,7 @@ func resourceAliyunEssScalingConfigurationDelete(d *schema.ResourceData, meta in } } - c, err := client.DescribeScalingConfigurationById(d.Id()) + c, err := essService.DescribeScalingConfigurationById(d.Id()) if err != nil { if NotFoundError(err) { return nil @@ -422,7 +441,7 @@ func resourceAliyunEssScalingConfigurationDelete(d *schema.ResourceData, meta in return resource.NonRetryableError(err) } - instances, err := client.DescribeScalingInstances(c.ScalingGroupId, d.Id(), make([]string, 0), "") + instances, err := essService.DescribeScalingInstances(c.ScalingGroupId, d.Id(), make([]string, 0), "") if err != nil { if NotFoundError(err) { return nil @@ -513,10 +532,11 @@ func buildAlicloudEssScalingConfigurationArgs(d *schema.ResourceData, meta inter } func activeSubstituteScalingConfiguration(d *schema.ResourceData, meta interface{}) (configures []ess.ScalingConfiguration, err error) { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} substitute_id, ok := d.GetOk("substitute") - c, err := client.DescribeScalingConfigurationById(d.Id()) + c, err := essService.DescribeScalingConfigurationById(d.Id()) if err != nil { return } @@ -524,10 +544,13 @@ func activeSubstituteScalingConfiguration(d *schema.ResourceData, meta interface req := ess.CreateDescribeScalingConfigurationsRequest() req.ScalingGroupId = c.ScalingGroupId - resp, err := client.essconn.DescribeScalingConfigurations(req) + raw, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeScalingConfigurations(req) + }) if err != nil { return } + resp, _ := raw.(*ess.DescribeScalingConfigurationsResponse) if resp == nil || len(resp.ScalingConfigurations.ScalingConfiguration) < 1 { return } @@ -549,7 +572,7 @@ func activeSubstituteScalingConfiguration(d *schema.ResourceData, meta interface } - err = client.ActiveScalingConfigurationById(c.ScalingGroupId, substitute_id.(string)) + err = essService.ActiveScalingConfigurationById(c.ScalingGroupId, substitute_id.(string)) if err != nil { return configures, fmt.Errorf("Inactive scaling configuration %s err: %#v. Substitute scaling configuration ID: %s", d.Id(), err, substitute_id.(string)) diff --git a/alicloud/resource_alicloud_ess_scalingconfiguration_test.go b/alicloud/resource_alicloud_ess_scalingconfiguration_test.go index 6a3fc56bd0d..c1b5475b4a8 100644 --- a/alicloud/resource_alicloud_ess_scalingconfiguration_test.go +++ b/alicloud/resource_alicloud_ess_scalingconfiguration_test.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudEssScalingConfiguration_basic(t *testing.T) { @@ -182,8 +183,9 @@ func testAccCheckEssScalingConfigurationExists(n string, d *ess.ScalingConfigura return fmt.Errorf("No ESS Scaling Configuration ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - attr, err := client.DescribeScalingConfigurationById(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} + attr, err := essService.DescribeScalingConfigurationById(rs.Primary.ID) log.Printf("[DEBUG] check scaling configuration %s attribute %#v", rs.Primary.ID, attr) if err != nil { @@ -196,13 +198,14 @@ func testAccCheckEssScalingConfigurationExists(n string, d *ess.ScalingConfigura } func testAccCheckEssScalingConfigurationDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_ess_scaling_configuration" { continue } - _, err := client.DescribeScalingConfigurationById(rs.Primary.ID) + _, err := essService.DescribeScalingConfigurationById(rs.Primary.ID) // Verify the error is what we want if err != nil { diff --git a/alicloud/resource_alicloud_ess_scalinggroup.go b/alicloud/resource_alicloud_ess_scalinggroup.go index eda75a48655..878c4dd2bd7 100644 --- a/alicloud/resource_alicloud_ess_scalinggroup.go +++ b/alicloud/resource_alicloud_ess_scalinggroup.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudEssScalingGroup() *schema.Resource { @@ -95,16 +96,19 @@ func resourceAliyunEssScalingGroupCreate(d *schema.ResourceData, meta interface{ return err } - essconn := meta.(*AliyunClient).essconn + client := meta.(*connectivity.AliyunClient) if err := resource.Retry(5*time.Minute, func() *resource.RetryError { - scaling, err := essconn.CreateScalingGroup(args) + raw, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.CreateScalingGroup(args) + }) if err != nil { if IsExceptedError(err, EssThrottling) { return resource.RetryableError(fmt.Errorf("CreateScalingGroup timeout and got an error: %#v.", err)) } return resource.NonRetryableError(fmt.Errorf("CreateScalingGroup got an error: %#v.", err)) } + scaling, _ := raw.(*ess.CreateScalingGroupResponse) d.SetId(scaling.ScalingGroupId) return nil }); err != nil { @@ -116,9 +120,10 @@ func resourceAliyunEssScalingGroupCreate(d *schema.ResourceData, meta interface{ func resourceAliyunEssScalingGroupRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} - scaling, err := client.DescribeScalingGroupById(d.Id()) + scaling, err := essService.DescribeScalingGroupById(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -167,7 +172,7 @@ func resourceAliyunEssScalingGroupRead(d *schema.ResourceData, meta interface{}) func resourceAliyunEssScalingGroupUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).essconn + client := meta.(*connectivity.AliyunClient) args := ess.CreateModifyScalingGroupRequest() args.ScalingGroupId = d.Id() @@ -202,7 +207,10 @@ func resourceAliyunEssScalingGroupUpdate(d *schema.ResourceData, meta interface{ d.SetPartial("removal_policies") } - if _, err := conn.ModifyScalingGroup(args); err != nil { + _, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.ModifyScalingGroup(args) + }) + if err != nil { return err } @@ -212,12 +220,14 @@ func resourceAliyunEssScalingGroupUpdate(d *schema.ResourceData, meta interface{ } func resourceAliyunEssScalingGroupDelete(d *schema.ResourceData, meta interface{}) error { - - return meta.(*AliyunClient).DeleteScalingGroupById(d.Id()) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} + return essService.DeleteScalingGroupById(d.Id()) } func buildAlicloudEssScalingGroupArgs(d *schema.ResourceData, meta interface{}) (*ess.CreateScalingGroupRequest, error) { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} args := ess.CreateCreateScalingGroupRequest() args.MinSize = requests.NewInteger(d.Get("min_size").(int)) @@ -239,7 +249,7 @@ func buildAlicloudEssScalingGroupArgs(d *schema.ResourceData, meta interface{}) if lbs, ok := d.GetOk("loadbalancer_ids"); ok { for _, lb := range lbs.(*schema.Set).List() { - if err := client.WaitForLoadBalancer(lb.(string), Active, DefaultTimeout); err != nil { + if err := slbService.WaitForLoadBalancer(lb.(string), Active, DefaultTimeout); err != nil { return nil, fmt.Errorf("WaitForLoadbalancer %s %s got error: %#v", lb.(string), Active, err) } } diff --git a/alicloud/resource_alicloud_ess_scalinggroup_test.go b/alicloud/resource_alicloud_ess_scalinggroup_test.go index 91d4bbf188e..9a99c0415f0 100644 --- a/alicloud/resource_alicloud_ess_scalinggroup_test.go +++ b/alicloud/resource_alicloud_ess_scalinggroup_test.go @@ -13,6 +13,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -23,11 +24,11 @@ func init() { } func testSweepEssGroups(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -39,14 +40,17 @@ func testSweepEssGroups(region string) error { var groups []ess.ScalingGroup req := ess.CreateDescribeScalingGroupsRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.essconn.DescribeScalingGroups(req) + raw, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeScalingGroups(req) + }) if err != nil { return fmt.Errorf("Error retrieving Scaling groups: %s", err) } + resp, _ := raw.(*ess.DescribeScalingGroupsResponse) if resp == nil || len(resp.ScalingGroups.ScalingGroup) < 1 { break } @@ -83,7 +87,10 @@ func testSweepEssGroups(region string) error { req := ess.CreateDeleteScalingGroupRequest() req.ScalingGroupId = id req.ForceDelete = requests.NewBoolean(true) - if _, err := conn.essconn.DeleteScalingGroup(req); err != nil { + _, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DeleteScalingGroup(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Scaling Group (%s (%s)): %s", name, id, err) } } @@ -257,8 +264,9 @@ func testAccCheckEssScalingGroupExists(n string, d *ess.ScalingGroup) resource.T return fmt.Errorf("No ESS Scaling Group ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - attr, err := client.DescribeScalingGroupById(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} + attr, err := essService.DescribeScalingGroupById(rs.Primary.ID) log.Printf("[DEBUG] check scaling group %s attribute %#v", rs.Primary.ID, attr) if err != nil { @@ -271,14 +279,15 @@ func testAccCheckEssScalingGroupExists(n string, d *ess.ScalingGroup) resource.T } func testAccCheckEssScalingGroupDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_ess_scaling_group" { continue } - if _, err := client.DescribeScalingGroupById(rs.Primary.ID); err != nil { + if _, err := essService.DescribeScalingGroupById(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_ess_scalingrule.go b/alicloud/resource_alicloud_ess_scalingrule.go index 37d5026e09c..015fe28e1d3 100644 --- a/alicloud/resource_alicloud_ess_scalingrule.go +++ b/alicloud/resource_alicloud_ess_scalingrule.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudEssScalingRule() *schema.Resource { @@ -58,13 +59,15 @@ func resourceAliyunEssScalingRuleCreate(d *schema.ResourceData, meta interface{} return err } - essconn := meta.(*AliyunClient).essconn + client := meta.(*connectivity.AliyunClient) - rule, err := essconn.CreateScalingRule(args) + raw, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.CreateScalingRule(args) + }) if err != nil { return err } - + rule, _ := raw.(*ess.CreateScalingRuleResponse) d.SetId(d.Get("scaling_group_id").(string) + COLON_SEPARATED + rule.ScalingRuleId) return resourceAliyunEssScalingRuleUpdate(d, meta) @@ -72,10 +75,11 @@ func resourceAliyunEssScalingRuleCreate(d *schema.ResourceData, meta interface{} func resourceAliyunEssScalingRuleRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} ids := strings.Split(d.Id(), COLON_SEPARATED) - rule, err := client.DescribeScalingRuleById(ids[0], ids[1]) + rule, err := essService.DescribeScalingRuleById(ids[0], ids[1]) if err != nil { if NotFoundError(err) { d.SetId("") @@ -95,11 +99,12 @@ func resourceAliyunEssScalingRuleRead(d *schema.ResourceData, meta interface{}) } func resourceAliyunEssScalingRuleDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} ids := strings.Split(d.Id(), COLON_SEPARATED) return resource.Retry(2*time.Minute, func() *resource.RetryError { - err := client.DeleteScalingRuleById(ids[1]) + err := essService.DeleteScalingRuleById(ids[1]) if err != nil { if IsExceptedErrors(err, []string{InvalidScalingRuleIdNotFound}) { @@ -108,7 +113,7 @@ func resourceAliyunEssScalingRuleDelete(d *schema.ResourceData, meta interface{} return resource.RetryableError(fmt.Errorf("Delete scaling rule timeout and got an error:%#v.", err)) } - _, err = client.DescribeScalingRuleById(ids[0], ids[1]) + _, err = essService.DescribeScalingRuleById(ids[0], ids[1]) if err != nil { if NotFoundError(err) { return nil @@ -122,7 +127,7 @@ func resourceAliyunEssScalingRuleDelete(d *schema.ResourceData, meta interface{} func resourceAliyunEssScalingRuleUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).essconn + client := meta.(*connectivity.AliyunClient) ids := strings.Split(d.Id(), COLON_SEPARATED) args := ess.CreateModifyScalingRuleRequest() @@ -144,7 +149,10 @@ func resourceAliyunEssScalingRuleUpdate(d *schema.ResourceData, meta interface{} args.Cooldown = requests.NewInteger(d.Get("cooldown").(int)) } - if _, err := conn.ModifyScalingRule(args); err != nil { + _, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.ModifyScalingRule(args) + }) + if err != nil { return err } diff --git a/alicloud/resource_alicloud_ess_scalingrule_test.go b/alicloud/resource_alicloud_ess_scalingrule_test.go index 5441ddf4816..67a4336cd7a 100644 --- a/alicloud/resource_alicloud_ess_scalingrule_test.go +++ b/alicloud/resource_alicloud_ess_scalingrule_test.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudEssScalingRule_basic(t *testing.T) { @@ -108,9 +109,10 @@ func testAccCheckEssScalingRuleExists(n string, d *ess.ScalingRule) resource.Tes return fmt.Errorf("No ESS Scaling Rule ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} ids := strings.Split(rs.Primary.ID, COLON_SEPARATED) - attr, err := client.DescribeScalingRuleById(ids[0], ids[1]) + attr, err := essService.DescribeScalingRuleById(ids[0], ids[1]) log.Printf("[DEBUG] check scaling rule %s attribute %#v", rs.Primary.ID, attr) if err != nil { @@ -123,14 +125,15 @@ func testAccCheckEssScalingRuleExists(n string, d *ess.ScalingRule) resource.Tes } func testAccCheckEssScalingRuleDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_ess_scaling_rule" { continue } ids := strings.Split(rs.Primary.ID, COLON_SEPARATED) - _, err := client.DescribeScalingRuleById(ids[0], ids[1]) + _, err := essService.DescribeScalingRuleById(ids[0], ids[1]) // Verify the error is what we want if err != nil { diff --git a/alicloud/resource_alicloud_ess_schedule.go b/alicloud/resource_alicloud_ess_schedule.go index ac6d61112cd..ffb6899cbe6 100644 --- a/alicloud/resource_alicloud_ess_schedule.go +++ b/alicloud/resource_alicloud_ess_schedule.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudEssSchedule() *schema.Resource { @@ -76,13 +77,15 @@ func resourceAliyunEssScheduleCreate(d *schema.ResourceData, meta interface{}) e return err } - essconn := meta.(*AliyunClient).essconn + client := meta.(*connectivity.AliyunClient) - rule, err := essconn.CreateScheduledTask(args) + raw, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.CreateScheduledTask(args) + }) if err != nil { return err } - + rule, _ := raw.(*ess.CreateScheduledTaskResponse) d.SetId(rule.ScheduledTaskId) return resourceAliyunEssScheduleUpdate(d, meta) @@ -90,9 +93,10 @@ func resourceAliyunEssScheduleCreate(d *schema.ResourceData, meta interface{}) e func resourceAliyunEssScheduleRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} - rule, err := client.DescribeScheduleById(d.Id()) + rule, err := essService.DescribeScheduleById(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -116,7 +120,7 @@ func resourceAliyunEssScheduleRead(d *schema.ResourceData, meta interface{}) err func resourceAliyunEssScheduleUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).essconn + client := meta.(*connectivity.AliyunClient) args := ess.CreateModifyScheduledTaskRequest() args.ScheduledTaskId = d.Id() @@ -157,7 +161,10 @@ func resourceAliyunEssScheduleUpdate(d *schema.ResourceData, meta interface{}) e args.TaskEnabled = requests.NewBoolean(d.Get("task_enabled").(bool)) } - if _, err := conn.ModifyScheduledTask(args); err != nil { + _, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.ModifyScheduledTask(args) + }) + if err != nil { return err } @@ -165,16 +172,17 @@ func resourceAliyunEssScheduleUpdate(d *schema.ResourceData, meta interface{}) e } func resourceAliyunEssScheduleDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + essService := EssService{client} return resource.Retry(2*time.Minute, func() *resource.RetryError { - err := client.DeleteScheduleById(d.Id()) + err := essService.DeleteScheduleById(d.Id()) if err != nil { return resource.RetryableError(fmt.Errorf("Delete scaling schedule timeout and got an error:%#v.", err)) } - _, err = client.DescribeScheduleById(d.Id()) + _, err = essService.DescribeScheduleById(d.Id()) if err != nil { if NotFoundError(err) { return nil diff --git a/alicloud/resource_alicloud_ess_schedule_test.go b/alicloud/resource_alicloud_ess_schedule_test.go index 96d3103f268..46353d9afae 100644 --- a/alicloud/resource_alicloud_ess_schedule_test.go +++ b/alicloud/resource_alicloud_ess_schedule_test.go @@ -13,6 +13,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -23,11 +24,11 @@ func init() { } func testSweepEssSchedules(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -39,14 +40,17 @@ func testSweepEssSchedules(region string) error { var groups []ess.ScheduledTask req := ess.CreateDescribeScheduledTasksRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.essconn.DescribeScheduledTasks(req) + raw, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeScheduledTasks(req) + }) if err != nil { return fmt.Errorf("Error retrieving Scheduled Tasks: %s", err) } + resp, _ := raw.(*ess.DescribeScheduledTasksResponse) if resp == nil || len(resp.ScheduledTasks.ScheduledTask) < 1 { break } @@ -80,7 +84,10 @@ func testSweepEssSchedules(region string) error { log.Printf("[INFO] Deleting Scheduled Task: %s (%s)", name, id) req := ess.CreateDeleteScheduledTaskRequest() req.ScheduledTaskId = id - if _, err := conn.essconn.DeleteScheduledTask(req); err != nil { + _, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DeleteScheduledTask(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Scheduled Task (%s (%s)): %s", name, id, err) } } @@ -127,8 +134,9 @@ func testAccCheckEssScheduleExists(n string, d *ess.ScheduledTask) resource.Test return fmt.Errorf("No ESS Schedule ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - attr, err := client.DescribeScheduleById(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} + attr, err := essService.DescribeScheduleById(rs.Primary.ID) log.Printf("[DEBUG] check schedule %s attribute %#v", rs.Primary.ID, attr) if err != nil { @@ -141,13 +149,14 @@ func testAccCheckEssScheduleExists(n string, d *ess.ScheduledTask) resource.Test } func testAccCheckEssScheduleDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + essService := EssService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_ess_schedule" { continue } - if _, err := client.DescribeScheduleById(rs.Primary.ID); err != nil { + if _, err := essService.DescribeScheduleById(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_fc_function.go b/alicloud/resource_alicloud_fc_function.go index 3d95234d2d4..41080a8e78c 100644 --- a/alicloud/resource_alicloud_fc_function.go +++ b/alicloud/resource_alicloud_fc_function.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/fc-go-sdk" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudFCFunction() *schema.Resource { @@ -101,11 +102,7 @@ func resourceAlicloudFCFunction() *schema.Resource { } func resourceAlicloudFCFunctionCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) serviceName := d.Get("service").(string) var name string @@ -128,7 +125,7 @@ func resourceAlicloudFCFunctionCreate(d *schema.ResourceData, meta interface{}) Timeout: Int32Pointer(int32(d.Get("timeout").(int))), MemorySize: Int32Pointer(int32(d.Get("memory_size").(int))), } - code, err := getFunctionCode(d) + code, err := getFunctionCode(d, client) if err != nil { return err } @@ -137,14 +134,16 @@ func resourceAlicloudFCFunctionCreate(d *schema.ResourceData, meta interface{}) var function *fc.CreateFunctionOutput if err := resource.Retry(2*time.Minute, func() *resource.RetryError { - out, err := conn.CreateFunction(input) + raw, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.CreateFunction(input) + }) if err != nil { if IsExceptedErrors(err, []string{AccessDenied}) { return resource.RetryableError(fmt.Errorf("Error creating function compute service got an error: %#v", err)) } return resource.NonRetryableError(fmt.Errorf("Error creating function compute service got an error: %#v", err)) } - function = out + function, _ = raw.(*fc.CreateFunctionOutput) return nil }); err != nil { @@ -161,14 +160,15 @@ func resourceAlicloudFCFunctionCreate(d *schema.ResourceData, meta interface{}) } func resourceAlicloudFCFunctionRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + fcService := FcService{client} split := strings.Split(d.Id(), COLON_SEPARATED) if len(split) < 2 { return fmt.Errorf("Invalid resource ID %s. Please check it and try again.", d.Id()) } - function, err := client.DescribeFcFunction(split[0], split[1]) + function, err := fcService.DescribeFcFunction(split[0], split[1]) if err != nil { if NotFoundError(err) { d.SetId("") @@ -190,11 +190,7 @@ func resourceAlicloudFCFunctionRead(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudFCFunctionUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) d.Partial(true) updateInput := &fc.UpdateFunctionInput{} @@ -231,13 +227,16 @@ func resourceAlicloudFCFunctionUpdate(d *schema.ResourceData, meta interface{}) split := strings.Split(d.Id(), COLON_SEPARATED) updateInput.ServiceName = StringPointer(split[0]) updateInput.FunctionName = StringPointer(split[1]) - code, err := getFunctionCode(d) + code, err := getFunctionCode(d, client) if err != nil { return err } updateInput.Code = code - if _, err := conn.UpdateFunction(updateInput); err != nil { + _, err = client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.UpdateFunction(updateInput) + }) + if err != nil { return fmt.Errorf("UpdateFunction %s got an error: %#v.", d.Id(), err) } } @@ -247,25 +246,25 @@ func resourceAlicloudFCFunctionUpdate(d *schema.ResourceData, meta interface{}) } func resourceAlicloudFCFunctionDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) + fcService := FcService{client} split := strings.Split(d.Id(), COLON_SEPARATED) return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DeleteFunction(&fc.DeleteFunctionInput{ - ServiceName: StringPointer(split[0]), - FunctionName: StringPointer(split[1]), - }); err != nil { + _, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.DeleteFunction(&fc.DeleteFunctionInput{ + ServiceName: StringPointer(split[0]), + FunctionName: StringPointer(split[1]), + }) + }) + if err != nil { if IsExceptedErrors(err, []string{ServiceNotFound, FunctionNotFound}) { return nil } return resource.NonRetryableError(fmt.Errorf("Deleting function got an error: %#v.", err)) } - if _, err := client.DescribeFcFunction(split[0], split[1]); err != nil { + if _, err := fcService.DescribeFcFunction(split[0], split[1]); err != nil { if NotFoundError(err) { return nil } @@ -276,7 +275,7 @@ func resourceAlicloudFCFunctionDelete(d *schema.ResourceData, meta interface{}) } -func getFunctionCode(d *schema.ResourceData) (*fc.Code, error) { +func getFunctionCode(d *schema.ResourceData, client *connectivity.AliyunClient) (*fc.Code, error) { code := fc.NewCode() if filename, ok := d.GetOk("filename"); ok && filename.(string) != "" { file, err := loadFileContent(filename.(string)) diff --git a/alicloud/resource_alicloud_fc_function_test.go b/alicloud/resource_alicloud_fc_function_test.go index 77c7e090b0e..590a42bd411 100644 --- a/alicloud/resource_alicloud_fc_function_test.go +++ b/alicloud/resource_alicloud_fc_function_test.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudFCFunction_basic(t *testing.T) { @@ -66,9 +67,10 @@ func testAccCheckAlicloudFCFunctionExists(name string, service *fc.GetFunctionOu return fmt.Errorf("No Log store ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + fcService := FcService{client} split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - ser, err := client.DescribeFcFunction(split[0], split[1]) + ser, err := fcService.DescribeFcFunction(split[0], split[1]) if err != nil { return err } @@ -80,7 +82,8 @@ func testAccCheckAlicloudFCFunctionExists(name string, service *fc.GetFunctionOu } func testAccCheckAlicloudFCFunctionDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + fcService := FcService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_fc_function" { @@ -88,7 +91,7 @@ func testAccCheckAlicloudFCFunctionDestroy(s *terraform.State) error { } split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - if _, err := client.DescribeFcFunction(split[0], split[1]); err != nil { + if _, err := fcService.DescribeFcFunction(split[0], split[1]); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_fc_service.go b/alicloud/resource_alicloud_fc_service.go index 1f15a9590f6..8e7bc857cfe 100644 --- a/alicloud/resource_alicloud_fc_service.go +++ b/alicloud/resource_alicloud_fc_service.go @@ -4,6 +4,9 @@ import ( "fmt" "time" + "github.com/aliyun/aliyun-log-go-sdk" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" + "github.com/aliyun/fc-go-sdk" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" @@ -106,11 +109,7 @@ func resourceAlicloudFCService() *schema.Resource { } func resourceAlicloudFCServiceCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) var name string if v, ok := d.GetOk("name"); ok { @@ -143,13 +142,16 @@ func resourceAlicloudFCServiceCreate(d *schema.ResourceData, meta interface{}) e var service *fc.CreateServiceOutput if err := resource.Retry(2*time.Minute, func() *resource.RetryError { - service, err = conn.CreateService(input) + raw, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.CreateService(input) + }) if err != nil { if IsExceptedErrors(err, []string{AccessDenied, "does not exist"}) { return resource.RetryableError(fmt.Errorf("Error creating function compute service got an error: %#v", err)) } return resource.NonRetryableError(fmt.Errorf("Error creating function compute service got an error: %#v", err)) } + service, _ = raw.(*fc.CreateServiceOutput) return nil }); err != nil { @@ -166,9 +168,10 @@ func resourceAlicloudFCServiceCreate(d *schema.ResourceData, meta interface{}) e } func resourceAlicloudFCServiceRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + fcService := FcService{client} - service, err := client.DescribeFcService(d.Id()) + service, err := fcService.DescribeFcService(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -208,11 +211,7 @@ func resourceAlicloudFCServiceRead(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudFCServiceUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) d.Partial(true) updateInput := &fc.UpdateServiceInput{} @@ -250,7 +249,10 @@ func resourceAlicloudFCServiceUpdate(d *schema.ResourceData, meta interface{}) e if updateInput != nil { updateInput.ServiceName = StringPointer(d.Id()) - if _, err := conn.UpdateService(updateInput); err != nil { + _, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.UpdateService(updateInput) + }) + if err != nil { return fmt.Errorf("UpdateService %s got an error: %#v.", d.Id(), err) } } @@ -260,23 +262,23 @@ func resourceAlicloudFCServiceUpdate(d *schema.ResourceData, meta interface{}) e } func resourceAlicloudFCServiceDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) + fcService := FcService{client} return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DeleteService(&fc.DeleteServiceInput{ - ServiceName: StringPointer(d.Id()), - }); err != nil { + _, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.DeleteService(&fc.DeleteServiceInput{ + ServiceName: StringPointer(d.Id()), + }) + }) + if err != nil { if IsExceptedErrors(err, []string{ServiceNotFound}) { return nil } return resource.NonRetryableError(fmt.Errorf("Deleting function service got an error: %#v.", err)) } - if _, err := client.DescribeFcService(d.Id()); err != nil { + if _, err := fcService.DescribeFcService(d.Id()); err != nil { if NotFoundError(err) { return nil } @@ -288,6 +290,8 @@ func resourceAlicloudFCServiceDelete(d *schema.ResourceData, meta interface{}) e } func parseVpcConfig(d *schema.ResourceData, meta interface{}) (config *fc.VPCConfig, err error) { + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} if v, ok := d.GetOk("vpc_config"); ok { confs := v.([]interface{}) @@ -302,7 +306,7 @@ func parseVpcConfig(d *schema.ResourceData, meta interface{}) (config *fc.VPCCon } if conf != nil { vswitch_ids := conf["vswitch_ids"].(*schema.Set).List() - vsw, e := meta.(*AliyunClient).DescribeVswitch(vswitch_ids[0].(string)) + vsw, e := vpcService.DescribeVswitch(vswitch_ids[0].(string)) if e != nil { err = fmt.Errorf("While creating fc service, describing vswitch %s got an error: %#v.", vswitch_ids[0].(string), e) return @@ -318,6 +322,7 @@ func parseVpcConfig(d *schema.ResourceData, meta interface{}) (config *fc.VPCCon } func parseLogConfig(d *schema.ResourceData, meta interface{}) (project, logstore string, err error) { + client := meta.(*connectivity.AliyunClient) if v, ok := d.GetOk("log_config"); ok { configs := v.([]interface{}) @@ -334,7 +339,10 @@ func parseLogConfig(d *schema.ResourceData, meta interface{}) (project, logstore } if project != "" { err = resource.Retry(2*time.Minute, func() *resource.RetryError { - if _, e := meta.(*AliyunClient).logconn.CheckProjectExist(project); e != nil { + _, e := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return slsClient.CheckProjectExist(project) + }) + if e != nil { if NotFoundError(e) { return resource.RetryableError(fmt.Errorf("Check log project %s failed: %#v.", project, e)) } @@ -350,7 +358,10 @@ func parseLogConfig(d *schema.ResourceData, meta interface{}) (project, logstore if logstore != "" { err = resource.Retry(2*time.Minute, func() *resource.RetryError { - if _, e := meta.(*AliyunClient).logconn.CheckLogstoreExist(project, logstore); e != nil { + _, e := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return slsClient.CheckLogstoreExist(project, logstore) + }) + if e != nil { if NotFoundError(e) { return resource.RetryableError(fmt.Errorf("Check logstore %s failed: %#v.", logstore, e)) } diff --git a/alicloud/resource_alicloud_fc_service_test.go b/alicloud/resource_alicloud_fc_service_test.go index f2121a2dafb..cbc6a72e608 100644 --- a/alicloud/resource_alicloud_fc_service_test.go +++ b/alicloud/resource_alicloud_fc_service_test.go @@ -13,6 +13,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -23,11 +24,11 @@ func init() { } func testSweepFCServices(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -38,34 +39,35 @@ func testSweepFCServices(region string) error { "test-acc-alicloud", } - fcconn, err := conn.Fcconn() + raw, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.ListServices(fc.NewListServicesInput()) + }) if err != nil { - return fmt.Errorf("error getting fc conn: %s", err) - } - - if services, err := fcconn.ListServices(fc.NewListServicesInput()); err != nil { return fmt.Errorf("Error retrieving FC services: %s", err) - } else { - for _, v := range services.Services { - name := *v.ServiceName - id := *v.ServiceID - skip := true - for _, prefix := range prefixes { - if strings.HasPrefix(strings.ToLower(name), strings.ToLower(prefix)) { - skip = false - break - } - } - if skip { - log.Printf("[INFO] Skipping FC services: %s (%s)", name, id) - continue + } + services, _ := raw.(*fc.ListServicesOutput) + for _, v := range services.Services { + name := *v.ServiceName + id := *v.ServiceID + skip := true + for _, prefix := range prefixes { + if strings.HasPrefix(strings.ToLower(name), strings.ToLower(prefix)) { + skip = false + break } - log.Printf("[INFO] Deleting FC services: %s (%s)", name, id) - if _, err := conn.fcconn.DeleteService(&fc.DeleteServiceInput{ + } + if skip { + log.Printf("[INFO] Skipping FC services: %s (%s)", name, id) + continue + } + log.Printf("[INFO] Deleting FC services: %s (%s)", name, id) + _, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.DeleteService(&fc.DeleteServiceInput{ ServiceName: StringPointer(name), - }); err != nil { - log.Printf("[ERROR] Failed to delete FC services (%s (%s)): %s", name, id, err) - } + }) + }) + if err != nil { + log.Printf("[ERROR] Failed to delete FC services (%s (%s)): %s", name, id, err) } } return nil @@ -154,9 +156,10 @@ func testAccCheckAlicloudFCServiceExists(name string, service *fc.GetServiceOutp return fmt.Errorf("No Log store ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + fcService := FcService{client} - ser, err := client.DescribeFcService(rs.Primary.ID) + ser, err := fcService.DescribeFcService(rs.Primary.ID) if err != nil { return err } @@ -168,14 +171,15 @@ func testAccCheckAlicloudFCServiceExists(name string, service *fc.GetServiceOutp } func testAccCheckAlicloudFCServiceDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + fcService := FcService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_fc_service" { continue } - ser, err := client.DescribeFcService(rs.Primary.ID) + ser, err := fcService.DescribeFcService(rs.Primary.ID) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_fc_trigger.go b/alicloud/resource_alicloud_fc_trigger.go index fe5e0e31a93..875e7c0b005 100644 --- a/alicloud/resource_alicloud_fc_trigger.go +++ b/alicloud/resource_alicloud_fc_trigger.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/fc-go-sdk" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudFCTrigger() *schema.Resource { @@ -71,7 +72,7 @@ func resourceAlicloudFCTrigger() *schema.Resource { Type: schema.TypeString, Required: true, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { - equal, _ := CompareJsonTemplateAreEquivalent(old, new) + equal, _ := compareJsonTemplateAreEquivalent(old, new) return equal }, ValidateFunc: validateJsonString, @@ -94,11 +95,7 @@ func resourceAlicloudFCTrigger() *schema.Resource { } func resourceAlicloudFCTriggerCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) serviceName := d.Get("service").(string) fcName := d.Get("function").(string) @@ -132,14 +129,16 @@ func resourceAlicloudFCTriggerCreate(d *schema.ResourceData, meta interface{}) e } var trigger *fc.CreateTriggerOutput if err := resource.Retry(2*time.Minute, func() *resource.RetryError { - out, err := conn.CreateTrigger(input) + raw, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.CreateTrigger(input) + }) if err != nil { if IsExceptedErrors(err, []string{AccessDenied}) { return resource.RetryableError(fmt.Errorf("Error creating function compute service got an error: %#v", err)) } return resource.NonRetryableError(fmt.Errorf("Error creating function compute trigger got an error: %#v", err)) } - trigger = out + trigger, _ = raw.(*fc.CreateTriggerOutput) return nil }); err != nil { @@ -156,13 +155,14 @@ func resourceAlicloudFCTriggerCreate(d *schema.ResourceData, meta interface{}) e } func resourceAlicloudFCTriggerRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + fcService := FcService{client} split := strings.Split(d.Id(), COLON_SEPARATED) if len(split) < 3 { return fmt.Errorf("Invalid resource ID %s. Please check it and try again.", d.Id()) } - trigger, err := client.DescribeFcTrigger(split[0], split[1], split[2]) + trigger, err := fcService.DescribeFcTrigger(split[0], split[1], split[2]) if err != nil { if NotFoundError(err) { d.SetId("") @@ -184,11 +184,7 @@ func resourceAlicloudFCTriggerRead(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudFCTriggerUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) d.Partial(true) updateInput := &fc.UpdateTriggerInput{} @@ -215,7 +211,10 @@ func resourceAlicloudFCTriggerUpdate(d *schema.ResourceData, meta interface{}) e updateInput.FunctionName = StringPointer(split[1]) updateInput.TriggerName = StringPointer(split[2]) - if _, err := conn.UpdateTrigger(updateInput); err != nil { + _, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.UpdateTrigger(updateInput) + }) + if err != nil { return fmt.Errorf("UpdateTrigger %s got an error: %#v.", d.Id(), err) } } @@ -225,29 +224,30 @@ func resourceAlicloudFCTriggerUpdate(d *schema.ResourceData, meta interface{}) e } func resourceAlicloudFCTriggerDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn, err := client.Fcconn() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) + fcService := FcService{client} + split := strings.Split(d.Id(), COLON_SEPARATED) if len(split) < 3 { return fmt.Errorf("Invalid resource ID %s. Please check it and try again.", d.Id()) } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DeleteTrigger(&fc.DeleteTriggerInput{ - ServiceName: StringPointer(split[0]), - FunctionName: StringPointer(split[1]), - TriggerName: StringPointer(split[2]), - }); err != nil { + _, err := client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.DeleteTrigger(&fc.DeleteTriggerInput{ + ServiceName: StringPointer(split[0]), + FunctionName: StringPointer(split[1]), + TriggerName: StringPointer(split[2]), + }) + }) + if err != nil { if IsExceptedErrors(err, []string{ServiceNotFound, FunctionNotFound, TriggerNotFound}) { return nil } return resource.NonRetryableError(fmt.Errorf("Deleting trigger got an error: %#v.", err)) } - if _, err := client.DescribeFcTrigger(split[0], split[1], split[2]); err != nil { + if _, err := fcService.DescribeFcTrigger(split[0], split[1], split[2]); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_fc_trigger_test.go b/alicloud/resource_alicloud_fc_trigger_test.go index 3984d45e493..5e1fb9f1433 100644 --- a/alicloud/resource_alicloud_fc_trigger_test.go +++ b/alicloud/resource_alicloud_fc_trigger_test.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudFCTrigger_log(t *testing.T) { @@ -66,9 +67,10 @@ func testAccCheckAlicloudFCTriggerExists(name string, trigger *fc.GetTriggerOutp return fmt.Errorf("No Log store ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + fcService := FcService{client} split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - ser, err := client.DescribeFcTrigger(split[0], split[1], split[2]) + ser, err := fcService.DescribeFcTrigger(split[0], split[1], split[2]) if err != nil { return err } @@ -79,7 +81,8 @@ func testAccCheckAlicloudFCTriggerExists(name string, trigger *fc.GetTriggerOutp } func testAccCheckAlicloudFCTriggerDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + fcService := FcService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_fc_trigger" { @@ -87,7 +90,7 @@ func testAccCheckAlicloudFCTriggerDestroy(s *terraform.State) error { } split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - ser, err := client.DescribeFcTrigger(split[0], split[1], split[2]) + ser, err := fcService.DescribeFcTrigger(split[0], split[1], split[2]) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_forward.go b/alicloud/resource_alicloud_forward.go index cdde4137d6b..be3c7b8342c 100644 --- a/alicloud/resource_alicloud_forward.go +++ b/alicloud/resource_alicloud_forward.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunForwardEntry() *schema.Resource { @@ -52,10 +53,10 @@ func resourceAliyunForwardEntry() *schema.Resource { } func resourceAliyunForwardEntryCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) args := vpc.CreateCreateForwardEntryRequest() - args.RegionId = string(getRegion(d, meta)) + args.RegionId = string(client.Region) args.ForwardTableId = d.Get("forward_table_id").(string) args.ExternalIp = d.Get("external_ip").(string) args.ExternalPort = d.Get("external_port").(string) @@ -65,13 +66,16 @@ func resourceAliyunForwardEntryCreate(d *schema.ResourceData, meta interface{}) if err := resource.Retry(2*time.Minute, func() *resource.RetryError { ar := args - resp, err := conn.CreateForwardEntry(ar) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateForwardEntry(ar) + }) if err != nil { if IsExceptedError(err, InvalidIpNotInNatgw) { return resource.RetryableError(fmt.Errorf("CreateForwardEntry timeout and got error: %#v", err)) } return resource.NonRetryableError(fmt.Errorf("CreateNatGateway got error: %#v", err)) } + resp, _ := raw.(*vpc.CreateForwardEntryResponse) d.SetId(resp.ForwardEntryId) d.Set("forward_table_id", d.Get("forward_table_id").(string)) return nil @@ -83,9 +87,10 @@ func resourceAliyunForwardEntryCreate(d *schema.ResourceData, meta interface{}) } func resourceAliyunForwardEntryRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - forwardEntry, err := client.DescribeForwardEntry(d.Get("forward_table_id").(string), d.Id()) + forwardEntry, err := vpcService.DescribeForwardEntry(d.Get("forward_table_id").(string), d.Id()) if err != nil { if NotFoundError(err) { @@ -106,9 +111,10 @@ func resourceAliyunForwardEntryRead(d *schema.ResourceData, meta interface{}) er } func resourceAliyunForwardEntryUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - forwardEntry, err := client.DescribeForwardEntry(d.Get("forward_table_id").(string), d.Id()) + forwardEntry, err := vpcService.DescribeForwardEntry(d.Get("forward_table_id").(string), d.Id()) if err != nil { return err } @@ -116,7 +122,7 @@ func resourceAliyunForwardEntryUpdate(d *schema.ResourceData, meta interface{}) d.Partial(true) attributeUpdate := false args := vpc.CreateModifyForwardEntryRequest() - args.RegionId = string(getRegion(d, meta)) + args.RegionId = string(client.Region) args.ForwardTableId = forwardEntry.ForwardTableId args.ForwardEntryId = forwardEntry.ForwardEntryId args.ExternalIp = forwardEntry.ExternalIp @@ -144,7 +150,10 @@ func resourceAliyunForwardEntryUpdate(d *schema.ResourceData, meta interface{}) } if attributeUpdate { - if _, err := client.vpcconn.ModifyForwardEntry(args); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyForwardEntry(args) + }) + if err != nil { return err } } @@ -156,14 +165,18 @@ func resourceAliyunForwardEntryUpdate(d *schema.ResourceData, meta interface{}) func resourceAliyunForwardEntryDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} args := vpc.CreateDeleteForwardEntryRequest() - args.RegionId = string(getRegion(d, meta)) + args.RegionId = string(client.Region) args.ForwardTableId = d.Get("forward_table_id").(string) args.ForwardEntryId = d.Id() return resource.Retry(3*time.Minute, func() *resource.RetryError { - if _, err := client.vpcconn.DeleteForwardEntry(args); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteForwardEntry(args) + }) + if err != nil { if IsExceptedError(err, InvalidForwardEntryIdNotFound) || IsExceptedError(err, InvalidForwardTableIdNotFound) { return nil @@ -171,7 +184,7 @@ func resourceAliyunForwardEntryDelete(d *schema.ResourceData, meta interface{}) return resource.NonRetryableError(err) } - forwardEntry, err := client.DescribeForwardEntry(d.Get("forward_table_id").(string), d.Id()) + forwardEntry, err := vpcService.DescribeForwardEntry(d.Get("forward_table_id").(string), d.Id()) if err != nil { if NotFoundError(err) { diff --git a/alicloud/resource_alicloud_forward_test.go b/alicloud/resource_alicloud_forward_test.go index fcd4ef6159a..6cff6249355 100644 --- a/alicloud/resource_alicloud_forward_test.go +++ b/alicloud/resource_alicloud_forward_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudForward_basic(t *testing.T) { @@ -43,7 +44,8 @@ func TestAccAlicloudForward_basic(t *testing.T) { } func testAccCheckForwardEntryDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_snat_entry" { @@ -51,7 +53,7 @@ func testAccCheckForwardEntryDestroy(s *terraform.State) error { } // Try to find the Snat entry - if _, err := client.DescribeForwardEntry(rs.Primary.Attributes["forward_table_id"], rs.Primary.ID); err != nil { + if _, err := vpcService.DescribeForwardEntry(rs.Primary.Attributes["forward_table_id"], rs.Primary.ID); err != nil { if NotFoundError(err) { continue } @@ -77,8 +79,9 @@ func testAccCheckForwardEntryExists(n string, snat *vpc.ForwardTableEntry) resou return fmt.Errorf("No ForwardEntry ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeForwardEntry(rs.Primary.Attributes["forward_table_id"], rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} + instance, err := vpcService.DescribeForwardEntry(rs.Primary.Attributes["forward_table_id"], rs.Primary.ID) if err != nil { return err diff --git a/alicloud/resource_alicloud_havip.go b/alicloud/resource_alicloud_havip.go index 47a6b36f5fd..fb0810a0006 100644 --- a/alicloud/resource_alicloud_havip.go +++ b/alicloud/resource_alicloud_havip.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunHaVip() *schema.Resource { @@ -42,31 +43,36 @@ func resourceAliyunHaVip() *schema.Resource { } func resourceAliyunHaVipCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + haVipService := HaVipService{client} request := vpc.CreateCreateHaVipRequest() - request.RegionId = getRegionId(d, meta) + request.RegionId = client.RegionId request.VSwitchId = d.Get("vswitch_id").(string) request.IpAddress = d.Get("ip_address").(string) request.Description = d.Get("description").(string) request.ClientToken = buildClientToken("TF-AllocateHaVip") - havip, err := client.vpcconn.CreateHaVip(request) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateHaVip(request) + }) if err != nil { return err } + havip, _ := raw.(*vpc.CreateHaVipResponse) d.SetId(havip.HaVipId) - if err := client.WaitForHaVip(havip.HaVipId, Available, 2*DefaultTimeout); err != nil { + if err := haVipService.WaitForHaVip(havip.HaVipId, Available, 2*DefaultTimeout); err != nil { return fmt.Errorf("WaitHaVip %s got error: %#v, %s", Available, err, havip.HaVipId) } return resourceAliyunHaVipRead(d, meta) } func resourceAliyunHaVipRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + haVipService := HaVipService{client} - resp, err := client.DescribeHaVip(d.Id()) + resp, err := haVipService.DescribeHaVip(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -83,12 +89,15 @@ func resourceAliyunHaVipRead(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunHaVipUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) if d.HasChange("description") { request := vpc.CreateModifyHaVipAttributeRequest() request.HaVipId = d.Id() request.Description = d.Get("description").(string) - if _, err := client.vpcconn.ModifyHaVipAttribute(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyHaVipAttribute(request) + }) + if err != nil { return err } } @@ -97,22 +106,26 @@ func resourceAliyunHaVipUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunHaVipDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + haVipService := HaVipService{client} - if err := client.WaitForHaVip(d.Id(), Available, 2*DefaultTimeout); err != nil { + if err := haVipService.WaitForHaVip(d.Id(), Available, 2*DefaultTimeout); err != nil { return fmt.Errorf("WaitHaVip %s got error: %#v, %s", Available, err, d.Id()) } request := vpc.CreateDeleteHaVipRequest() request.HaVipId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := client.vpcconn.DeleteHaVip(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteHaVip(request) + }) + if err != nil { if IsExceptedError(err, InvalidHaVipIdNotFound) { return nil } return resource.NonRetryableError(err) } - if _, err := client.DescribeHaVip(d.Id()); err != nil { + if _, err := haVipService.DescribeHaVip(d.Id()); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_havip_attachment.go b/alicloud/resource_alicloud_havip_attachment.go index 5d2ef8ecfd3..14c3eb567fd 100644 --- a/alicloud/resource_alicloud_havip_attachment.go +++ b/alicloud/resource_alicloud_havip_attachment.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunHaVipAttachment() *schema.Resource { @@ -34,14 +35,18 @@ func resourceAliyunHaVipAttachment() *schema.Resource { } func resourceAliyunHaVipAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + haVipService := HaVipService{client} args := vpc.CreateAssociateHaVipRequest() args.HaVipId = Trim(d.Get("havip_id").(string)) args.InstanceId = Trim(d.Get("instance_id").(string)) if err := resource.Retry(5*time.Minute, func() *resource.RetryError { ar := args - if _, err := client.vpcconn.AssociateHaVip(ar); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.AssociateHaVip(ar) + }) + if err != nil { if IsExceptedErrors(err, []string{TaskConflict, IncorrectHaVipStatus, InvalidVipStatus}) { return resource.RetryableError(fmt.Errorf("AssociateHaVip got an error: %#v", err)) } @@ -52,7 +57,7 @@ func resourceAliyunHaVipAttachmentCreate(d *schema.ResourceData, meta interface{ return err } //check the havip attachment - if err := client.WaitForHaVipAttachment(args.HaVipId, args.InstanceId, 5*DefaultTimeout); err != nil { + if err := haVipService.WaitForHaVipAttachment(args.HaVipId, args.InstanceId, 5*DefaultTimeout); err != nil { return fmt.Errorf("Wait for havip attachment got error: %#v", err) } @@ -62,10 +67,11 @@ func resourceAliyunHaVipAttachmentCreate(d *schema.ResourceData, meta interface{ } func resourceAliyunHaVipAttachmentRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + haVipService := HaVipService{client} haVipId, instanceId, err := getHaVipIdAndInstanceId(d, meta) - err = client.DescribeHaVipAttachment(haVipId, instanceId) + err = haVipService.DescribeHaVipAttachment(haVipId, instanceId) if err != nil { if NotFoundError(err) { @@ -81,8 +87,8 @@ func resourceAliyunHaVipAttachmentRead(d *schema.ResourceData, meta interface{}) } func resourceAliyunHaVipAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + haVipService := HaVipService{client} haVipId, instanceId, err := getHaVipIdAndInstanceId(d, meta) if err != nil { @@ -94,7 +100,9 @@ func resourceAliyunHaVipAttachmentDelete(d *schema.ResourceData, meta interface{ request.InstanceId = instanceId return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.vpcconn.UnassociateHaVip(request) + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.UnassociateHaVip(request) + }) //Waiting for unassociate the havip if err != nil { if IsExceptedError(err, TaskConflict) { @@ -102,7 +110,7 @@ func resourceAliyunHaVipAttachmentDelete(d *schema.ResourceData, meta interface{ } } //Eusure the instance has been unassociated truly. - err = client.DescribeHaVipAttachment(haVipId, instanceId) + err = haVipService.DescribeHaVipAttachment(haVipId, instanceId) if err != nil { if NotFoundError(err) { return nil diff --git a/alicloud/resource_alicloud_havip_attachment_test.go b/alicloud/resource_alicloud_havip_attachment_test.go index 91c35b97da1..bcf6d8b32c5 100644 --- a/alicloud/resource_alicloud_havip_attachment_test.go +++ b/alicloud/resource_alicloud_havip_attachment_test.go @@ -7,6 +7,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) // At present, only white list users can operate HaVip Resource. So close havip sweeper. @@ -116,13 +117,14 @@ func testAccCheckHaVipAttachmentExists(n string) resource.TestCheckFunc { if rs.Primary.ID == "" { return fmt.Errorf("No HaVip ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + haVipService := HaVipService{client} parts := strings.Split(rs.Primary.ID, COLON_SEPARATED) if len(parts) != 2 { return fmt.Errorf("invalid resource id") } - err := client.DescribeHaVipAttachment(parts[0], parts[1]) + err := haVipService.DescribeHaVipAttachment(parts[0], parts[1]) if err != nil { return fmt.Errorf("Describe HaVip attachment error %#v", err) } @@ -131,7 +133,8 @@ func testAccCheckHaVipAttachmentExists(n string) resource.TestCheckFunc { } func testAccCheckHaVipAttachmentDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + haVipService := HaVipService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_havip_attachment" { continue @@ -141,7 +144,7 @@ func testAccCheckHaVipAttachmentDestroy(s *terraform.State) error { if len(parts) != 2 { return fmt.Errorf("invalid resource id") } - err := client.DescribeHaVipAttachment(parts[0], parts[1]) + err := haVipService.DescribeHaVipAttachment(parts[0], parts[1]) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_havip_test.go b/alicloud/resource_alicloud_havip_test.go index cfac795994a..522ed7e540c 100644 --- a/alicloud/resource_alicloud_havip_test.go +++ b/alicloud/resource_alicloud_havip_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) // At present, only white list users can operate HaVip Resource. So close havip sweeper. @@ -152,8 +153,9 @@ func testAccCheckHaVipExists(n string, havip vpc.HaVip) resource.TestCheckFunc { if rs.Primary.ID == "" { return fmt.Errorf("No HaVip ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeHaVip(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + haVipService := HaVipService{client} + instance, err := haVipService.DescribeHaVip(rs.Primary.ID) if err != nil { return err } @@ -163,12 +165,13 @@ func testAccCheckHaVipExists(n string, havip vpc.HaVip) resource.TestCheckFunc { } func testAccCheckHaVipDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + haVipService := HaVipService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_havip" { continue } - instance, err := client.DescribeHaVip(rs.Primary.ID) + instance, err := haVipService.DescribeHaVip(rs.Primary.ID) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_instance.go b/alicloud/resource_alicloud_instance.go index 736c96184ca..41a9bbb3818 100644 --- a/alicloud/resource_alicloud_instance.go +++ b/alicloud/resource_alicloud_instance.go @@ -12,6 +12,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunInstance() *schema.Resource { @@ -250,15 +251,15 @@ func resourceAliyunInstance() *schema.Resource { } func resourceAliyunInstanceCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.ecsconn + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} // Ensure instance_type is valid - zoneId, validZones, err := meta.(*AliyunClient).DescribeAvailableResources(d, meta, InstanceTypeResource) + zoneId, validZones, err := ecsService.DescribeAvailableResources(d, meta, InstanceTypeResource) if err != nil { return err } - if err := meta.(*AliyunClient).InstanceTypeValidation(d.Get("instance_type").(string), zoneId, validZones); err != nil { + if err := ecsService.InstanceTypeValidation(d.Get("instance_type").(string), zoneId, validZones); err != nil { return err } @@ -271,10 +272,13 @@ func resourceAliyunInstanceCreate(d *schema.ResourceData, meta interface{}) erro args.IoOptimized = "none" } - resp, err := conn.CreateInstance(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.CreateInstance(args) + }) if err != nil { return fmt.Errorf("Error creating Aliyun ecs instance: %#v", err) } + resp, _ := raw.(*ecs.CreateInstanceResponse) if resp == nil { return fmt.Errorf("Creating Ecs instance got a response: %#v.", resp) } @@ -283,7 +287,7 @@ func resourceAliyunInstanceCreate(d *schema.ResourceData, meta interface{}) erro // after instance created, its status is pending, // so we need to wait it become to stopped and then start it - if err := client.WaitForEcsInstance(d.Id(), Stopped, DefaultTimeoutMedium); err != nil { + if err := ecsService.WaitForEcsInstance(d.Id(), Stopped, DefaultTimeoutMedium); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Stopped, err) } @@ -294,18 +298,24 @@ func resourceAliyunInstanceCreate(d *schema.ResourceData, meta interface{}) erro if out > 0 { req := ecs.CreateAllocatePublicIpAddressRequest() req.InstanceId = d.Id() - if _, err := conn.AllocatePublicIpAddress(req); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.AllocatePublicIpAddress(req) + }) + if err != nil { return fmt.Errorf("[DEBUG] AllocatePublicIpAddress for instance got error: %#v", err) } } startArgs := ecs.CreateStartInstanceRequest() startArgs.InstanceId = d.Id() - if _, err := conn.StartInstance(startArgs); err != nil { + _, err = client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.StartInstance(startArgs) + }) + if err != nil { return fmt.Errorf("Start instance got error: %#v", err) } - if err := client.WaitForEcsInstance(d.Id(), Running, DefaultTimeoutMedium); err != nil { + if err := ecsService.WaitForEcsInstance(d.Id(), Running, DefaultTimeoutMedium); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } @@ -313,10 +323,10 @@ func resourceAliyunInstanceCreate(d *schema.ResourceData, meta interface{}) erro } func resourceAliyunInstanceRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.ecsconn + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} - instance, err := client.DescribeInstanceById(d.Id()) + instance, err := ecsService.DescribeInstanceById(d.Id()) if err != nil { if NotFoundError(err) { @@ -326,7 +336,7 @@ func resourceAliyunInstanceRead(d *schema.ResourceData, meta interface{}) error return fmt.Errorf("Error DescribeInstanceAttribute: %#v", err) } - disk, diskErr := client.QueryInstanceSystemDisk(d.Id()) + disk, diskErr := ecsService.QueryInstanceSystemDisk(d.Id()) if diskErr != nil { if NotFoundError(diskErr) { @@ -381,11 +391,14 @@ func resourceAliyunInstanceRead(d *schema.ResourceData, meta interface{}) error if d.Get("user_data").(string) != "" { args := ecs.CreateDescribeUserDataRequest() args.InstanceId = d.Id() - resp, err := conn.DescribeUserData(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeUserData(args) + }) if err != nil { log.Printf("[ERROR] DescribeUserData for instance got error: %#v", err) } + resp, _ := raw.(*ecs.DescribeUserDataResponse) if resp != nil { d.Set("user_data", userDataHashSum(resp.UserData)) } @@ -394,11 +407,13 @@ func resourceAliyunInstanceRead(d *schema.ResourceData, meta interface{}) error if len(instance.VpcAttributes.VSwitchId) > 0 { args := ecs.CreateDescribeInstanceRamRoleRequest() args.InstanceIds = convertListToJsonString([]interface{}{d.Id()}) - response, err := conn.DescribeInstanceRamRole(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstanceRamRole(args) + }) if err != nil { return fmt.Errorf("[ERROR] DescribeInstanceRamRole for instance got error: %#v", err) } - + response, _ := raw.(*ecs.DescribeInstanceRamRoleResponse) if response != nil && len(response.InstanceRamRoleSets.InstanceRamRoleSet) > 1 { d.Set("role_name", response.InstanceRamRoleSets.InstanceRamRoleSet[0].RamRoleName) } @@ -407,10 +422,13 @@ func resourceAliyunInstanceRead(d *schema.ResourceData, meta interface{}) error if instance.InstanceChargeType == string(PrePaid) { args := ecs.CreateDescribeInstanceAutoRenewAttributeRequest() args.InstanceId = d.Id() - resp, err := conn.DescribeInstanceAutoRenewAttribute(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstanceAutoRenewAttribute(args) + }) if err != nil { return fmt.Errorf("DescribeInstanceAutoRenewAttribute got an error: %#v.", err) } + resp, _ := raw.(*ecs.DescribeInstanceAutoRenewAttributeResponse) if resp != nil && len(resp.InstanceRenewAttributes.InstanceRenewAttribute) > 0 { renew := resp.InstanceRenewAttributes.InstanceRenewAttribute[0] d.Set("renewal_status", renew.RenewalStatus) @@ -418,7 +436,7 @@ func resourceAliyunInstanceRead(d *schema.ResourceData, meta interface{}) error } } - tags, err := client.DescribeTags(d.Id(), TagResourceInstance) + tags, err := ecsService.DescribeTags(d.Id(), TagResourceInstance) if err != nil && !NotFoundError(err) { return fmt.Errorf("[ERROR] DescribeTags for instance got error: %#v", err) } @@ -430,8 +448,8 @@ func resourceAliyunInstanceRead(d *schema.ResourceData, meta interface{}) error } func resourceAliyunInstanceUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.ecsconn + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} d.Partial(true) @@ -451,13 +469,13 @@ func resourceAliyunInstanceUpdate(d *schema.ResourceData, meta interface{}) erro al := expandStringList(ns.Difference(os).List()) if len(al) > 0 { - err := client.JoinSecurityGroups(d.Id(), al) + err := ecsService.JoinSecurityGroups(d.Id(), al) if err != nil { return err } } if len(rl) > 0 { - err := client.LeaveSecurityGroups(d.Id(), rl) + err := ecsService.LeaveSecurityGroups(d.Id(), rl) if err != nil { return err } @@ -465,6 +483,25 @@ func resourceAliyunInstanceUpdate(d *schema.ResourceData, meta interface{}) erro d.SetPartial("security_groups") } + if d.HasChange("renewal_status") || d.HasChange("auto_renew_period") { + status := d.Get("renewal_status").(string) + args := ecs.CreateModifyInstanceAutoRenewAttributeRequest() + args.InstanceId = d.Id() + args.RenewalStatus = status + + if status == string(RenewAutoRenewal) { + args.Duration = requests.NewInteger(d.Get("auto_renew_period").(int)) + } + + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ModifyInstanceAutoRenewAttribute(args) + }) + if err != nil { + return fmt.Errorf("ModifyInstanceAutoRenewAttribute got an error: %#v", err) + } + d.SetPartial("renewal_status") + d.SetPartial("auto_renew_period") + } run := false imageUpdate, err := modifyInstanceImage(d, meta, run) @@ -489,7 +526,7 @@ func resourceAliyunInstanceUpdate(d *schema.ResourceData, meta interface{}) erro if imageUpdate || vpcUpdate || passwordUpdate || typeUpdate { run = true log.Printf("[INFO] Need rebooting to make all changes valid.") - instance, errDesc := client.DescribeInstanceById(d.Id()) + instance, errDesc := ecsService.DescribeInstanceById(d.Id()) if errDesc != nil { return fmt.Errorf("Describe instance got an error: %#v", errDesc) } @@ -498,12 +535,15 @@ func resourceAliyunInstanceUpdate(d *schema.ResourceData, meta interface{}) erro stop := ecs.CreateStopInstanceRequest() stop.InstanceId = d.Id() stop.ForceStop = requests.NewBoolean(false) - if _, err := conn.StopInstance(stop); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.StopInstance(stop) + }) + if err != nil { return fmt.Errorf("StopInstance got error: %#v", err) } } - if err := client.WaitForEcsInstance(d.Id(), Stopped, DefaultTimeout); err != nil { + if err := ecsService.WaitForEcsInstance(d.Id(), Stopped, DefaultTimeout); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Stopped, err) } @@ -523,12 +563,15 @@ func resourceAliyunInstanceUpdate(d *schema.ResourceData, meta interface{}) erro start := ecs.CreateStartInstanceRequest() start.InstanceId = d.Id() - if _, err := conn.StartInstance(start); err != nil { + _, err = client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.StartInstance(start) + }) + if err != nil { return fmt.Errorf("StartInstance got error: %#v", err) } // Start instance sometimes costs more than 8 minutes when os type is centos. - if err := client.WaitForEcsInstance(d.Id(), Running, DefaultTimeoutMedium); err != nil { + if err := ecsService.WaitForEcsInstance(d.Id(), Running, DefaultTimeoutMedium); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } } @@ -558,7 +601,10 @@ func resourceAliyunInstanceUpdate(d *schema.ResourceData, meta interface{}) erro args.Duration = requests.NewInteger(d.Get("auto_renew_period").(int)) } - if _, err := client.ecsconn.ModifyInstanceAutoRenewAttribute(args); err != nil { + _, err = client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ModifyInstanceAutoRenewAttribute(args) + }) + if err != nil { return fmt.Errorf("ModifyInstanceAutoRenewAttribute got an error: %#v", err) } d.SetPartial("renewal_status") @@ -574,8 +620,9 @@ func resourceAliyunInstanceUpdate(d *schema.ResourceData, meta interface{}) erro } func resourceAliyunInstanceDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.ecsconn + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} + if d.Get("instance_charge_type").(string) == string(PrePaid) { force := d.Get("force_delete").(bool) if !force { @@ -593,7 +640,7 @@ func resourceAliyunInstanceDelete(d *schema.ResourceData, meta interface{}) erro deld.Force = requests.NewBoolean(true) return resource.Retry(5*time.Minute, func() *resource.RetryError { - instance, err := client.DescribeInstanceById(d.Id()) + instance, err := ecsService.DescribeInstanceById(d.Id()) if err != nil { if NotFoundError(err) { return nil @@ -601,16 +648,22 @@ func resourceAliyunInstanceDelete(d *schema.ResourceData, meta interface{}) erro } if instance.Status != string(Stopped) { - if _, err := conn.StopInstance(stop); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.StopInstance(stop) + }) + if err != nil { return resource.RetryableError(fmt.Errorf("Stop instance timeout and got an error: %#v.", err)) } - if err := client.WaitForEcsInstance(d.Id(), Stopped, DefaultTimeout); err != nil { + if err := ecsService.WaitForEcsInstance(d.Id(), Stopped, DefaultTimeout); err != nil { return resource.RetryableError(fmt.Errorf("Waiting for ecs stopped timeout and got an error: %#v.", err)) } } - if _, err := conn.DeleteInstance(deld); err != nil { + _, err = client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DeleteInstance(deld) + }) + if err != nil { if NotFoundError(err) || IsExceptedErrors(err, EcsNotFound) { return nil } @@ -623,7 +676,8 @@ func resourceAliyunInstanceDelete(d *schema.ResourceData, meta interface{}) erro } func buildAliyunInstanceArgs(d *schema.ResourceData, meta interface{}) (*ecs.CreateInstanceRequest, error) { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} args := ecs.CreateCreateInstanceRequest() args.InstanceType = d.Get("instance_type").(string) @@ -637,16 +691,16 @@ func buildAliyunInstanceArgs(d *schema.ResourceData, meta interface{}) (*ecs.Cre zoneID := d.Get("availability_zone").(string) // check instanceType and systemDiskCategory, when zoneID is not empty if zoneID != "" { - zone, err := client.DescribeZone(zoneID) + zone, err := ecsService.DescribeZone(zoneID) if err != nil { return nil, err } - if err := client.ResourceAvailable(zone, ResourceTypeInstance); err != nil { + if err := ecsService.ResourceAvailable(zone, ResourceTypeInstance); err != nil { return nil, err } - if err := client.DiskAvailable(zone, systemDiskCategory); err != nil { + if err := ecsService.DiskAvailable(zone, systemDiskCategory); err != nil { return nil, err } @@ -663,7 +717,7 @@ func buildAliyunInstanceArgs(d *schema.ResourceData, meta interface{}) (*ecs.Cre sgList := expandStringList(sgs.(*schema.Set).List()) sg0 := sgList[0] // check security group instance exist - _, err := client.DescribeSecurityGroupAttribute(sg0) + _, err := ecsService.DescribeSecurityGroupAttribute(sg0) if err == nil { args.SecurityGroupId = sg0 } @@ -742,7 +796,8 @@ func modifyInstanceChargeType(d *schema.ResourceData, meta interface{}, forceDel return nil } - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} chargeType := d.Get("instance_charge_type").(string) if d.HasChange("instance_charge_type") || forceDelete { if forceDelete { @@ -760,7 +815,10 @@ func modifyInstanceChargeType(d *schema.ResourceData, meta interface{}, forceDel } args.InstanceChargeType = chargeType if err := resource.Retry(6*time.Minute, func() *resource.RetryError { - if _, err := client.ecsconn.ModifyInstanceChargeType(args); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ModifyInstanceChargeType(args) + }) + if err != nil { if IsExceptedErrors(err, []string{Throttling}) { time.Sleep(10 * time.Second) return resource.RetryableError(fmt.Errorf("Modifying instance %s chareType timeout and got an error:%#v.", d.Id(), err)) @@ -773,7 +831,7 @@ func modifyInstanceChargeType(d *schema.ResourceData, meta interface{}, forceDel } // Wait for instance charge type has been changed if err := resource.Retry(3*time.Minute, func() *resource.RetryError { - if instance, err := client.DescribeInstanceById(d.Id()); err != nil { + if instance, err := ecsService.DescribeInstanceById(d.Id()); err != nil { return resource.NonRetryableError(fmt.Errorf("Describing instance %s got an error: %#v.", d.Id(), err)) } else if instance.InstanceChargeType == chargeType { return nil @@ -794,14 +852,15 @@ func modifyInstanceImage(d *schema.ResourceData, meta interface{}, run bool) (bo if d.IsNewResource() { return false, nil } - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} update := false if d.HasChange("image_id") { update = true if !run { return update, nil } - instance, e := client.DescribeInstanceById(d.Id()) + instance, e := ecsService.DescribeInstanceById(d.Id()) if e != nil { return update, e } @@ -810,7 +869,9 @@ func modifyInstanceImage(d *schema.ResourceData, meta interface{}, run bool) (bo args.ImageId = d.Get("image_id").(string) args.SystemDiskSize = requests.NewInteger(d.Get("system_disk_size").(int)) args.ClientToken = buildClientToken("TF-ReplaceSystemDisk") - _, err := client.ecsconn.ReplaceSystemDisk(args) + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ReplaceSystemDisk(args) + }) if err != nil { return update, fmt.Errorf("Replace system disk got an error: %#v", err) } @@ -818,7 +879,7 @@ func modifyInstanceImage(d *schema.ResourceData, meta interface{}, run bool) (bo // Ensure instance's image has been replaced successfully. timeout := DefaultTimeoutMedium for { - instance, errDesc := client.DescribeInstanceById(d.Id()) + instance, errDesc := ecsService.DescribeInstanceById(d.Id()) if errDesc != nil { return update, fmt.Errorf("Describe instance got an error: %#v", errDesc) } @@ -839,7 +900,7 @@ func modifyInstanceImage(d *schema.ResourceData, meta interface{}, run bool) (bo // After updating image, it need to re-attach key pair if instance.KeyPairName != "" { - if err := client.AttachKeyPair(instance.KeyPairName, []interface{}{d.Id()}); err != nil { + if err := ecsService.AttachKeyPair(instance.KeyPairName, []interface{}{d.Id()}); err != nil { return update, fmt.Errorf("After updating image, attaching key pair %s got an error: %#v.", instance.KeyPairName, err) } } @@ -892,7 +953,11 @@ func modifyInstanceAttribute(d *schema.ResourceData, meta interface{}) (bool, er } if update { - if _, err := meta.(*AliyunClient).ecsconn.ModifyInstanceAttribute(args); err != nil { + client := meta.(*connectivity.AliyunClient) + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ModifyInstanceAttribute(args) + }) + if err != nil { return reboot, fmt.Errorf("Modify instance attribute got error: %#v", err) } } @@ -937,7 +1002,11 @@ func modifyVpcAttribute(d *schema.ResourceData, meta interface{}, run bool) (boo } if update { - if _, err := meta.(*AliyunClient).ecsconn.ModifyInstanceVpcAttribute(vpcArgs); err != nil { + client := meta.(*connectivity.AliyunClient) + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ModifyInstanceVpcAttribute(vpcArgs) + }) + if err != nil { return update, fmt.Errorf("ModifyInstanceVPCAttribute got an error: %#v.", err) } } @@ -948,7 +1017,8 @@ func modifyInstanceType(d *schema.ResourceData, meta interface{}, run bool) (boo if d.IsNewResource() { return false, nil } - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} update := false if d.HasChange("instance_type") { update = true @@ -959,11 +1029,11 @@ func modifyInstanceType(d *schema.ResourceData, meta interface{}, run bool) (boo return update, fmt.Errorf("At present, 'PrePaid' instance type cannot be modified.") } // Ensure instance_type is valid - zoneId, validZones, err := meta.(*AliyunClient).DescribeAvailableResources(d, meta, InstanceTypeResource) + zoneId, validZones, err := ecsService.DescribeAvailableResources(d, meta, InstanceTypeResource) if err != nil { return update, err } - if err := meta.(*AliyunClient).InstanceTypeValidation(d.Get("instance_type").(string), zoneId, validZones); err != nil { + if err := ecsService.InstanceTypeValidation(d.Get("instance_type").(string), zoneId, validZones); err != nil { return update, err } @@ -976,7 +1046,10 @@ func modifyInstanceType(d *schema.ResourceData, meta interface{}, run bool) (boo args.ClientToken = buildClientToken("TF-ModifyInstanceSpec") err = resource.Retry(6*time.Minute, func() *resource.RetryError { - if _, err := client.ecsconn.ModifyInstanceSpec(args); err != nil { + _, err = client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ModifyInstanceSpec(args) + }) + if err != nil { if IsExceptedError(err, EcsThrottling) { time.Sleep(10 * time.Second) return resource.RetryableError(fmt.Errorf("Modify instance type timeout and got an error; %#v", err)) @@ -1024,9 +1097,13 @@ func modifyInstanceNetworkSpec(d *schema.ResourceData, meta interface{}) error { } //An instance that was successfully modified once cannot be modified again within 5 minutes. + client := meta.(*connectivity.AliyunClient) if update { if err := resource.Retry(6*time.Minute, func() *resource.RetryError { - if _, err := meta.(*AliyunClient).ecsconn.ModifyInstanceNetworkSpec(args); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ModifyInstanceNetworkSpec(args) + }) + if err != nil { if IsExceptedError(err, EcsThrottling) { time.Sleep(10 * time.Second) return resource.RetryableError(fmt.Errorf("Modify instance network bandwidth timeout and got an error; %#v", err)) @@ -1043,7 +1120,10 @@ func modifyInstanceNetworkSpec(d *schema.ResourceData, meta interface{}) error { if allocate { req := ecs.CreateAllocatePublicIpAddressRequest() req.InstanceId = d.Id() - if _, err := meta.(*AliyunClient).ecsconn.AllocatePublicIpAddress(req); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.AllocatePublicIpAddress(req) + }) + if err != nil { return fmt.Errorf("[DEBUG] AllocatePublicIpAddress for instance got error: %#v", err) } } diff --git a/alicloud/resource_alicloud_instance_test.go b/alicloud/resource_alicloud_instance_test.go index dae05ffc247..d5b2fc493a0 100644 --- a/alicloud/resource_alicloud_instance_test.go +++ b/alicloud/resource_alicloud_instance_test.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -27,11 +28,11 @@ func init() { } func testSweepInstances(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -43,14 +44,17 @@ func testSweepInstances(region string) error { var insts []ecs.Instance req := ecs.CreateDescribeInstancesRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.ecsconn.DescribeInstances(req) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstances(req) + }) if err != nil { return fmt.Errorf("Error retrieving Instances: %s", err) } + resp, _ := raw.(*ecs.DescribeInstancesResponse) if resp == nil || len(resp.Instances.Instance) < 1 { break } @@ -87,7 +91,10 @@ func testSweepInstances(region string) error { req := ecs.CreateDeleteInstanceRequest() req.InstanceId = id req.Force = requests.NewBoolean(true) - if _, err := conn.ecsconn.DeleteInstance(req); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DeleteInstance(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Instance (%s (%s)): %s", name, id, err) } } @@ -766,8 +773,9 @@ func testAccCheckInstanceExistsWithProviders(n string, i *ecs.Instance, provider continue } - client := provider.Meta().(*AliyunClient) - instance, err := client.DescribeInstanceById(rs.Primary.ID) + client := provider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} + instance, err := ecsService.DescribeInstanceById(rs.Primary.ID) log.Printf("[WARN]get ecs instance %#v", instance) // Verify the error is what we want if err != nil { @@ -805,7 +813,8 @@ func testAccCheckInstanceDestroyWithProviders(providers *[]*schema.Provider) res } func testAccCheckInstanceDestroyWithProvider(s *terraform.State, provider *schema.Provider) error { - client := provider.Meta().(*AliyunClient) + client := provider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_instance" { @@ -813,7 +822,7 @@ func testAccCheckInstanceDestroyWithProvider(s *terraform.State, provider *schem } // Try to find the resource - instance, err := client.DescribeInstanceById(rs.Primary.ID) + instance, err := ecsService.DescribeInstanceById(rs.Primary.ID) if err == nil { if instance.Status != "" && instance.Status != string(Stopped) { return fmt.Errorf("Found unstopped instance: %s", instance.InstanceId) @@ -844,8 +853,9 @@ func testAccCheckSystemDiskSize(n string, size int) resource.TestCheckFunc { if provider.Meta() == nil { continue } - client := provider.Meta().(*AliyunClient) - systemDisk, err := client.QueryInstanceSystemDisk(rs.Primary.ID) + client := provider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} + systemDisk, err := ecsService.QueryInstanceSystemDisk(rs.Primary.ID) if err != nil { log.Printf("[ERROR]get system disk size error: %#v", err) return err diff --git a/alicloud/resource_alicloud_key_pair.go b/alicloud/resource_alicloud_key_pair.go index d9d7a4d7031..ae6f72546b7 100644 --- a/alicloud/resource_alicloud_key_pair.go +++ b/alicloud/resource_alicloud_key_pair.go @@ -8,6 +8,8 @@ import ( "os" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" + "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" @@ -64,7 +66,7 @@ func resourceAlicloudKeyPair() *schema.Resource { } func resourceAlicloudKeyPairCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ecsconn + client := meta.(*connectivity.AliyunClient) var keyName string if v, ok := d.GetOk("key_name"); ok { @@ -79,20 +81,24 @@ func resourceAlicloudKeyPairCreate(d *schema.ResourceData, meta interface{}) err args := ecs.CreateImportKeyPairRequest() args.KeyPairName = keyName args.PublicKeyBody = publicKey.(string) - keypair, err := conn.ImportKeyPair(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ImportKeyPair(args) + }) if err != nil { return fmt.Errorf("Error Import KeyPair: %s", err) } - + keypair, _ := raw.(*ecs.ImportKeyPairResponse) d.SetId(keypair.KeyPairName) } else { args := ecs.CreateCreateKeyPairRequest() args.KeyPairName = keyName - keypair, err := conn.CreateKeyPair(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.CreateKeyPair(args) + }) if err != nil { return fmt.Errorf("Error Create KeyPair: %s", err) } - + keypair, _ := raw.(*ecs.CreateKeyPairResponse) d.SetId(keypair.KeyPairName) if file, ok := d.GetOk("key_file"); ok { ioutil.WriteFile(file.(string), []byte(keypair.PrivateKeyBody), 0600) @@ -104,8 +110,10 @@ func resourceAlicloudKeyPairCreate(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudKeyPairRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} - keypair, err := meta.(*AliyunClient).DescribeKeyPair(d.Id()) + keypair, err := ecsService.DescribeKeyPair(d.Id()) if err != nil { if NotFoundError(err) || IsExceptedError(err, KeyPairNotFound) { d.SetId("") @@ -119,21 +127,24 @@ func resourceAlicloudKeyPairRead(d *schema.ResourceData, meta interface{}) error } func resourceAlicloudKeyPairDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} deldArgs := ecs.CreateDeleteKeyPairsRequest() deldArgs.KeyPairNames = convertListToJsonString(append(make([]interface{}, 0, 1), d.Id())) return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.ecsconn.DeleteKeyPairs(deldArgs) + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DeleteKeyPairs(deldArgs) + }) if err != nil { if IsExceptedError(err, KeyPairNotFound) { return nil } } - _, err = client.DescribeKeyPair(d.Id()) + _, err = ecsService.DescribeKeyPair(d.Id()) if err != nil { if NotFoundError(err) || IsExceptedError(err, KeyPairNotFound) { return nil diff --git a/alicloud/resource_alicloud_key_pair_attachment.go b/alicloud/resource_alicloud_key_pair_attachment.go index efb917f0829..8be0c29e154 100644 --- a/alicloud/resource_alicloud_key_pair_attachment.go +++ b/alicloud/resource_alicloud_key_pair_attachment.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudKeyPairAttachment() *schema.Resource { @@ -43,14 +44,15 @@ func resourceAlicloudKeyPairAttachment() *schema.Resource { } func resourceAlicloudKeyPairAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} keyname := d.Get("key_name").(string) instanceIds := d.Get("instance_ids").(*schema.Set).List() force := d.Get("force").(bool) idsMap := make(map[string]string) var newIds []string if force { - ids, _, err := client.QueryInstancesWithKeyPair("", keyname) + ids, _, err := ecsService.QueryInstancesWithKeyPair("", keyname) if err != nil { return fmt.Errorf("QueryInstancesWithKeyPair %s got an error: %#v.", keyname, err) } @@ -66,7 +68,7 @@ func resourceAlicloudKeyPairAttachmentCreate(d *schema.ResourceData, meta interf } } - if err := client.AttachKeyPair(keyname, instanceIds); err != nil { + if err := ecsService.AttachKeyPair(keyname, instanceIds); err != nil { return err } @@ -75,12 +77,15 @@ func resourceAlicloudKeyPairAttachmentCreate(d *schema.ResourceData, meta interf req.ForceStop = requests.NewBoolean(true) for _, id := range newIds { req.InstanceId = id - if _, err := client.ecsconn.RebootInstance(req); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.RebootInstance(req) + }) + if err != nil { return fmt.Errorf("Reboot instance %s got an error: %#v.", id, err) } } for _, id := range newIds { - if err := client.WaitForEcsInstance(id, Running, DefaultLongTimeout); err != nil { + if err := ecsService.WaitForEcsInstance(id, Running, DefaultLongTimeout); err != nil { return fmt.Errorf("WaitForInstance %s is %s got error: %#v", id, Running, err) } } @@ -92,9 +97,10 @@ func resourceAlicloudKeyPairAttachmentCreate(d *schema.ResourceData, meta interf } func resourceAlicloudKeyPairAttachmentRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} keyname := strings.Split(d.Id(), ":")[0] - keypair, err := client.DescribeKeyPair(keyname) + keypair, err := ecsService.DescribeKeyPair(keyname) if err != nil { if NotFoundError(err) || IsExceptedError(err, KeyPairNotFound) { @@ -108,7 +114,7 @@ func resourceAlicloudKeyPairAttachmentRead(d *schema.ResourceData, meta interfac if ids, ok := d.GetOk("instance_ids"); ok { d.Set("instance_ids", ids) } else { - ids, _, err := client.QueryInstancesWithKeyPair("", keyname) + ids, _, err := ecsService.QueryInstancesWithKeyPair("", keyname) if err != nil { return fmt.Errorf("Describe instances by keypair %s got an error: %#v.", keyname, err) } @@ -118,7 +124,8 @@ func resourceAlicloudKeyPairAttachmentRead(d *schema.ResourceData, meta interfac } func resourceAlicloudKeyPairAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} keyname := strings.Split(d.Id(), ":")[0] instanceIds := strings.Split(d.Id(), ":")[1] @@ -127,12 +134,14 @@ func resourceAlicloudKeyPairAttachmentDelete(d *schema.ResourceData, meta interf return resource.Retry(5*time.Minute, func() *resource.RetryError { req.InstanceIds = instanceIds - _, err := client.ecsconn.DetachKeyPair(req) + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DetachKeyPair(req) + }) if err != nil { return resource.NonRetryableError(fmt.Errorf("Error DetachKeyPair:%#v", err)) } - instance_ids, _, err := client.QueryInstancesWithKeyPair(instanceIds, d.Id()) + instance_ids, _, err := ecsService.QueryInstancesWithKeyPair(instanceIds, d.Id()) if err != nil { return resource.NonRetryableError(err) } diff --git a/alicloud/resource_alicloud_key_pair_attachment_test.go b/alicloud/resource_alicloud_key_pair_attachment_test.go index 9d1156cff4b..da0c0d9c0e8 100644 --- a/alicloud/resource_alicloud_key_pair_attachment_test.go +++ b/alicloud/resource_alicloud_key_pair_attachment_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudKeyPairAttachment_basic(t *testing.T) { @@ -50,9 +51,10 @@ func testAccCheckKeyPairAttachmentExists(n string, instance *ecs.Instance, keypa return fmt.Errorf("No Key Pair Attachment ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} - response, err := client.DescribeInstanceById(instance.InstanceId) + response, err := ecsService.DescribeInstanceById(instance.InstanceId) if err != nil { return fmt.Errorf("Error QueryInstancesById: %#v", err) } @@ -74,12 +76,13 @@ func testAccCheckKeyPairAttachmentDestroy(s *terraform.State) error { continue } // Try to find the Disk - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} instance_ids := rs.Primary.Attributes["instance_ids"] for _, inst := range instance_ids { - response, err := client.DescribeInstanceById(string(inst)) + response, err := ecsService.DescribeInstanceById(string(inst)) if err != nil { return err } diff --git a/alicloud/resource_alicloud_key_pair_test.go b/alicloud/resource_alicloud_key_pair_test.go index 1fde50c26cd..4d0125cc3ad 100644 --- a/alicloud/resource_alicloud_key_pair_test.go +++ b/alicloud/resource_alicloud_key_pair_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepKeyPairs(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -38,14 +39,17 @@ func testSweepKeyPairs(region string) error { var pairs []ecs.KeyPair req := ecs.CreateDescribeKeyPairsRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.ecsconn.DescribeKeyPairs(req) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeKeyPairs(req) + }) if err != nil { return fmt.Errorf("Error retrieving Key Pairs: %s", err) } + resp, _ := raw.(*ecs.DescribeKeyPairsResponse) if resp == nil || len(resp.KeyPairs.KeyPair) < 1 { break } @@ -78,7 +82,10 @@ func testSweepKeyPairs(region string) error { log.Printf("[INFO] Deleting Key Pair: %s", name) req := ecs.CreateDeleteKeyPairsRequest() req.KeyPairNames = convertListToJsonString(append(make([]interface{}, 0, 1), name)) - if _, err := conn.ecsconn.DeleteKeyPairs(req); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DeleteKeyPairs(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Key Pair (%s): %s", name, err) } } @@ -175,9 +182,10 @@ func testAccCheckKeyPairExists(n string, keypair *ecs.KeyPair) resource.TestChec return fmt.Errorf("No Key Pair ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} - response, err := client.DescribeKeyPair(rs.Primary.ID) + response, err := ecsService.DescribeKeyPair(rs.Primary.ID) log.Printf("[WARN] disk ids %#v", rs.Primary.ID) @@ -200,9 +208,10 @@ func testAccCheckKeyPairHasPrefix(n string, keypair *ecs.KeyPair, prefix string) return fmt.Errorf("No Key Pair ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} - response, err := client.DescribeKeyPair(rs.Primary.ID) + response, err := ecsService.DescribeKeyPair(rs.Primary.ID) log.Printf("[WARN] disk ids %#v", rs.Primary.ID) @@ -225,9 +234,10 @@ func testAccCheckKeyPairDestroy(s *terraform.State) error { } // Try to find the Disk - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} - response, err := client.DescribeKeyPair(rs.Primary.ID) + response, err := ecsService.DescribeKeyPair(rs.Primary.ID) os.Remove(rs.Primary.Attributes["key_file"]) if err != nil { diff --git a/alicloud/resource_alicloud_kms_key.go b/alicloud/resource_alicloud_kms_key.go index 0824fb19e87..59c0b8b441a 100644 --- a/alicloud/resource_alicloud_kms_key.go +++ b/alicloud/resource_alicloud_kms_key.go @@ -8,6 +8,7 @@ import ( "github.com/denverdino/aliyungo/kms" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudKmsKey() *schema.Resource { @@ -62,7 +63,7 @@ func resourceAlicloudKmsKey() *schema.Resource { } func resourceAlicloudKmsKeyCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).kmsconn + client := meta.(*connectivity.AliyunClient) args := kms.CreateKeyArgs{ KeyUsage: kms.KeyUsage(d.Get("key_usage").(string)), @@ -71,27 +72,31 @@ func resourceAlicloudKmsKeyCreate(d *schema.ResourceData, meta interface{}) erro if v, ok := d.GetOk("description"); ok { args.Description = v.(string) } - resp, err := conn.CreateKey(&args) + raw, err := client.WithKmsClient(func(kmsClient *kms.Client) (interface{}, error) { + return kmsClient.CreateKey(&args) + }) if err != nil { return fmt.Errorf("CreateKey got an error: %#v.", err) } - + resp, _ := raw.(*kms.CreateKeyResponse) d.SetId(resp.KeyMetadata.KeyId) return resourceAlicloudKmsKeyUpdate(d, meta) } func resourceAlicloudKmsKeyRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).kmsconn + client := meta.(*connectivity.AliyunClient) - key, err := conn.DescribeKey(d.Id()) + raw, err := client.WithKmsClient(func(kmsClient *kms.Client) (interface{}, error) { + return kmsClient.DescribeKey(d.Id()) + }) if err != nil { if IsExceptedError(err, ForbiddenKeyNotFound) { return nil } return fmt.Errorf("DescribeKey got an error: %#v.", err) } - + key, _ := raw.(*kms.DescribeKeyResponse) if KeyState(key.KeyMetadata.KeyState) == PendingDeletion { log.Printf("[WARN] Removing KMS key %s because it's already gone", d.Id()) d.SetId("") @@ -108,24 +113,32 @@ func resourceAlicloudKmsKeyRead(d *schema.ResourceData, meta interface{}) error } func resourceAlicloudKmsKeyUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).kmsconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) if d.HasChange("is_enabled") { - key, err := conn.DescribeKey(d.Id()) + raw, err := client.WithKmsClient(func(kmsClient *kms.Client) (interface{}, error) { + return kmsClient.DescribeKey(d.Id()) + }) if err != nil { return fmt.Errorf("DescribeKey got an error: %#v.", err) } - + key, _ := raw.(*kms.DescribeKeyResponse) if d.Get("is_enabled").(bool) && KeyState(key.KeyMetadata.KeyState) == Disabled { - if _, err := conn.EnableKey(d.Id()); err != nil { + _, err := client.WithKmsClient(func(kmsClient *kms.Client) (interface{}, error) { + return kmsClient.EnableKey(d.Id()) + }) + if err != nil { return fmt.Errorf("Enable key got an error: %#v.", err) } } if !d.Get("is_enabled").(bool) && KeyState(key.KeyMetadata.KeyState) == Enabled { - if _, err := conn.DisableKey(d.Id()); err != nil { + _, err := client.WithKmsClient(func(kmsClient *kms.Client) (interface{}, error) { + return kmsClient.DisableKey(d.Id()) + }) + if err != nil { return fmt.Errorf("Disable key got an error: %#v.", err) } } @@ -138,23 +151,29 @@ func resourceAlicloudKmsKeyUpdate(d *schema.ResourceData, meta interface{}) erro } func resourceAlicloudKmsKeyDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).kmsconn + client := meta.(*connectivity.AliyunClient) - if _, err := conn.ScheduleKeyDeletion(&kms.ScheduleKeyDeletionArgs{ - KeyId: d.Id(), - PendingWindowInDays: d.Get("deletion_window_in_days").(int), - }); err != nil { + _, err := client.WithKmsClient(func(kmsClient *kms.Client) (interface{}, error) { + return kmsClient.ScheduleKeyDeletion(&kms.ScheduleKeyDeletionArgs{ + KeyId: d.Id(), + PendingWindowInDays: d.Get("deletion_window_in_days").(int), + }) + }) + if err != nil { return err } return resource.Retry(3*time.Minute, func() *resource.RetryError { - key, err := conn.DescribeKey(d.Id()) + raw, err := client.WithKmsClient(func(kmsClient *kms.Client) (interface{}, error) { + return kmsClient.DescribeKey(d.Id()) + }) if err != nil { if IsExceptedError(err, ForbiddenKeyNotFound) { return nil } return resource.NonRetryableError(fmt.Errorf("DescribeKey got an error: %#v.", err)) } + key, _ := raw.(*kms.DescribeKeyResponse) if key == nil || KeyState(key.KeyMetadata.KeyState) == PendingDeletion { log.Printf("[WARN] Removing KMS key %s because it's already gone", d.Id()) diff --git a/alicloud/resource_alicloud_kms_key_test.go b/alicloud/resource_alicloud_kms_key_test.go index 6f82ffd7d93..b8f9a0da54b 100644 --- a/alicloud/resource_alicloud_kms_key_test.go +++ b/alicloud/resource_alicloud_kms_key_test.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/kms" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudKmsKey_basic(t *testing.T) { @@ -46,13 +47,15 @@ func testAccCheckAlicloudKmsKeyExists(name string, key *kms.KeyMetadata) resourc return fmt.Errorf("No KMS Key ID is set") } - conn := testAccProvider.Meta().(*AliyunClient).kmsconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) - o, err := conn.DescribeKey(rs.Primary.ID) + raw, err := client.WithKmsClient(func(kmsClient *kms.Client) (interface{}, error) { + return kmsClient.DescribeKey(rs.Primary.ID) + }) if err != nil { return err } - + o, _ := raw.(*kms.DescribeKeyResponse) meta := o.KeyMetadata key = &meta @@ -61,19 +64,21 @@ func testAccCheckAlicloudKmsKeyExists(name string, key *kms.KeyMetadata) resourc } func testAccCheckAlicloudKmsKeyDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AliyunClient).kmsconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_kms_key" { continue } - out, err := conn.DescribeKey(rs.Primary.ID) + raw, err := client.WithKmsClient(func(kmsClient *kms.Client) (interface{}, error) { + return kmsClient.DescribeKey(rs.Primary.ID) + }) if err != nil && !IsExceptedError(err, ForbiddenKeyNotFound) { return err } - + out, _ := raw.(*kms.DescribeKeyResponse) if KeyState(out.KeyMetadata.KeyState) == PendingDeletion { return nil } diff --git a/alicloud/resource_alicloud_kvstore_backup_policy.go b/alicloud/resource_alicloud_kvstore_backup_policy.go index 42fe22947a0..7085e891f70 100644 --- a/alicloud/resource_alicloud_kvstore_backup_policy.go +++ b/alicloud/resource_alicloud_kvstore_backup_policy.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/r-kvstore" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudKVStoreBackupPolicy() *schema.Resource { @@ -44,8 +45,7 @@ func resourceAlicloudKVStoreBackupPolicy() *schema.Resource { } func resourceAlicloudKVStoreBackupPolicyCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.rkvconn + client := meta.(*connectivity.AliyunClient) request := r_kvstore.CreateModifyBackupPolicyRequest() request.InstanceId = d.Get("instance_id").(string) @@ -55,7 +55,10 @@ func resourceAlicloudKVStoreBackupPolicyCreate(d *schema.ResourceData, meta inte request.PreferredBackupPeriod = backupPeriod err := resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.ModifyBackupPolicy(request); err != nil { + _, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.ModifyBackupPolicy(request) + }) + if err != nil { return resource.NonRetryableError(fmt.Errorf("Create backup policy got an error: %#v", err)) } return nil @@ -71,7 +74,10 @@ func resourceAlicloudKVStoreBackupPolicyCreate(d *schema.ResourceData, meta inte } func resourceAlicloudKVStoreBackupPolicyRead(d *schema.ResourceData, meta interface{}) error { - policy, err := meta.(*AliyunClient).DescribeRKVInstancebackupPolicy(d.Id()) + client := meta.(*connectivity.AliyunClient) + kvstoreService := KvstoreService{client} + + policy, err := kvstoreService.DescribeRKVInstancebackupPolicy(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -88,8 +94,7 @@ func resourceAlicloudKVStoreBackupPolicyRead(d *schema.ResourceData, meta interf } func resourceAlicloudKVStoreBackupPolicyUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.rkvconn + client := meta.(*connectivity.AliyunClient) update := false request := r_kvstore.CreateModifyBackupPolicyRequest() request.InstanceId = d.Id() @@ -107,7 +112,10 @@ func resourceAlicloudKVStoreBackupPolicyUpdate(d *schema.ResourceData, meta inte } if update { - if _, err := conn.ModifyBackupPolicy(request); err != nil { + _, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.ModifyBackupPolicy(request) + }) + if err != nil { return err } } @@ -117,15 +125,17 @@ func resourceAlicloudKVStoreBackupPolicyUpdate(d *schema.ResourceData, meta inte func resourceAlicloudKVStoreBackupPolicyDelete(d *schema.ResourceData, meta interface{}) error { // In case of a delete we are resetting to default values which is Monday - Sunday each 3am-4am - client := meta.(*AliyunClient) - conn := client.rkvconn + client := meta.(*connectivity.AliyunClient) request := r_kvstore.CreateModifyBackupPolicyRequest() request.InstanceId = d.Id() request.PreferredBackupTime = "01:00Z-02:00Z" request.PreferredBackupPeriod = "Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday" - if _, err := conn.ModifyBackupPolicy(request); err != nil { + _, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.ModifyBackupPolicy(request) + }) + if err != nil { return err } diff --git a/alicloud/resource_alicloud_kvstore_backup_policy_test.go b/alicloud/resource_alicloud_kvstore_backup_policy_test.go index 2242012583f..b4a6910a9b3 100644 --- a/alicloud/resource_alicloud_kvstore_backup_policy_test.go +++ b/alicloud/resource_alicloud_kvstore_backup_policy_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/r-kvstore" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudKVStoreBackupPolicy_basic(t *testing.T) { @@ -47,8 +48,9 @@ func testAccCheckKVStoreBackupPolicyExists(n string, d *r_kvstore.DescribeBackup return fmt.Errorf("No KVStore Instance backup policy ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - policy, err := client.DescribeRKVInstancebackupPolicy(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + kvstoreService := KvstoreService{client} + policy, err := kvstoreService.DescribeRKVInstancebackupPolicy(rs.Primary.ID) if err != nil { return fmt.Errorf("Error Describe KVStore Instance backup policy: %#v", err) } @@ -59,14 +61,15 @@ func testAccCheckKVStoreBackupPolicyExists(n string, d *r_kvstore.DescribeBackup } func testAccCheckKVStoreBackupPolicyDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + kvstoreService := KvstoreService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_kvstore_instance" { continue } - if _, err := client.DescribeRKVInstancebackupPolicy(rs.Primary.ID); err != nil { + if _, err := kvstoreService.DescribeRKVInstancebackupPolicy(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_kvstore_instance.go b/alicloud/resource_alicloud_kvstore_instance.go index aae1b3665ef..07560887557 100644 --- a/alicloud/resource_alicloud_kvstore_instance.go +++ b/alicloud/resource_alicloud_kvstore_instance.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/r-kvstore" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudKVStoreInstance() *schema.Resource { @@ -108,24 +109,26 @@ func resourceAlicloudKVStoreInstance() *schema.Resource { } func resourceAlicloudKVStoreInstanceCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.rkvconn + client := meta.(*connectivity.AliyunClient) + kvstoreService := KvstoreService{client} request, err := buildKVStoreCreateRequest(d, meta) if err != nil { return err } - resp, err := conn.CreateInstance(request) + raw, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.CreateInstance(request) + }) if err != nil { return fmt.Errorf("Error creating Alicloud db instance: %#v", err) } - + resp, _ := raw.(*r_kvstore.CreateInstanceResponse) d.SetId(resp.InstanceId) // wait instance status change from Creating to Normal - if err := client.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { + if err := kvstoreService.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } @@ -133,8 +136,8 @@ func resourceAlicloudKVStoreInstanceCreate(d *schema.ResourceData, meta interfac } func resourceAlicloudKVStoreInstanceUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.rkvconn + client := meta.(*connectivity.AliyunClient) + kvstoreService := KvstoreService{client} d.Partial(true) if d.HasChange("security_ips") { @@ -147,15 +150,18 @@ func resourceAlicloudKVStoreInstanceUpdate(d *schema.ResourceData, meta interfac return fmt.Errorf("Security ips cannot be empty") } // wait instance status is Normal before modifying - if err := client.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { + if err := kvstoreService.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } - if _, err := conn.ModifySecurityIps(request); err != nil { + _, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.ModifySecurityIps(request) + }) + if err != nil { return fmt.Errorf("Create security whitelist ips got an error: %#v", err) } d.SetPartial("security_ips") // wait instance status is Normal after modifying - if err := client.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { + if err := kvstoreService.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } } @@ -170,11 +176,14 @@ func resourceAlicloudKVStoreInstanceUpdate(d *schema.ResourceData, meta interfac request.InstanceId = d.Id() request.InstanceClass = d.Get("instance_class").(string) request.EffectiveTime = "Immediately" - if _, err := conn.ModifyInstanceSpec(request); err != nil { + _, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.ModifyInstanceSpec(request) + }) + if err != nil { return err } // wait instance status is Normal after modifying - if err := client.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { + if err := kvstoreService.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } @@ -199,14 +208,17 @@ func resourceAlicloudKVStoreInstanceUpdate(d *schema.ResourceData, meta interfac if update { // wait instance status is Normal before modifying - if err := client.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { + if err := kvstoreService.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } - if _, err := conn.ModifyInstanceAttribute(request); err != nil { + _, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.ModifyInstanceAttribute(request) + }) + if err != nil { return fmt.Errorf("ModifyRKVInstanceDescription got an error: %#v", err) } // wait instance status is Normal after modifying - if err := client.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { + if err := kvstoreService.WaitForRKVInstance(d.Id(), Normal, DefaultLongTimeout); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } } @@ -216,8 +228,9 @@ func resourceAlicloudKVStoreInstanceUpdate(d *schema.ResourceData, meta interfac } func resourceAlicloudKVStoreInstanceRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - instance, err := client.DescribeRKVInstanceById(d.Id()) + client := meta.(*connectivity.AliyunClient) + kvstoreService := KvstoreService{client} + instance, err := kvstoreService.DescribeRKVInstanceById(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -240,9 +253,10 @@ func resourceAlicloudKVStoreInstanceRead(d *schema.ResourceData, meta interface{ } func resourceAlicloudKVStoreInstanceDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + kvstoreService := KvstoreService{client} - instance, err := client.DescribeRKVInstanceById(d.Id()) + instance, err := kvstoreService.DescribeRKVInstanceById(d.Id()) if err != nil { if NotFoundError(err) { return nil @@ -256,7 +270,9 @@ func resourceAlicloudKVStoreInstanceDelete(d *schema.ResourceData, meta interfac request.InstanceId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.rkvconn.DeleteInstance(request) + _, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.DeleteInstance(request) + }) if err != nil { if IsExceptedError(err, InvalidKVStoreInstanceIdNotFound) { @@ -265,7 +281,7 @@ func resourceAlicloudKVStoreInstanceDelete(d *schema.ResourceData, meta interfac return resource.RetryableError(fmt.Errorf("Delete KVStore instance timeout and got an error: %#v", err)) } - if _, err := client.DescribeRKVInstanceById(d.Id()); err != nil { + if _, err := kvstoreService.DescribeRKVInstanceById(d.Id()); err != nil { if NotFoundError(err) { return nil } @@ -277,10 +293,11 @@ func resourceAlicloudKVStoreInstanceDelete(d *schema.ResourceData, meta interfac } func buildKVStoreCreateRequest(d *schema.ResourceData, meta interface{}) (*r_kvstore.CreateInstanceRequest, error) { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} request := r_kvstore.CreateCreateInstanceRequest() request.InstanceName = Trim(d.Get("instance_name").(string)) - request.RegionId = getRegionId(d, meta) + request.RegionId = client.RegionId request.EngineVersion = Trim(d.Get("engine_version").(string)) request.InstanceClass = Trim(d.Get("instance_class").(string)) request.ChargeType = Trim(d.Get("instance_charge_type").(string)) @@ -302,7 +319,7 @@ func buildKVStoreCreateRequest(d *schema.ResourceData, meta interface{}) (*r_kvs request.PrivateIpAddress = Trim(d.Get("private_ip").(string)) // check vswitchId in zone - vsw, err := client.DescribeVswitch(vswitchId.(string)) + vsw, err := vpcService.DescribeVswitch(vswitchId.(string)) if err != nil { return nil, fmt.Errorf("DescribeVSwitch got an error: %#v", err) } diff --git a/alicloud/resource_alicloud_kvstore_instance_test.go b/alicloud/resource_alicloud_kvstore_instance_test.go index 962e0147426..b81d077ef6a 100644 --- a/alicloud/resource_alicloud_kvstore_instance_test.go +++ b/alicloud/resource_alicloud_kvstore_instance_test.go @@ -12,6 +12,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/r-kvstore" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -22,11 +23,11 @@ func init() { } func testSweepKVStoreInstances(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -35,14 +36,17 @@ func testSweepKVStoreInstances(region string) error { var insts []r_kvstore.KVStoreInstance req := r_kvstore.CreateDescribeInstancesRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.rkvconn.DescribeInstances(req) + raw, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.DescribeInstances(req) + }) if err != nil { return fmt.Errorf("Error retrieving KVStore Instances: %s", err) } + resp, _ := raw.(*r_kvstore.DescribeInstancesResponse) if resp == nil || len(resp.Instances.KVStoreInstance) < 1 { break } @@ -79,7 +83,10 @@ func testSweepKVStoreInstances(region string) error { log.Printf("[INFO] Deleting KVStore Instance: %s (%s)", name, id) req := r_kvstore.CreateDeleteInstanceRequest() req.InstanceId = id - if _, err := conn.rkvconn.DeleteInstance(req); err != nil { + _, err := client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.DeleteInstance(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete KVStore Instance (%s (%s)): %s", name, id, err) } } @@ -222,8 +229,9 @@ func testAccCheckKVStoreInstanceExists(n string, d *r_kvstore.DBInstanceAttribut return fmt.Errorf("No KVStore Instance ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - attr, err := client.DescribeRKVInstanceById(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + kvstoreService := KvstoreService{client} + attr, err := kvstoreService.DescribeRKVInstanceById(rs.Primary.ID) log.Printf("[DEBUG] check instance %s attribute %#v", rs.Primary.ID, attr) if err != nil { @@ -236,14 +244,15 @@ func testAccCheckKVStoreInstanceExists(n string, d *r_kvstore.DBInstanceAttribut } func testAccCheckKVStoreInstanceDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + kvstoreService := KvstoreService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_kvstore_instance" { continue } - if _, err := client.DescribeRKVInstanceById(rs.Primary.ID); err != nil { + if _, err := kvstoreService.DescribeRKVInstanceById(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_log_machine_group.go b/alicloud/resource_alicloud_log_machine_group.go index ca4b88c8ae9..3c9228c1c91 100644 --- a/alicloud/resource_alicloud_log_machine_group.go +++ b/alicloud/resource_alicloud_log_machine_group.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/aliyun-log-go-sdk" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudLogMachineGroup() *schema.Resource { @@ -56,15 +57,18 @@ func resourceAlicloudLogMachineGroup() *schema.Resource { } func resourceAlicloudLogMachineGroupCreate(d *schema.ResourceData, meta interface{}) error { - - if err := meta.(*AliyunClient).logconn.CreateMachineGroup(d.Get("project").(string), &sls.MachineGroup{ - Name: d.Get("name").(string), - MachineIDType: d.Get("identify_type").(string), - MachineIDList: expandStringList(d.Get("identify_list").(*schema.Set).List()), - Attribute: sls.MachinGroupAttribute{ - TopicName: d.Get("topic").(string), - }, - }); err != nil { + client := meta.(*connectivity.AliyunClient) + _, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return nil, slsClient.CreateMachineGroup(d.Get("project").(string), &sls.MachineGroup{ + Name: d.Get("name").(string), + MachineIDType: d.Get("identify_type").(string), + MachineIDList: expandStringList(d.Get("identify_list").(*schema.Set).List()), + Attribute: sls.MachinGroupAttribute{ + TopicName: d.Get("topic").(string), + }, + }) + }) + if err != nil { return fmt.Errorf("CreateLogMachineGroup got an error: %#v.", err) } @@ -74,9 +78,11 @@ func resourceAlicloudLogMachineGroupCreate(d *schema.ResourceData, meta interfac } func resourceAlicloudLogMachineGroupRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + logService := LogService{client} split := strings.Split(d.Id(), COLON_SEPARATED) - group, err := meta.(*AliyunClient).DescribeLogMachineGroup(split[0], split[1]) + group, err := logService.DescribeLogMachineGroup(split[0], split[1]) if err != nil { if NotFoundError(err) { d.SetId("") @@ -113,14 +119,18 @@ func resourceAlicloudLogMachineGroupUpdate(d *schema.ResourceData, meta interfac } if update { - if err := meta.(*AliyunClient).logconn.UpdateMachineGroup(split[0], &sls.MachineGroup{ - Name: split[1], - MachineIDType: d.Get("identify_type").(string), - MachineIDList: expandStringList(d.Get("identify_list").(*schema.Set).List()), - Attribute: sls.MachinGroupAttribute{ - TopicName: d.Get("topic").(string), - }, - }); err != nil { + client := meta.(*connectivity.AliyunClient) + _, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return nil, slsClient.UpdateMachineGroup(split[0], &sls.MachineGroup{ + Name: split[1], + MachineIDType: d.Get("identify_type").(string), + MachineIDList: expandStringList(d.Get("identify_list").(*schema.Set).List()), + Attribute: sls.MachinGroupAttribute{ + TopicName: d.Get("topic").(string), + }, + }) + }) + if err != nil { return fmt.Errorf("UpdateLogMachineGroup %s got an error: %#v.", split[1], err) } } @@ -130,15 +140,19 @@ func resourceAlicloudLogMachineGroupUpdate(d *schema.ResourceData, meta interfac } func resourceAlicloudLogMachineGroupDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + logService := LogService{client} split := strings.Split(d.Id(), COLON_SEPARATED) return resource.Retry(3*time.Minute, func() *resource.RetryError { - if err := client.logconn.DeleteMachineGroup(split[0], split[1]); err != nil { + _, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return nil, slsClient.DeleteMachineGroup(split[0], split[1]) + }) + if err != nil { return resource.NonRetryableError(fmt.Errorf("Deleting log machine group %s got an error: %#v", split[1], err)) } - if _, err := client.DescribeLogMachineGroup(split[0], split[1]); err != nil { + if _, err := logService.DescribeLogMachineGroup(split[0], split[1]); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_log_machine_group_test.go b/alicloud/resource_alicloud_log_machine_group_test.go index 4333c5d3fea..a725a522a4d 100644 --- a/alicloud/resource_alicloud_log_machine_group_test.go +++ b/alicloud/resource_alicloud_log_machine_group_test.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/aliyun-log-go-sdk" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudLogMachineGroup_ip(t *testing.T) { @@ -70,7 +71,9 @@ func testAccCheckAlicloudLogMachineGroupExists(name string, group *sls.MachineGr split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - g, err := testAccProvider.Meta().(*AliyunClient).DescribeLogMachineGroup(split[0], split[1]) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + logService := LogService{client} + g, err := logService.DescribeLogMachineGroup(split[0], split[1]) if err != nil { return err } @@ -81,7 +84,8 @@ func testAccCheckAlicloudLogMachineGroupExists(name string, group *sls.MachineGr } func testAccCheckAlicloudLogMachineGroupDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + logService := LogService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_log_machine_group" { @@ -90,7 +94,7 @@ func testAccCheckAlicloudLogMachineGroupDestroy(s *terraform.State) error { split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - if _, err := client.DescribeLogMachineGroup(split[0], split[1]); err != nil { + if _, err := logService.DescribeLogMachineGroup(split[0], split[1]); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_log_project.go b/alicloud/resource_alicloud_log_project.go index ea2636387a2..7cd4064e345 100644 --- a/alicloud/resource_alicloud_log_project.go +++ b/alicloud/resource_alicloud_log_project.go @@ -4,6 +4,9 @@ import ( "fmt" "time" + "github.com/aliyun/aliyun-log-go-sdk" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" ) @@ -34,22 +37,26 @@ func resourceAlicloudLogProject() *schema.Resource { } func resourceAlicloudLogProjectCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) - project, err := client.logconn.CreateProject(d.Get("name").(string), d.Get("description").(string)) + raw, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return slsClient.CreateProject(d.Get("name").(string), d.Get("description").(string)) + }) if err != nil { return fmt.Errorf("CreateProject got an error: %#v.", err) } - + project, _ := raw.(*sls.LogProject) d.SetId(project.Name) return resourceAlicloudLogProjectRead(d, meta) } func resourceAlicloudLogProjectRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) - project, err := client.logconn.GetProject(d.Id()) + raw, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return slsClient.GetProject(d.Id()) + }) if err != nil { if IsExceptedError(err, ProjectNotExist) { d.SetId("") @@ -57,6 +64,7 @@ func resourceAlicloudLogProjectRead(d *schema.ResourceData, meta interface{}) er } return fmt.Errorf("GetProject got an error: %#v.", err) } + project, _ := raw.(*sls.LogProject) d.Set("name", project.Name) d.Set("description", project.Description) @@ -64,7 +72,7 @@ func resourceAlicloudLogProjectRead(d *schema.ResourceData, meta interface{}) er } //func resourceAlicloudLogProjectUpdate(d *schema.ResourceData, meta interface{}) error { -// client := meta.(*AliyunClient) +// client := meta.(*aliyunclient.AliyunClient) // // d.Partial(true) // @@ -81,19 +89,25 @@ func resourceAlicloudLogProjectRead(d *schema.ResourceData, meta interface{}) er //} func resourceAlicloudLogProjectDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).logconn + client := meta.(*connectivity.AliyunClient) return resource.Retry(3*time.Minute, func() *resource.RetryError { - if err := conn.DeleteProject(d.Id()); err != nil { + _, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return nil, slsClient.DeleteProject(d.Id()) + }) + if err != nil { if !IsExceptedErrors(err, []string{ProjectNotExist}) { return resource.NonRetryableError(fmt.Errorf("Deleting log project got an error: %#v", err)) } } - exist, err := conn.CheckProjectExist(d.Id()) + raw, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return slsClient.CheckProjectExist(d.Id()) + }) if err != nil { return resource.NonRetryableError(fmt.Errorf("While deleting log project, checking project existing got an error: %#v.", err)) } + exist, _ := raw.(bool) if !exist { return nil } diff --git a/alicloud/resource_alicloud_log_project_test.go b/alicloud/resource_alicloud_log_project_test.go index 59a8d3fad80..74d3c7d0caf 100644 --- a/alicloud/resource_alicloud_log_project_test.go +++ b/alicloud/resource_alicloud_log_project_test.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/aliyun-log-go-sdk" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -19,11 +20,11 @@ func init() { } func testSweepLogProjects(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -32,10 +33,13 @@ func testSweepLogProjects(region string) error { "tf-test-", } - names, err := conn.logconn.ListProject() + raw, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return slsClient.ListProject() + }) if err != nil { return fmt.Errorf("Error retrieving Log Projects: %s", err) } + names, _ := raw.([]string) for _, v := range names { name := v @@ -51,7 +55,10 @@ func testSweepLogProjects(region string) error { continue } log.Printf("[INFO] Deleting Log Project: %s", name) - if err := conn.logconn.DeleteProject(name); err != nil { + _, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return nil, slsClient.DeleteProject(name) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Log Project (%s): %s", name, err) } } @@ -88,9 +95,10 @@ func testAccCheckAlicloudLogProjectExists(name string, project *sls.LogProject) return fmt.Errorf("No Log project ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + logService := LogService{client} - p, err := client.DescribeLogProject(rs.Primary.ID) + p, err := logService.DescribeLogProject(rs.Primary.ID) if err != nil { return err } @@ -104,19 +112,21 @@ func testAccCheckAlicloudLogProjectExists(name string, project *sls.LogProject) } func testAccCheckAlicloudLogProjectDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AliyunClient).logconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_log_project" { continue } - exist, err := conn.CheckProjectExist(rs.Primary.ID) + raw, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return slsClient.CheckProjectExist(rs.Primary.ID) + }) if err != nil { return fmt.Errorf("Check log project got an error: %#v.", err) } - + exist, _ := raw.(bool) if !exist { return nil } diff --git a/alicloud/resource_alicloud_log_store.go b/alicloud/resource_alicloud_log_store.go index e1c875f76c1..eb99c4620c1 100644 --- a/alicloud/resource_alicloud_log_store.go +++ b/alicloud/resource_alicloud_log_store.go @@ -4,6 +4,9 @@ import ( "fmt" "time" + "github.com/aliyun/aliyun-log-go-sdk" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" + "strings" "github.com/hashicorp/terraform/helper/resource" @@ -77,8 +80,12 @@ func resourceAlicloudLogStore() *schema.Resource { } func resourceAlicloudLogStoreCreate(d *schema.ResourceData, meta interface{}) error { - if err := meta.(*AliyunClient).logconn.CreateLogStore(d.Get("project").(string), d.Get("name").(string), - d.Get("retention_period").(int), d.Get("shard_count").(int)); err != nil { + client := meta.(*connectivity.AliyunClient) + _, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return nil, slsClient.CreateLogStore(d.Get("project").(string), d.Get("name").(string), + d.Get("retention_period").(int), d.Get("shard_count").(int)) + }) + if err != nil { return fmt.Errorf("CreateLogStore got an error: %#v.", err) } @@ -88,9 +95,11 @@ func resourceAlicloudLogStoreCreate(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudLogStoreRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + logService := LogService{client} split := strings.Split(d.Id(), COLON_SEPARATED) - store, err := meta.(*AliyunClient).DescribeLogStore(split[0], split[1]) + store, err := logService.DescribeLogStore(split[0], split[1]) if err != nil { if NotFoundError(err) { d.SetId("") @@ -123,7 +132,8 @@ func resourceAlicloudLogStoreRead(d *schema.ResourceData, meta interface{}) erro } func resourceAlicloudLogStoreUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + logService := LogService{client} if d.IsNewResource() { return resourceAlicloudLogStoreRead(d, meta) @@ -139,11 +149,14 @@ func resourceAlicloudLogStoreUpdate(d *schema.ResourceData, meta interface{}) er } if update { - store, err := client.DescribeLogStore(split[0], split[1]) + store, err := logService.DescribeLogStore(split[0], split[1]) if err != nil { return err } - if err = client.logconn.UpdateLogStore(split[0], split[1], d.Get("retention_period").(int), store.ShardCount); err != nil { + _, err = client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return nil, slsClient.UpdateLogStore(split[0], split[1], d.Get("retention_period").(int), store.ShardCount) + }) + if err != nil { return fmt.Errorf("UpdateLogStore %s got an error: %#v.", split[1], err) } } @@ -153,11 +166,12 @@ func resourceAlicloudLogStoreUpdate(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudLogStoreDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + logService := LogService{client} split := strings.Split(d.Id(), COLON_SEPARATED) - project, err := client.DescribeLogProject(split[0]) + project, err := logService.DescribeLogProject(split[0]) if err != nil { return err } @@ -166,7 +180,7 @@ func resourceAlicloudLogStoreDelete(d *schema.ResourceData, meta interface{}) er return resource.NonRetryableError(fmt.Errorf("Deleting log store %s got an error: %#v", split[1], err)) } - store, err := client.DescribeLogStore(split[0], split[1]) + store, err := logService.DescribeLogStore(split[0], split[1]) if err != nil { if NotFoundError(err) { return nil diff --git a/alicloud/resource_alicloud_log_store_index.go b/alicloud/resource_alicloud_log_store_index.go index 8b5b6eb73c8..4cdceee16c2 100644 --- a/alicloud/resource_alicloud_log_store_index.go +++ b/alicloud/resource_alicloud_log_store_index.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform/helper/hashcode" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudLogStoreIndex() *schema.Resource { @@ -117,7 +118,8 @@ func resourceAlicloudLogStoreIndex() *schema.Resource { } func resourceAlicloudLogStoreIndexCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + logService := LogService{client} _, fullOk := d.GetOk("full_text") _, fieldOk := d.GetOk("field_search") @@ -126,7 +128,7 @@ func resourceAlicloudLogStoreIndexCreate(d *schema.ResourceData, meta interface{ } project := d.Get("project").(string) - store, err := client.DescribeLogStore(project, d.Get("logstore").(string)) + store, err := logService.DescribeLogStore(project, d.Get("logstore").(string)) if err != nil { return fmt.Errorf("DescribeLogStore got an error: %#v.", err) } @@ -167,9 +169,11 @@ func resourceAlicloudLogStoreIndexCreate(d *schema.ResourceData, meta interface{ } func resourceAlicloudLogStoreIndexRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + logService := LogService{client} split := strings.Split(d.Id(), COLON_SEPARATED) - index, err := meta.(*AliyunClient).DescribeLogStoreIndex(split[0], split[1]) + index, err := logService.DescribeLogStoreIndex(split[0], split[1]) if err != nil { if NotFoundError(err) { @@ -215,7 +219,7 @@ func resourceAlicloudLogStoreIndexRead(d *schema.ResourceData, meta interface{}) } func resourceAlicloudLogStoreIndexUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) split := strings.Split(d.Id(), COLON_SEPARATED) d.Partial(true) @@ -234,8 +238,10 @@ func resourceAlicloudLogStoreIndexUpdate(d *schema.ResourceData, meta interface{ } if update { - - if err := client.logconn.UpdateIndex(split[0], split[1], index); err != nil { + _, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return nil, slsClient.UpdateIndex(split[0], split[1], index) + }) + if err != nil { return fmt.Errorf("UpdateLogStoreIndex got an error: %#v.", err) } } @@ -245,18 +251,22 @@ func resourceAlicloudLogStoreIndexUpdate(d *schema.ResourceData, meta interface{ } func resourceAlicloudLogStoreIndexDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + logService := LogService{client} split := strings.Split(d.Id(), COLON_SEPARATED) - if _, err := client.DescribeLogStoreIndex(split[0], split[1]); err != nil { + if _, err := logService.DescribeLogStoreIndex(split[0], split[1]); err != nil { if NotFoundError(err) { return nil } return fmt.Errorf("While deleting index, GetIndex got an error: %#v.", err) } - if err := client.logconn.DeleteIndex(split[0], split[1]); err != nil { + _, err := client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return nil, slsClient.DeleteIndex(split[0], split[1]) + }) + if err != nil { return fmt.Errorf("DeleteIndex got an error: %#v.", err) } return nil diff --git a/alicloud/resource_alicloud_log_store_index_test.go b/alicloud/resource_alicloud_log_store_index_test.go index 413c15e542a..18afd348d52 100644 --- a/alicloud/resource_alicloud_log_store_index_test.go +++ b/alicloud/resource_alicloud_log_store_index_test.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/aliyun-log-go-sdk" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudLogStoreIndex_fullText(t *testing.T) { @@ -96,7 +97,9 @@ func testAccCheckAlicloudLogStoreIndexExists(name string, index *sls.Index) reso split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - i, err := testAccProvider.Meta().(*AliyunClient).DescribeLogStoreIndex(split[0], split[1]) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + logService := LogService{client} + i, err := logService.DescribeLogStoreIndex(split[0], split[1]) if err != nil { return err } @@ -107,7 +110,8 @@ func testAccCheckAlicloudLogStoreIndexExists(name string, index *sls.Index) reso } func testAccCheckAlicloudLogStoreIndexDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + logService := LogService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_log_store_index" { @@ -116,7 +120,7 @@ func testAccCheckAlicloudLogStoreIndexDestroy(s *terraform.State) error { split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - i, err := client.DescribeLogStoreIndex(split[0], split[1]) + i, err := logService.DescribeLogStoreIndex(split[0], split[1]) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_log_store_test.go b/alicloud/resource_alicloud_log_store_test.go index 412a598d15f..9a6dbfa863f 100644 --- a/alicloud/resource_alicloud_log_store_test.go +++ b/alicloud/resource_alicloud_log_store_test.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/aliyun-log-go-sdk" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudLogStore_basic(t *testing.T) { @@ -45,9 +46,10 @@ func testAccCheckAlicloudLogStoreExists(name string, store *sls.LogStore) resour } split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + logService := LogService{client} - logstore, err := client.DescribeLogStore(split[0], split[1]) + logstore, err := logService.DescribeLogStore(split[0], split[1]) if err != nil { return err } @@ -61,7 +63,8 @@ func testAccCheckAlicloudLogStoreExists(name string, store *sls.LogStore) resour } func testAccCheckAlicloudLogStoreDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + logService := LogService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_log_store" { @@ -69,7 +72,7 @@ func testAccCheckAlicloudLogStoreDestroy(s *terraform.State) error { } split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - if _, err := client.DescribeLogStore(split[0], split[1]); err != nil { + if _, err := logService.DescribeLogStore(split[0], split[1]); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_mns_queue.go b/alicloud/resource_alicloud_mns_queue.go index e9656a34a45..776a4e0962c 100644 --- a/alicloud/resource_alicloud_mns_queue.go +++ b/alicloud/resource_alicloud_mns_queue.go @@ -3,7 +3,9 @@ package alicloud import ( "fmt" + "github.com/dxh031/ali_mns" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudMNSQueue() *schema.Resource { @@ -58,11 +60,7 @@ func resourceAlicloudMNSQueue() *schema.Resource { } func resourceAlicloudMNSQueueCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - queueManager, err := client.MnsQueueManager() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) name := d.Get("name").(string) var delaySeconds, maximumMessageSize, messageRetentionPeriod, visibilityTimeout, pollingWaitSeconds int if v, ok := d.GetOk("delay_seconds"); ok { @@ -81,7 +79,9 @@ func resourceAlicloudMNSQueueCreate(d *schema.ResourceData, meta interface{}) er pollingWaitSeconds = v.(int) } - err = queueManager.CreateQueue(name, int32(delaySeconds), int32(maximumMessageSize), int32(messageRetentionPeriod), int32(visibilityTimeout), int32(pollingWaitSeconds), 3) + _, err := client.WithMnsQueueManager(func(queueManager ali_mns.AliQueueManager) (interface{}, error) { + return nil, queueManager.CreateQueue(name, int32(delaySeconds), int32(maximumMessageSize), int32(messageRetentionPeriod), int32(visibilityTimeout), int32(pollingWaitSeconds), 3) + }) if err != nil { return fmt.Errorf("Create queue got an error: %#v", err) } @@ -90,15 +90,14 @@ func resourceAlicloudMNSQueueCreate(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudMNSQueueRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - queueManager, err := client.MnsQueueManager() - if err != nil { - return err - } - attr, err := queueManager.GetQueueAttributes(d.Id()) + client := meta.(*connectivity.AliyunClient) + raw, err := client.WithMnsQueueManager(func(queueManager ali_mns.AliQueueManager) (interface{}, error) { + return queueManager.GetQueueAttributes(d.Id()) + }) if err != nil { return err } + attr, _ := raw.(ali_mns.QueueAttribute) d.Set("name", attr.QueueName) d.Set("delay_seconds", attr.DelaySeconds) d.Set("maximum_message_size", attr.MaxMessageSize) @@ -110,11 +109,7 @@ func resourceAlicloudMNSQueueRead(d *schema.ResourceData, meta interface{}) erro } func resourceAlicloudMNSQueueUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - queueManager, err := client.MnsQueueManager() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) attributeUpdate := false var delaySeconds, maximumMessageSize, messageRetentionPeriod, visibilityTimeouts, pollingWaitSeconds int delaySeconds = d.Get("delay_seconds").(int) @@ -142,7 +137,9 @@ func resourceAlicloudMNSQueueUpdate(d *schema.ResourceData, meta interface{}) er } if attributeUpdate { - err = queueManager.SetQueueAttributes(name, int32(delaySeconds), int32(maximumMessageSize), int32(messageRetentionPeriod), int32(visibilityTimeouts), int32(pollingWaitSeconds), 3) + _, err := client.WithMnsQueueManager(func(queueManager ali_mns.AliQueueManager) (interface{}, error) { + return nil, queueManager.SetQueueAttributes(name, int32(delaySeconds), int32(maximumMessageSize), int32(messageRetentionPeriod), int32(visibilityTimeouts), int32(pollingWaitSeconds), 3) + }) if err != nil { return err } @@ -151,20 +148,22 @@ func resourceAlicloudMNSQueueUpdate(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudMNSQueueDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - queueManager, err := client.MnsQueueManager() - if err != nil { - return err - } + client := meta.(*connectivity.AliyunClient) + mnsService := MnsService{} name := d.Id() - err = queueManager.DeleteQueue(name) + _, err := client.WithMnsQueueManager(func(queueManager ali_mns.AliQueueManager) (interface{}, error) { + return nil, queueManager.DeleteQueue(name) + }) if err != nil { return err } - attr, err := queueManager.GetQueueAttributes(name) - if QueueNotExistFunc(err) { + raw, err := client.WithMnsQueueManager(func(queueManager ali_mns.AliQueueManager) (interface{}, error) { + return queueManager.GetQueueAttributes(name) + }) + if mnsService.QueueNotExistFunc(err) { return nil } + attr, _ := raw.(ali_mns.QueueAttribute) if attr.QueueName == name { return fmt.Errorf("delete queue %s error.", name) } diff --git a/alicloud/resource_alicloud_mns_queue_test.go b/alicloud/resource_alicloud_mns_queue_test.go index 856a81ac792..e4ac544b1b5 100644 --- a/alicloud/resource_alicloud_mns_queue_test.go +++ b/alicloud/resource_alicloud_mns_queue_test.go @@ -9,6 +9,7 @@ import ( "github.com/dxh031/ali_mns" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -19,16 +20,11 @@ func init() { } func testSweepMnsQueues(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) - - queueManager, err := conn.MnsQueueManager() - if err != nil { - return fmt.Errorf("Creating MNS QueueManager error: %#v", err) - } + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -39,10 +35,13 @@ func testSweepMnsQueues(region string) error { for _, namePrefix := range prefixes { for { var nextMaker string - queueDetails, err := queueManager.ListQueueDetail(nextMaker, 1000, namePrefix) + raw, err := client.WithMnsQueueManager(func(queueManager ali_mns.AliQueueManager) (interface{}, error) { + return queueManager.ListQueueDetail(nextMaker, 1000, namePrefix) + }) if err != nil { return fmt.Errorf("get queueDetails error: %#v", err) } + queueDetails, _ := raw.(ali_mns.QueueDetails) for _, attr := range queueDetails.Attrs { queueAttrs = append(queueAttrs, attr) } @@ -66,7 +65,9 @@ func testSweepMnsQueues(region string) error { continue } log.Printf("[INFO] delete mns queque: %s ", name) - err = queueManager.DeleteQueue(queueAttr.QueueName) + _, err := client.WithMnsQueueManager(func(queueManager ali_mns.AliQueueManager) (interface{}, error) { + return nil, queueManager.DeleteQueue(queueAttr.QueueName) + }) if err != nil { log.Printf("[ERROR] Failed to delete mnsQueue (%s (%s)): %s", queueAttr.QueueName, queueAttr.QueueName, err) } @@ -120,17 +121,16 @@ func testAccMNSQueueExist(n string, attr *ali_mns.QueueAttribute) resource.TestC return fmt.Errorf("No MNSQueue ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) - queueManager, err := client.MnsQueueManager() - if err != nil { - return fmt.Errorf("Creating MNS QueueManager error: %#v", err) - } - instance, err := queueManager.GetQueueAttributes(rs.Primary.ID) + raw, err := client.WithMnsQueueManager(func(queueManager ali_mns.AliQueueManager) (interface{}, error) { + return queueManager.GetQueueAttributes(rs.Primary.ID) + }) if err != nil { return err } + instance, _ := raw.(ali_mns.QueueAttribute) if instance.QueueName != rs.Primary.ID { return fmt.Errorf("mns queue:%s not found", n) } @@ -142,17 +142,17 @@ func testAccMNSQueueExist(n string, attr *ali_mns.QueueAttribute) resource.TestC } func testAccCheckMNSQueueDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + mnsService := MnsService{} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_mns_queue" { continue } - queueManager, err := client.MnsQueueManager() + _, err := client.WithMnsQueueManager(func(queueManager ali_mns.AliQueueManager) (interface{}, error) { + return queueManager.GetQueueAttributes(rs.Primary.ID) + }) if err != nil { - return fmt.Errorf("Creating MNS QueueManager error: %#v", err) - } - if _, err := queueManager.GetQueueAttributes(rs.Primary.ID); err != nil { - if QueueNotExistFunc(err) { + if mnsService.QueueNotExistFunc(err) { continue } return err diff --git a/alicloud/resource_alicloud_mns_topic.go b/alicloud/resource_alicloud_mns_topic.go index e537643cb47..77aa9f7d2f2 100644 --- a/alicloud/resource_alicloud_mns_topic.go +++ b/alicloud/resource_alicloud_mns_topic.go @@ -6,7 +6,9 @@ import ( "github.com/hashicorp/terraform/helper/resource" + "github.com/dxh031/ali_mns" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudMNSTopic() *schema.Resource { @@ -43,15 +45,13 @@ func resourceAlicloudMNSTopic() *schema.Resource { } func resourceAlicloudMNSTopicCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - topicManager, err := client.MnsTopicManager() - if err != nil { - return fmt.Errorf("Creating alicoudMNSTopicManager error: %#v", err) - } + client := meta.(*connectivity.AliyunClient) name := d.Get("name").(string) maximumMessageSize := d.Get("maximum_message_size").(int) loggingEnabled := d.Get("logging_enabled").(bool) - err = topicManager.CreateTopic(name, int32(maximumMessageSize), loggingEnabled) + _, err := client.WithMnsTopicManager(func(topicManager ali_mns.AliTopicManager) (interface{}, error) { + return nil, topicManager.CreateTopic(name, int32(maximumMessageSize), loggingEnabled) + }) if err != nil { return fmt.Errorf("Create topic got an error: %#v", err) } @@ -60,15 +60,14 @@ func resourceAlicloudMNSTopicCreate(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudMNSTopicRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - topicManager, err := client.MnsTopicManager() - if err != nil { - return fmt.Errorf("Creating alicoudMNSTopicManager error: %#v", err) - } - attr, err := topicManager.GetTopicAttributes(d.Id()) + client := meta.(*connectivity.AliyunClient) + raw, err := client.WithMnsTopicManager(func(topicManager ali_mns.AliTopicManager) (interface{}, error) { + return topicManager.GetTopicAttributes(d.Id()) + }) if err != nil { return err } + attr, _ := raw.(ali_mns.TopicAttribute) d.Set("name", attr.TopicName) d.Set("maximum_message_size", attr.MaxMessageSize) d.Set("logging_enabled", attr.LoggingEnabled) @@ -76,11 +75,7 @@ func resourceAlicloudMNSTopicRead(d *schema.ResourceData, meta interface{}) erro } func resourceAlicloudMNSTopicUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - topicManager, err := client.MnsTopicManager() - if err != nil { - return fmt.Errorf(" Creating alicoudMNSTopicManager error: %#v", err) - } + client := meta.(*connectivity.AliyunClient) attributeUpdate := false name := d.Id() maximumMessageSize := d.Get("maximum_message_size").(int) @@ -94,7 +89,9 @@ func resourceAlicloudMNSTopicUpdate(d *schema.ResourceData, meta interface{}) er } if attributeUpdate { - err = topicManager.SetTopicAttributes(name, int32(maximumMessageSize), loggingEnabled) + _, err := client.WithMnsTopicManager(func(topicManager ali_mns.AliTopicManager) (interface{}, error) { + return nil, topicManager.SetTopicAttributes(name, int32(maximumMessageSize), loggingEnabled) + }) if err != nil { return err } @@ -103,26 +100,28 @@ func resourceAlicloudMNSTopicUpdate(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudMNSTopicDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - topicManager, err := client.MnsTopicManager() - if err != nil { - return fmt.Errorf("Creating alicoudMNSTopicManager error: %#v", err) - } + client := meta.(*connectivity.AliyunClient) + mnsService := MnsService{} name := d.Id() return resource.Retry(3*time.Minute, func() *resource.RetryError { - err = topicManager.DeleteTopic(name) + _, err := client.WithMnsTopicManager(func(topicManager ali_mns.AliTopicManager) (interface{}, error) { + return nil, topicManager.DeleteTopic(name) + }) if err != nil { return resource.NonRetryableError(fmt.Errorf("Deleting mns topic got an error: %#v", err)) } - attr, err := topicManager.GetTopicAttributes(name) + raw, err := client.WithMnsTopicManager(func(topicManager ali_mns.AliTopicManager) (interface{}, error) { + return topicManager.GetTopicAttributes(name) + }) if err != nil { - if TopicNotExistFunc(err) { + if mnsService.TopicNotExistFunc(err) { return nil } return resource.NonRetryableError(fmt.Errorf("Describe mns topic got an error: %#v", err)) } + attr, _ := raw.(ali_mns.TopicAttribute) if attr.TopicName != name { return nil } diff --git a/alicloud/resource_alicloud_mns_topic_subscription.go b/alicloud/resource_alicloud_mns_topic_subscription.go index f0ca2f19be7..18704f73f4b 100644 --- a/alicloud/resource_alicloud_mns_topic_subscription.go +++ b/alicloud/resource_alicloud_mns_topic_subscription.go @@ -8,6 +8,7 @@ import ( "github.com/dxh031/ali_mns" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudMNSSubscription() *schema.Resource { @@ -70,12 +71,8 @@ func resourceAlicloudMNSSubscription() *schema.Resource { } func resourceAlicloudMNSSubscriptionCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) topicName := d.Get("topic_name").(string) - subscriptionManager, err := client.MnsSubscriptionManager(topicName) - if err != nil { - return fmt.Errorf("Creating mns subscription client error: %#v", err) - } name := d.Get("name").(string) endpoint := d.Get("endpoint").(string) notifyStrategyStr := d.Get("notify_strategy").(string) @@ -92,7 +89,9 @@ func resourceAlicloudMNSSubscriptionCreate(d *schema.ResourceData, meta interfac NotifyStrategy: notifyStrategy, NotifyContentFormat: notifyContentFormat, } - err = subscriptionManager.Subscribe(name, subRequest) + _, err := client.WithMnsSubscriptionManagerByTopicName(topicName, func(subscriptionManager ali_mns.AliMNSTopic) (interface{}, error) { + return nil, subscriptionManager.Subscribe(name, subRequest) + }) if err != nil { return fmt.Errorf("Create Subscription got an error: %#v", err) } @@ -101,20 +100,20 @@ func resourceAlicloudMNSSubscriptionCreate(d *schema.ResourceData, meta interfac } func resourceAlicloudMNSSubscriptionRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - topicName, name := GetTopicNameAndSubscriptionName(d.Id()) - subscriptionManager, err := client.MnsSubscriptionManager(topicName) - if err != nil { - return fmt.Errorf("Creating mns subscription client error: %#v", err) - } - attr, err := subscriptionManager.GetSubscriptionAttributes(name) + client := meta.(*connectivity.AliyunClient) + mnsService := MnsService{} + topicName, name := mnsService.GetTopicNameAndSubscriptionName(d.Id()) + raw, err := client.WithMnsSubscriptionManagerByTopicName(topicName, func(subscriptionManager ali_mns.AliMNSTopic) (interface{}, error) { + return subscriptionManager.GetSubscriptionAttributes(name) + }) if err != nil { - if SubscriptionNotExistFunc(err) { + if mnsService.SubscriptionNotExistFunc(err) { d.SetId("") return nil } return fmt.Errorf("Get mns subscription attr error: %#v", err) } + attr, _ := raw.(ali_mns.SubscriptionAttribute) d.Set("topic_name", attr.TopicName) d.Set("name", attr.SubscriptionName) d.Set("endpoint", attr.Endpoint) @@ -126,14 +125,13 @@ func resourceAlicloudMNSSubscriptionRead(d *schema.ResourceData, meta interface{ func resourceAlicloudMNSSubscriptionUpdate(d *schema.ResourceData, meta interface{}) error { if d.HasChange("notify_strategy") { - client := meta.(*AliyunClient) - topicName, name := GetTopicNameAndSubscriptionName(d.Id()) - subscriptionManager, err := client.MnsSubscriptionManager(topicName) - if err != nil { - return fmt.Errorf("Creating mns subscription client error: %#v", err) - } + client := meta.(*connectivity.AliyunClient) + mnsService := MnsService{} + topicName, name := mnsService.GetTopicNameAndSubscriptionName(d.Id()) notifyStrategy := ali_mns.NotifyStrategyType(d.Get("notify_strategy").(string)) - err = subscriptionManager.SetSubscriptionAttributes(name, notifyStrategy) + _, err := client.WithMnsSubscriptionManagerByTopicName(topicName, func(subscriptionManager ali_mns.AliMNSTopic) (interface{}, error) { + return nil, subscriptionManager.SetSubscriptionAttributes(name, notifyStrategy) + }) if err != nil { return fmt.Errorf("update mns subscription client error: %#v", err) } @@ -142,24 +140,26 @@ func resourceAlicloudMNSSubscriptionUpdate(d *schema.ResourceData, meta interfac } func resourceAlicloudMNSSubscriptionDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - topicName, name := GetTopicNameAndSubscriptionName(d.Id()) - subscriptionManager, err := client.MnsSubscriptionManager(topicName) - if err != nil { - return fmt.Errorf("Creating mns subscription client error: %#v", err) - } + client := meta.(*connectivity.AliyunClient) + mnsService := MnsService{} + topicName, name := mnsService.GetTopicNameAndSubscriptionName(d.Id()) return resource.Retry(3*time.Minute, func() *resource.RetryError { - err = subscriptionManager.Unsubscribe(name) + _, err := client.WithMnsSubscriptionManagerByTopicName(topicName, func(subscriptionManager ali_mns.AliMNSTopic) (interface{}, error) { + return nil, subscriptionManager.Unsubscribe(name) + }) if err != nil { return resource.NonRetryableError(fmt.Errorf("Deleting mns subscription %s got an error: %#v", name, err)) } - attr, err := subscriptionManager.GetSubscriptionAttributes(name) + raw, err := client.WithMnsSubscriptionManagerByTopicName(topicName, func(subscriptionManager ali_mns.AliMNSTopic) (interface{}, error) { + return subscriptionManager.GetSubscriptionAttributes(name) + }) if err != nil { - if SubscriptionNotExistFunc(err) { + if mnsService.SubscriptionNotExistFunc(err) { return nil } return resource.NonRetryableError(fmt.Errorf("Describe mns subscription %s got an error: %#v", name, err)) } + attr, _ := raw.(ali_mns.SubscriptionAttribute) if attr.SubscriptionName != name { return nil } diff --git a/alicloud/resource_alicloud_mns_topic_subscription_test.go b/alicloud/resource_alicloud_mns_topic_subscription_test.go index 2b93066d6fe..75379124cf7 100644 --- a/alicloud/resource_alicloud_mns_topic_subscription_test.go +++ b/alicloud/resource_alicloud_mns_topic_subscription_test.go @@ -7,6 +7,7 @@ import ( "github.com/dxh031/ali_mns" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccResourceAlicloudMNSTopicSubscription_basic(t *testing.T) { @@ -57,17 +58,17 @@ func testAccMNSTopicSubscriptionExist(n string, attr *ali_mns.SubscriptionAttrib if rs.Primary.ID == "" { return fmt.Errorf("No MNSTopicSubscription ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - topicName, name := GetTopicNameAndSubscriptionName(rs.Primary.ID) - subscriptionManager, err := client.MnsSubscriptionManager(topicName) - if err != nil { - return fmt.Errorf("Creating mns subscription client error: %#v", err) - } - instance, err := subscriptionManager.GetSubscriptionAttributes(name) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + mnsService := MnsService{} + topicName, name := mnsService.GetTopicNameAndSubscriptionName(rs.Primary.ID) + raw, err := client.WithMnsSubscriptionManagerByTopicName(topicName, func(subscriptionManager ali_mns.AliMNSTopic) (interface{}, error) { + return subscriptionManager.GetSubscriptionAttributes(name) + }) if err != nil { return err } + instance, _ := raw.(ali_mns.SubscriptionAttribute) if instance.SubscriptionName != name { return fmt.Errorf("mns subscription %s not found", n) } @@ -78,18 +79,18 @@ func testAccMNSTopicSubscriptionExist(n string, attr *ali_mns.SubscriptionAttrib } func testAccCheckMNSTopicSubscriptionDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + mnsService := MnsService{} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_mns_topic_subscription" { continue } - topicName, name := GetTopicNameAndSubscriptionName(rs.Primary.ID) - subscriptionManager, err := client.MnsSubscriptionManager(topicName) + topicName, name := mnsService.GetTopicNameAndSubscriptionName(rs.Primary.ID) + _, err := client.WithMnsSubscriptionManagerByTopicName(topicName, func(subscriptionManager ali_mns.AliMNSTopic) (interface{}, error) { + return subscriptionManager.GetSubscriptionAttributes(name) + }) if err != nil { - return fmt.Errorf("Creating mns subscription client error: %#v", err) - } - if _, err := subscriptionManager.GetSubscriptionAttributes(name); err != nil { - if SubscriptionNotExistFunc(err) { + if mnsService.SubscriptionNotExistFunc(err) { continue } return err diff --git a/alicloud/resource_alicloud_mns_topic_test.go b/alicloud/resource_alicloud_mns_topic_test.go index 011a3e30800..df06fab4058 100644 --- a/alicloud/resource_alicloud_mns_topic_test.go +++ b/alicloud/resource_alicloud_mns_topic_test.go @@ -9,6 +9,7 @@ import ( "github.com/dxh031/ali_mns" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -19,16 +20,11 @@ func init() { } func testSweepMnsTopics(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) - - topicManager, err := conn.MnsTopicManager() - if err != nil { - return fmt.Errorf(" Creating alicoudMNSTopicManager error: %#v", err) - } + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -39,10 +35,13 @@ func testSweepMnsTopics(region string) error { for _, namePrefix := range prefixes { for { var nextMaker string - topicDetails, err := topicManager.ListTopicDetail(nextMaker, 1000, namePrefix) + raw, err := client.WithMnsTopicManager(func(topicManager ali_mns.AliTopicManager) (interface{}, error) { + return topicManager.ListTopicDetail(nextMaker, 1000, namePrefix) + }) if err != nil { return fmt.Errorf("get topicDetails error: %#v", err) } + topicDetails, _ := raw.(ali_mns.TopicDetails) for _, attr := range topicDetails.Attrs { topicAttrs = append(topicAttrs, attr) } @@ -66,7 +65,9 @@ func testSweepMnsTopics(region string) error { continue } log.Printf("[INFO] delete mns topic : %s ", name) - err = topicManager.DeleteTopic(name) + _, err := client.WithMnsTopicManager(func(topicManager ali_mns.AliTopicManager) (interface{}, error) { + return nil, topicManager.DeleteTopic(name) + }) if err != nil { log.Printf("[ERROR] Failed to delete mns topic (%s (%s)): %s", topicAttr.TopicName, topicAttr.TopicName, err) } @@ -117,16 +118,14 @@ func testAccMNSTopicExist(n string, attr *ali_mns.TopicAttribute) resource.TestC return fmt.Errorf("No MNSTopic ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - - topicManager, err := client.MnsTopicManager() - if err != nil { - return fmt.Errorf(" Creating alicoudMNSTopicManager error: %#v", err) - } - instance, err := topicManager.GetTopicAttributes(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + raw, err := client.WithMnsTopicManager(func(topicManager ali_mns.AliTopicManager) (interface{}, error) { + return topicManager.GetTopicAttributes(rs.Primary.ID) + }) if err != nil { return err } + instance, _ := raw.(ali_mns.TopicAttribute) if instance.TopicName != rs.Primary.ID { return fmt.Errorf("mns topic %s not found", n) } @@ -137,19 +136,19 @@ func testAccMNSTopicExist(n string, attr *ali_mns.TopicAttribute) resource.TestC } func testAccCheckMNSTopicDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + mnsService := MnsService{} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_mns_topic" { continue } - topicManager, err := client.MnsTopicManager() - if err != nil { - return fmt.Errorf(" Creating alicoudMNSTopicManager error: %#v", err) - } - if _, err := topicManager.GetTopicAttributes(rs.Primary.ID); err != nil { - if TopicNotExistFunc(err) { + _, err := client.WithMnsTopicManager(func(topicManager ali_mns.AliTopicManager) (interface{}, error) { + return topicManager.GetTopicAttributes(rs.Primary.ID) + }) + if err != nil { + if mnsService.TopicNotExistFunc(err) { continue } return err diff --git a/alicloud/resource_alicloud_nat_gateway.go b/alicloud/resource_alicloud_nat_gateway.go index 92f1d6ff1f5..b72e6d8d828 100644 --- a/alicloud/resource_alicloud_nat_gateway.go +++ b/alicloud/resource_alicloud_nat_gateway.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunNatGateway() *schema.Resource { @@ -96,10 +97,10 @@ func resourceAliyunNatGateway() *schema.Resource { } func resourceAliyunNatGatewayCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) args := vpc.CreateCreateNatGatewayRequest() - args.RegionId = string(getRegion(d, meta)) + args.RegionId = string(client.Region) args.VpcId = string(d.Get("vpc_id").(string)) args.Spec = string(d.Get("specification").(string)) args.ClientToken = buildClientToken("TF-CreateNatGateway") @@ -128,13 +129,16 @@ func resourceAliyunNatGatewayCreate(d *schema.ResourceData, meta interface{}) er if err := resource.Retry(3*time.Minute, func() *resource.RetryError { ar := *args - resp, err := conn.CreateNatGateway(&ar) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateNatGateway(&ar) + }) if err != nil { if IsExceptedError(err, VswitchStatusError) || IsExceptedError(err, TaskConflict) { return resource.RetryableError(fmt.Errorf("CreateNatGateway got error: %#v", err)) } return resource.NonRetryableError(fmt.Errorf("CreateNatGateway got error: %#v", err)) } + resp, _ := raw.(*vpc.CreateNatGatewayResponse) d.SetId(resp.NatGatewayId) return nil }); err != nil { @@ -146,9 +150,10 @@ func resourceAliyunNatGatewayCreate(d *schema.ResourceData, meta interface{}) er func resourceAliyunNatGatewayRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - natGateway, err := client.DescribeNatGateway(d.Id()) + natGateway, err := vpcService.DescribeNatGateway(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -177,10 +182,10 @@ func resourceAliyunNatGatewayRead(d *schema.ResourceData, meta interface{}) erro func resourceAliyunNatGatewayUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.vpcconn + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - natGateway, err := client.DescribeNatGateway(d.Id()) + natGateway, err := vpcService.DescribeNatGateway(d.Id()) if err != nil { return err } @@ -219,7 +224,10 @@ func resourceAliyunNatGatewayUpdate(d *schema.ResourceData, meta interface{}) er } if attributeUpdate { - if _, err := conn.ModifyNatGatewayAttribute(args); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyNatGatewayAttribute(args) + }) + if err != nil { return err } } @@ -231,7 +239,10 @@ func resourceAliyunNatGatewayUpdate(d *schema.ResourceData, meta interface{}) er request.NatGatewayId = natGateway.NatGatewayId request.Spec = d.Get("specification").(string) - if _, err := conn.ModifyNatGatewaySpec(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyNatGatewaySpec(request) + }) + if err != nil { return fmt.Errorf("ModifyNatGatewaySpec got an error: %#v with args: %#v", err, *args) } @@ -243,27 +254,32 @@ func resourceAliyunNatGatewayUpdate(d *schema.ResourceData, meta interface{}) er func resourceAliyunNatGatewayDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.vpcconn + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} packRequest := vpc.CreateDescribeBandwidthPackagesRequest() - packRequest.RegionId = string(getRegion(d, meta)) + packRequest.RegionId = string(client.Region) packRequest.NatGatewayId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - resp, err := conn.DescribeBandwidthPackages(packRequest) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeBandwidthPackages(packRequest) + }) if err != nil { log.Printf("[ERROR] Describe bandwidth package is failed, natGateway Id: %s", d.Id()) return resource.NonRetryableError(err) } - + resp, _ := raw.(*vpc.DescribeBandwidthPackagesResponse) retry := false if resp != nil && len(resp.BandwidthPackages.BandwidthPackage) > 0 { for _, pack := range resp.BandwidthPackages.BandwidthPackage { request := vpc.CreateDeleteBandwidthPackageRequest() - request.RegionId = string(getRegion(d, meta)) + request.RegionId = string(client.Region) request.BandwidthPackageId = pack.BandwidthPackageId - if _, err := conn.DeleteBandwidthPackage(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteBandwidthPackage(request) + }) + if err != nil { if IsExceptedError(err, NatGatewayInvalidRegionId) { log.Printf("[ERROR] Delete bandwidth package is failed, bandwidthPackageId: %#v", pack.BandwidthPackageId) return resource.NonRetryableError(err) @@ -278,10 +294,13 @@ func resourceAliyunNatGatewayDelete(d *schema.ResourceData, meta interface{}) er } args := vpc.CreateDeleteNatGatewayRequest() - args.RegionId = string(getRegion(d, meta)) + args.RegionId = string(client.Region) args.NatGatewayId = d.Id() - if _, err := conn.DeleteNatGateway(args); err != nil { + _, err = client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteNatGateway(args) + }) + if err != nil { if IsExceptedError(err, DependencyViolationBandwidthPackages) { return resource.RetryableError(fmt.Errorf("Delete nat gateway timeout and got an error: %#v.", err)) } @@ -291,7 +310,7 @@ func resourceAliyunNatGatewayDelete(d *schema.ResourceData, meta interface{}) er return resource.NonRetryableError(err) } - nat, err := client.DescribeNatGateway(d.Id()) + nat, err := vpcService.DescribeNatGateway(d.Id()) if err != nil { if NotFoundError(err) { @@ -342,10 +361,14 @@ func getPackages(packageId string, meta interface{}, d *schema.ResourceData) (pa invoker := NewInvoker() err = invoker.Run(func() error { - packages, err := meta.(*AliyunClient).vpcconn.DescribeBandwidthPackages(req) + client := meta.(*connectivity.AliyunClient) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeBandwidthPackages(req) + }) if err != nil { return err } + packages, _ := raw.(*vpc.DescribeBandwidthPackagesResponse) if packages == nil || len(packages.BandwidthPackages.BandwidthPackage) < 1 { return GetNotFoundErrorFromString(GetNotFoundMessage("Bandwidth Package", packageId)) } diff --git a/alicloud/resource_alicloud_nat_gateway_test.go b/alicloud/resource_alicloud_nat_gateway_test.go index d954d10d952..bbaab122a54 100644 --- a/alicloud/resource_alicloud_nat_gateway_test.go +++ b/alicloud/resource_alicloud_nat_gateway_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepNatGateways(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -36,14 +37,17 @@ func testSweepNatGateways(region string) error { var gws []vpc.NatGateway req := vpc.CreateDescribeNatGatewaysRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.vpcconn.DescribeNatGateways(req) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeNatGateways(req) + }) if err != nil { return fmt.Errorf("Error retrieving Nat Gateways: %s", err) } + resp, _ := raw.(*vpc.DescribeNatGatewaysResponse) if resp == nil || len(resp.NatGateways.NatGateway) < 1 { break } @@ -78,7 +82,10 @@ func testSweepNatGateways(region string) error { req := vpc.CreateDeleteNatGatewayRequest() req.NatGatewayId = id req.Force = requests.NewBoolean(true) - if _, err := conn.vpcconn.DeleteNatGateway(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteNatGateway(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Nat Gateway (%s (%s)): %s", name, id, err) } } @@ -140,8 +147,9 @@ func testAccCheckNatGatewayExists(n string, nat *vpc.NatGateway) resource.TestCh return fmt.Errorf("No Gateway ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeNatGateway(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} + instance, err := vpcService.DescribeNatGateway(rs.Primary.ID) if err != nil { return err @@ -156,7 +164,8 @@ func testAccCheckNatGatewayExists(n string, nat *vpc.NatGateway) resource.TestCh } func testAccCheckNatGatewayDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_nat_gateway" { @@ -164,7 +173,7 @@ func testAccCheckNatGatewayDestroy(s *terraform.State) error { } // Try to find the Nat gateway - if _, err := client.DescribeNatGateway(rs.Primary.ID); err != nil { + if _, err := vpcService.DescribeNatGateway(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_oss_bucket.go b/alicloud/resource_alicloud_oss_bucket.go index 38e7ea4dac8..9a083507d15 100644 --- a/alicloud/resource_alicloud_oss_bucket.go +++ b/alicloud/resource_alicloud_oss_bucket.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform/helper/hashcode" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudOssBucket() *schema.Resource { @@ -207,30 +208,36 @@ func resourceAlicloudOssBucket() *schema.Resource { } func resourceAlicloudOssBucketCreate(d *schema.ResourceData, meta interface{}) error { - ossconn := meta.(*AliyunClient).ossconn + client := meta.(*connectivity.AliyunClient) bucket := d.Get("bucket").(string) - isExist, err := ossconn.IsBucketExist(bucket) + raw, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.IsBucketExist(bucket) + }) if err != nil { return err } + isExist, _ := raw.(bool) if isExist { return fmt.Errorf("[ERROR] The specified bucket name: %#v is not available. The bucket namespace is shared by all users of the OSS system. Please select a different name and try again.", bucket) } - log.Printf("[DEBUG] OSS bucket create: %#v, using endpoint: %#v", bucket, ossconn.Config.Endpoint) - - err = ossconn.CreateBucket(bucket) + _, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.CreateBucket(bucket) + }) if err != nil { return fmt.Errorf("Error creating OSS bucket: %#v", err) } retryErr := resource.Retry(3*time.Minute, func() *resource.RetryError { - isExist, err := ossconn.IsBucketExist(bucket) + raw, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.IsBucketExist(bucket) + }) if err != nil { return resource.NonRetryableError(err) } + isExist, _ := raw.(bool) if !isExist { return resource.RetryableError(fmt.Errorf("Trying to ensure new OSS bucket %#v has been created successfully.", bucket)) } @@ -249,16 +256,18 @@ func resourceAlicloudOssBucketCreate(d *schema.ResourceData, meta interface{}) e } func resourceAlicloudOssBucketRead(d *schema.ResourceData, meta interface{}) error { - ossconn := meta.(*AliyunClient).ossconn + client := meta.(*connectivity.AliyunClient) - info, err := ossconn.GetBucketInfo(d.Id()) + raw, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketInfo(d.Id()) + }) if err != nil { if ossNotFoundError(err) { return nil } return err } - + info, _ := raw.(oss.GetBucketInfoResult) d.Set("bucket", d.Id()) d.Set("acl", info.BucketInfo.ACL) @@ -270,10 +279,14 @@ func resourceAlicloudOssBucketRead(d *schema.ResourceData, meta interface{}) err d.Set("storage_class", info.BucketInfo.StorageClass) // Read the CORS - cors, err := ossconn.GetBucketCORS(d.Id()) + raw, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketCORS(d.Id()) + }) if err != nil && !IsExceptedErrors(err, []string{NoSuchCORSConfiguration}) { return err - } else if err == nil && cors.CORSRules != nil { + } + cors, _ := raw.(oss.GetBucketCORSResult) + if err == nil && cors.CORSRules != nil { rules := make([]map[string]interface{}, 0, len(cors.CORSRules)) for _, r := range cors.CORSRules { rule := make(map[string]interface{}) @@ -291,10 +304,14 @@ func resourceAlicloudOssBucketRead(d *schema.ResourceData, meta interface{}) err } // Read the website configuration - ws, err := ossconn.GetBucketWebsite(d.Id()) + raw, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketWebsite(d.Id()) + }) if err != nil && !IsExceptedErrors(err, []string{NoSuchWebsiteConfiguration}) { return fmt.Errorf("Error getting bucket website: %#v", err) - } else if err == nil && &ws != nil { + } + ws, _ := raw.(oss.GetBucketWebsiteResult) + if err == nil && &ws != nil { var websites []map[string]interface{} w := make(map[string]interface{}) @@ -312,10 +329,13 @@ func resourceAlicloudOssBucketRead(d *schema.ResourceData, meta interface{}) err } // Read the logging configuration - logging, err := ossconn.GetBucketLogging(d.Id()) + raw, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketLogging(d.Id()) + }) if err != nil { return fmt.Errorf("Error getting bucket logging: %#v", err) } + logging, _ := raw.(oss.GetBucketLoggingResult) logEnabled := false if &logging != nil { enable := logging.LoggingEnabled @@ -339,12 +359,14 @@ func resourceAlicloudOssBucketRead(d *schema.ResourceData, meta interface{}) err d.Set("logging_isenable", logEnabled) // Read the bucket referer - referer, err := ossconn.GetBucketReferer(d.Id()) + raw, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketReferer(d.Id()) + }) referers := make([]map[string]interface{}, 0) if err != nil { return fmt.Errorf("Error getting bucket referer: %#v", err) } - + referer, _ := raw.(oss.GetBucketRefererResult) referers = append(referers, map[string]interface{}{ "allow_empty": referer.AllowEmptyReferer, "referers": referer.RefererList, @@ -354,7 +376,9 @@ func resourceAlicloudOssBucketRead(d *schema.ResourceData, meta interface{}) err } // Read the lifecycle rule configuration - lifecycle, err := ossconn.GetBucketLifecycle(d.Id()) + raw, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketLifecycle(d.Id()) + }) if err != nil { if ossNotFoundError(err) { log.Printf("[WARN] OSS bucket: %s, no lifecycle could be found.", d.Id()) @@ -362,6 +386,7 @@ func resourceAlicloudOssBucketRead(d *schema.ResourceData, meta interface{}) err } return fmt.Errorf("Error getting bucket lifecycle: %#v", err) } + lifecycle, _ := raw.(oss.GetBucketLifecycleResult) if len(lifecycle.Rules) > 0 { rules := make([]map[string]interface{}, 0, len(lifecycle.Rules)) @@ -398,47 +423,50 @@ func resourceAlicloudOssBucketRead(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudOssBucketUpdate(d *schema.ResourceData, meta interface{}) error { - ossconn := meta.(*AliyunClient).ossconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) if d.HasChange("acl") { - if err := ossconn.SetBucketACL(d.Id(), oss.ACLType(d.Get("acl").(string))); err != nil { + _, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.SetBucketACL(d.Id(), oss.ACLType(d.Get("acl").(string))) + }) + if err != nil { return fmt.Errorf("Error setting OSS bucket ACL: %#v", err) } d.SetPartial("acl") } if d.HasChange("cors_rule") { - if err := resourceAlicloudOssBucketCorsUpdate(ossconn, d); err != nil { + if err := resourceAlicloudOssBucketCorsUpdate(client, d); err != nil { return err } d.SetPartial("cors_rule") } if d.HasChange("website") { - if err := resourceAlicloudOssBucketWebsiteUpdate(ossconn, d); err != nil { + if err := resourceAlicloudOssBucketWebsiteUpdate(client, d); err != nil { return err } d.SetPartial("website") } if d.HasChange("logging") { - if err := resourceAlicloudOssBucketLoggingUpdate(ossconn, d); err != nil { + if err := resourceAlicloudOssBucketLoggingUpdate(client, d); err != nil { return err } d.SetPartial("logging") } if d.HasChange("referer_config") { - if err := resourceAlicloudOssBucketRefererUpdate(ossconn, d); err != nil { + if err := resourceAlicloudOssBucketRefererUpdate(client, d); err != nil { return err } d.SetPartial("referer_config") } if d.HasChange("lifecycle_rule") { - if err := resourceAlicloudOssBucketLifecycleRuleUpdate(ossconn, d); err != nil { + if err := resourceAlicloudOssBucketLifecycleRuleUpdate(client, d); err != nil { return err } d.SetPartial("lifecycle_rule") @@ -447,11 +475,14 @@ func resourceAlicloudOssBucketUpdate(d *schema.ResourceData, meta interface{}) e d.Partial(false) return resourceAlicloudOssBucketRead(d, meta) } -func resourceAlicloudOssBucketCorsUpdate(ossconn *oss.Client, d *schema.ResourceData) error { +func resourceAlicloudOssBucketCorsUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { cors := d.Get("cors_rule").([]interface{}) if cors == nil || len(cors) == 0 { err := resource.Retry(3*time.Minute, func() *resource.RetryError { - if err := ossconn.DeleteBucketCORS(d.Id()); err != nil { + _, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.DeleteBucketCORS(d.Id()) + }) + if err != nil { return resource.NonRetryableError(err) } return nil @@ -491,18 +522,23 @@ func resourceAlicloudOssBucketCorsUpdate(ossconn *oss.Client, d *schema.Resource } log.Printf("[DEBUG] Oss bucket: %s, put CORS: %#v", d.Id(), cors) - err := ossconn.SetBucketCORS(d.Id(), rules) + _, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.SetBucketCORS(d.Id(), rules) + }) if err != nil { return fmt.Errorf("Error putting oss CORS: %s", err) } return nil } -func resourceAlicloudOssBucketWebsiteUpdate(ossconn *oss.Client, d *schema.ResourceData) error { +func resourceAlicloudOssBucketWebsiteUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { ws := d.Get("website").([]interface{}) if ws == nil || len(ws) == 0 { err := resource.Retry(3*time.Minute, func() *resource.RetryError { - if err := ossconn.DeleteBucketWebsite(d.Id()); err != nil { + _, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.DeleteBucketWebsite(d.Id()) + }) + if err != nil { return resource.NonRetryableError(err) } return nil @@ -522,18 +558,24 @@ func resourceAlicloudOssBucketWebsiteUpdate(ossconn *oss.Client, d *schema.Resou if v, ok := w["error_document"]; ok { error_document = v.(string) } - if err := ossconn.SetBucketWebsite(d.Id(), index_document, error_document); err != nil { + _, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.SetBucketWebsite(d.Id(), index_document, error_document) + }) + if err != nil { return fmt.Errorf("Error putting OSS bucket website: %#v", err) } return nil } -func resourceAlicloudOssBucketLoggingUpdate(ossconn *oss.Client, d *schema.ResourceData) error { +func resourceAlicloudOssBucketLoggingUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { logging := d.Get("logging").([]interface{}) if logging == nil || len(logging) == 0 { err := resource.Retry(3*time.Minute, func() *resource.RetryError { - if err := ossconn.DeleteBucketLogging(d.Id()); err != nil { + _, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.DeleteBucketLogging(d.Id()) + }) + if err != nil { return resource.NonRetryableError(err) } return nil @@ -552,18 +594,24 @@ func resourceAlicloudOssBucketLoggingUpdate(ossconn *oss.Client, d *schema.Resou if v, ok := c["target_prefix"]; ok { target_prefix = v.(string) } - if err := ossconn.SetBucketLogging(d.Id(), target_bucket, target_prefix, d.Get("logging_isenable").(bool)); err != nil { + _, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.SetBucketLogging(d.Id(), target_bucket, target_prefix, d.Get("logging_isenable").(bool)) + }) + if err != nil { return fmt.Errorf("Error putting OSS bucket logging: %#v", err) } return nil } -func resourceAlicloudOssBucketRefererUpdate(ossconn *oss.Client, d *schema.ResourceData) error { +func resourceAlicloudOssBucketRefererUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { config := d.Get("referer_config").([]interface{}) if config == nil || len(config) < 1 { log.Printf("[DEBUG] OSS set bucket referer as nil") - if err := ossconn.SetBucketReferer(d.Id(), nil, true); err != nil { + _, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.SetBucketReferer(d.Id(), nil, true) + }) + if err != nil { return fmt.Errorf("Error deleting OSS website: %#v", err) } return nil @@ -581,19 +629,25 @@ func resourceAlicloudOssBucketRefererUpdate(ossconn *oss.Client, d *schema.Resou referers = append(referers, referer.(string)) } } - if err := ossconn.SetBucketReferer(d.Id(), referers, allow); err != nil { + _, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.SetBucketReferer(d.Id(), referers, allow) + }) + if err != nil { return fmt.Errorf("Error putting OSS bucket referer configuration: %#v", err) } return nil } -func resourceAlicloudOssBucketLifecycleRuleUpdate(ossconn *oss.Client, d *schema.ResourceData) error { +func resourceAlicloudOssBucketLifecycleRuleUpdate(client *connectivity.AliyunClient, d *schema.ResourceData) error { bucket := d.Id() lifecycleRules := d.Get("lifecycle_rule").([]interface{}) if lifecycleRules == nil || len(lifecycleRules) == 0 { err := resource.Retry(3*time.Minute, func() *resource.RetryError { - if err := ossconn.DeleteBucketLifecycle(bucket); err != nil { + _, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.DeleteBucketLifecycle(bucket) + }) + if err != nil { return resource.NonRetryableError(err) } return nil @@ -653,7 +707,10 @@ func resourceAlicloudOssBucketLifecycleRuleUpdate(ossconn *oss.Client, d *schema } err := resource.Retry(3*time.Minute, func() *resource.RetryError { - if err := ossconn.SetBucketLifecycle(bucket, rules); err != nil { + _, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.SetBucketLifecycle(bucket, rules) + }) + if err != nil { return resource.NonRetryableError(err) } return nil @@ -665,19 +722,24 @@ func resourceAlicloudOssBucketLifecycleRuleUpdate(ossconn *oss.Client, d *schema return nil } func resourceAlicloudOssBucketDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient).ossconn + client := meta.(*connectivity.AliyunClient) return resource.Retry(5*time.Minute, func() *resource.RetryError { - exist, err := client.IsBucketExist(d.Id()) + raw, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.IsBucketExist(d.Id()) + }) if err != nil { return resource.NonRetryableError(fmt.Errorf("OSS delete bucket got an error: %#v", err)) } - + exist, _ := raw.(bool) if !exist { return nil } - if err := client.DeleteBucket(d.Id()); err != nil { + _, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.DeleteBucket(d.Id()) + }) + if err != nil { return resource.RetryableError(fmt.Errorf("OSS Bucket %#v is in use - trying again while it is deleted.", d.Id())) } diff --git a/alicloud/resource_alicloud_oss_bucket_object.go b/alicloud/resource_alicloud_oss_bucket_object.go index cb5d1ba12e1..e5eb01e73ed 100644 --- a/alicloud/resource_alicloud_oss_bucket_object.go +++ b/alicloud/resource_alicloud_oss_bucket_object.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "github.com/mitchellh/go-homedir" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudOssBucketObject() *schema.Resource { @@ -105,12 +106,14 @@ func resourceAlicloudOssBucketObject() *schema.Resource { } func resourceAlicloudOssBucketObjectPut(d *schema.ResourceData, meta interface{}) error { - - bucket, err := meta.(*AliyunClient).ossconn.Bucket(d.Get("bucket").(string)) + client := meta.(*connectivity.AliyunClient) + raw, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.Bucket(d.Get("bucket").(string)) + }) if err != nil { return fmt.Errorf("Error getting bucket: %#v", err) } - + bucket, _ := raw.(*oss.Bucket) var filePath string var body io.Reader @@ -151,11 +154,14 @@ func resourceAlicloudOssBucketObjectPut(d *schema.ResourceData, meta interface{} } func resourceAlicloudOssBucketObjectRead(d *schema.ResourceData, meta interface{}) error { - bucket, err := meta.(*AliyunClient).ossconn.Bucket(d.Get("bucket").(string)) + client := meta.(*connectivity.AliyunClient) + raw, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.Bucket(d.Get("bucket").(string)) + }) if err != nil { return fmt.Errorf("Error getting bucket: %#v", err) } - + bucket, _ := raw.(*oss.Bucket) options, err := buildObjectHeaderOptions(d) if err != nil { return fmt.Errorf("Error building object header options: %#v", err) @@ -186,10 +192,14 @@ func resourceAlicloudOssBucketObjectRead(d *schema.ResourceData, meta interface{ } func resourceAlicloudOssBucketObjectDelete(d *schema.ResourceData, meta interface{}) error { - bucket, err := meta.(*AliyunClient).ossconn.Bucket(d.Get("bucket").(string)) + client := meta.(*connectivity.AliyunClient) + raw, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.Bucket(d.Get("bucket").(string)) + }) if err != nil { return fmt.Errorf("Error getting bucket: %#v", err) } + bucket, _ := raw.(*oss.Bucket) return resource.Retry(5*time.Minute, func() *resource.RetryError { exist, err := bucket.IsObjectExist(d.Id()) if err != nil { diff --git a/alicloud/resource_alicloud_oss_bucket_object_test.go b/alicloud/resource_alicloud_oss_bucket_object_test.go index 7cf1cdc5484..524adb987f4 100644 --- a/alicloud/resource_alicloud_oss_bucket_object_test.go +++ b/alicloud/resource_alicloud_oss_bucket_object_test.go @@ -8,6 +8,9 @@ import ( "os" "testing" + "github.com/aliyun/aliyun-oss-go-sdk/oss" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" + "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" @@ -141,11 +144,15 @@ func testAccCheckOssBucketObjectExistsWithProviders(n string, bucket string, obj if provider.Meta() == nil { continue } - client, err := provider.Meta().(*AliyunClient).ossconn.Bucket(bucket) + client := provider.Meta().(*connectivity.AliyunClient) + raw, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.Bucket(bucket) + }) + buck, _ := raw.(*oss.Bucket) if err != nil { return fmt.Errorf("Error getting bucket: %#v", err) } - object, err := client.GetObjectMeta(rs.Primary.ID) + object, err := buck.GetObjectMeta(rs.Primary.ID) log.Printf("[WARN]get oss bucket object %#v", bucket) if err == nil { if object != nil { @@ -167,7 +174,8 @@ func testAccCheckAlicloudOssBucketObjectDestroy(s *terraform.State) error { } func testAccCheckOssBucketObjectDestroyWithProvider(s *terraform.State, provider *schema.Provider) error { - client := provider.Meta().(*AliyunClient) + client := provider.Meta().(*connectivity.AliyunClient) + ossService := OssService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_oss_bucket" { @@ -175,7 +183,7 @@ func testAccCheckOssBucketObjectDestroyWithProvider(s *terraform.State, provider } // Try to find the resource - bucket, err := client.QueryOssBucketById(rs.Primary.ID) + bucket, err := ossService.QueryOssBucketById(rs.Primary.ID) if err == nil { if bucket.Name != "" { return fmt.Errorf("Found instance: %s", bucket.Name) diff --git a/alicloud/resource_alicloud_oss_bucket_test.go b/alicloud/resource_alicloud_oss_bucket_test.go index 26ed770e80c..a52088d224a 100644 --- a/alicloud/resource_alicloud_oss_bucket_test.go +++ b/alicloud/resource_alicloud_oss_bucket_test.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -23,11 +24,11 @@ func init() { } func testSweepOSSBuckets(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testacc", @@ -38,11 +39,13 @@ func testSweepOSSBuckets(region string) error { "test-acc-alicloud-", } - resp, err := conn.ossconn.ListBuckets() + raw, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.ListBuckets() + }) if err != nil { return fmt.Errorf("Error retrieving OSS buckets: %s", err) } - + resp, _ := raw.(oss.ListBucketsResult) sweeped := false for _, v := range resp.Buckets { @@ -59,10 +62,13 @@ func testSweepOSSBuckets(region string) error { continue } sweeped = true - bucket, err := conn.ossconn.Bucket(name) + raw, err := client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.Bucket(name) + }) if err != nil { return fmt.Errorf("Error getting bucket (%s): %#v", name, err) } + bucket, _ := raw.(*oss.Bucket) if objects, err := bucket.ListObjects(); err != nil { log.Printf("[ERROR] Failed to list objects: %s", err) } else if len(objects.Objects) > 0 { @@ -76,7 +82,10 @@ func testSweepOSSBuckets(region string) error { log.Printf("[INFO] Deleting OSS bucket: %s", name) - if err := conn.ossconn.DeleteBucket(name); err != nil { + _, err = client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return nil, ossClient.DeleteBucket(name) + }) + if err != nil { log.Printf("[ERROR] Failed to delete OSS bucket (%s): %s", name, err) } } @@ -285,8 +294,9 @@ func testAccCheckOssBucketExistsWithProviders(n string, b *oss.BucketInfo, provi continue } - client := provider.Meta().(*AliyunClient) - bucket, err := client.QueryOssBucketById(rs.Primary.ID) + client := provider.Meta().(*connectivity.AliyunClient) + ossService := OssService{client} + bucket, err := ossService.QueryOssBucketById(rs.Primary.ID) log.Printf("[WARN]get oss bucket %#v", bucket) if err == nil && bucket != nil { *b = *bucket @@ -341,7 +351,8 @@ func testAccCheckOssBucketDestroy(s *terraform.State) error { } func testAccCheckOssBucketDestroyWithProvider(s *terraform.State, provider *schema.Provider) error { - client := provider.Meta().(*AliyunClient) + client := provider.Meta().(*connectivity.AliyunClient) + ossService := OssService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_oss_bucket" { @@ -349,7 +360,7 @@ func testAccCheckOssBucketDestroyWithProvider(s *terraform.State, provider *sche } // Try to find the resource - bucket, err := client.QueryOssBucketById(rs.Primary.ID) + bucket, err := ossService.QueryOssBucketById(rs.Primary.ID) if err == nil { if bucket.Name != "" { return fmt.Errorf("Found instance: %s", bucket.Name) diff --git a/alicloud/resource_alicloud_ots_instance.go b/alicloud/resource_alicloud_ots_instance.go index 7015b3080cc..44677edfe85 100644 --- a/alicloud/resource_alicloud_ots_instance.go +++ b/alicloud/resource_alicloud_ots_instance.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudOtsInstance() *schema.Resource { @@ -59,7 +60,8 @@ func resourceAlicloudOtsInstance() *schema.Resource { } func resourceAliyunOtsInstanceCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + otsService := OtsService{client} req := ots.CreateInsertInstanceRequest() req.ClusterType = convertInstanceType(OtsInstanceType(d.Get("instance_type").(string))) @@ -67,19 +69,24 @@ func resourceAliyunOtsInstanceCreate(d *schema.ResourceData, meta interface{}) e req.Description = d.Get("description").(string) req.Network = convertInstanceAccessedBy(InstanceAccessedByType(d.Get("accessed_by").(string))) - if _, err := client.otsconn.InsertInstance(req); err != nil { + _, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.InsertInstance(req) + }) + if err != nil { return fmt.Errorf("failed to create instance with error: %s", err) } d.SetId(req.InstanceName) - if err := client.WaitForOtsInstance(req.InstanceName, Running, DefaultTimeout); err != nil { + if err := otsService.WaitForOtsInstance(req.InstanceName, Running, DefaultTimeout); err != nil { return err } return resourceAliyunOtsInstanceUpdate(d, meta) } func resourceAliyunOtsInstanceRead(d *schema.ResourceData, meta interface{}) error { - inst, err := meta.(*AliyunClient).DescribeOtsInstance(d.Id()) + client := meta.(*connectivity.AliyunClient) + otsService := OtsService{client} + inst, err := otsService.DescribeOtsInstance(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -97,7 +104,8 @@ func resourceAliyunOtsInstanceRead(d *schema.ResourceData, meta interface{}) err } func resourceAliyunOtsInstanceUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + otsService := OtsService{client} d.Partial(true) @@ -105,7 +113,10 @@ func resourceAliyunOtsInstanceUpdate(d *schema.ResourceData, meta interface{}) e req := ots.CreateUpdateInstanceRequest() req.InstanceName = d.Id() req.Network = convertInstanceAccessedBy(InstanceAccessedByType(d.Get("accessed_by").(string))) - if _, err := client.otsconn.UpdateInstance(req); err != nil { + _, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.UpdateInstance(req) + }) + if err != nil { return fmt.Errorf("UpdateInstance %s got an error: %#v.", d.Id(), err) } d.SetPartial("accessed_by") @@ -128,7 +139,10 @@ func resourceAliyunOtsInstanceUpdate(d *schema.ResourceData, meta interface{}) e }) } args.TagInfo = &tags - if _, err := client.otsconn.DeleteTags(args); err != nil { + _, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.DeleteTags(args) + }) + if err != nil { return fmt.Errorf("Remove tags got error: %s", err) } } @@ -144,13 +158,16 @@ func resourceAliyunOtsInstanceUpdate(d *schema.ResourceData, meta interface{}) e }) } args.TagInfo = &tags - if _, err := client.otsconn.InsertTags(args); err != nil { + _, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.InsertTags(args) + }) + if err != nil { return fmt.Errorf("Insertting tags got error: %s", err) } } d.SetPartial("tags") } - if err := client.WaitForOtsInstance(d.Id(), Running, DefaultTimeout); err != nil { + if err := otsService.WaitForOtsInstance(d.Id(), Running, DefaultTimeout); err != nil { return err } d.Partial(false) @@ -158,18 +175,22 @@ func resourceAliyunOtsInstanceUpdate(d *schema.ResourceData, meta interface{}) e } func resourceAliyunOtsInstanceDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + otsService := OtsService{client} req := ots.CreateDeleteInstanceRequest() req.InstanceName = d.Id() return resource.Retry(10*time.Minute, func() *resource.RetryError { - if _, err := meta.(*AliyunClient).DescribeOtsInstance(d.Id()); err != nil { + if _, err := otsService.DescribeOtsInstance(d.Id()); err != nil { if NotFoundError(err) { return nil } return resource.NonRetryableError(fmt.Errorf("When deleting instance, failed to describe instance with error: %s", err)) } - if _, err := client.otsconn.DeleteInstance(req); err != nil { + _, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.DeleteInstance(req) + }) + if err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_ots_instance_attachment.go b/alicloud/resource_alicloud_ots_instance_attachment.go index 4701d11896f..eb8321eb6a9 100644 --- a/alicloud/resource_alicloud_ots_instance_attachment.go +++ b/alicloud/resource_alicloud_ots_instance_attachment.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudOtsInstanceAttachment() *schema.Resource { @@ -41,20 +42,24 @@ func resourceAlicloudOtsInstanceAttachment() *schema.Resource { } func resourceAliyunOtsInstanceAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} req := ots.CreateBindInstance2VpcRequest() req.InstanceName = d.Get("instance_name").(string) req.InstanceVpcName = d.Get("vpc_name").(string) req.VirtualSwitchId = d.Get("vswitch_id").(string) - if vsw, err := client.DescribeVswitch(d.Get("vswitch_id").(string)); err != nil { + if vsw, err := vpcService.DescribeVswitch(d.Get("vswitch_id").(string)); err != nil { return err } else { req.VpcId = vsw.VpcId } - if _, err := client.otsconn.BindInstance2Vpc(req); err != nil { + _, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.BindInstance2Vpc(req) + }) + if err != nil { return fmt.Errorf("Failed to bind instance with error: %s", err) } @@ -63,7 +68,9 @@ func resourceAliyunOtsInstanceAttachmentCreate(d *schema.ResourceData, meta inte } func resourceAliyunOtsInstanceAttachmentRead(d *schema.ResourceData, meta interface{}) error { - inst, err := meta.(*AliyunClient).DescribeOtsInstanceVpc(d.Id()) + client := meta.(*connectivity.AliyunClient) + otsService := OtsService{client} + inst, err := otsService.DescribeOtsInstanceVpc(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -79,8 +86,9 @@ func resourceAliyunOtsInstanceAttachmentRead(d *schema.ResourceData, meta interf } func resourceAliyunOtsInstanceAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - inst, err := client.DescribeOtsInstanceVpc(d.Id()) + client := meta.(*connectivity.AliyunClient) + otsService := OtsService{client} + inst, err := otsService.DescribeOtsInstanceVpc(d.Id()) if err != nil { if NotFoundError(err) { return nil @@ -92,10 +100,13 @@ func resourceAliyunOtsInstanceAttachmentDelete(d *schema.ResourceData, meta inte req.InstanceVpcName = inst.InstanceVpcName return resource.Retry(2*time.Minute, func() *resource.RetryError { - if _, err := client.otsconn.UnbindInstance2Vpc(req); err != nil { + _, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.UnbindInstance2Vpc(req) + }) + if err != nil { return resource.NonRetryableError(err) } - if _, err := client.DescribeOtsInstanceVpc(d.Id()); err != nil { + if _, err := otsService.DescribeOtsInstanceVpc(d.Id()); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_ots_instance_attachment_test.go b/alicloud/resource_alicloud_ots_instance_attachment_test.go index 975e94dec90..90887154081 100644 --- a/alicloud/resource_alicloud_ots_instance_attachment_test.go +++ b/alicloud/resource_alicloud_ots_instance_attachment_test.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudOtsInstanceAttachment_Basic(t *testing.T) { @@ -58,9 +59,10 @@ func testAccCheckOtsInstanceAttachmentExist(n string, instance *ots.VpcInfo) res return fmt.Errorf("no OTS table ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + otsService := OtsService{client} - response, err := client.DescribeOtsInstanceVpc(rs.Primary.ID) + response, err := otsService.DescribeOtsInstanceVpc(rs.Primary.ID) if err != nil { return err @@ -76,9 +78,10 @@ func testAccCheckOtsInstanceAttachmentDestroy(s *terraform.State) error { continue } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + otsService := OtsService{client} - if _, err := client.DescribeOtsInstanceVpc(rs.Primary.ID); err != nil { + if _, err := otsService.DescribeOtsInstanceVpc(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_ots_instance_test.go b/alicloud/resource_alicloud_ots_instance_test.go index a570a2dc1c6..3abbee81d18 100644 --- a/alicloud/resource_alicloud_ots_instance_test.go +++ b/alicloud/resource_alicloud_ots_instance_test.go @@ -12,6 +12,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -22,11 +23,11 @@ func init() { } func testSweepOtsInstances(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -38,15 +39,18 @@ func testSweepOtsInstances(region string) error { var insts []ots.InstanceInfo req := ots.CreateListInstanceRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.Method = "GET" req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNum = requests.NewInteger(1) for { - resp, err := conn.otsconn.ListInstance(req) + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.ListInstance(req) + }) if err != nil { return fmt.Errorf("Error retrieving OTS Instances: %s", err) } + resp, _ := raw.(*ots.ListInstanceResponse) if resp == nil || len(resp.InstanceInfos.InstanceInfo) < 1 { break } @@ -81,7 +85,10 @@ func testSweepOtsInstances(region string) error { log.Printf("[INFO] Deleting OTS Instance: %s", name) req := ots.CreateDeleteInstanceRequest() req.InstanceName = name - if _, err := conn.otsconn.DeleteInstance(req); err != nil { + _, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.DeleteInstance(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete OTS Instance (%s): %s", name, err) } } @@ -170,9 +177,10 @@ func testAccCheckOtsInstanceExist(n string, instance *ots.InstanceInfo) resource return fmt.Errorf("no OTS table ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + otsService := OtsService{client} - response, err := client.DescribeOtsInstance(rs.Primary.ID) + response, err := otsService.DescribeOtsInstance(rs.Primary.ID) if err != nil { return err @@ -188,9 +196,10 @@ func testAccCheckOtsInstanceDestroy(s *terraform.State) error { continue } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + otsService := OtsService{client} - if _, err := client.DescribeOtsInstance(rs.Primary.ID); err != nil { + if _, err := otsService.DescribeOtsInstance(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_ots_table.go b/alicloud/resource_alicloud_ots_table.go index dbc8a3ee105..9f0522c5e6d 100644 --- a/alicloud/resource_alicloud_ots_table.go +++ b/alicloud/resource_alicloud_ots_table.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudOtsTable() *schema.Resource { @@ -70,11 +71,12 @@ func resourceAliyunOtsTableCreate(d *schema.ResourceData, meta interface{}) erro instanceName := d.Get("instance_name").(string) tableName := d.Get("table_name").(string) tableMeta.TableName = tableName - client := meta.(*AliyunClient).buildTableClient(instanceName) + client := meta.(*connectivity.AliyunClient) + otsService := OtsService{client} for _, primaryKey := range d.Get("primary_key").([]interface{}) { pk := primaryKey.(map[string]interface{}) - pkValue := getPrimaryKeyType(pk["type"].(string)) + pkValue := otsService.getPrimaryKeyType(pk["type"].(string)) tableMeta.AddPrimaryKeyColumn(pk["name"].(string), pkValue) } tableOption := new(tablestore.TableOption) @@ -88,7 +90,9 @@ func resourceAliyunOtsTableCreate(d *schema.ResourceData, meta interface{}) erro createTableRequest.TableOption = tableOption createTableRequest.ReservedThroughput = reservedThroughput - _, err := client.CreateTable(createTableRequest) + _, err := client.WithTableStoreClient(instanceName, func(tableStoreClient *tablestore.TableStoreClient) (interface{}, error) { + return tableStoreClient.CreateTable(createTableRequest) + }) if err != nil { return fmt.Errorf("failed to create table with error: %s", err) } @@ -103,7 +107,9 @@ func resourceAliyunOtsTableRead(d *schema.ResourceData, meta interface{}) error return err } - describe, err := meta.(*AliyunClient).DescribeOtsTable(instanceName, tableName) + client := meta.(*connectivity.AliyunClient) + otsService := OtsService{client} + describe, err := otsService.DescribeOtsTable(instanceName, tableName) if err != nil { if NotFoundError(err) { @@ -121,7 +127,7 @@ func resourceAliyunOtsTableRead(d *schema.ResourceData, meta interface{}) error for _, v := range keys { item := make(map[string]interface{}) item["name"] = *v.Name - item["type"] = convertPrimaryKeyType(*v.Type) + item["type"] = otsService.convertPrimaryKeyType(*v.Type) pks = append(pks, item) } d.Set("primary_key", pks) @@ -137,7 +143,7 @@ func resourceAliyunOtsTableUpdate(d *schema.ResourceData, meta interface{}) erro if err != nil { return err } - client := meta.(*AliyunClient).buildTableClient(instanceName) + client := meta.(*connectivity.AliyunClient) update := false updateTableReq := new(tablestore.UpdateTableRequest) @@ -158,7 +164,9 @@ func resourceAliyunOtsTableUpdate(d *schema.ResourceData, meta interface{}) erro if update { updateTableReq.TableOption = tableOption - _, err := client.UpdateTable(updateTableReq) + _, err := client.WithTableStoreClient(instanceName, func(tableStoreClient *tablestore.TableStoreClient) (interface{}, error) { + return tableStoreClient.UpdateTable(updateTableReq) + }) if err != nil { return fmt.Errorf("failed to update table with error: %s", err) @@ -173,23 +181,27 @@ func resourceAliyunOtsTableDelete(d *schema.ResourceData, meta interface{}) erro return err } - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + otsService := OtsService{client} req := new(tablestore.DeleteTableRequest) req.TableName = tableName return resource.Retry(2*time.Minute, func() *resource.RetryError { - if _, err := client.DescribeOtsInstance(instanceName); err != nil { + if _, err := otsService.DescribeOtsInstance(instanceName); err != nil { if NotFoundError(err) { return nil } return resource.NonRetryableError(fmt.Errorf("When deleting table %s, describing instance %s got an error: %#v.", tableName, instanceName, err)) } - if _, err := client.buildTableClient(instanceName).DeleteTable(req); err != nil { + _, err := client.WithTableStoreClient(instanceName, func(tableStoreClient *tablestore.TableStoreClient) (interface{}, error) { + return tableStoreClient.DeleteTable(req) + }) + if err != nil { if strings.HasPrefix(err.Error(), OTSObjectNotExist) { return nil } return resource.NonRetryableError(fmt.Errorf("Deleting table %s got an error: %#v.", tableName, err)) } - if _, err := client.DescribeOtsTable(instanceName, tableName); err != nil { + if _, err := otsService.DescribeOtsTable(instanceName, tableName); err != nil { if NotFoundError(err) { return nil } @@ -203,9 +215,9 @@ func parseId(d *schema.ResourceData, meta interface{}) (instanceName, tableName split := strings.Split(d.Id(), COLON_SEPARATED) if len(split) == 1 { // For compatibility - if meta.(*AliyunClient).OtsInstanceName != "" { + if meta.(*connectivity.AliyunClient).OtsInstanceName != "" { tableName = split[0] - instanceName = meta.(*AliyunClient).OtsInstanceName + instanceName = meta.(*connectivity.AliyunClient).OtsInstanceName d.SetId(fmt.Sprintf("%s%s%s", instanceName, COLON_SEPARATED, tableName)) } else { err = fmt.Errorf("From Provider version 1.10.0, the provider field 'ots_instance_name' has been deprecated and " + diff --git a/alicloud/resource_alicloud_ots_table_test.go b/alicloud/resource_alicloud_ots_table_test.go index 74a2e427092..39a9bf68353 100644 --- a/alicloud/resource_alicloud_ots_table_test.go +++ b/alicloud/resource_alicloud_ots_table_test.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudOtsTable_Basic(t *testing.T) { @@ -54,10 +55,11 @@ func testAccCheckOtsTableExist(n string, table *tablestore.DescribeTableResponse return fmt.Errorf("no OTS table ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + otsService := OtsService{client} split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - response, err := client.DescribeOtsTable(split[0], split[1]) + response, err := otsService.DescribeOtsTable(split[0], split[1]) if err != nil { return fmt.Errorf("Error finding OTS table %s: %#v", rs.Primary.ID, err) @@ -74,10 +76,11 @@ func testAccCheckOtsTableDestroy(s *terraform.State) error { continue } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + otsService := OtsService{client} split := strings.Split(rs.Primary.ID, COLON_SEPARATED) - if _, err := client.DescribeOtsTable(split[0], split[1]); err != nil { + if _, err := otsService.DescribeOtsTable(split[0], split[1]); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_pvtz_zone.go b/alicloud/resource_alicloud_pvtz_zone.go index 02fa48602b2..d00faf5fd57 100644 --- a/alicloud/resource_alicloud_pvtz_zone.go +++ b/alicloud/resource_alicloud_pvtz_zone.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudPvtzZone() *schema.Resource { @@ -48,8 +49,7 @@ func resourceAlicloudPvtzZone() *schema.Resource { } func resourceAlicloudPvtzZoneCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.pvtzconn + client := meta.(*connectivity.AliyunClient) args := pvtz.CreateAddZoneRequest() @@ -57,11 +57,13 @@ func resourceAlicloudPvtzZoneCreate(d *schema.ResourceData, meta interface{}) er args.ZoneName = v.(string) } - response, err := conn.AddZone(args) + raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.AddZone(args) + }) if err != nil { return fmt.Errorf("AddZone got an error:%#v", err) } - + response, _ := raw.(*pvtz.AddZoneResponse) if response == nil { return fmt.Errorf("AddZone got a nil response: %#v", response) } @@ -73,13 +75,14 @@ func resourceAlicloudPvtzZoneCreate(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudPvtzZoneRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.pvtzconn + client := meta.(*connectivity.AliyunClient) request := pvtz.CreateDescribeZoneInfoRequest() request.ZoneId = d.Id() - response, err := conn.DescribeZoneInfo(request) + raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.DescribeZoneInfo(request) + }) if err != nil { if NotFoundError(err) { d.SetId("") @@ -88,6 +91,7 @@ func resourceAlicloudPvtzZoneRead(d *schema.ResourceData, meta interface{}) erro return err } + response, _ := raw.(*pvtz.DescribeZoneInfoResponse) d.Set("name", response.ZoneName) d.Set("remark", response.Remark) @@ -107,7 +111,11 @@ func resourceAlicloudPvtzZoneUpdate(d *schema.ResourceData, meta interface{}) er if d.HasChange("remark") { request.Remark = d.Get("remark").(string) - if _, err := meta.(*AliyunClient).pvtzconn.UpdateZoneRemark(request); err != nil { + client := meta.(*connectivity.AliyunClient) + _, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.UpdateZoneRemark(request) + }) + if err != nil { return err } } @@ -116,20 +124,22 @@ func resourceAlicloudPvtzZoneUpdate(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudPvtzZoneDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.pvtzconn + client := meta.(*connectivity.AliyunClient) + pvtzService := PvtzService{client} request := pvtz.CreateDeleteZoneRequest() request.ZoneId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := conn.DeleteZone(request) + _, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.DeleteZone(request) + }) if err != nil { return resource.NonRetryableError(fmt.Errorf("Error deleting zone failed: %#v", err)) } - if _, err := client.DescribePvtzZoneInfo(d.Id()); err != nil { + if _, err := pvtzService.DescribePvtzZoneInfo(d.Id()); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_pvtz_zone_attachment.go b/alicloud/resource_alicloud_pvtz_zone_attachment.go index 801c73012c9..2abfd5ed1c4 100644 --- a/alicloud/resource_alicloud_pvtz_zone_attachment.go +++ b/alicloud/resource_alicloud_pvtz_zone_attachment.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudPvtzZoneAttachment() *schema.Resource { @@ -36,9 +37,10 @@ func resourceAlicloudPvtzZoneAttachment() *schema.Resource { } func resourceAlicloudPvtzZoneAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + pvtzService := PvtzService{client} - zone, err := client.DescribePvtzZoneInfo(d.Get("zone_id").(string)) + zone, err := pvtzService.DescribePvtzZoneInfo(d.Get("zone_id").(string)) if err != nil { return err } @@ -51,8 +53,8 @@ func resourceAlicloudPvtzZoneAttachmentCreate(d *schema.ResourceData, meta inter func resourceAlicloudPvtzZoneAttachmentUpdate(d *schema.ResourceData, meta interface{}) error { if d.HasChange("vpc_ids") { - client := meta.(*AliyunClient) - conn := client.pvtzconn + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} args := pvtz.CreateBindZoneVpcRequest() args.ZoneId = d.Id() @@ -65,7 +67,7 @@ func resourceAlicloudPvtzZoneAttachmentUpdate(d *schema.ResourceData, meta inter vpcs := make([]pvtz.BindZoneVpcVpcs, len(bindZoneVpcs)) for i, e := range bindZoneVpcs { vpcId := e.(string) - v, _ := client.DescribeVpc(vpcId) + v, _ := vpcService.DescribeVpc(vpcId) regionId := v.RegionId @@ -75,7 +77,9 @@ func resourceAlicloudPvtzZoneAttachmentUpdate(d *schema.ResourceData, meta inter args.Vpcs = &vpcs - _, err := conn.BindZoneVpc(args) + _, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.BindZoneVpc(args) + }) if nil != err { return fmt.Errorf("bindZoneVpc error:%#v", err) } @@ -85,13 +89,14 @@ func resourceAlicloudPvtzZoneAttachmentUpdate(d *schema.ResourceData, meta inter } func resourceAlicloudPvtzZoneAttachmentRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.pvtzconn + client := meta.(*connectivity.AliyunClient) request := pvtz.CreateDescribeZoneInfoRequest() request.ZoneId = d.Id() - response, err := conn.DescribeZoneInfo(request) + raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.DescribeZoneInfo(request) + }) if err != nil { if NotFoundError(err) { @@ -101,7 +106,7 @@ func resourceAlicloudPvtzZoneAttachmentRead(d *schema.ResourceData, meta interfa return err } - + response, _ := raw.(*pvtz.DescribeZoneInfoResponse) var vpcIds []string vpcs := response.BindVpcs.Vpc for _, vpc := range vpcs { @@ -115,8 +120,8 @@ func resourceAlicloudPvtzZoneAttachmentRead(d *schema.ResourceData, meta interfa } func resourceAlicloudPvtzZoneAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.pvtzconn + client := meta.(*connectivity.AliyunClient) + pvtzService := PvtzService{client} request := pvtz.CreateBindZoneVpcRequest() request.ZoneId = d.Id() @@ -124,13 +129,15 @@ func resourceAlicloudPvtzZoneAttachmentDelete(d *schema.ResourceData, meta inter request.Vpcs = &vpcs return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := conn.BindZoneVpc(request) + _, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.BindZoneVpc(request) + }) if err != nil { return resource.NonRetryableError(fmt.Errorf("Error unbind zone vpc failed: %#v", err)) } - if _, err := client.DescribePvtzZoneInfo(d.Id()); err != nil { + if _, err := pvtzService.DescribePvtzZoneInfo(d.Id()); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_pvtz_zone_attachment_test.go b/alicloud/resource_alicloud_pvtz_zone_attachment_test.go index 279e7aae7f7..7e4a1441acf 100644 --- a/alicloud/resource_alicloud_pvtz_zone_attachment_test.go +++ b/alicloud/resource_alicloud_pvtz_zone_attachment_test.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudPvtzZoneAttachment_Basic(t *testing.T) { @@ -116,8 +117,9 @@ func testAccAlicloudPvtzZoneAttachmentExists(n string, zone *pvtz.DescribeZoneIn return fmt.Errorf("No ZONE ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribePvtzZoneInfo(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + pvtzService := PvtzService{client} + instance, err := pvtzService.DescribePvtzZoneInfo(rs.Primary.ID) if err != nil { return err @@ -140,14 +142,15 @@ func testAccAlicloudPvtzZoneAttachmentExists(n string, zone *pvtz.DescribeZoneIn } func testAccAlicloudPvtzZoneAttachmentDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + pvtzService := PvtzService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_pvtz_zone_attachment" { continue } - instance, err := client.DescribePvtzZoneInfo(rs.Primary.ID) + instance, err := pvtzService.DescribePvtzZoneInfo(rs.Primary.ID) if err != nil && !NotFoundError(err) { return err diff --git a/alicloud/resource_alicloud_pvtz_zone_record.go b/alicloud/resource_alicloud_pvtz_zone_record.go index cf5fe1e60a7..443d199314a 100644 --- a/alicloud/resource_alicloud_pvtz_zone_record.go +++ b/alicloud/resource_alicloud_pvtz_zone_record.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudPvtzZoneRecord() *schema.Resource { @@ -53,8 +54,7 @@ func resourceAlicloudPvtzZoneRecord() *schema.Resource { } func resourceAlicloudPvtzZoneRecordCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.pvtzconn + client := meta.(*connectivity.AliyunClient) args := pvtz.CreateAddZoneRecordRequest() @@ -82,11 +82,14 @@ func resourceAlicloudPvtzZoneRecordCreate(d *schema.ResourceData, meta interface args.Ttl = requests.NewInteger(d.Get("ttl").(int)) } - resp, err := conn.AddZoneRecord(args) + raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.AddZoneRecord(args) + }) if err != nil { return fmt.Errorf("AddZoneRecord got a error: %#v", err) } + resp, _ := raw.(*pvtz.AddZoneRecordResponse) if resp == nil { return fmt.Errorf("AddZoneRecord got a nil response: %#v", resp) } @@ -136,7 +139,11 @@ func resourceAlicloudPvtzZoneRecordUpdate(d *schema.ResourceData, meta interface } if attributeUpdate { - if _, err := meta.(*AliyunClient).pvtzconn.UpdateZoneRecord(args); err != nil { + client := meta.(*connectivity.AliyunClient) + _, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.UpdateZoneRecord(args) + }) + if err != nil { return err } } @@ -148,7 +155,8 @@ func resourceAlicloudPvtzZoneRecordUpdate(d *schema.ResourceData, meta interface } func resourceAlicloudPvtzZoneRecordRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + pvtzService := PvtzService{client} recordIdStr, zoneId, _ := getRecordIdAndZoneId(d, meta) recordId, e := strconv.Atoi(recordIdStr) @@ -156,7 +164,7 @@ func resourceAlicloudPvtzZoneRecordRead(d *schema.ResourceData, meta interface{} return e } - record, err := client.DescribeZoneRecord(recordId, zoneId) + record, err := pvtzService.DescribeZoneRecord(recordId, zoneId) if err != nil { if NotFoundError(e) { d.SetId("") @@ -178,8 +186,8 @@ func resourceAlicloudPvtzZoneRecordRead(d *schema.ResourceData, meta interface{} } func resourceAlicloudPvtzZoneRecordDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.pvtzconn + client := meta.(*connectivity.AliyunClient) + pvtzService := PvtzService{client} request := pvtz.CreateDeleteZoneRecordRequest() recordIdStr, zoneId, _ := getRecordIdAndZoneId(d, meta) @@ -190,13 +198,15 @@ func resourceAlicloudPvtzZoneRecordDelete(d *schema.ResourceData, meta interface request.RecordId = requests.NewInteger(recordId) return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := conn.DeleteZoneRecord(request) + _, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.DeleteZoneRecord(request) + }) if err != nil { return resource.NonRetryableError(fmt.Errorf("Error deleting zone record failed: %#v", err)) } - if _, e := client.DescribeZoneRecord(recordId, zoneId); e != nil { + if _, e := pvtzService.DescribeZoneRecord(recordId, zoneId); e != nil { if NotFoundError(e) { return nil } diff --git a/alicloud/resource_alicloud_pvtz_zone_record_test.go b/alicloud/resource_alicloud_pvtz_zone_record_test.go index c235c497e13..67b03054718 100644 --- a/alicloud/resource_alicloud_pvtz_zone_record_test.go +++ b/alicloud/resource_alicloud_pvtz_zone_record_test.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudPvtzZoneRecord_Basic(t *testing.T) { @@ -122,9 +123,10 @@ func testAccAlicloudPvtzZoneRecordExists(n string, record *pvtz.Record) resource if convErr != nil { return convErr } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + pvtzService := PvtzService{client} - instance, err := client.DescribeZoneRecord(recordId, zoneId) + instance, err := pvtzService.DescribeZoneRecord(recordId, zoneId) if err != nil { return err @@ -136,7 +138,8 @@ func testAccAlicloudPvtzZoneRecordExists(n string, record *pvtz.Record) resource } func testAccAlicloudPvtzZoneRecordDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + pvtzService := PvtzService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_pvtz_zone_record" { @@ -148,7 +151,7 @@ func testAccAlicloudPvtzZoneRecordDestroy(s *terraform.State) error { return err } - zoneRecord, err := client.DescribeZoneRecord(recordId, zoneId) + zoneRecord, err := pvtzService.DescribeZoneRecord(recordId, zoneId) if err != nil && !NotFoundError(err) { return err diff --git a/alicloud/resource_alicloud_pvtz_zone_test.go b/alicloud/resource_alicloud_pvtz_zone_test.go index de80e9b9193..d129bd71143 100644 --- a/alicloud/resource_alicloud_pvtz_zone_test.go +++ b/alicloud/resource_alicloud_pvtz_zone_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepPvtzZones(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -37,14 +38,17 @@ func testSweepPvtzZones(region string) error { var zones []pvtz.Zone req := pvtz.CreateDescribeZonesRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.pvtzconn.DescribeZones(req) + raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.DescribeZones(req) + }) if err != nil { return fmt.Errorf("Error retrieving Private Zones: %s", err) } + resp, _ := raw.(*pvtz.DescribeZonesResponse) if resp == nil || len(resp.Zones.Zone) < 1 { break } @@ -83,14 +87,20 @@ func testSweepPvtzZones(region string) error { vpcs := make([]pvtz.BindZoneVpcVpcs, 0) request.Vpcs = &vpcs - if _, err := conn.pvtzconn.BindZoneVpc(request); err != nil { + _, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.BindZoneVpc(request) + }) + if err != nil { log.Printf("[ERROR] Failed to unbind VPC from Private Zone (%s (%s)): %s ", name, id, err) } log.Printf("[INFO] Deleting Private Zone: %s (%s)", name, id) req := pvtz.CreateDeleteZoneRequest() req.ZoneId = id - if _, err := conn.pvtzconn.DeleteZone(req); err != nil { + _, err = client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.DeleteZone(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Private Zone (%s (%s)): %s", name, id, err) } } @@ -208,9 +218,10 @@ func testAccAlicloudPvtzZoneExists(n string, zone *pvtz.DescribeZoneInfoResponse return fmt.Errorf("No ZONE ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + pvtzService := PvtzService{client} - instance, err := client.DescribePvtzZoneInfo(rs.Primary.ID) + instance, err := pvtzService.DescribePvtzZoneInfo(rs.Primary.ID) if err != nil { return err @@ -222,14 +233,15 @@ func testAccAlicloudPvtzZoneExists(n string, zone *pvtz.DescribeZoneInfoResponse } func testAccAlicloudPvtzZoneDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + pvtzService := PvtzService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_pvtz_zone" { continue } - instance, err := client.DescribePvtzZoneInfo(rs.Primary.ID) + instance, err := pvtzService.DescribePvtzZoneInfo(rs.Primary.ID) if err != nil && !NotFoundError(err) { return err diff --git a/alicloud/resource_alicloud_ram_access_key.go b/alicloud/resource_alicloud_ram_access_key.go index 71365d96aa7..a8d346a8530 100644 --- a/alicloud/resource_alicloud_ram_access_key.go +++ b/alicloud/resource_alicloud_ram_access_key.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamAccessKey() *schema.Resource { @@ -39,17 +40,20 @@ func resourceAlicloudRamAccessKey() *schema.Resource { } func resourceAlicloudRamAccessKeyCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.UserQueryRequest{} if v, ok := d.GetOk("user_name"); ok && v.(string) != "" { args.UserName = v.(string) } - response, err := conn.CreateAccessKey(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.CreateAccessKey(args) + }) if err != nil { return fmt.Errorf("CreateAccessKey got an error: %#v", err) } + response, _ := raw.(ram.AccessKeyResponse) // create a secret_file and write access key to it. if output, ok := d.GetOk("secret_file"); ok && output != nil { @@ -61,7 +65,7 @@ func resourceAlicloudRamAccessKeyCreate(d *schema.ResourceData, meta interface{} } func resourceAlicloudRamAccessKeyUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -75,7 +79,10 @@ func resourceAlicloudRamAccessKeyUpdate(d *schema.ResourceData, meta interface{} if d.HasChange("status") { d.SetPartial("status") - if _, err := conn.UpdateAccessKey(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.UpdateAccessKey(args) + }) + if err != nil { return fmt.Errorf("UpdateAccessKey got an error: %#v", err) } } @@ -85,18 +92,20 @@ func resourceAlicloudRamAccessKeyUpdate(d *schema.ResourceData, meta interface{} } func resourceAlicloudRamAccessKeyRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.UserQueryRequest{} if v, ok := d.GetOk("user_name"); ok && v.(string) != "" { args.UserName = v.(string) } - response, err := conn.ListAccessKeys(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListAccessKeys(args) + }) if err != nil { return fmt.Errorf("Get list access keys got an error: %#v", err) } - + response, _ := raw.(ram.AccessKeyListResponse) accessKeys := response.AccessKeys.AccessKey if len(accessKeys) < 1 { return fmt.Errorf("No access keys found.") @@ -114,7 +123,7 @@ func resourceAlicloudRamAccessKeyRead(d *schema.ResourceData, meta interface{}) } func resourceAlicloudRamAccessKeyDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.UpdateAccessKeyRequest{ UserAccessKeyId: d.Id(), @@ -128,20 +137,26 @@ func resourceAlicloudRamAccessKeyDelete(d *schema.ResourceData, meta interface{} } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DeleteAccessKey(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeleteAccessKey(args) + }) + if err != nil { if RamEntityNotExist(err) { return nil } return resource.NonRetryableError(fmt.Errorf("Error deleting access key: %#v", err)) } - response, err := conn.ListAccessKeys(queryArgs) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListAccessKeys(queryArgs) + }) if err != nil { if RamEntityNotExist(err) { return nil } return resource.NonRetryableError(err) } + response, _ := raw.(ram.AccessKeyListResponse) if len(response.AccessKeys.AccessKey) < 1 { return nil diff --git a/alicloud/resource_alicloud_ram_access_key_test.go b/alicloud/resource_alicloud_ram_access_key_test.go index 0958e5660af..d825fbcb6b7 100644 --- a/alicloud/resource_alicloud_ram_access_key_test.go +++ b/alicloud/resource_alicloud_ram_access_key_test.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudRamAccessKey_basic(t *testing.T) { @@ -53,16 +54,18 @@ func testAccCheckRamAccessKeyExists(n string, ak *ram.AccessKey) resource.TestCh return fmt.Errorf("No Access key ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.UserQueryRequest{ UserName: rs.Primary.Attributes["user_name"], } - response, err := conn.ListAccessKeys(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListAccessKeys(request) + }) if err == nil { + response, _ := raw.(ram.AccessKeyListResponse) if len(response.AccessKeys.AccessKey) > 0 { for _, v := range response.AccessKeys.AccessKey { if v.AccessKeyId == rs.Primary.ID { @@ -85,15 +88,17 @@ func testAccCheckRamAccessKeyDestroy(s *terraform.State) error { } // Try to find the ak - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.UserQueryRequest{ UserName: rs.Primary.Attributes["user_name"], } - response, err := conn.ListAccessKeys(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListAccessKeys(request) + }) + response, _ := raw.(ram.AccessKeyListResponse) if len(response.AccessKeys.AccessKey) > 0 { for _, v := range response.AccessKeys.AccessKey { if v.AccessKeyId == rs.Primary.ID { diff --git a/alicloud/resource_alicloud_ram_account_alias.go b/alicloud/resource_alicloud_ram_account_alias.go index 3d205cfe147..5889bcd0be4 100644 --- a/alicloud/resource_alicloud_ram_account_alias.go +++ b/alicloud/resource_alicloud_ram_account_alias.go @@ -5,6 +5,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamAccountAlias() *schema.Resource { @@ -25,13 +26,16 @@ func resourceAlicloudRamAccountAlias() *schema.Resource { } func resourceAlicloudRamAccountAliasCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.AccountAliasRequest{ AccountAlias: d.Get("account_alias").(string), } - if _, err := conn.SetAccountAlias(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.SetAccountAlias(args) + }) + if err != nil { return fmt.Errorf("SetAccountAlias got an error: %#v", err) } @@ -40,21 +44,27 @@ func resourceAlicloudRamAccountAliasCreate(d *schema.ResourceData, meta interfac } func resourceAlicloudRamAccountAliasRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) - response, err := conn.GetAccountAlias() + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetAccountAlias() + }) if err != nil { return fmt.Errorf("GetAccountAlias got an error: %#v", err) } + response, _ := raw.(ram.AccountAliasResponse) d.Set("account_alias", response.AccountAlias) return nil } func resourceAlicloudRamAccountAliasDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) - if _, err := conn.ClearAccountAlias(); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ClearAccountAlias() + }) + if err != nil { return fmt.Errorf("ClearAccountAlias got an error: %#v", err) } return nil diff --git a/alicloud/resource_alicloud_ram_account_alias_test.go b/alicloud/resource_alicloud_ram_account_alias_test.go index e5048061da0..2853bb7a541 100644 --- a/alicloud/resource_alicloud_ram_account_alias_test.go +++ b/alicloud/resource_alicloud_ram_account_alias_test.go @@ -8,8 +8,10 @@ import ( "strings" "time" + "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -20,11 +22,11 @@ func init() { } func testSweepAccountAliases(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -34,12 +36,14 @@ func testSweepAccountAliases(region string) error { "tftest", } - resp, err := conn.ramconn.GetAccountAlias() + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetAccountAlias() + }) if err != nil { return fmt.Errorf("Error retrieving Ram account alias: %s", err) } sweeped := false - + resp, _ := raw.(ram.AccountAliasResponse) name := resp.AccountAlias skip := true for _, prefix := range prefixes { @@ -55,7 +59,10 @@ func testSweepAccountAliases(region string) error { sweeped = true log.Printf("[INFO] Deleting Ram account alias: %s", name) - if _, err := conn.ramconn.ClearAccountAlias(); err != nil { + _, err = client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ClearAccountAlias() + }) + if err != nil { log.Printf("[ERROR] Failed to delete Ram account alias (%s): %s", name, err) } @@ -106,12 +113,14 @@ func testAccCheckRamAccountAliasExists(n string, alias *string) resource.TestChe return fmt.Errorf("No Alias ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) - response, err := conn.GetAccountAlias() + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetAccountAlias() + }) if err == nil { + response, _ := raw.(ram.AccountAliasResponse) *alias = response.AccountAlias return nil } @@ -127,10 +136,11 @@ func testAccCheckRamAccountAliasDestroy(s *terraform.State) error { } // Try to find the alias - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) - _, err := conn.GetAccountAlias() + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetAccountAlias() + }) if err != nil && !RamEntityNotExist(err) { return err diff --git a/alicloud/resource_alicloud_ram_group.go b/alicloud/resource_alicloud_ram_group.go index 47794301cbf..6b206f24695 100644 --- a/alicloud/resource_alicloud_ram_group.go +++ b/alicloud/resource_alicloud_ram_group.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamGroup() *schema.Resource { @@ -40,7 +41,7 @@ func resourceAlicloudRamGroup() *schema.Resource { } func resourceAlicloudRamGroupCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.GroupRequest{ Group: ram.Group{ @@ -48,17 +49,19 @@ func resourceAlicloudRamGroupCreate(d *schema.ResourceData, meta interface{}) er }, } - response, err := conn.CreateGroup(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.CreateGroup(args) + }) if err != nil { return fmt.Errorf("CreateGroup got an error: %#v", err) } - + response, _ := raw.(ram.GroupResponse) d.SetId(response.Group.GroupName) return resourceAlicloudRamGroupUpdate(d, meta) } func resourceAlicloudRamGroupUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -82,7 +85,10 @@ func resourceAlicloudRamGroupUpdate(d *schema.ResourceData, meta interface{}) er } if attributeUpdate { - if _, err := conn.UpdateGroup(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.UpdateGroup(args) + }) + if err != nil { return fmt.Errorf("UpdateGroup got an error: %v", err) } } @@ -92,20 +98,22 @@ func resourceAlicloudRamGroupUpdate(d *schema.ResourceData, meta interface{}) er } func resourceAlicloudRamGroupRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.GroupQueryRequest{ GroupName: d.Id(), } - response, err := conn.GetGroup(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetGroup(args) + }) if err != nil { if RamEntityNotExist(err) { d.SetId("") } return fmt.Errorf("GetGroup got an error: %#v", err) } - + response, _ := raw.(ram.GroupResponse) group := response.Group d.Set("name", group.GroupName) d.Set("comments", group.Comments) @@ -113,7 +121,7 @@ func resourceAlicloudRamGroupRead(d *schema.ResourceData, meta interface{}) erro } func resourceAlicloudRamGroupDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.GroupQueryRequest{ GroupName: d.Id(), @@ -121,16 +129,21 @@ func resourceAlicloudRamGroupDelete(d *schema.ResourceData, meta interface{}) er if d.Get("force").(bool) { // list and delete users which in this group - listUserResp, err := conn.ListUsersForGroup(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListUsersForGroup(args) + }) if err != nil { return fmt.Errorf("Error while listing users for group %s: %#v", d.Id(), err) } + listUserResp, _ := raw.(ram.ListUserResponse) users := listUserResp.Users.User if len(users) > 0 { for _, v := range users { - _, err = conn.RemoveUserFromGroup(ram.UserRelateGroupRequest{ - UserName: v.UserName, - GroupName: args.GroupName, + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.RemoveUserFromGroup(ram.UserRelateGroupRequest{ + UserName: v.UserName, + GroupName: args.GroupName, + }) }) if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error while deleting user %s from group %s: %#v", v.UserName, d.Id(), err) @@ -139,19 +152,24 @@ func resourceAlicloudRamGroupDelete(d *schema.ResourceData, meta interface{}) er } // list and detach policies which attach this group - listPolicyResp, err := conn.ListPoliciesForGroup(args) + raw, err = client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForGroup(args) + }) if err != nil { return fmt.Errorf("Error while listing policies for group %s: %#v", d.Id(), err) } + listPolicyResp, _ := raw.(ram.PolicyListResponse) policies := listPolicyResp.Policies.Policy if len(policies) > 0 { for _, v := range policies { - _, err = conn.DetachPolicyFromGroup(ram.AttachPolicyToGroupRequest{ - PolicyRequest: ram.PolicyRequest{ - PolicyType: ram.Type(v.PolicyType), - PolicyName: v.PolicyName, - }, - GroupName: args.GroupName, + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DetachPolicyFromGroup(ram.AttachPolicyToGroupRequest{ + PolicyRequest: ram.PolicyRequest{ + PolicyType: ram.Type(v.PolicyType), + PolicyName: v.PolicyName, + }, + GroupName: args.GroupName, + }) }) if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error while detaching policy %s from group %s: %#v", v.PolicyName, d.Id(), err) @@ -161,7 +179,10 @@ func resourceAlicloudRamGroupDelete(d *schema.ResourceData, meta interface{}) er } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DeleteGroup(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeleteGroup(args) + }) + if err != nil { if IsExceptedError(err, DeleteConflictGroupUser) || IsExceptedError(err, DeleteConflictGroupPolicy) { return resource.RetryableError(fmt.Errorf("The group can not has any user member or any attached policy while deleting the group.- you can set force with true to force delete the group.")) } diff --git a/alicloud/resource_alicloud_ram_group_membership.go b/alicloud/resource_alicloud_ram_group_membership.go index 747f8335bd7..d498268b890 100644 --- a/alicloud/resource_alicloud_ram_group_membership.go +++ b/alicloud/resource_alicloud_ram_group_membership.go @@ -5,6 +5,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamGroupMembership() *schema.Resource { @@ -35,12 +36,12 @@ func resourceAlicloudRamGroupMembership() *schema.Resource { } func resourceAlicloudRamGroupMembershipCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) group := d.Get("group_name").(string) users := expandStringList(d.Get("user_names").(*schema.Set).List()) - err := addUsersToGroup(conn, users, group) + err := addUsersToGroup(client, users, group) if err != nil { return fmt.Errorf("AddUserToGroup got an error: %#v", err) } @@ -51,7 +52,7 @@ func resourceAlicloudRamGroupMembershipCreate(d *schema.ResourceData, meta inter } func resourceAlicloudRamGroupMembershipUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -71,11 +72,11 @@ func resourceAlicloudRamGroupMembershipUpdate(d *schema.ResourceData, meta inter add := expandStringList(newSet.Difference(oldSet).List()) group := d.Id() - if err := removeUsersFromGroup(conn, remove, group); err != nil { + if err := removeUsersFromGroup(client, remove, group); err != nil { return fmt.Errorf("removeUsersFromGroup got an error: %#v", err) } - if err := addUsersToGroup(conn, add, group); err != nil { + if err := addUsersToGroup(client, add, group); err != nil { return fmt.Errorf("addUsersToGroup got an error: %#v", err) } } @@ -85,20 +86,22 @@ func resourceAlicloudRamGroupMembershipUpdate(d *schema.ResourceData, meta inter } func resourceAlicloudRamGroupMembershipRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.GroupQueryRequest{ GroupName: d.Id(), } - response, err := conn.ListUsersForGroup(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListUsersForGroup(args) + }) if err != nil { if RamEntityNotExist(err) { d.SetId("") } return fmt.Errorf("ListUsersForGroup got an error: %#v", err) } - + response, _ := raw.(ram.ListUserResponse) var users []string if len(response.Users.User) > 0 { for _, v := range response.Users.User { @@ -115,23 +118,25 @@ func resourceAlicloudRamGroupMembershipRead(d *schema.ResourceData, meta interfa } func resourceAlicloudRamGroupMembershipDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) users := expandStringList(d.Get("user_names").(*schema.Set).List()) group := d.Id() - if err := removeUsersFromGroup(conn, users, group); err != nil { + if err := removeUsersFromGroup(client, users, group); err != nil { return fmt.Errorf("removeUsersFromGroup got an error: %#v", err) } return nil } -func addUsersToGroup(conn ram.RamClientInterface, users []string, group string) error { +func addUsersToGroup(client *connectivity.AliyunClient, users []string, group string) error { for _, u := range users { - _, err := conn.AddUserToGroup(ram.UserRelateGroupRequest{ - UserName: u, - GroupName: group, + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.AddUserToGroup(ram.UserRelateGroupRequest{ + UserName: u, + GroupName: group, + }) }) if err != nil { @@ -141,11 +146,13 @@ func addUsersToGroup(conn ram.RamClientInterface, users []string, group string) return nil } -func removeUsersFromGroup(conn ram.RamClientInterface, users []string, group string) error { +func removeUsersFromGroup(client *connectivity.AliyunClient, users []string, group string) error { for _, u := range users { - _, err := conn.RemoveUserFromGroup(ram.UserRelateGroupRequest{ - UserName: u, - GroupName: group, + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.RemoveUserFromGroup(ram.UserRelateGroupRequest{ + UserName: u, + GroupName: group, + }) }) if err != nil && !RamEntityNotExist(err) { diff --git a/alicloud/resource_alicloud_ram_group_membership_test.go b/alicloud/resource_alicloud_ram_group_membership_test.go index 84d4c21eb3c..0d06d983be0 100644 --- a/alicloud/resource_alicloud_ram_group_membership_test.go +++ b/alicloud/resource_alicloud_ram_group_membership_test.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudRamGroupMembership_basic(t *testing.T) { @@ -53,16 +54,18 @@ func testAccCheckRamGroupMembershipExists(n string, user *ram.User, user1 *ram.U return fmt.Errorf("No membership ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.GroupQueryRequest{ GroupName: rs.Primary.ID, } - response, err := conn.ListUsersForGroup(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListUsersForGroup(request) + }) if err == nil { + response, _ := raw.(ram.ListUserResponse) if len(response.Users.User) == 2 { return nil } @@ -80,19 +83,20 @@ func testAccCheckRamGroupMembershipDestroy(s *terraform.State) error { } // Try to find the membership - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.GroupQueryRequest{ GroupName: rs.Primary.ID, } - response, err := conn.ListUsersForGroup(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListUsersForGroup(request) + }) if err != nil && !RamEntityNotExist(err) { return err } - + response, _ := raw.(ram.ListUserResponse) if len(response.Users.User) > 0 { for _, v := range response.Users.User { for _, u := range rs.Primary.Meta["user_names"].([]string) { diff --git a/alicloud/resource_alicloud_ram_group_policy_attachment.go b/alicloud/resource_alicloud_ram_group_policy_attachment.go index 2350aa8ea09..674e0e8ecf6 100644 --- a/alicloud/resource_alicloud_ram_group_policy_attachment.go +++ b/alicloud/resource_alicloud_ram_group_policy_attachment.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamGroupPolicyAtatchment() *schema.Resource { @@ -39,7 +40,7 @@ func resourceAlicloudRamGroupPolicyAtatchment() *schema.Resource { } func resourceAlicloudRamGroupPolicyAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.AttachPolicyToGroupRequest{ PolicyRequest: ram.PolicyRequest{ @@ -49,7 +50,10 @@ func resourceAlicloudRamGroupPolicyAttachmentCreate(d *schema.ResourceData, meta GroupName: d.Get("group_name").(string), } - if _, err := conn.AttachPolicyToGroup(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.AttachPolicyToGroup(args) + }) + if err != nil { return fmt.Errorf("AttachPolicyToGroup got an error: %#v", err) } d.SetId("group" + args.PolicyName + string(args.PolicyType) + args.GroupName) @@ -58,20 +62,22 @@ func resourceAlicloudRamGroupPolicyAttachmentCreate(d *schema.ResourceData, meta } func resourceAlicloudRamGroupPolicyAttachmentRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.GroupQueryRequest{ GroupName: d.Get("group_name").(string), } - response, err := conn.ListPoliciesForGroup(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForGroup(args) + }) if err != nil { if RamEntityNotExist(err) { d.SetId("") } return fmt.Errorf("Get list policies for group got an error: %#v", err) } - + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) > 0 { for _, v := range response.Policies.Policy { if v.PolicyName == d.Get("policy_name").(string) && v.PolicyType == d.Get("policy_type").(string) { @@ -88,7 +94,7 @@ func resourceAlicloudRamGroupPolicyAttachmentRead(d *schema.ResourceData, meta i } func resourceAlicloudRamGroupPolicyAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.AttachPolicyToGroupRequest{ PolicyRequest: ram.PolicyRequest{ @@ -99,14 +105,19 @@ func resourceAlicloudRamGroupPolicyAttachmentDelete(d *schema.ResourceData, meta } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DetachPolicyFromGroup(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DetachPolicyFromGroup(args) + }) + if err != nil { if RamEntityNotExist(err) { return nil } return resource.NonRetryableError(fmt.Errorf("Error deleting group policy attachment: %#v", err)) } - response, err := conn.ListPoliciesForGroup(ram.GroupQueryRequest{GroupName: args.GroupName}) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForGroup(ram.GroupQueryRequest{GroupName: args.GroupName}) + }) if err != nil { if RamEntityNotExist(err) { return nil @@ -114,7 +125,7 @@ func resourceAlicloudRamGroupPolicyAttachmentDelete(d *schema.ResourceData, meta return resource.NonRetryableError(err) } - + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) < 1 { return nil } diff --git a/alicloud/resource_alicloud_ram_group_policy_attachment_test.go b/alicloud/resource_alicloud_ram_group_policy_attachment_test.go index 63c6c20e26d..8e4b54ca906 100644 --- a/alicloud/resource_alicloud_ram_group_policy_attachment_test.go +++ b/alicloud/resource_alicloud_ram_group_policy_attachment_test.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudRamGroupPolicyAttachment_basic(t *testing.T) { @@ -51,15 +52,17 @@ func testAccCheckRamGroupPolicyAttachmentExists(n string, policy *ram.Policy, gr return fmt.Errorf("No Attachment ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.GroupQueryRequest{ GroupName: group.GroupName, } - response, err := conn.ListPoliciesForGroup(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForGroup(request) + }) if err == nil { + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) > 0 { for _, v := range response.Policies.Policy { if v.PolicyName == policy.PolicyName && v.PolicyType == policy.PolicyType { @@ -81,19 +84,20 @@ func testAccCheckRamGroupPolicyAttachmentDestroy(s *terraform.State) error { } // Try to find the attachment - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.GroupQueryRequest{ GroupName: rs.Primary.Attributes["group_name"], } - response, err := conn.ListPoliciesForGroup(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForGroup(request) + }) if err != nil && !RamEntityNotExist(err) { return err } - + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) > 0 { for _, v := range response.Policies.Policy { if v.PolicyName == rs.Primary.Attributes["name"] && v.PolicyType == rs.Primary.Attributes["policy_type"] { diff --git a/alicloud/resource_alicloud_ram_group_test.go b/alicloud/resource_alicloud_ram_group_test.go index 8067c89e59e..74e0e63cc9e 100644 --- a/alicloud/resource_alicloud_ram_group_test.go +++ b/alicloud/resource_alicloud_ram_group_test.go @@ -11,6 +11,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -25,11 +26,11 @@ func init() { } func testSweepRamGroups(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -42,10 +43,13 @@ func testSweepRamGroups(region string) error { var groups []ram.Group args := ram.GroupListRequest{} for { - resp, err := conn.ramconn.ListGroup(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListGroup(args) + }) if err != nil { return fmt.Errorf("Error retrieving Ram groups: %s", err) } + resp, _ := raw.(ram.GroupListResponse) if len(resp.Groups.Group) < 1 { break } @@ -76,7 +80,10 @@ func testSweepRamGroups(region string) error { req := ram.GroupQueryRequest{ GroupName: name, } - if _, err := conn.ramconn.DeleteGroup(req); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeleteGroup(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Ram User (%s): %s", name, err) } } @@ -131,14 +138,16 @@ func testAccCheckRamGroupExists(n string, group *ram.Group) resource.TestCheckFu return fmt.Errorf("No Group ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) - response, err := conn.GetGroup(ram.GroupQueryRequest{ - GroupName: rs.Primary.ID, + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetGroup(ram.GroupQueryRequest{ + GroupName: rs.Primary.ID, + }) }) if err == nil { + response, _ := raw.(ram.GroupResponse) *group = response.Group return nil } @@ -154,14 +163,15 @@ func testAccCheckRamGroupDestroy(s *terraform.State) error { } // Try to find the group - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.GroupQueryRequest{ GroupName: rs.Primary.ID, } - _, err := conn.GetGroup(request) + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetGroup(request) + }) if err != nil && !RamEntityNotExist(err) { return err diff --git a/alicloud/resource_alicloud_ram_login_profile.go b/alicloud/resource_alicloud_ram_login_profile.go index 5dfc8d065da..e6446e6a484 100644 --- a/alicloud/resource_alicloud_ram_login_profile.go +++ b/alicloud/resource_alicloud_ram_login_profile.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamLoginProfile() *schema.Resource { @@ -46,7 +47,7 @@ func resourceAlicloudRamLoginProfile() *schema.Resource { } func resourceAlicloudRamLoginProfileCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.ProfileRequest{ UserName: d.Get("user_name").(string), @@ -55,7 +56,10 @@ func resourceAlicloudRamLoginProfileCreate(d *schema.ResourceData, meta interfac MFABindRequired: d.Get("mfa_bind_required").(bool), } - if _, err := conn.CreateLoginProfile(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.CreateLoginProfile(args) + }) + if err != nil { return fmt.Errorf("CreateLoginProfile got an error: %#v", err) } @@ -64,7 +68,7 @@ func resourceAlicloudRamLoginProfileCreate(d *schema.ResourceData, meta interfac } func resourceAlicloudRamLoginProfileUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -92,7 +96,10 @@ func resourceAlicloudRamLoginProfileUpdate(d *schema.ResourceData, meta interfac } if attributeUpdate && !d.IsNewResource() { - if _, err := conn.UpdateLoginProfile(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.UpdateLoginProfile(args) + }) + if err != nil { return fmt.Errorf("UpdateLoginProfile got an error: %v", err) } } @@ -102,20 +109,22 @@ func resourceAlicloudRamLoginProfileUpdate(d *schema.ResourceData, meta interfac } func resourceAlicloudRamLoginProfileRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.UserQueryRequest{ UserName: d.Id(), } - response, err := conn.GetLoginProfile(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetLoginProfile(args) + }) if err != nil { if RamEntityNotExist(err) { d.SetId("") } return fmt.Errorf("GetLoginProfile got an error: %#v", err) } - + response, _ := raw.(ram.ProfileResponse) profile := response.LoginProfile d.Set("user_name", profile.UserName) d.Set("mfa_bind_required", profile.MFABindRequired) @@ -124,21 +133,26 @@ func resourceAlicloudRamLoginProfileRead(d *schema.ResourceData, meta interface{ } func resourceAlicloudRamLoginProfileDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.UserQueryRequest{ UserName: d.Id(), } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DeleteLoginProfile(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeleteLoginProfile(args) + }) + if err != nil { if RamEntityNotExist(err) { return nil } return resource.NonRetryableError(fmt.Errorf("Error deleting login profile: %#v", err)) } - response, err := conn.GetLoginProfile(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetLoginProfile(args) + }) if err != nil { if RamEntityNotExist(err) { return nil @@ -146,7 +160,7 @@ func resourceAlicloudRamLoginProfileDelete(d *schema.ResourceData, meta interfac return resource.NonRetryableError(err) } - + response, _ := raw.(ram.ProfileResponse) if response.LoginProfile.UserName == args.UserName { return resource.RetryableError(fmt.Errorf("Error deleting login profile - trying again while it is deleted.")) } diff --git a/alicloud/resource_alicloud_ram_login_profile_test.go b/alicloud/resource_alicloud_ram_login_profile_test.go index fcb13e36545..15c8a21b4ce 100644 --- a/alicloud/resource_alicloud_ram_login_profile_test.go +++ b/alicloud/resource_alicloud_ram_login_profile_test.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudRamLoginProfile_basic(t *testing.T) { @@ -49,18 +50,20 @@ func testAccCheckRamLoginProfileExists(n string, profile *ram.LoginProfile) reso return fmt.Errorf("No LoginProfile ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.UserQueryRequest{ UserName: rs.Primary.Attributes["user_name"], } - response, err := conn.GetLoginProfile(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetLoginProfile(request) + }) if err != nil { return fmt.Errorf("Error finding login profile %#v", rs.Primary.ID) } + response, _ := raw.(ram.ProfileResponse) *profile = response.LoginProfile return nil } @@ -74,14 +77,15 @@ func testAccCheckRamLoginProfileDestroy(s *terraform.State) error { } // Try to find the login profile - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.UserQueryRequest{ UserName: rs.Primary.Attributes["user_name"], } - _, err := conn.GetLoginProfile(request) + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetLoginProfile(request) + }) if err != nil && !RamEntityNotExist(err) { return err diff --git a/alicloud/resource_alicloud_ram_policy.go b/alicloud/resource_alicloud_ram_policy.go index 6c231d0336b..9de46e8a02c 100644 --- a/alicloud/resource_alicloud_ram_policy.go +++ b/alicloud/resource_alicloud_ram_policy.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamPolicy() *schema.Resource { @@ -69,7 +70,7 @@ func resourceAlicloudRamPolicy() *schema.Resource { ConflictsWith: []string{"statement", "version"}, ValidateFunc: validateJsonString, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { - equal, _ := CompareJsonTemplateAreEquivalent(old, new) + equal, _ := compareJsonTemplateAreEquivalent(old, new) return equal }, }, @@ -104,24 +105,26 @@ func resourceAlicloudRamPolicy() *schema.Resource { } func resourceAlicloudRamPolicyCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args, err := buildAlicloudRamPolicyCreateArgs(d, meta) if err != nil { return err } - response, err := conn.CreatePolicy(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.CreatePolicy(args) + }) if err != nil { return fmt.Errorf("CreatePolicy got an error: %#v", err) } - + response, _ := raw.(ram.PolicyResponse) d.SetId(response.Policy.PolicyName) return resourceAlicloudRamPolicyUpdate(d, meta) } func resourceAlicloudRamPolicyUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) args, attributeUpdate, err := buildAlicloudRamPolicyUpdateArgs(d, meta) @@ -130,7 +133,10 @@ func resourceAlicloudRamPolicyUpdate(d *schema.ResourceData, meta interface{}) e } if !d.IsNewResource() && attributeUpdate { - if _, err := conn.CreatePolicyVersion(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.CreatePolicyVersion(args) + }) + if err != nil { return fmt.Errorf("Error updating policy %s: %#v", d.Id(), err) } } @@ -141,29 +147,35 @@ func resourceAlicloudRamPolicyUpdate(d *schema.ResourceData, meta interface{}) e } func resourceAlicloudRamPolicyRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) + ramService := RamService{client} args := ram.PolicyRequest{ PolicyName: d.Id(), PolicyType: ram.Custom, } - policyResp, err := conn.GetPolicy(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetPolicy(args) + }) if err != nil { if RamEntityNotExist(err) { d.SetId("") } return fmt.Errorf("GetPolicy got an error: %#v", err) } + policyResp, _ := raw.(ram.PolicyResponse) policy := policyResp.Policy args.VersionId = policy.DefaultVersion - policyVersionResp, err := conn.GetPolicyVersionNew(args) + raw, err = client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetPolicyVersionNew(args) + }) if err != nil { return fmt.Errorf("GetPolicyVersion got an error: %#v", err) } - - statement, version, err := ParsePolicyDocument(policyVersionResp.PolicyVersion.PolicyDocument) + policyVersionResp, _ := raw.(ram.PolicyVersionResponseNew) + statement, version, err := ramService.ParsePolicyDocument(policyVersionResp.PolicyVersion.PolicyDocument) if err != nil { return err } @@ -180,7 +192,7 @@ func resourceAlicloudRamPolicyRead(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudRamPolicyDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.PolicyRequest{ PolicyName: d.Id(), @@ -190,16 +202,20 @@ func resourceAlicloudRamPolicyDelete(d *schema.ResourceData, meta interface{}) e args.PolicyType = ram.Custom // list and detach entities for this policy - response, err := conn.ListEntitiesForPolicy(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListEntitiesForPolicy(args) + }) if err != nil { return fmt.Errorf("Error listing entities for policy %s when trying to delete: %#v", d.Id(), err) } - + response, _ := raw.(ram.PolicyListEntitiesResponse) if len(response.Users.User) > 0 { for _, v := range response.Users.User { - _, err := conn.DetachPolicyFromUser(ram.AttachPolicyRequest{ - PolicyRequest: args, - UserName: v.UserName, + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DetachPolicyFromUser(ram.AttachPolicyRequest{ + PolicyRequest: args, + UserName: v.UserName, + }) }) if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error detaching policy %s from user %s:%#v", d.Id(), v.UserId, err) @@ -209,9 +225,11 @@ func resourceAlicloudRamPolicyDelete(d *schema.ResourceData, meta interface{}) e if len(response.Groups.Group) > 0 { for _, v := range response.Groups.Group { - _, err := conn.DetachPolicyFromGroup(ram.AttachPolicyToGroupRequest{ - PolicyRequest: args, - GroupName: v.GroupName, + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DetachPolicyFromGroup(ram.AttachPolicyToGroupRequest{ + PolicyRequest: args, + GroupName: v.GroupName, + }) }) if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error detaching policy %s from group %s:%#v", d.Id(), v.GroupName, err) @@ -221,9 +239,11 @@ func resourceAlicloudRamPolicyDelete(d *schema.ResourceData, meta interface{}) e if len(response.Roles.Role) > 0 { for _, v := range response.Roles.Role { - _, err := conn.DetachPolicyFromRole(ram.AttachPolicyToRoleRequest{ - PolicyRequest: args, - RoleName: v.RoleName, + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DetachPolicyFromRole(ram.AttachPolicyToRoleRequest{ + PolicyRequest: args, + RoleName: v.RoleName, + }) }) if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error detaching policy %s from role %s:%#v", d.Id(), v.RoleId, err) @@ -232,15 +252,21 @@ func resourceAlicloudRamPolicyDelete(d *schema.ResourceData, meta interface{}) e } // list and delete policy version which are not default - pvResp, err := conn.ListPolicyVersionsNew(args) + raw, err = client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPolicyVersionsNew(args) + }) if err != nil { return fmt.Errorf("Error listing policy versions for policy %s:%#v", d.Id(), err) } + pvResp, _ := raw.(ram.PolicyVersionsResponse) if len(pvResp.PolicyVersions.PolicyVersion) > 1 { for _, v := range pvResp.PolicyVersions.PolicyVersion { if !v.IsDefaultVersion { args.VersionId = v.VersionId - if _, err = conn.DeletePolicyVersion(args); err != nil && !RamEntityNotExist(err) { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeletePolicyVersion(args) + }) + if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error delete policy version %s for policy %s:%#v", v.VersionId, d.Id(), err) } } @@ -249,7 +275,10 @@ func resourceAlicloudRamPolicyDelete(d *schema.ResourceData, meta interface{}) e } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DeletePolicy(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeletePolicy(args) + }) + if err != nil { if IsExceptedError(err, DeleteConflictPolicyUser) || IsExceptedError(err, DeleteConflictPolicyGroup) || IsExceptedError(err, DeleteConflictRolePolicy) { return resource.RetryableError(fmt.Errorf("The policy can not been attached to any user or group or role while deleting the policy. - you can set force with true to force delete the policy.")) } @@ -263,6 +292,8 @@ func resourceAlicloudRamPolicyDelete(d *schema.ResourceData, meta interface{}) e } func buildAlicloudRamPolicyCreateArgs(d *schema.ResourceData, meta interface{}) (ram.PolicyRequest, error) { + client := meta.(*connectivity.AliyunClient) + ramService := RamService{client} var document string doc, docOk := d.GetOk("document") @@ -275,7 +306,7 @@ func buildAlicloudRamPolicyCreateArgs(d *schema.ResourceData, meta interface{}) if docOk { document = doc.(string) } else { - doc, err := AssemblePolicyDocument(statement.(*schema.Set).List(), d.Get("version").(string)) + doc, err := ramService.AssemblePolicyDocument(statement.(*schema.Set).List(), d.Get("version").(string)) if err != nil { return ram.PolicyRequest{}, err } @@ -295,6 +326,8 @@ func buildAlicloudRamPolicyCreateArgs(d *schema.ResourceData, meta interface{}) } func buildAlicloudRamPolicyUpdateArgs(d *schema.ResourceData, meta interface{}) (ram.PolicyRequest, bool, error) { + client := meta.(*connectivity.AliyunClient) + ramService := RamService{client} args := ram.PolicyRequest{ PolicyName: d.Id(), SetAsDefault: "true", @@ -316,7 +349,7 @@ func buildAlicloudRamPolicyUpdateArgs(d *schema.ResourceData, meta interface{}) d.SetPartial("version") } - document, err := AssemblePolicyDocument(d.Get("statement").(*schema.Set).List(), d.Get("version").(string)) + document, err := ramService.AssemblePolicyDocument(d.Get("statement").(*schema.Set).List(), d.Get("version").(string)) if err != nil { return ram.PolicyRequest{}, attributeUpdate, err } diff --git a/alicloud/resource_alicloud_ram_policy_test.go b/alicloud/resource_alicloud_ram_policy_test.go index 2dbcc4a39ff..d9340ed9fd2 100644 --- a/alicloud/resource_alicloud_ram_policy_test.go +++ b/alicloud/resource_alicloud_ram_policy_test.go @@ -11,6 +11,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepRamPolicies(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -36,11 +37,13 @@ func testSweepRamPolicies(region string) error { } args := ram.PolicyQueryRequest{} - resp, err := conn.ramconn.ListPolicies(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPolicies(args) + }) if err != nil { return fmt.Errorf("Error retrieving Ram policies: %s", err) } - + resp, _ := raw.(ram.PolicyQueryResponse) sweeped := false for _, v := range resp.Policies.Policy { @@ -61,7 +64,10 @@ func testSweepRamPolicies(region string) error { req := ram.PolicyRequest{ PolicyName: name, } - if _, err := conn.ramconn.DeletePolicy(req); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeletePolicy(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Ram Policy (%s): %s", name, err) } } @@ -116,18 +122,20 @@ func testAccCheckRamPolicyExists(n string, policy *ram.Policy) resource.TestChec return fmt.Errorf("No Policy ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.PolicyRequest{ PolicyName: rs.Primary.ID, PolicyType: ram.Custom, } - response, err := conn.GetPolicy(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetPolicy(request) + }) log.Printf("[WARN] Policy id %#v", rs.Primary.ID) if err == nil { + response, _ := raw.(ram.PolicyResponse) *policy = response.Policy return nil } @@ -143,15 +151,16 @@ func testAccCheckRamPolicyDestroy(s *terraform.State) error { } // Try to find the policy - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.PolicyRequest{ PolicyName: rs.Primary.ID, PolicyType: ram.Custom, } - _, err := conn.GetPolicy(request) + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetPolicy(request) + }) if err != nil && !RamEntityNotExist(err) { return err diff --git a/alicloud/resource_alicloud_ram_role.go b/alicloud/resource_alicloud_ram_role.go index 2d3217d7458..cee7e0b0d9a 100644 --- a/alicloud/resource_alicloud_ram_role.go +++ b/alicloud/resource_alicloud_ram_role.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamRole() *schema.Resource { @@ -52,7 +53,7 @@ func resourceAlicloudRamRole() *schema.Resource { Computed: true, ConflictsWith: []string{"ram_users", "services", "version"}, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { - equal, _ := CompareJsonTemplateAreEquivalent(old, new) + equal, _ := compareJsonTemplateAreEquivalent(old, new) return equal }, ValidateFunc: validateJsonString, @@ -84,24 +85,26 @@ func resourceAlicloudRamRole() *schema.Resource { } func resourceAlicloudRamRoleCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args, err := buildAlicloudRamRoleCreateArgs(d, meta) if err != nil { return err } - response, err := conn.CreateRole(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.CreateRole(args) + }) if err != nil { return fmt.Errorf("CreateRole got an error: %#v", err) } - + response, _ := raw.(ram.RoleResponse) d.SetId(response.Role.RoleName) return resourceAlicloudRamRoleUpdate(d, meta) } func resourceAlicloudRamRoleUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -111,7 +114,10 @@ func resourceAlicloudRamRoleUpdate(d *schema.ResourceData, meta interface{}) err } if !d.IsNewResource() && attributeUpdate { - if _, err := conn.UpdateRole(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.UpdateRole(args) + }) + if err != nil { return fmt.Errorf("UpdateRole got an error: %v", err) } } @@ -121,22 +127,25 @@ func resourceAlicloudRamRoleUpdate(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudRamRoleRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) + ramService := RamService{client} args := ram.RoleQueryRequest{ RoleName: d.Id(), } - response, err := conn.GetRole(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetRole(args) + }) if err != nil { if RamEntityNotExist(err) { d.SetId("") } return fmt.Errorf("GetRole got an error: %v", err) } - + response, _ := raw.(ram.RoleResponse) role := response.Role - rolePolicy, err := ParseRolePolicyDocument(role.AssumeRolePolicyDocument) + rolePolicy, err := ramService.ParseRolePolicyDocument(role.AssumeRolePolicyDocument) if err != nil { return err } @@ -155,27 +164,31 @@ func resourceAlicloudRamRoleRead(d *schema.ResourceData, meta interface{}) error } func resourceAlicloudRamRoleDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.RoleQueryRequest{ RoleName: d.Id(), } if d.Get("force").(bool) { - resp, err := conn.ListPoliciesForRole(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForRole(args) + }) if err != nil { return fmt.Errorf("Error listing Policies for Role (%s) when trying to delete: %#v", d.Id(), err) } - + resp, _ := raw.(ram.PolicyListResponse) // Loop and remove the Policies from the Role if len(resp.Policies.Policy) > 0 { for _, v := range resp.Policies.Policy { - _, err = conn.DetachPolicyFromRole(ram.AttachPolicyToRoleRequest{ - PolicyRequest: ram.PolicyRequest{ - PolicyName: v.PolicyName, - PolicyType: ram.Type(v.PolicyType), - }, - RoleName: d.Id(), + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DetachPolicyFromRole(ram.AttachPolicyToRoleRequest{ + PolicyRequest: ram.PolicyRequest{ + PolicyName: v.PolicyName, + PolicyType: ram.Type(v.PolicyType), + }, + RoleName: d.Id(), + }) }) if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error detach Policy from Role %s: %#v", d.Id(), err) @@ -184,7 +197,10 @@ func resourceAlicloudRamRoleDelete(d *schema.ResourceData, meta interface{}) err } } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DeleteRole(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeleteRole(args) + }) + if err != nil { if IsExceptedError(err, DeleteConflictRolePolicy) { return resource.RetryableError(fmt.Errorf("The role can not has any attached policy while deleting the role. - you can set force with true to force delete the role.")) } @@ -195,7 +211,8 @@ func resourceAlicloudRamRoleDelete(d *schema.ResourceData, meta interface{}) err } func buildAlicloudRamRoleCreateArgs(d *schema.ResourceData, meta interface{}) (ram.RoleRequest, error) { - + client := meta.(*connectivity.AliyunClient) + ramService := RamService{client} args := ram.RoleRequest{ RoleName: d.Get("name").(string), } @@ -211,7 +228,7 @@ func buildAlicloudRamRoleCreateArgs(d *schema.ResourceData, meta interface{}) (r if documentOk { args.AssumeRolePolicyDocument = document.(string) } else { - rolePolicyDocument, err := AssembleRolePolicyDocument(ramUsers.(*schema.Set).List(), services.(*schema.Set).List(), d.Get("version").(string)) + rolePolicyDocument, err := ramService.AssembleRolePolicyDocument(ramUsers.(*schema.Set).List(), services.(*schema.Set).List(), d.Get("version").(string)) if err != nil { return ram.RoleRequest{}, err } @@ -226,6 +243,8 @@ func buildAlicloudRamRoleCreateArgs(d *schema.ResourceData, meta interface{}) (r } func buildAlicloudRamRoleUpdateArgs(d *schema.ResourceData, meta interface{}) (ram.UpdateRoleRequest, bool, error) { + client := meta.(*connectivity.AliyunClient) + ramService := RamService{client} args := ram.UpdateRoleRequest{ RoleName: d.Id(), } @@ -250,7 +269,7 @@ func buildAlicloudRamRoleUpdateArgs(d *schema.ResourceData, meta interface{}) (r d.SetPartial("version") } - document, err := AssembleRolePolicyDocument(d.Get("ram_users").(*schema.Set).List(), d.Get("services").(*schema.Set).List(), d.Get("version").(string)) + document, err := ramService.AssembleRolePolicyDocument(d.Get("ram_users").(*schema.Set).List(), d.Get("services").(*schema.Set).List(), d.Get("version").(string)) if err != nil { return ram.UpdateRoleRequest{}, attributeUpdate, err } diff --git a/alicloud/resource_alicloud_ram_role_attachment.go b/alicloud/resource_alicloud_ram_role_attachment.go index fac05ea3780..691b60eac49 100644 --- a/alicloud/resource_alicloud_ram_role_attachment.go +++ b/alicloud/resource_alicloud_ram_role_attachment.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamRoleAttachment() *schema.Resource { @@ -36,8 +37,8 @@ func resourceAlicloudRamRoleAttachment() *schema.Resource { } func resourceAlicloudInstanceRoleAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.ecsconn + client := meta.(*connectivity.AliyunClient) + ramService := RamService{client} instanceIds := convertListToJsonString(d.Get("instance_ids").(*schema.Set).List()) @@ -45,13 +46,16 @@ func resourceAlicloudInstanceRoleAttachmentCreate(d *schema.ResourceData, meta i args.InstanceIds = instanceIds args.RamRoleName = d.Get("role_name").(string) - err := client.JudgeRolePolicyPrincipal(args.RamRoleName) + err := ramService.JudgeRolePolicyPrincipal(args.RamRoleName) if err != nil { return err } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.AttachInstanceRamRole(args); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.AttachInstanceRamRole(args) + }) + if err != nil { if IsExceptedError(err, RoleAttachmentUnExpectedJson) { return resource.RetryableError(fmt.Errorf("Please trying again.")) } @@ -63,7 +67,7 @@ func resourceAlicloudInstanceRoleAttachmentCreate(d *schema.ResourceData, meta i } func resourceAlicloudInstanceRoleAttachmentRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ecsconn + client := meta.(*connectivity.AliyunClient) roleName := strings.Split(d.Id(), ":")[0] instanceIds := strings.Split(d.Id(), ":")[1] @@ -71,7 +75,9 @@ func resourceAlicloudInstanceRoleAttachmentRead(d *schema.ResourceData, meta int args.InstanceIds = instanceIds return resource.Retry(5*time.Minute, func() *resource.RetryError { - resp, err := conn.DescribeInstanceRamRole(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstanceRamRole(args) + }) if err != nil { if IsExceptedErrors(err, []string{RoleAttachmentUnExpectedJson}) { return resource.RetryableError(fmt.Errorf("Please trying again.")) @@ -82,7 +88,7 @@ func resourceAlicloudInstanceRoleAttachmentRead(d *schema.ResourceData, meta int } return resource.NonRetryableError(fmt.Errorf("DescribeInstanceRamRole got an error: %#v", err)) } - + resp, _ := raw.(*ecs.DescribeInstanceRamRoleResponse) instRoleSets := resp.InstanceRamRoleSets.InstanceRamRoleSet if len(instRoleSets) > 0 { var instIds []string @@ -105,7 +111,7 @@ func resourceAlicloudInstanceRoleAttachmentRead(d *schema.ResourceData, meta int } func resourceAlicloudInstanceRoleAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ecsconn + client := meta.(*connectivity.AliyunClient) roleName := strings.Split(d.Id(), ":")[0] instanceIds := strings.Split(d.Id(), ":")[1] @@ -114,7 +120,9 @@ func resourceAlicloudInstanceRoleAttachmentDelete(d *schema.ResourceData, meta i req.InstanceIds = instanceIds return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := conn.DetachInstanceRamRole(req) + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DetachInstanceRamRole(req) + }) if err != nil { if IsExceptedErrors(err, []string{RoleAttachmentUnExpectedJson}) { diff --git a/alicloud/resource_alicloud_ram_role_attachment_test.go b/alicloud/resource_alicloud_ram_role_attachment_test.go index 9ef0b25d7ff..918798ae4f5 100644 --- a/alicloud/resource_alicloud_ram_role_attachment_test.go +++ b/alicloud/resource_alicloud_ram_role_attachment_test.go @@ -9,6 +9,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudRamRoleAttachment_basic(t *testing.T) { @@ -56,17 +57,19 @@ func testAccCheckRamRoleAttachmentExists(n string, instanceA *ecs.Instance, inst return fmt.Errorf("No Attachment ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ecsconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) args := ecs.CreateDescribeInstanceRamRoleRequest() args.InstanceIds = convertListToJsonString([]interface{}{instanceA.InstanceId, instanceB.InstanceId}) for { - response, err := conn.DescribeInstanceRamRole(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstanceRamRole(args) + }) if IsExceptedError(err, RoleAttachmentUnExpectedJson) { continue } + response, _ := raw.(*ecs.DescribeInstanceRamRoleResponse) if err == nil { if len(response.InstanceRamRoleSets.InstanceRamRoleSet) > 0 { for _, v := range response.InstanceRamRoleSets.InstanceRamRoleSet { @@ -90,14 +93,15 @@ func testAccCheckRamRoleAttachmentDestroy(s *terraform.State) error { } // Try to find the attachment - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ecsconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) args := ecs.CreateDescribeInstanceRamRoleRequest() args.InstanceIds = strings.Split(rs.Primary.ID, ":")[1] for { - response, err := conn.DescribeInstanceRamRole(args) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstanceRamRole(args) + }) if IsExceptedError(err, RoleAttachmentUnExpectedJson) { continue } @@ -105,6 +109,7 @@ func testAccCheckRamRoleAttachmentDestroy(s *terraform.State) error { break } if err == nil { + response, _ := raw.(*ecs.DescribeInstanceRamRoleResponse) if len(response.InstanceRamRoleSets.InstanceRamRoleSet) > 0 { for _, v := range response.InstanceRamRoleSets.InstanceRamRoleSet { if v.RamRoleName != "" { diff --git a/alicloud/resource_alicloud_ram_role_policy_attachment.go b/alicloud/resource_alicloud_ram_role_policy_attachment.go index daf58a120bc..5c21721e463 100644 --- a/alicloud/resource_alicloud_ram_role_policy_attachment.go +++ b/alicloud/resource_alicloud_ram_role_policy_attachment.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamRolePolicyAttachment() *schema.Resource { @@ -40,7 +41,7 @@ func resourceAlicloudRamRolePolicyAttachment() *schema.Resource { } func resourceAlicloudRamRolePolicyAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.AttachPolicyToRoleRequest{ PolicyRequest: ram.PolicyRequest{ PolicyName: d.Get("policy_name").(string), @@ -49,7 +50,10 @@ func resourceAlicloudRamRolePolicyAttachmentCreate(d *schema.ResourceData, meta RoleName: d.Get("role_name").(string), } - if _, err := conn.AttachPolicyToRole(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.AttachPolicyToRole(args) + }) + if err != nil { return fmt.Errorf("AttachPolicyToRole got an error: %#v", err) } d.SetId("role" + args.PolicyName + string(args.PolicyType) + args.RoleName) @@ -58,17 +62,19 @@ func resourceAlicloudRamRolePolicyAttachmentCreate(d *schema.ResourceData, meta } func resourceAlicloudRamRolePolicyAttachmentRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.RoleQueryRequest{ RoleName: d.Get("role_name").(string), } - response, err := conn.ListPoliciesForRole(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForRole(args) + }) if err != nil { return fmt.Errorf("Get list policies for role got an error: %v", err) } - + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) > 0 { for _, v := range response.Policies.Policy { if v.PolicyName == d.Get("policy_name").(string) && v.PolicyType == d.Get("policy_type").(string) { @@ -85,7 +91,7 @@ func resourceAlicloudRamRolePolicyAttachmentRead(d *schema.ResourceData, meta in } func resourceAlicloudRamRolePolicyAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.AttachPolicyToRoleRequest{ PolicyRequest: ram.PolicyRequest{ @@ -96,20 +102,26 @@ func resourceAlicloudRamRolePolicyAttachmentDelete(d *schema.ResourceData, meta } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DetachPolicyFromRole(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DetachPolicyFromRole(args) + }) + if err != nil { if RamEntityNotExist(err) { return nil } return resource.NonRetryableError(fmt.Errorf("Error deleting role policy attachment: %#v", err)) } - response, err := conn.ListPoliciesForRole(ram.RoleQueryRequest{RoleName: args.RoleName}) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForRole(ram.RoleQueryRequest{RoleName: args.RoleName}) + }) if err != nil { if RamEntityNotExist(err) { return nil } return resource.NonRetryableError(err) } + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) < 1 { return nil diff --git a/alicloud/resource_alicloud_ram_role_policy_attachment_test.go b/alicloud/resource_alicloud_ram_role_policy_attachment_test.go index 04c914cd600..8d0068bdde9 100644 --- a/alicloud/resource_alicloud_ram_role_policy_attachment_test.go +++ b/alicloud/resource_alicloud_ram_role_policy_attachment_test.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudRamRolePolicyAttachment_basic(t *testing.T) { @@ -51,15 +52,17 @@ func testAccCheckRamRolePolicyAttachmentExists(n string, policy *ram.Policy, rol return fmt.Errorf("No Attachment ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.RoleQueryRequest{ RoleName: role.RoleName, } - response, err := conn.ListPoliciesForRole(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForRole(request) + }) if err == nil { + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) > 0 { for _, v := range response.Policies.Policy { if v.PolicyName == policy.PolicyName && v.PolicyType == policy.PolicyType { @@ -81,19 +84,20 @@ func testAccCheckRamRolePolicyAttachmentDestroy(s *terraform.State) error { } // Try to find the attachment - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.RoleQueryRequest{ RoleName: rs.Primary.Attributes["role_name"], } - response, err := conn.ListPoliciesForRole(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForRole(request) + }) if err != nil && !RamEntityNotExist(err) { return err } - + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) > 0 { for _, v := range response.Policies.Policy { if v.PolicyName == rs.Primary.Attributes["policy_name"] && v.PolicyType == rs.Primary.Attributes["policy_type"] { diff --git a/alicloud/resource_alicloud_ram_role_test.go b/alicloud/resource_alicloud_ram_role_test.go index 199211a56e4..697ebfe9b2b 100644 --- a/alicloud/resource_alicloud_ram_role_test.go +++ b/alicloud/resource_alicloud_ram_role_test.go @@ -11,6 +11,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -26,11 +27,11 @@ func init() { } func testSweepRamRoles(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -40,10 +41,13 @@ func testSweepRamRoles(region string) error { "tftest", } - resp, err := conn.ramconn.ListRoles() + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListRoles() + }) if err != nil { return fmt.Errorf("Error retrieving Ram roles: %s", err) } + resp, _ := raw.(ram.ListRoleResponse) if len(resp.Roles.Role) < 1 { return nil } @@ -67,18 +71,24 @@ func testSweepRamRoles(region string) error { sweeped = true log.Printf("[INFO] Detaching Ram Role: %s (%s) policies.", name, id) - if resp, err := conn.ramconn.ListPoliciesForRole(ram.RoleQueryRequest{ - RoleName: name, - }); err != nil { + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForRole(ram.RoleQueryRequest{ + RoleName: name, + }) + }) + resp, _ := raw.(ram.PolicyListResponse) + if err != nil { log.Printf("[ERROR] Failed to list Ram Role (%s (%s)) policies: %s", name, id, err) } else if len(resp.Policies.Policy) > 0 { for _, v := range resp.Policies.Policy { - _, err = conn.ramconn.DetachPolicyFromRole(ram.AttachPolicyToRoleRequest{ - PolicyRequest: ram.PolicyRequest{ - PolicyName: v.PolicyName, - PolicyType: ram.Type(v.PolicyType), - }, - RoleName: name, + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DetachPolicyFromRole(ram.AttachPolicyToRoleRequest{ + PolicyRequest: ram.PolicyRequest{ + PolicyName: v.PolicyName, + PolicyType: ram.Type(v.PolicyType), + }, + RoleName: name, + }) }) if err != nil && !RamEntityNotExist(err) { log.Printf("[ERROR] Failed detach Policy %s: %#v", v.PolicyName, err) @@ -90,7 +100,10 @@ func testSweepRamRoles(region string) error { req := ram.RoleQueryRequest{ RoleName: name, } - if _, err := conn.ramconn.DeleteRole(req); err != nil { + _, err = client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeleteRole(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Ram Role (%s (%s)): %s", name, id, err) } } @@ -145,17 +158,19 @@ func testAccCheckRamRoleExists(n string, role *ram.Role) resource.TestCheckFunc return fmt.Errorf("No Role ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.RoleQueryRequest{ RoleName: rs.Primary.Attributes["name"], } - response, err := conn.GetRole(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetRole(request) + }) log.Printf("[WARN] Role id %#v", rs.Primary.ID) if err == nil { + response, _ := raw.(ram.RoleResponse) *role = response.Role return nil } @@ -171,14 +186,15 @@ func testAccCheckRamRoleDestroy(s *terraform.State) error { } // Try to find the role - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.RoleQueryRequest{ RoleName: rs.Primary.Attributes["name"], } - _, err := conn.GetRole(request) + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetRole(request) + }) if err != nil && !RamEntityNotExist(err) { return err diff --git a/alicloud/resource_alicloud_ram_user.go b/alicloud/resource_alicloud_ram_user.go index e18755662c3..1190e0f585e 100644 --- a/alicloud/resource_alicloud_ram_user.go +++ b/alicloud/resource_alicloud_ram_user.go @@ -7,6 +7,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamUser() *schema.Resource { @@ -53,7 +54,7 @@ func resourceAlicloudRamUser() *schema.Resource { } func resourceAlicloudRamUserCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.UserRequest{ User: ram.User{ @@ -61,17 +62,19 @@ func resourceAlicloudRamUserCreate(d *schema.ResourceData, meta interface{}) err }, } - response, err := conn.CreateUser(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.CreateUser(args) + }) if err != nil { return fmt.Errorf("CreateUser got an error: %#v", err) } - + response, _ := raw.(ram.UserResponse) d.SetId(response.User.UserName) return resourceAlicloudRamUserUpdate(d, meta) } func resourceAlicloudRamUserUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -114,7 +117,10 @@ func resourceAlicloudRamUserUpdate(d *schema.ResourceData, meta interface{}) err } if attributeUpdate { - if _, err := conn.UpdateUser(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.UpdateUser(args) + }) + if err != nil { return fmt.Errorf("Update user got an error: %v", err) } } @@ -124,13 +130,15 @@ func resourceAlicloudRamUserUpdate(d *schema.ResourceData, meta interface{}) err } func resourceAlicloudRamUserRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.UserQueryRequest{ UserName: d.Id(), } - response, err := conn.GetUser(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetUser(args) + }) if err != nil { if RamEntityNotExist(err) { d.SetId("") @@ -138,7 +146,7 @@ func resourceAlicloudRamUserRead(d *schema.ResourceData, meta interface{}) error } return fmt.Errorf("GetUser got an error: %#v", err) } - + response, _ := raw.(ram.UserResponse) user := response.User d.Set("name", user.UserName) d.Set("display_name", user.DisplayName) @@ -149,7 +157,7 @@ func resourceAlicloudRamUserRead(d *schema.ResourceData, meta interface{}) error } func resourceAlicloudRamUserDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) userName := d.Id() args := ram.UserQueryRequest{ @@ -158,15 +166,20 @@ func resourceAlicloudRamUserDelete(d *schema.ResourceData, meta interface{}) err if d.Get("force").(bool) { // list and delete access keys for this user - akResp, err := conn.ListAccessKeys(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListAccessKeys(args) + }) if err != nil { return fmt.Errorf("Error listing access keys for User (%s) when trying to delete: %#v", d.Id(), err) } + akResp, _ := raw.(ram.AccessKeyListResponse) if len(akResp.AccessKeys.AccessKey) > 0 { for _, v := range akResp.AccessKeys.AccessKey { - _, err = conn.DeleteAccessKey(ram.UpdateAccessKeyRequest{ - UserAccessKeyId: v.AccessKeyId, - UserName: userName, + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeleteAccessKey(ram.UpdateAccessKeyRequest{ + UserAccessKeyId: v.AccessKeyId, + UserName: userName, + }) }) if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error deleting access key %s: %#v", v.AccessKeyId, err) @@ -175,18 +188,23 @@ func resourceAlicloudRamUserDelete(d *schema.ResourceData, meta interface{}) err } // list and delete policies for this user - policyResp, err := conn.ListPoliciesForUser(args) + raw, err = client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForUser(args) + }) if err != nil { return fmt.Errorf("Error listing policies for User (%s) when trying to delete: %#v", d.Id(), err) } + policyResp, _ := raw.(ram.PolicyListResponse) if len(policyResp.Policies.Policy) > 0 { for _, v := range policyResp.Policies.Policy { - _, err = conn.DetachPolicyFromUser(ram.AttachPolicyRequest{ - PolicyRequest: ram.PolicyRequest{ - PolicyName: v.PolicyName, - PolicyType: ram.Type(v.PolicyType), - }, - UserName: userName, + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DetachPolicyFromUser(ram.AttachPolicyRequest{ + PolicyRequest: ram.PolicyRequest{ + PolicyName: v.PolicyName, + PolicyType: ram.Type(v.PolicyType), + }, + UserName: userName, + }) }) if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error deleting policy %s: %#v", v.PolicyName, err) @@ -195,15 +213,20 @@ func resourceAlicloudRamUserDelete(d *schema.ResourceData, meta interface{}) err } // list and delete groups for this user - groupResp, err := conn.ListGroupsForUser(args) + raw, err = client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListGroupsForUser(args) + }) if err != nil { return fmt.Errorf("Error listing groups for User (%s) when trying to delete: %#v", d.Id(), err) } + groupResp, _ := raw.(ram.GroupListResponse) if len(groupResp.Groups.Group) > 0 { for _, v := range groupResp.Groups.Group { - _, err = conn.RemoveUserFromGroup(ram.UserRelateGroupRequest{ - UserName: userName, - GroupName: v.GroupName, + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.RemoveUserFromGroup(ram.UserRelateGroupRequest{ + UserName: userName, + GroupName: v.GroupName, + }) }) if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error deleting group %s: %#v", v.GroupName, err) @@ -212,19 +235,28 @@ func resourceAlicloudRamUserDelete(d *schema.ResourceData, meta interface{}) err } // delete login profile for this user - if _, err = conn.DeleteLoginProfile(args); err != nil && !RamEntityNotExist(err) { + _, err = client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeleteLoginProfile(args) + }) + if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error deleting login profile for User (%s): %#v", d.Id(), err) } // unbind MFA device for this user - if _, err = conn.UnbindMFADevice(args); err != nil && !RamEntityNotExist(err) { + _, err = client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.UnbindMFADevice(args) + }) + if err != nil && !RamEntityNotExist(err) { return fmt.Errorf("Error deleting login profile for User (%s): %#v", d.Id(), err) } } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DeleteUser(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeleteUser(args) + }) + if err != nil { if IsExceptedError(err, DeleteConflictUserAccessKey) || IsExceptedError(err, DeleteConflictUserGroup) || IsExceptedError(err, DeleteConflictUserPolicy) || IsExceptedError(err, DeleteConflictUserLoginProfile) || IsExceptedError(err, DeleteConflictUserMFADevice) { diff --git a/alicloud/resource_alicloud_ram_user_policy_attachment.go b/alicloud/resource_alicloud_ram_user_policy_attachment.go index cee6f55b8e9..98322d15a65 100644 --- a/alicloud/resource_alicloud_ram_user_policy_attachment.go +++ b/alicloud/resource_alicloud_ram_user_policy_attachment.go @@ -9,6 +9,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRamUserPolicyAtatchment() *schema.Resource { @@ -41,7 +42,7 @@ func resourceAlicloudRamUserPolicyAtatchment() *schema.Resource { } func resourceAlicloudRamUserPolicyAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) args := ram.AttachPolicyRequest{ PolicyRequest: ram.PolicyRequest{ @@ -51,7 +52,10 @@ func resourceAlicloudRamUserPolicyAttachmentCreate(d *schema.ResourceData, meta UserName: d.Get("user_name").(string), } - if _, err := conn.AttachPolicyToUser(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.AttachPolicyToUser(args) + }) + if err != nil { return fmt.Errorf("AttachPolicyToUser got an error: %#v", err) } @@ -60,7 +64,7 @@ func resourceAlicloudRamUserPolicyAttachmentCreate(d *schema.ResourceData, meta } func resourceAlicloudRamUserPolicyAttachmentRead(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) // In order to be compatible with previous Id (before 1.9.6) which format to user id := fmt.Sprintf("%s%s%s%s%s", d.Get("user_name").(string), COLON_SEPARATED, d.Get("policy_name").(string), COLON_SEPARATED, d.Get("policy_type").(string)) @@ -74,11 +78,13 @@ func resourceAlicloudRamUserPolicyAttachmentRead(d *schema.ResourceData, meta in UserName: split[0], } - response, err := conn.ListPoliciesForUser(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForUser(args) + }) if err != nil { return fmt.Errorf("Get list policies for user got an error: %#v", err) } - + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) > 0 { for _, v := range response.Policies.Policy { if v.PolicyName == d.Get("policy_name").(string) && v.PolicyType == d.Get("policy_type").(string) { @@ -95,7 +101,7 @@ func resourceAlicloudRamUserPolicyAttachmentRead(d *schema.ResourceData, meta in } func resourceAlicloudRamUserPolicyAttachmentDelete(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ramconn + client := meta.(*connectivity.AliyunClient) // In order to be compatible with previous Id (before 1.9.6) which format to user id := fmt.Sprintf("%s%s%s%s%s", d.Get("user_name").(string), COLON_SEPARATED, d.Get("policy_name").(string), COLON_SEPARATED, d.Get("policy_type").(string)) @@ -115,14 +121,19 @@ func resourceAlicloudRamUserPolicyAttachmentDelete(d *schema.ResourceData, meta } return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.DetachPolicyFromUser(args); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DetachPolicyFromUser(args) + }) + if err != nil { if RamEntityNotExist(err) { return nil } return resource.NonRetryableError(fmt.Errorf("Error deleting user policy attachment: %#v", err)) } - response, err := conn.ListPoliciesForUser(ram.UserQueryRequest{UserName: args.UserName}) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForUser(ram.UserQueryRequest{UserName: args.UserName}) + }) if err != nil { if RamEntityNotExist(err) { return nil @@ -130,7 +141,7 @@ func resourceAlicloudRamUserPolicyAttachmentDelete(d *schema.ResourceData, meta return resource.NonRetryableError(err) } - + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) < 1 { return nil } diff --git a/alicloud/resource_alicloud_ram_user_policy_attachment_test.go b/alicloud/resource_alicloud_ram_user_policy_attachment_test.go index a043b847413..0994dd69d21 100644 --- a/alicloud/resource_alicloud_ram_user_policy_attachment_test.go +++ b/alicloud/resource_alicloud_ram_user_policy_attachment_test.go @@ -9,6 +9,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudRamUserPolicyAttachment_basic(t *testing.T) { @@ -53,15 +54,17 @@ func testAccCheckRamUserPolicyAttachmentExists(n string, policy *ram.Policy, use return fmt.Errorf("No Attachment ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) split := strings.Split(rs.Primary.ID, COLON_SEPARATED) request := ram.UserQueryRequest{ UserName: split[0], } - response, err := conn.ListPoliciesForUser(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForUser(request) + }) if err == nil { + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) > 0 { for _, v := range response.Policies.Policy { if v.PolicyName == policy.PolicyName && v.PolicyType == policy.PolicyType { @@ -83,19 +86,20 @@ func testAccCheckRamUserPolicyAttachmentDestroy(s *terraform.State) error { } // Try to find the attachment - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.UserQueryRequest{ UserName: rs.Primary.Attributes["user_name"], } - response, err := conn.ListPoliciesForUser(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListPoliciesForUser(request) + }) if err != nil && !RamEntityNotExist(err) { return err } - + response, _ := raw.(ram.PolicyListResponse) if len(response.Policies.Policy) > 0 { for _, v := range response.Policies.Policy { if v.PolicyName == rs.Primary.Attributes["policy_name"] && v.PolicyType == rs.Primary.Attributes["policy_type"] { diff --git a/alicloud/resource_alicloud_ram_user_test.go b/alicloud/resource_alicloud_ram_user_test.go index 7cbbebff7c3..d810757341c 100644 --- a/alicloud/resource_alicloud_ram_user_test.go +++ b/alicloud/resource_alicloud_ram_user_test.go @@ -11,6 +11,7 @@ import ( "github.com/denverdino/aliyungo/ram" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -25,11 +26,11 @@ func init() { } func testSweepRamUsers(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -42,10 +43,13 @@ func testSweepRamUsers(region string) error { var users []ram.User args := ram.ListUserRequest{} for { - resp, err := conn.ramconn.ListUsers(args) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.ListUsers(args) + }) if err != nil { return fmt.Errorf("Error retrieving Ram users: %s", err) } + resp, _ := raw.(ram.ListUserResponse) if len(resp.Users.User) < 1 { break } @@ -77,7 +81,10 @@ func testSweepRamUsers(region string) error { req := ram.UserQueryRequest{ UserName: name, } - if _, err := conn.ramconn.DeleteUser(req); err != nil { + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.DeleteUser(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Ram User (%s (%s)): %s", name, id, err) } } @@ -136,17 +143,19 @@ func testAccCheckRamUserExists(n string, user *ram.User) resource.TestCheckFunc return fmt.Errorf("No User ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.UserQueryRequest{ UserName: rs.Primary.Attributes["user_name"], } - response, err := conn.GetUser(request) + raw, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetUser(request) + }) log.Printf("[WARN] User id %#v", rs.Primary.ID) if err == nil { + response, _ := raw.(ram.UserResponse) *user = response.User return nil } @@ -162,14 +171,15 @@ func testAccCheckRamUserDestroy(s *terraform.State) error { } // Try to find the user - client := testAccProvider.Meta().(*AliyunClient) - conn := client.ramconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) request := ram.UserQueryRequest{ UserName: rs.Primary.Attributes["user_name"], } - _, err := conn.GetUser(request) + _, err := client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetUser(request) + }) if err != nil && !RamEntityNotExist(err) { return err diff --git a/alicloud/resource_alicloud_route_table_attachment.go b/alicloud/resource_alicloud_route_table_attachment.go index 1adeb05838e..1a094c4d27b 100644 --- a/alicloud/resource_alicloud_route_table_attachment.go +++ b/alicloud/resource_alicloud_route_table_attachment.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunRouteTableAttachment() *schema.Resource { @@ -34,14 +35,18 @@ func resourceAliyunRouteTableAttachment() *schema.Resource { } func resourceAliyunRouteTableAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + routeTableService := RouteTableService{client} args := vpc.CreateAssociateRouteTableRequest() args.RouteTableId = Trim(d.Get("route_table_id").(string)) args.VSwitchId = Trim(d.Get("vswitch_id").(string)) if err := resource.Retry(3*time.Minute, func() *resource.RetryError { ar := args - if _, err := client.vpcconn.AssociateRouteTable(ar); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.AssociateRouteTable(ar) + }) + if err != nil { if IsExceptedError(err, TaskConflict) { return resource.RetryableError(fmt.Errorf("AssociateRouteTable got an error: %#v", err)) } @@ -52,7 +57,7 @@ func resourceAliyunRouteTableAttachmentCreate(d *schema.ResourceData, meta inter return err } - err := client.WaitForRouteTableAttachment(args.RouteTableId, args.VSwitchId, DefaultTimeout) + err := routeTableService.WaitForRouteTableAttachment(args.RouteTableId, args.VSwitchId, DefaultTimeout) //check the route table attachment if err != nil { return fmt.Errorf("Wait for route table attachment got error: %#v", err) @@ -64,17 +69,18 @@ func resourceAliyunRouteTableAttachmentCreate(d *schema.ResourceData, meta inter } func resourceAliyunRouteTableAttachmentRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + routeTableService := RouteTableService{client} - routeTableId, vSwitchId, err := getRouteTableIdAndVSwitchId(d, meta) - routeTable, err := client.DescribeRouteTable(routeTableId) + routeTableId, vSwitchId, err := routeTableService.GetRouteTableIdAndVSwitchId(d, meta) + routeTable, err := routeTableService.DescribeRouteTable(routeTableId) if len(routeTable.VSwitchIds.VSwitchId) <= 0 { d.SetId("") return nil } //Finding the vSwitchId - err = client.DescribeRouteTableAttachment(routeTableId, vSwitchId) + err = routeTableService.DescribeRouteTableAttachment(routeTableId, vSwitchId) if err != nil { if NotFoundError(err) { @@ -90,10 +96,10 @@ func resourceAliyunRouteTableAttachmentRead(d *schema.ResourceData, meta interfa } func resourceAliyunRouteTableAttachmentDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + routeTableService := RouteTableService{client} - client := meta.(*AliyunClient) - - routeTableId, vSwitchId, err := getRouteTableIdAndVSwitchId(d, meta) + routeTableId, vSwitchId, err := routeTableService.GetRouteTableIdAndVSwitchId(d, meta) if err != nil { return err } @@ -103,7 +109,9 @@ func resourceAliyunRouteTableAttachmentDelete(d *schema.ResourceData, meta inter request.VSwitchId = vSwitchId return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.vpcconn.UnassociateRouteTable(request) + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.UnassociateRouteTable(request) + }) //Waiting for unassociate the route table if err != nil { if IsExceptedError(err, TaskConflict) { @@ -111,7 +119,7 @@ func resourceAliyunRouteTableAttachmentDelete(d *schema.ResourceData, meta inter } } //Eusure the vswitch has been unassociated truly. - err = client.DescribeRouteTableAttachment(routeTableId, vSwitchId) + err = routeTableService.DescribeRouteTableAttachment(routeTableId, vSwitchId) if err != nil { if NotFoundError(err) { return nil diff --git a/alicloud/resource_alicloud_route_table_attachment_test.go b/alicloud/resource_alicloud_route_table_attachment_test.go index 9411f7d8aca..97e845b538e 100644 --- a/alicloud/resource_alicloud_route_table_attachment_test.go +++ b/alicloud/resource_alicloud_route_table_attachment_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepRouteTableAttachment(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -34,14 +35,17 @@ func testSweepRouteTableAttachment(region string) error { var routeTables []vpc.RouterTableListType req := vpc.CreateDescribeRouteTableListRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.vpcconn.DescribeRouteTableList(req) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeRouteTableList(req) + }) if err != nil { return fmt.Errorf("Error retrieving RouteTables: %s", err) } + resp, _ := raw.(*vpc.DescribeRouteTableListResponse) if resp == nil || len(resp.RouterTableList.RouterTableListType) < 1 { break } @@ -77,7 +81,10 @@ func testSweepRouteTableAttachment(region string) error { req := vpc.CreateUnassociateRouteTableRequest() req.RouteTableId = id req.VSwitchId = vswitch - if _, err := conn.vpcconn.UnassociateRouteTable(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.UnassociateRouteTable(req) + }) + if err != nil { log.Printf("[ERROR] Failed to unassociate Route Table (%s (%s)): %s", name, id, err) } } @@ -118,13 +125,14 @@ func testAccCheckRouteTableAttachmentExists(n string) resource.TestCheckFunc { if rs.Primary.ID == "" { return fmt.Errorf("No Route Table ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + routeTableService := RouteTableService{client} parts := strings.Split(rs.Primary.ID, COLON_SEPARATED) if len(parts) != 2 { return fmt.Errorf("invalid resource id") } - err := client.DescribeRouteTableAttachment(parts[0], parts[1]) + err := routeTableService.DescribeRouteTableAttachment(parts[0], parts[1]) if err != nil { return fmt.Errorf("Describe Route Table attachment error %#v", err) } @@ -133,7 +141,8 @@ func testAccCheckRouteTableAttachmentExists(n string) resource.TestCheckFunc { } func testAccCheckRouteTableAttachmentDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + routeTableService := RouteTableService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_route_table_attachment" { continue @@ -143,7 +152,7 @@ func testAccCheckRouteTableAttachmentDestroy(s *terraform.State) error { if len(parts) != 2 { return fmt.Errorf("invalid resource id") } - err := client.DescribeRouteTableAttachment(parts[0], parts[1]) + err := routeTableService.DescribeRouteTableAttachment(parts[0], parts[1]) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_router_interface.go b/alicloud/resource_alicloud_router_interface.go index 4b950df530d..f5ecbf14ca8 100644 --- a/alicloud/resource_alicloud_router_interface.go +++ b/alicloud/resource_alicloud_router_interface.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRouterInterface() *schema.Resource { @@ -122,20 +123,23 @@ func resourceAlicloudRouterInterface() *schema.Resource { } func resourceAlicloudRouterInterfaceCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} args, err := buildAlicloudRouterInterfaceCreateArgs(d, meta) if err != nil { return err } - response, err := client.vpcconn.CreateRouterInterface(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateRouterInterface(args) + }) if err != nil { return fmt.Errorf("CreateRouterInterface got an error: %#v", err) } - + response, _ := raw.(*vpc.CreateRouterInterfaceResponse) d.SetId(response.RouterInterfaceId) - if err := client.WaitForRouterInterface(getRegionId(d, meta), d.Id(), Idle, 300); err != nil { + if err := vpcService.WaitForRouterInterface(client.RegionId, d.Id(), Idle, 300); err != nil { return fmt.Errorf("WaitForRouterInterface %s got error: %#v", Idle, err) } @@ -143,7 +147,7 @@ func resourceAlicloudRouterInterfaceCreate(d *schema.ResourceData, meta interfac } func resourceAlicloudRouterInterfaceUpdate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -153,7 +157,10 @@ func resourceAlicloudRouterInterfaceUpdate(d *schema.ResourceData, meta interfac } if attributeUpdate { - if _, err := conn.ModifyRouterInterfaceAttribute(args); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyRouterInterfaceAttribute(args) + }) + if err != nil { return fmt.Errorf("ModifyRouterInterfaceAttribute got an error: %#v", err) } } @@ -161,10 +168,13 @@ func resourceAlicloudRouterInterfaceUpdate(d *schema.ResourceData, meta interfac if d.HasChange("specification") && !d.IsNewResource() { d.SetPartial("specification") request := vpc.CreateModifyRouterInterfaceSpecRequest() - request.RegionId = string(getRegion(d, meta)) + request.RegionId = string(client.Region) request.RouterInterfaceId = d.Id() request.Spec = d.Get("specification").(string) - if _, err := conn.ModifyRouterInterfaceSpec(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyRouterInterfaceSpec(request) + }) + if err != nil { return fmt.Errorf("ModifyRouterInterfaceSpec got an error: %#v", err) } } @@ -174,8 +184,10 @@ func resourceAlicloudRouterInterfaceUpdate(d *schema.ResourceData, meta interfac } func resourceAlicloudRouterInterfaceRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - ri, err := meta.(*AliyunClient).DescribeRouterInterface(getRegionId(d, meta), d.Id()) + ri, err := vpcService.DescribeRouterInterface(client.RegionId, d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -207,25 +219,29 @@ func resourceAlicloudRouterInterfaceRead(d *schema.ResourceData, meta interface{ } func resourceAlicloudRouterInterfaceDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - if ri, err := client.DescribeRouterInterface(getRegionId(d, meta), d.Id()); err != nil { + if ri, err := vpcService.DescribeRouterInterface(client.RegionId, d.Id()); err != nil { if NotFoundError(err) { return nil } return fmt.Errorf("When deleting router interface %s, describing it got an error: %#v.", d.Id(), err) } else if ri.Status == string(Active) { - if err := client.DeactivateRouterInterface(d.Id()); err != nil { + if err := vpcService.DeactivateRouterInterface(d.Id()); err != nil { return fmt.Errorf("When deleting router interface %s, deactiving it got an error: %#v.", d.Id(), err) } } args := vpc.CreateDeleteRouterInterfaceRequest() - args.RegionId = string(getRegion(d, meta)) + args.RegionId = string(client.Region) args.RouterInterfaceId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := client.vpcconn.DeleteRouterInterface(args); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteRouterInterface(args) + }) + if err != nil { if IsExceptedErrors(err, []string{InvalidInstanceIdNotFound}) { return nil } @@ -235,7 +251,7 @@ func resourceAlicloudRouterInterfaceDelete(d *schema.ResourceData, meta interfac } return resource.NonRetryableError(fmt.Errorf("Error deleting interface %s: %#v", d.Id(), err)) } - if _, err := client.DescribeRouterInterface(getRegionId(d, meta), d.Id()); err != nil { + if _, err := vpcService.DescribeRouterInterface(client.RegionId, d.Id()); err != nil { if NotFoundError(err) { return nil } @@ -246,10 +262,11 @@ func resourceAlicloudRouterInterfaceDelete(d *schema.ResourceData, meta interfac } func buildAlicloudRouterInterfaceCreateArgs(d *schema.ResourceData, meta interface{}) (*vpc.CreateRouterInterfaceRequest, error) { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} oppositeRegion := d.Get("opposite_region").(string) - if err := client.JudgeRegionValidation("opposite_region", oppositeRegion); err != nil { + if err := ecsService.JudgeRegionValidation("opposite_region", oppositeRegion); err != nil { return nil, err } @@ -289,9 +306,14 @@ func buildAlicloudRouterInterfaceCreateArgs(d *schema.ResourceData, meta interfa Value: &values, }} req.Filter = &filters - if resp, err := client.vpcconn.DescribeVirtualBorderRouters(req); err != nil { + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVirtualBorderRouters(req) + }) + if err != nil { return request, fmt.Errorf("Describing VBR %s got an error: %#v.", request.RouterId, err) - } else if resp != nil && resp.TotalCount > 0 { + } + resp, _ := raw.(*vpc.DescribeVirtualBorderRoutersResponse) + if resp != nil && resp.TotalCount > 0 { request.AccessPointId = resp.VirtualBorderRouterSet.VirtualBorderRouterType[0].AccessPointId } } diff --git a/alicloud/resource_alicloud_router_interface_connection.go b/alicloud/resource_alicloud_router_interface_connection.go index c45f36529c7..87c48c04c5c 100644 --- a/alicloud/resource_alicloud_router_interface_connection.go +++ b/alicloud/resource_alicloud_router_interface_connection.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudRouterInterfaceConnection() *schema.Resource { @@ -62,11 +63,12 @@ func resourceAlicloudRouterInterfaceConnection() *schema.Resource { } func resourceAlicloudRouterInterfaceConnectionCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} oppsiteId := d.Get("opposite_interface_id").(string) interfaceId := d.Get("interface_id").(string) - ri, err := client.DescribeRouterInterface(getRegionId(d, meta), interfaceId) + ri, err := vpcService.DescribeRouterInterface(client.RegionId, interfaceId) if err != nil { return err } @@ -78,10 +80,10 @@ func resourceAlicloudRouterInterfaceConnectionCreate(d *schema.ResourceData, met return fmt.Errorf("The specified router interface connection has existed, and please import it using id %s.", interfaceId) } if ri.Status == string(Inactive) { - if err := client.ActivateRouterInterface(interfaceId); err != nil { + if err := vpcService.ActivateRouterInterface(interfaceId); err != nil { return err } - if err := client.WaitForRouterInterface(getRegionId(d, meta), interfaceId, Active, DefaultTimeout); err != nil { + if err := vpcService.WaitForRouterInterface(client.RegionId, interfaceId, Active, DefaultTimeout); err != nil { return fmt.Errorf("When activing router interface %s got an error: %#v.", interfaceId, err) } d.SetId(interfaceId) @@ -117,7 +119,7 @@ func resourceAlicloudRouterInterfaceConnectionCreate(d *schema.ResourceData, met if owner == "" { return fmt.Errorf("Opposite router interface owner id is empty. Please use field 'opposite_interface_owner_id' or globle field 'account_id' to set.") } - oppositeRi, err := client.DescribeRouterInterface(ri.OppositeRegionId, oppsiteId) + oppositeRi, err := vpcService.DescribeRouterInterface(ri.OppositeRegionId, oppsiteId) if err != nil { return err } @@ -128,11 +130,14 @@ func resourceAlicloudRouterInterfaceConnectionCreate(d *schema.ResourceData, met if err := resource.Retry(2*time.Minute, func() *resource.RetryError { - if _, err := client.vpcconn.ModifyRouterInterfaceAttribute(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyRouterInterfaceAttribute(req) + }) + if err != nil { return resource.NonRetryableError(fmt.Errorf("Modifying RouterInterface %s Connection got an error: %#v.", interfaceId, err)) } - ri, err := client.DescribeRouterInterface(getRegionId(d, meta), interfaceId) + ri, err := vpcService.DescribeRouterInterface(client.RegionId, interfaceId) if err != nil { return resource.NonRetryableError(fmt.Errorf("When modifying RouterInterface %s Connection, describing it got an error: %#v.", interfaceId, err)) @@ -153,7 +158,10 @@ func resourceAlicloudRouterInterfaceConnectionCreate(d *schema.ResourceData, met if err := resource.Retry(2*time.Minute, func() *resource.RetryError { - if _, err := client.vpcconn.ConnectRouterInterface(connReq); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ConnectRouterInterface(connReq) + }) + if err != nil { if IsExceptedErrors(err, []string{IncorrectOppositeInterfaceInfoNotSet}) { return resource.RetryableError(fmt.Errorf("Connecting router interface %s timeout.", interfaceId)) } @@ -165,7 +173,7 @@ func resourceAlicloudRouterInterfaceConnectionCreate(d *schema.ResourceData, met return err } - if err := client.WaitForRouterInterface(getRegionId(d, meta), interfaceId, Active, DefaultTimeout); err != nil { + if err := vpcService.WaitForRouterInterface(client.RegionId, interfaceId, Active, DefaultTimeout); err != nil { return fmt.Errorf("Connecting router interface %s got an error: %#v.", interfaceId, err) } } @@ -175,8 +183,9 @@ func resourceAlicloudRouterInterfaceConnectionCreate(d *schema.ResourceData, met } func resourceAlicloudRouterInterfaceConnectionRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - ri, err := client.DescribeRouterInterface(getRegionId(d, meta), d.Id()) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} + ri, err := vpcService.DescribeRouterInterface(client.RegionId, d.Id()) if err != nil { if NotFoundError(err) { @@ -185,10 +194,10 @@ func resourceAlicloudRouterInterfaceConnectionRead(d *schema.ResourceData, meta } } if ri.Status == string(Inactive) { - if err := client.ActivateRouterInterface(d.Id()); err != nil { + if err := vpcService.ActivateRouterInterface(d.Id()); err != nil { return err } - if err := client.WaitForRouterInterface(getRegionId(d, meta), d.Id(), Active, DefaultTimeout); err != nil { + if err := vpcService.WaitForRouterInterface(client.RegionId, d.Id(), Active, DefaultTimeout); err != nil { return fmt.Errorf("When activing router interface %s got an error: %#v.", d.Id(), err) } } @@ -204,9 +213,10 @@ func resourceAlicloudRouterInterfaceConnectionRead(d *schema.ResourceData, meta } func resourceAlicloudRouterInterfaceConnectionDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - ri, err := client.DescribeRouterInterface(getRegionId(d, meta), d.Id()) + ri, err := vpcService.DescribeRouterInterface(client.RegionId, d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -222,12 +232,12 @@ func resourceAlicloudRouterInterfaceConnectionDelete(d *schema.ResourceData, met // At present, the interface with "active/inactive" status can not be modify opposite connection information // and it is RouterInterface product limitation. So, the connection delete action is only modifying it to inactive. if ri.Status == string(Active) { - if err := client.DeactivateRouterInterface(d.Id()); err != nil { + if err := vpcService.DeactivateRouterInterface(d.Id()); err != nil { return err } } - if err := client.WaitForRouterInterface(getRegionId(d, meta), d.Id(), Inactive, DefaultTimeoutMedium); err != nil { + if err := vpcService.WaitForRouterInterface(client.RegionId, d.Id(), Inactive, DefaultTimeoutMedium); err != nil { return fmt.Errorf("Deleting routerinterface %s connection got an error: %#v.", d.Id(), err) } diff --git a/alicloud/resource_alicloud_router_interface_connection_test.go b/alicloud/resource_alicloud_router_interface_connection_test.go index bc6a1542c57..6ed9ad1c80d 100644 --- a/alicloud/resource_alicloud_router_interface_connection_test.go +++ b/alicloud/resource_alicloud_router_interface_connection_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudRouterInterfaceConnection_basic(t *testing.T) { @@ -52,9 +53,10 @@ func testAccCheckRouterInterfaceConnectionExists(n string) resource.TestCheckFun return fmt.Errorf("No interface ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} - response, err := client.DescribeRouterInterface(client.RegionId, rs.Primary.ID) + response, err := vpcService.DescribeRouterInterface(client.RegionId, rs.Primary.ID) if err != nil { return fmt.Errorf("Error finding interface %s: %#v", rs.Primary.ID, err) } @@ -74,9 +76,10 @@ func testAccCheckRouterInterfaceConnectionDestroy(s *terraform.State) error { } // Try to find the interface - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} - ri, err := client.DescribeRouterInterface(client.RegionId, rs.Primary.ID) + ri, err := vpcService.DescribeRouterInterface(client.RegionId, rs.Primary.ID) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_router_interface_test.go b/alicloud/resource_alicloud_router_interface_test.go index 50f960be8c2..7f203ff8ec5 100644 --- a/alicloud/resource_alicloud_router_interface_test.go +++ b/alicloud/resource_alicloud_router_interface_test.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -20,11 +21,11 @@ func init() { } func testSweepRouterInterfaces(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -36,14 +37,17 @@ func testSweepRouterInterfaces(region string) error { var ris []vpc.RouterInterfaceTypeInDescribeRouterInterfaces req := vpc.CreateDescribeRouterInterfacesRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.vpcconn.DescribeRouterInterfaces(req) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeRouterInterfaces(req) + }) if err != nil { return fmt.Errorf("Error retrieving Router Interfaces: %s", err) } + resp, _ := raw.(*vpc.DescribeRouterInterfacesResponse) if resp == nil || len(resp.RouterInterfaceSet.RouterInterfaceType) < 1 { break } @@ -77,7 +81,10 @@ func testSweepRouterInterfaces(region string) error { log.Printf("[INFO] Deleting Router Interface: %s (%s)", name, id) req := vpc.CreateDeleteRouterInterfaceRequest() req.RouterInterfaceId = id - if _, err := conn.vpcconn.DeleteRouterInterface(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteRouterInterface(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Router Interface (%s (%s)): %s", name, id, err) } } @@ -131,9 +138,10 @@ func testAccCheckRouterInterfaceExists(n string, ri *vpc.RouterInterfaceTypeInDe return fmt.Errorf("No interface ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} - response, err := client.DescribeRouterInterface(client.RegionId, rs.Primary.ID) + response, err := vpcService.DescribeRouterInterface(client.RegionId, rs.Primary.ID) if err != nil { return fmt.Errorf("Error finding interface %s: %#v", rs.Primary.ID, err) } @@ -150,9 +158,10 @@ func testAccCheckRouterInterfaceDestroy(s *terraform.State) error { } // Try to find the interface - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} - ri, err := client.DescribeRouterInterface(client.RegionId, rs.Primary.ID) + ri, err := vpcService.DescribeRouterInterface(client.RegionId, rs.Primary.ID) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_security_group.go b/alicloud/resource_alicloud_security_group.go index c565549cf14..81c23e5a9eb 100644 --- a/alicloud/resource_alicloud_security_group.go +++ b/alicloud/resource_alicloud_security_group.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunSecurityGroup() *schema.Resource { @@ -48,13 +49,15 @@ func resourceAliyunSecurityGroup() *schema.Resource { } func resourceAliyunSecurityGroupCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).ecsconn + client := meta.(*connectivity.AliyunClient) - resp, err := conn.CreateSecurityGroup(buildAliyunSecurityGroupArgs(d, meta)) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.CreateSecurityGroup(buildAliyunSecurityGroupArgs(d, meta)) + }) if err != nil { return err } - + resp, _ := raw.(*ecs.CreateSecurityGroupResponse) if resp == nil { return fmt.Errorf("Creating security group got a nil response.") } @@ -63,11 +66,12 @@ func resourceAliyunSecurityGroupCreate(d *schema.ResourceData, meta interface{}) } func resourceAliyunSecurityGroupRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} var sg *ecs.DescribeSecurityGroupAttributeResponse err := resource.Retry(1*time.Minute, func() *resource.RetryError { - group, e := client.DescribeSecurityGroupAttribute(d.Id()) + group, e := ecsService.DescribeSecurityGroupAttribute(d.Id()) if e != nil { if NotFoundError(e) || IsExceptedErrors(e, []string{InvalidSecurityGroupIdNotFound}) { return nil @@ -80,17 +84,7 @@ func resourceAliyunSecurityGroupRead(d *schema.ResourceData, meta interface{}) e } return resource.RetryableError(fmt.Errorf("Create security group timeout and got an error: %#v", e)) }) - tags, err := client.DescribeTags(d.Id(), TagResourceSecurityGroup) - if err != nil && !NotFoundError(err) { - return fmt.Errorf("[ERROR] DescribeTags for security group got error: %#v", err) - } - if len(tags) > 0 { - d.Set("tags", tagsToMap(tags)) - } - if err != nil { - return err - } if sg == nil { d.SetId("") return nil @@ -101,12 +95,19 @@ func resourceAliyunSecurityGroupRead(d *schema.ResourceData, meta interface{}) e d.Set("vpc_id", sg.VpcId) d.Set("inner_access", sg.InnerAccessPolicy == string(GroupInnerAccept)) + tags, err := ecsService.DescribeTags(d.Id(), TagResourceSecurityGroup) + if err != nil && !NotFoundError(err) { + return fmt.Errorf("[ERROR] DescribeTags for security group got error: %#v", err) + } + if len(tags) > 0 { + d.Set("tags", tagsToMap(tags)) + } + return nil } func resourceAliyunSecurityGroupUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.ecsconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) attributeUpdate := false @@ -133,7 +134,10 @@ func resourceAliyunSecurityGroupUpdate(d *schema.ResourceData, meta interface{}) attributeUpdate = true } if attributeUpdate { - if _, err := conn.ModifySecurityGroupAttribute(args); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ModifySecurityGroupAttribute(args) + }) + if err != nil { return err } } @@ -147,7 +151,10 @@ func resourceAliyunSecurityGroupUpdate(d *schema.ResourceData, meta interface{}) args.SecurityGroupId = d.Id() args.InnerAccessPolicy = string(policy) - if _, err := conn.ModifySecurityGroupPolicy(args); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ModifySecurityGroupPolicy(args) + }) + if err != nil { return fmt.Errorf("ModifySecurityGroupPolicy got an error: %#v.", err) } } @@ -158,13 +165,15 @@ func resourceAliyunSecurityGroupUpdate(d *schema.ResourceData, meta interface{}) } func resourceAliyunSecurityGroupDelete(d *schema.ResourceData, meta interface{}) error { - - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} req := ecs.CreateDeleteSecurityGroupRequest() req.SecurityGroupId = d.Id() return resource.Retry(6*time.Minute, func() *resource.RetryError { - _, err := client.ecsconn.DeleteSecurityGroup(req) + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DeleteSecurityGroup(req) + }) if err != nil { if IsExceptedError(err, SgDependencyViolation) { @@ -172,10 +181,10 @@ func resourceAliyunSecurityGroupDelete(d *schema.ResourceData, meta interface{}) } } - sg, err := client.DescribeSecurityGroupAttribute(d.Id()) + sg, err := ecsService.DescribeSecurityGroupAttribute(d.Id()) if err != nil { - if IsExceptedError(err, InvalidSecurityGroupIdNotFound) { + if NotFoundError(err) || IsExceptedError(err, InvalidSecurityGroupIdNotFound) { return nil } return resource.NonRetryableError(err) diff --git a/alicloud/resource_alicloud_security_group_rule.go b/alicloud/resource_alicloud_security_group_rule.go index d5506ab7f32..813a5928f4f 100644 --- a/alicloud/resource_alicloud_security_group_rule.go +++ b/alicloud/resource_alicloud_security_group_rule.go @@ -7,8 +7,10 @@ import ( "time" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" + "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunSecurityGroupRule() *schema.Resource { @@ -94,8 +96,7 @@ func resourceAliyunSecurityGroupRule() *schema.Resource { } func resourceAliyunSecurityGroupRuleCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - conn := client.ecsconn + client := meta.(*connectivity.AliyunClient) direction := d.Get("type").(string) sgId := d.Get("security_group_id").(string) @@ -121,10 +122,14 @@ func resourceAliyunSecurityGroupRuleCreate(d *schema.ResourceData, meta interfac if direction == string(DirectionIngress) { request.ApiName = "AuthorizeSecurityGroup" - _, err = conn.ProcessCommonRequest(request) + _, err = client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ProcessCommonRequest(request) + }) } else { request.ApiName = "AuthorizeSecurityGroupEgress" - _, err = conn.ProcessCommonRequest(request) + _, err = client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ProcessCommonRequest(request) + }) } if err != nil { return fmt.Errorf("Error authorizing security group rule type %s: %s", direction, err) @@ -142,7 +147,8 @@ func resourceAliyunSecurityGroupRuleCreate(d *schema.ResourceData, meta interfac } func resourceAliyunSecurityGroupRuleRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} parts := strings.Split(d.Id(), ":") policy := parseSecurityRuleId(d, meta, 6) strPriority := parseSecurityRuleId(d, meta, 7) @@ -161,7 +167,7 @@ func resourceAliyunSecurityGroupRuleRead(d *schema.ResourceData, meta interface{ sgId := parts[0] direction := parts[1] - rule, err := client.DescribeSecurityGroupRule(sgId, direction, parts[2], parts[3], parts[4], parts[5], policy, priority) + rule, err := ecsService.DescribeSecurityGroupRule(sgId, direction, parts[2], parts[3], parts[4], parts[5], policy, priority) if err != nil { if NotFoundError(err) || IsExceptedError(err, InvalidSecurityGroupIdNotFound) { d.SetId("") @@ -195,7 +201,7 @@ func resourceAliyunSecurityGroupRuleRead(d *schema.ResourceData, meta interface{ } func deleteSecurityGroupRule(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) ruleType := d.Get("type").(string) request, err := buildAliyunSGRuleRequest(d, meta) if err != nil { @@ -204,17 +210,22 @@ func deleteSecurityGroupRule(d *schema.ResourceData, meta interface{}) error { if ruleType == string(DirectionIngress) { request.ApiName = "RevokeSecurityGroup" - _, err = client.ecsconn.ProcessCommonRequest(request) + _, err = client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ProcessCommonRequest(request) + }) } else { request.ApiName = "RevokeSecurityGroupEgress" - _, err = client.ecsconn.ProcessCommonRequest(request) + _, err = client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.ProcessCommonRequest(request) + }) } return err } func resourceAliyunSecurityGroupRuleDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} parts := strings.Split(d.Id(), ":") policy := parseSecurityRuleId(d, meta, 6) strPriority := parseSecurityRuleId(d, meta, 7) @@ -241,7 +252,7 @@ func resourceAliyunSecurityGroupRuleDelete(d *schema.ResourceData, meta interfac resource.RetryableError(fmt.Errorf("Delete security group rule timeout and got an error: %#v", err)) } - _, err = client.DescribeSecurityGroupRule(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], policy, priority) + _, err = ecsService.DescribeSecurityGroupRule(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], policy, priority) if err != nil { if NotFoundError(err) || IsExceptedError(err, InvalidSecurityGroupIdNotFound) { return nil @@ -255,9 +266,9 @@ func resourceAliyunSecurityGroupRuleDelete(d *schema.ResourceData, meta interfac } func buildAliyunSGRuleRequest(d *schema.ResourceData, meta interface{}) (*requests.CommonRequest, error) { - request := CommonRequestInit(getRegionId(d, meta), ECSCode, ECSDomain) - - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} + request := client.NewCommonRequest(connectivity.ECSCode, connectivity.ApiVersion20140526) direction := d.Get("type").(string) @@ -311,7 +322,7 @@ func buildAliyunSGRuleRequest(d *schema.ResourceData, meta interface{}) (*reques sgId := d.Get("security_group_id").(string) - group, err := client.DescribeSecurityGroupAttribute(sgId) + group, err := ecsService.DescribeSecurityGroupAttribute(sgId) if err != nil { return nil, fmt.Errorf("Error get security group %s error: %#v", sgId, err) } diff --git a/alicloud/resource_alicloud_security_group_rule_test.go b/alicloud/resource_alicloud_security_group_rule_test.go index a5b822458ef..02c0ef4b14c 100644 --- a/alicloud/resource_alicloud_security_group_rule_test.go +++ b/alicloud/resource_alicloud_security_group_rule_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudSecurityGroupRule_Ingress(t *testing.T) { @@ -333,14 +334,15 @@ func testAccCheckSecurityGroupRuleExists(n string, m *ecs.Permission) resource.T return fmt.Errorf("No SecurityGroup Rule ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} log.Printf("[WARN]get sg rule %s", rs.Primary.ID) parts := strings.Split(rs.Primary.ID, ":") prior, err := strconv.Atoi(parts[7]) if err != nil { return fmt.Errorf("testSecrityGroupRuleExists parse rule id gets an error: %#v", err) } - rule, err := client.DescribeSecurityGroupRule(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], prior) + rule, err := ecsService.DescribeSecurityGroupRule(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], prior) if err != nil { return err @@ -352,7 +354,8 @@ func testAccCheckSecurityGroupRuleExists(n string, m *ecs.Permission) resource.T } func testAccCheckSecurityGroupRuleDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_security_group_rule" { @@ -364,7 +367,7 @@ func testAccCheckSecurityGroupRuleDestroy(s *terraform.State) error { if err != nil { return fmt.Errorf("testSecrityGroupRuleDestroy parse rule id gets an error: %#v", err) } - _, err = client.DescribeSecurityGroupRule(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], prior) + _, err = ecsService.DescribeSecurityGroupRule(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], prior) // Verify the error is what we want if err != nil && !IsExceptedErrors(err, []string{InvalidSecurityGroupIdNotFound}) { diff --git a/alicloud/resource_alicloud_security_group_test.go b/alicloud/resource_alicloud_security_group_test.go index 42c2f626f23..c42820338bc 100644 --- a/alicloud/resource_alicloud_security_group_test.go +++ b/alicloud/resource_alicloud_security_group_test.go @@ -12,6 +12,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -26,11 +27,11 @@ func init() { } func testSweepSecurityGroups(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -42,14 +43,17 @@ func testSweepSecurityGroups(region string) error { var groups []ecs.SecurityGroup req := ecs.CreateDescribeSecurityGroupsRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.ecsconn.DescribeSecurityGroups(req) + raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeSecurityGroups(req) + }) if err != nil { return fmt.Errorf("Error retrieving Security Groups: %s", err) } + resp, _ := raw.(*ecs.DescribeSecurityGroupsResponse) if resp == nil || len(resp.SecurityGroups.SecurityGroup) < 1 { break } @@ -83,7 +87,10 @@ func testSweepSecurityGroups(region string) error { log.Printf("[INFO] Deleting Security Group: %s (%s)", name, id) req := ecs.CreateDeleteSecurityGroupRequest() req.SecurityGroupId = id - if _, err := conn.ecsconn.DeleteSecurityGroup(req); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DeleteSecurityGroup(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Security Group (%s (%s)): %s", name, id, err) } } @@ -164,8 +171,9 @@ func testAccCheckSecurityGroupExists(n string, sg *ecs.DescribeSecurityGroupAttr return fmt.Errorf("No SecurityGroup ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - d, err := client.DescribeSecurityGroupAttribute(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} + d, err := ecsService.DescribeSecurityGroupAttribute(rs.Primary.ID) log.Printf("[WARN] security group id %#v", rs.Primary.ID) @@ -180,14 +188,15 @@ func testAccCheckSecurityGroupExists(n string, sg *ecs.DescribeSecurityGroupAttr } func testAccCheckSecurityGroupDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + ecsService := EcsService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_security_group" { continue } - group, err := client.DescribeSecurityGroupAttribute(rs.Primary.ID) + group, err := ecsService.DescribeSecurityGroupAttribute(rs.Primary.ID) if err != nil { if NotFoundError(err) || IsExceptedErrors(err, []string{InvalidSecurityGroupIdNotFound}) { diff --git a/alicloud/resource_alicloud_slb.go b/alicloud/resource_alicloud_slb.go index 53612583c31..f3f22d3dcbf 100644 --- a/alicloud/resource_alicloud_slb.go +++ b/alicloud/resource_alicloud_slb.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunSlb() *schema.Resource { @@ -220,7 +221,8 @@ func resourceAliyunSlb() *schema.Resource { } func resourceAliyunSlbCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} args := slb.CreateCreateLoadBalancerRequest() args.LoadBalancerName = d.Get("name").(string) args.AddressType = strings.ToLower(string(Intranet)) @@ -247,7 +249,9 @@ func resourceAliyunSlbCreate(d *schema.ResourceData, meta interface{}) error { args.LoadBalancerSpec = v.(string) } - lb, err := client.slbconn.CreateLoadBalancer(args) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.CreateLoadBalancer(args) + }) if err != nil { if IsExceptedError(err, SlbOrderFailed) { @@ -255,10 +259,10 @@ func resourceAliyunSlbCreate(d *schema.ResourceData, meta interface{}) error { } return fmt.Errorf("Create load balancer got an error: %#v", err) } - + lb, _ := raw.(*slb.CreateLoadBalancerResponse) d.SetId(lb.LoadBalancerId) - if err := client.WaitForLoadBalancer(lb.LoadBalancerId, Active, DefaultTimeout); err != nil { + if err := slbService.WaitForLoadBalancer(lb.LoadBalancerId, Active, DefaultTimeout); err != nil { return fmt.Errorf("WaitForLoadbalancer %s got error: %#v", Active, err) } @@ -266,7 +270,9 @@ func resourceAliyunSlbCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunSlbRead(d *schema.ResourceData, meta interface{}) error { - loadBalancer, err := meta.(*AliyunClient).DescribeLoadBalancerAttribute(d.Id()) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} + loadBalancer, err := slbService.DescribeLoadBalancerAttribute(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -297,7 +303,7 @@ func resourceAliyunSlbRead(d *schema.ResourceData, meta interface{}) error { func resourceAliyunSlbUpdate(d *schema.ResourceData, meta interface{}) error { - slbconn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -305,7 +311,10 @@ func resourceAliyunSlbUpdate(d *schema.ResourceData, meta interface{}) error { req := slb.CreateSetLoadBalancerNameRequest() req.LoadBalancerId = d.Id() req.LoadBalancerName = d.Get("name").(string) - if _, err := slbconn.SetLoadBalancerName(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.SetLoadBalancerName(req) + }) + if err != nil { return fmt.Errorf("SetLoadBalancerName got an error: %#v", err) } @@ -316,7 +325,10 @@ func resourceAliyunSlbUpdate(d *schema.ResourceData, meta interface{}) error { args := slb.CreateModifyLoadBalancerInstanceSpecRequest() args.LoadBalancerId = d.Id() args.LoadBalancerSpec = d.Get("specification").(string) - if _, err := slbconn.ModifyLoadBalancerInstanceSpec(args); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.ModifyLoadBalancerInstanceSpec(args) + }) + if err != nil { return fmt.Errorf("ModifyLoadBalancerInstanceSpec got an error: %#v", err) } d.SetPartial("specification") @@ -338,7 +350,10 @@ func resourceAliyunSlbUpdate(d *schema.ResourceData, meta interface{}) error { } if update { - if _, err := slbconn.ModifyLoadBalancerInternetSpec(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.ModifyLoadBalancerInternetSpec(req) + }) + if err != nil { return fmt.Errorf("ModifyLoadBalancerInternetSpec got an error: %#v", err) } } @@ -349,19 +364,23 @@ func resourceAliyunSlbUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunSlbDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} req := slb.CreateDeleteLoadBalancerRequest() req.LoadBalancerId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := client.slbconn.DeleteLoadBalancer(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DeleteLoadBalancer(req) + }) + if err != nil { if IsExceptedErrors(err, []string{LoadBalancerNotFound}) { return nil } return resource.NonRetryableError(fmt.Errorf("Error deleting slb failed: %#v", err)) } - if _, err := client.DescribeLoadBalancerAttribute(d.Id()); err != nil { + if _, err := slbService.DescribeLoadBalancerAttribute(d.Id()); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_slb_acl.go b/alicloud/resource_alicloud_slb_acl.go index c4458635a94..8816e544de8 100644 --- a/alicloud/resource_alicloud_slb_acl.go +++ b/alicloud/resource_alicloud_slb_acl.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAlicloudSlbAcl() *schema.Resource { @@ -56,8 +57,7 @@ func resourceAlicloudSlbAcl() *schema.Resource { } func resourceAlicloudSlbAclCreate(d *schema.ResourceData, meta interface{}) error { - - client := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) name := strings.Trim(d.Get("name").(string), " ") ip_version := d.Get("ip_version").(string) @@ -66,7 +66,9 @@ func resourceAlicloudSlbAclCreate(d *schema.ResourceData, meta interface{}) erro request.AclName = name request.AddressIPVersion = ip_version - response, err := client.CreateAccessControlList(request) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.CreateAccessControlList(request) + }) if err != nil { if IsExceptedErrors(err, []string{SlbAclInvalidActionRegionNotSupport, SlbAclNumberOverLimit}) { return fmt.Errorf("CreateAccessControlList got an error: %#v", err) @@ -74,17 +76,21 @@ func resourceAlicloudSlbAclCreate(d *schema.ResourceData, meta interface{}) erro return fmt.Errorf("CreateAccessControlList got an unknown error: %#v", err) } + response, _ := raw.(*slb.CreateAccessControlListResponse) d.SetId(response.AclId) return resourceAlicloudSlbAclUpdate(d, meta) } func resourceAlicloudSlbAclRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} request := slb.CreateDescribeAccessControlListAttributeRequest() request.AclId = d.Id() - acl, err := client.DescribeAccessControlListAttribute(request) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeAccessControlListAttribute(request) + }) if err != nil { if IsExceptedError(err, SlbAclNotExists) { d.SetId("") @@ -92,10 +98,11 @@ func resourceAlicloudSlbAclRead(d *schema.ResourceData, meta interface{}) error } return err } + acl, _ := raw.(*slb.DescribeAccessControlListAttributeResponse) d.Set("name", acl.AclName) d.Set("ip_version", acl.AddressIPVersion) - if err := d.Set("entry_list", flattenSlbAclEntryMappings(acl.AclEntrys.AclEntry)); err != nil { + if err := d.Set("entry_list", slbService.FlattenSlbAclEntryMappings(acl.AclEntrys.AclEntry)); err != nil { return err } @@ -103,8 +110,8 @@ func resourceAlicloudSlbAclRead(d *schema.ResourceData, meta interface{}) error } func resourceAlicloudSlbAclUpdate(d *schema.ResourceData, meta interface{}) error { - - client := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} d.Partial(true) @@ -112,7 +119,10 @@ func resourceAlicloudSlbAclUpdate(d *schema.ResourceData, meta interface{}) erro request := slb.CreateSetAccessControlListAttributeRequest() request.AclId = d.Id() request.AclName = d.Get("name").(string) - if _, err := client.SetAccessControlListAttribute(request); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.SetAccessControlListAttribute(request) + }) + if err != nil { return fmt.Errorf("SetAccessControlListAttribute set %s name %s got an error: %#v", d.Id(), request.AclName, err) @@ -129,13 +139,13 @@ func resourceAlicloudSlbAclUpdate(d *schema.ResourceData, meta interface{}) erro add := ne.Difference(oe).List() if len(remove) > 0 { - if err := slbRemoveAccessControlListEntry(client, remove, d.Id()); err != nil { + if err := slbService.SlbRemoveAccessControlListEntry(remove, d.Id()); err != nil { return err } } if len(add) > 0 { - if err := slbAddAccessControlListEntry(client, add, d.Id()); err != nil { + if err := slbService.SlbAddAccessControlListEntry(add, d.Id()); err != nil { return err } } @@ -149,12 +159,15 @@ func resourceAlicloudSlbAclUpdate(d *schema.ResourceData, meta interface{}) erro } func resourceAlicloudSlbAclDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) return resource.Retry(5*time.Minute, func() *resource.RetryError { request := slb.CreateDeleteAccessControlListRequest() request.AclId = d.Id() - if _, err := client.DeleteAccessControlList(request); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DeleteAccessControlList(request) + }) + if err != nil { if IsExceptedError(err, SlbAclNotExists) { return nil } @@ -163,7 +176,10 @@ func resourceAlicloudSlbAclDelete(d *schema.ResourceData, meta interface{}) erro req := slb.CreateDescribeAccessControlListAttributeRequest() req.AclId = d.Id() - if _, err := client.DescribeAccessControlListAttribute(req); err != nil { + _, err = client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeAccessControlListAttribute(req) + }) + if err != nil { if IsExceptedError(err, SlbAclNotExists) { return nil } diff --git a/alicloud/resource_alicloud_slb_acl_test.go b/alicloud/resource_alicloud_slb_acl_test.go index e2dca7c6e91..77832a9c8e4 100644 --- a/alicloud/resource_alicloud_slb_acl_test.go +++ b/alicloud/resource_alicloud_slb_acl_test.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -19,11 +20,11 @@ func init() { } func testSweepSlbAcl(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - aliyunClient := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -31,11 +32,14 @@ func testSweepSlbAcl(region string) error { } req := slb.CreateDescribeAccessControlListsRequest() - req.RegionId = aliyunClient.RegionId - resp, err := aliyunClient.slbconn.DescribeAccessControlLists(req) + req.RegionId = client.RegionId + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeAccessControlLists(req) + }) if err != nil { return err } + resp, _ := raw.(*slb.DescribeAccessControlListsResponse) for _, acl := range resp.Acls.Acl { name := acl.AclName @@ -56,7 +60,10 @@ func testSweepSlbAcl(region string) error { log.Printf("[INFO] Deleting Slb Acl : %s (%s)", name, id) req := slb.CreateDeleteAccessControlListRequest() req.AclId = id - if _, err := aliyunClient.slbconn.DeleteAccessControlList(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DeleteAccessControlList(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Slb Acl (%s (%s)): %s", name, id, err) } } @@ -121,11 +128,14 @@ func testAccCheckSlbAclExists(n string, acl *slb.DescribeAccessControlListAttrib req := slb.CreateDescribeAccessControlListAttributeRequest() req.AclId = rs.Primary.ID - client := testAccProvider.Meta().(*AliyunClient).slbconn - r, err := client.DescribeAccessControlListAttribute(req) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeAccessControlListAttribute(req) + }) if err != nil { return fmt.Errorf("No SLB ACL ID %s is set", req.AclId) } + r, _ := raw.(*slb.DescribeAccessControlListAttributeResponse) *acl = *r @@ -134,7 +144,7 @@ func testAccCheckSlbAclExists(n string, acl *slb.DescribeAccessControlListAttrib } func testAccCheckSlbAclDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient).slbconn + client := testAccProvider.Meta().(*connectivity.AliyunClient) for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_slb_acl" { @@ -144,7 +154,10 @@ func testAccCheckSlbAclDestroy(s *terraform.State) error { req := slb.CreateDescribeAccessControlListAttributeRequest() req.AclId = rs.Primary.ID // Try to find the Slb server group - if _, err := client.DescribeAccessControlListAttribute(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeAccessControlListAttribute(req) + }) + if err != nil { if IsExceptedError(err, SlbAclNotExists) { continue diff --git a/alicloud/resource_alicloud_slb_attachment.go b/alicloud/resource_alicloud_slb_attachment.go index 7a77a6dfe76..67937afbe1f 100644 --- a/alicloud/resource_alicloud_slb_attachment.go +++ b/alicloud/resource_alicloud_slb_attachment.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunSlbAttachment() *schema.Resource { @@ -69,8 +70,9 @@ func resourceAliyunSlbAttachment() *schema.Resource { } func resourceAliyunSlbAttachmentCreate(d *schema.ResourceData, meta interface{}) error { - - loadBalancer, err := meta.(*AliyunClient).DescribeLoadBalancerAttribute(d.Get("load_balancer_id").(string)) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} + loadBalancer, err := slbService.DescribeLoadBalancerAttribute(d.Get("load_balancer_id").(string)) if err != nil { return err } @@ -81,8 +83,9 @@ func resourceAliyunSlbAttachmentCreate(d *schema.ResourceData, meta interface{}) } func resourceAliyunSlbAttachmentRead(d *schema.ResourceData, meta interface{}) error { - - loadBalancer, err := meta.(*AliyunClient).DescribeLoadBalancerAttribute(d.Id()) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} + loadBalancer, err := slbService.DescribeLoadBalancerAttribute(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -115,7 +118,7 @@ func resourceAliyunSlbAttachmentRead(d *schema.ResourceData, meta interface{}) e func resourceAliyunSlbAttachmentUpdate(d *schema.ResourceData, meta interface{}) error { - slbconn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) update := false weight := d.Get("weight").(int) @@ -135,7 +138,10 @@ func resourceAliyunSlbAttachmentUpdate(d *schema.ResourceData, meta interface{}) req.LoadBalancerId = d.Id() req.BackendServers = expandBackendServersToString(ns.Difference(os).List(), weight) if err := resource.Retry(2*time.Minute, func() *resource.RetryError { - if _, err := slbconn.AddBackendServers(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.AddBackendServers(req) + }) + if err != nil { if IsExceptedErrors(err, SlbIsBusy) { return resource.RetryableError(fmt.Errorf("Load banalcer adds backend servers timeout and got an error: %#v.", err)) } @@ -163,7 +169,10 @@ func resourceAliyunSlbAttachmentUpdate(d *schema.ResourceData, meta interface{}) req.LoadBalancerId = d.Id() req.BackendServers = expandBackendServersToString(d.Get("instance_ids").(*schema.Set).List(), weight) if err := resource.Retry(2*time.Minute, func() *resource.RetryError { - if _, err := slbconn.SetBackendServers(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.SetBackendServers(req) + }) + if err != nil { if IsExceptedErrors(err, SlbIsBusy) { return resource.RetryableError(fmt.Errorf("Load banalcer sets backend servers timeout and got an error: %#v.", err)) } @@ -185,14 +194,17 @@ func resourceAliyunSlbAttachmentDelete(d *schema.ResourceData, meta interface{}) } func removeBackendServers(d *schema.ResourceData, meta interface{}, servers []interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} instanceSet := d.Get("instance_ids").(*schema.Set) if len(servers) > 0 { req := slb.CreateRemoveBackendServersRequest() req.LoadBalancerId = d.Id() req.BackendServers = convertListToJsonString(servers) return resource.Retry(3*time.Minute, func() *resource.RetryError { - _, err := client.slbconn.RemoveBackendServers(req) + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.RemoveBackendServers(req) + }) if err != nil { if IsExceptedErrors(err, SlbIsBusy) { return resource.RetryableError(fmt.Errorf("Load balancer removes backend servers timeout and got an error: %#v", err)) @@ -200,7 +212,7 @@ func removeBackendServers(d *schema.ResourceData, meta interface{}, servers []in return resource.NonRetryableError(fmt.Errorf("Remove backend servers got an error: %#v", err)) } - loadBalancer, err := client.DescribeLoadBalancerAttribute(d.Id()) + loadBalancer, err := slbService.DescribeLoadBalancerAttribute(d.Id()) if err != nil { if NotFoundError(err) { return nil diff --git a/alicloud/resource_alicloud_slb_listener.go b/alicloud/resource_alicloud_slb_listener.go index 34b904219f1..426964f2f6a 100644 --- a/alicloud/resource_alicloud_slb_listener.go +++ b/alicloud/resource_alicloud_slb_listener.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunSlbListener() *schema.Resource { @@ -267,7 +268,8 @@ func resourceAliyunSlbListener() *schema.Resource { func resourceAliyunSlbListenerCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} protocol := d.Get("protocol").(string) lb_id := d.Get("load_balancer_id").(string) @@ -291,7 +293,10 @@ func resourceAliyunSlbListenerCreate(d *schema.ResourceData, meta interface{}) e } } - if _, err := client.slbconn.ProcessCommonRequest(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.ProcessCommonRequest(req) + }) + if err != nil { if IsExceptedErrors(err, []string{ListenerAlreadyExists}) { return fmt.Errorf("The listener with the frontend port %d already exists. Please define a new 'alicloud_slb_listener' resource and "+ "use ID '%s:%d' to import it or modify its frontend port and then try again.", frontend, lb_id, frontend) @@ -301,18 +306,21 @@ func resourceAliyunSlbListenerCreate(d *schema.ResourceData, meta interface{}) e d.SetId(lb_id + ":" + strconv.Itoa(frontend)) - if err := client.WaitForListener(lb_id, frontend, Protocol(protocol), Stopped, DefaultTimeout); err != nil { + if err := slbService.WaitForListener(lb_id, frontend, Protocol(protocol), Stopped, DefaultTimeout); err != nil { return fmt.Errorf("WaitForListener %s got error: %#v", Stopped, err) } reqStart := slb.CreateStartLoadBalancerListenerRequest() reqStart.LoadBalancerId = lb_id reqStart.ListenerPort = requests.NewInteger(frontend) - if _, err := client.slbconn.StartLoadBalancerListener(reqStart); err != nil { + _, err = client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.StartLoadBalancerListener(reqStart) + }) + if err != nil { return err } - if err := client.WaitForListener(lb_id, frontend, Protocol(protocol), Running, DefaultTimeout); err != nil { + if err := slbService.WaitForListener(lb_id, frontend, Protocol(protocol), Running, DefaultTimeout); err != nil { return fmt.Errorf("WaitForListener %s got error: %#v", Running, err) } @@ -320,6 +328,9 @@ func resourceAliyunSlbListenerCreate(d *schema.ResourceData, meta interface{}) e } func resourceAliyunSlbListenerRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} + lb_id, protocol, port, err := parseListenerId(d, meta) if err != nil { if NotFoundError(err) { @@ -333,14 +344,14 @@ func resourceAliyunSlbListenerRead(d *schema.ResourceData, meta interface{}) err d.Set("load_balancer_id", lb_id) return resource.Retry(5*time.Minute, func() *resource.RetryError { - listener, err := meta.(*AliyunClient).DescribeLoadBalancerListenerAttribute(lb_id, port, Protocol(protocol)) + listener, err := slbService.DescribeLoadBalancerListenerAttribute(lb_id, port, Protocol(protocol)) return readListenerAttribute(d, protocol, listener, err) }) } func resourceAliyunSlbListenerUpdate(d *schema.ResourceData, meta interface{}) error { - slbconn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) protocol := Protocol(d.Get("protocol").(string)) d.Partial(true) @@ -529,7 +540,10 @@ func resourceAliyunSlbListenerUpdate(d *schema.ResourceData, meta interface{}) e default: request = httpArgs } - if _, err = slbconn.ProcessCommonRequest(request); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.ProcessCommonRequest(request) + }) + if err != nil { return fmt.Errorf("%s got an error: %#v", request.ApiName, err) } } @@ -540,7 +554,9 @@ func resourceAliyunSlbListenerUpdate(d *schema.ResourceData, meta interface{}) e } func resourceAliyunSlbListenerDelete(d *schema.ResourceData, meta interface{}) error { - slbconn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} + lb_id, protocol, port, err := parseListenerId(d, meta) if err != nil { if NotFoundError(err) { @@ -554,7 +570,9 @@ func resourceAliyunSlbListenerDelete(d *schema.ResourceData, meta interface{}) e req.LoadBalancerId = lb_id req.ListenerPort = requests.NewInteger(port) return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := slbconn.DeleteLoadBalancerListener(req) + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DeleteLoadBalancerListener(req) + }) if err != nil { if IsExceptedErrors(err, SlbIsBusy) { @@ -563,13 +581,16 @@ func resourceAliyunSlbListenerDelete(d *schema.ResourceData, meta interface{}) e return resource.NonRetryableError(err) } - listener, err := meta.(*AliyunClient).DescribeLoadBalancerListenerAttribute(lb_id, port, Protocol(protocol)) + listener, err := slbService.DescribeLoadBalancerListenerAttribute(lb_id, port, Protocol(protocol)) return ensureListenerAbsent(d, protocol, listener, err) }) } func buildListenerCommonArgs(d *schema.ResourceData, meta interface{}) *requests.CommonRequest { - req := meta.(*AliyunClient).BuildSlbCommonRequest() + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} + + req := slbService.BuildSlbCommonRequest() req.QueryParams["LoadBalancerId"] = d.Get("load_balancer_id").(string) req.QueryParams["ListenerPort"] = string(requests.NewInteger(d.Get("frontend_port").(int))) req.QueryParams["BackendServerPort"] = string(requests.NewInteger(d.Get("backend_port").(int))) @@ -640,12 +661,15 @@ func buildHttpListenerArgs(d *schema.ResourceData, req *requests.CommonRequest) } func parseListenerId(d *schema.ResourceData, meta interface{}) (string, string, int, error) { + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} + parts := strings.Split(d.Id(), ":") port, err := strconv.Atoi(parts[1]) if err != nil { return "", "", 0, fmt.Errorf("Parsing SlbListener's id got an error: %#v", err) } - loadBalancer, err := meta.(*AliyunClient).DescribeLoadBalancerAttribute(parts[0]) + loadBalancer, err := slbService.DescribeLoadBalancerAttribute(parts[0]) if err != nil { return "", "", 0, err } diff --git a/alicloud/resource_alicloud_slb_listener_test.go b/alicloud/resource_alicloud_slb_listener_test.go index 0e0fde609df..78c2af04742 100644 --- a/alicloud/resource_alicloud_slb_listener_test.go +++ b/alicloud/resource_alicloud_slb_listener_test.go @@ -8,6 +8,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudSlbListener_http(t *testing.T) { @@ -131,9 +132,10 @@ func testAccCheckSlbListenerExists(n string, port int) resource.TestCheckFunc { return fmt.Errorf("No SLB listener ID is set") } - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + slbService := SlbService{client} parts := strings.Split(rs.Primary.ID, ":") - loadBalancer, err := client.DescribeLoadBalancerAttribute(parts[0]) + loadBalancer, err := slbService.DescribeLoadBalancerAttribute(parts[0]) if err != nil { return fmt.Errorf("DescribeLoadBalancerAttribute got an error: %#v", err) } @@ -148,7 +150,8 @@ func testAccCheckSlbListenerExists(n string, port int) resource.TestCheckFunc { } func testAccCheckSlbListenerDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + slbService := SlbService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_slb_listener" { @@ -161,7 +164,7 @@ func testAccCheckSlbListenerDestroy(s *terraform.State) error { if err != nil { return fmt.Errorf("Parsing SlbListener's id got an error: %#v", err) } - loadBalancer, err := client.DescribeLoadBalancerAttribute(parts[0]) + loadBalancer, err := slbService.DescribeLoadBalancerAttribute(parts[0]) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_slb_rule.go b/alicloud/resource_alicloud_slb_rule.go index b77b5706c26..bd34641ffff 100644 --- a/alicloud/resource_alicloud_slb_rule.go +++ b/alicloud/resource_alicloud_slb_rule.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunSlbRule() *schema.Resource { @@ -63,7 +64,8 @@ func resourceAliyunSlbRule() *schema.Resource { func resourceAliyunSlbRuleCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} slb_id := d.Get("load_balancer_id").(string) port := d.Get("frontend_port").(int) name := strings.Trim(d.Get("name").(string), " ") @@ -92,12 +94,15 @@ func resourceAliyunSlbRuleCreate(d *schema.ResourceData, meta interface{}) error req.ListenerPort = requests.NewInteger(port) req.RuleList = rule if err := resource.Retry(3*time.Minute, func() *resource.RetryError { - if _, err := client.slbconn.CreateRules(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.CreateRules(req) + }) + if err != nil { if IsExceptedErrors(err, []string{BackendServerConfiguring}) { return resource.RetryableError(fmt.Errorf("CreateRule got an error: %#v", err)) } if IsExceptedError(err, RuleDomainExist) { - if ruleId, err := client.DescribeLoadBalancerRuleId(slb_id, port, domain, url); err != nil { + if ruleId, err := slbService.DescribeLoadBalancerRuleId(slb_id, port, domain, url); err != nil { return resource.NonRetryableError(err) } else { return resource.NonRetryableError(fmt.Errorf("The rule with same domain and url already exists. "+ @@ -111,7 +116,7 @@ func resourceAliyunSlbRuleCreate(d *schema.ResourceData, meta interface{}) error return err } - ruleId, err := client.DescribeLoadBalancerRuleId(slb_id, port, domain, url) + ruleId, err := slbService.DescribeLoadBalancerRuleId(slb_id, port, domain, url) if err != nil { return err } @@ -126,8 +131,9 @@ func resourceAliyunSlbRuleCreate(d *schema.ResourceData, meta interface{}) error } func resourceAliyunSlbRuleRead(d *schema.ResourceData, meta interface{}) error { - - rule, err := meta.(*AliyunClient).DescribeLoadBalancerRuleAttribute(d.Id()) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} + rule, err := slbService.DescribeLoadBalancerRuleAttribute(d.Id()) if err != nil { if NotFoundError(err) { @@ -159,7 +165,11 @@ func resourceAliyunSlbRuleUpdate(d *schema.ResourceData, meta interface{}) error req := slb.CreateSetRuleRequest() req.RuleId = d.Id() req.VServerGroupId = d.Get("server_group_id").(string) - if _, err := meta.(*AliyunClient).slbconn.SetRule(req); err != nil { + client := meta.(*connectivity.AliyunClient) + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.SetRule(req) + }) + if err != nil { return fmt.Errorf("Modify rule %s server group got an error: %#v", d.Id(), err) } d.SetPartial("server_group_id") @@ -171,18 +181,23 @@ func resourceAliyunSlbRuleUpdate(d *schema.ResourceData, meta interface{}) error } func resourceAliyunSlbRuleDelete(d *schema.ResourceData, meta interface{}) error { - slbconn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) req := slb.CreateDeleteRulesRequest() req.RuleIds = fmt.Sprintf("['%s']", d.Id()) return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := slbconn.DeleteRules(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DeleteRules(req) + }) + if err != nil { if IsExceptedErrors(err, []string{InvalidRuleIdNotFound}) { return nil } return resource.NonRetryableError(err) } - if _, err := meta.(*AliyunClient).DescribeLoadBalancerRuleAttribute(d.Id()); err != nil { + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} + if _, err := slbService.DescribeLoadBalancerRuleAttribute(d.Id()); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_slb_rule_test.go b/alicloud/resource_alicloud_slb_rule_test.go index 5ebb74e9196..7eb54ad5054 100644 --- a/alicloud/resource_alicloud_slb_rule_test.go +++ b/alicloud/resource_alicloud_slb_rule_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudSlbRule_basic(t *testing.T) { @@ -72,8 +73,9 @@ func testAccCheckSlbRuleExists(n string, rule *slb.DescribeRuleAttributeResponse return fmt.Errorf("No SLB Rule ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - r, err := client.DescribeLoadBalancerRuleAttribute(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + slbService := SlbService{client} + r, err := slbService.DescribeLoadBalancerRuleAttribute(rs.Primary.ID) if err != nil { return err } @@ -85,7 +87,8 @@ func testAccCheckSlbRuleExists(n string, rule *slb.DescribeRuleAttributeResponse } func testAccCheckSlbRuleDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + slbService := SlbService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_slb_rule" { @@ -93,7 +96,7 @@ func testAccCheckSlbRuleDestroy(s *terraform.State) error { } // Try to find the Slb server group - if _, err := client.DescribeLoadBalancerRuleAttribute(rs.Primary.ID); err != nil { + if _, err := slbService.DescribeLoadBalancerRuleAttribute(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_slb_server_group.go b/alicloud/resource_alicloud_slb_server_group.go index 5e0c753d173..5fab790bd94 100644 --- a/alicloud/resource_alicloud_slb_server_group.go +++ b/alicloud/resource_alicloud_slb_server_group.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunSlbServerGroup() *schema.Resource { @@ -67,17 +68,20 @@ func resourceAliyunSlbServerGroup() *schema.Resource { } func resourceAliyunSlbServerGroupCreate(d *schema.ResourceData, meta interface{}) error { - + client := meta.(*connectivity.AliyunClient) var groupId string req := slb.CreateCreateVServerGroupRequest() req.LoadBalancerId = d.Get("load_balancer_id").(string) req.VServerGroupName = d.Get("name").(string) req.BackendServers = expandBackendServersWithPortToString(d.Get("servers").(*schema.Set).List()) - if group, err := meta.(*AliyunClient).slbconn.CreateVServerGroup(req); err != nil { + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.CreateVServerGroup(req) + }) + if err != nil { return fmt.Errorf("CreateVServerGroup got an error: %#v", err) - } else { - groupId = group.VServerGroupId } + group, _ := raw.(*slb.CreateVServerGroupResponse) + groupId = group.VServerGroupId d.SetId(groupId) @@ -85,7 +89,9 @@ func resourceAliyunSlbServerGroupCreate(d *schema.ResourceData, meta interface{} } func resourceAliyunSlbServerGroupRead(d *schema.ResourceData, meta interface{}) error { - group, err := meta.(*AliyunClient).DescribeSlbVServerGroupAttribute(d.Id()) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} + group, err := slbService.DescribeSlbVServerGroupAttribute(d.Id()) if err != nil { if NotFoundError(err) { @@ -135,8 +141,7 @@ func resourceAliyunSlbServerGroupRead(d *schema.ResourceData, meta interface{}) } func resourceAliyunSlbServerGroupUpdate(d *schema.ResourceData, meta interface{}) error { - - slbconn := meta.(*AliyunClient).slbconn + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -159,7 +164,10 @@ func resourceAliyunSlbServerGroupUpdate(d *schema.ResourceData, meta interface{} req := slb.CreateRemoveVServerGroupBackendServersRequest() req.VServerGroupId = d.Id() req.BackendServers = expandBackendServersWithPortToString(remove) - if _, err := slbconn.RemoveVServerGroupBackendServers(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.RemoveVServerGroupBackendServers(req) + }) + if err != nil { return fmt.Errorf("RemoveVServerGroupBackendServers got an error: %#v", err) } } @@ -167,7 +175,10 @@ func resourceAliyunSlbServerGroupUpdate(d *schema.ResourceData, meta interface{} req := slb.CreateAddVServerGroupBackendServersRequest() req.VServerGroupId = d.Id() req.BackendServers = expandBackendServersWithPortToString(add) - if _, err := slbconn.AddVServerGroupBackendServers(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.AddVServerGroupBackendServers(req) + }) + if err != nil { return fmt.Errorf("AddVServerGroupBackendServers got an error: %#v", err) } } @@ -183,7 +194,10 @@ func resourceAliyunSlbServerGroupUpdate(d *schema.ResourceData, meta interface{} req.VServerGroupId = d.Id() req.VServerGroupName = name req.BackendServers = expandBackendServersWithPortToString(d.Get("servers").(*schema.Set).List()) - if _, err := slbconn.SetVServerGroupAttribute(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.SetVServerGroupAttribute(req) + }) + if err != nil { return fmt.Errorf("SetVServerGroupAttribute got an error: %#v", err) } } @@ -194,11 +208,15 @@ func resourceAliyunSlbServerGroupUpdate(d *schema.ResourceData, meta interface{} } func resourceAliyunSlbServerGroupDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + slbService := SlbService{client} req := slb.CreateDeleteVServerGroupRequest() req.VServerGroupId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := client.slbconn.DeleteVServerGroup(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DeleteVServerGroup(req) + }) + if err != nil { if IsExceptedErrors(err, []string{VServerGroupNotFoundMessage, InvalidParameter}) { return nil } @@ -208,7 +226,7 @@ func resourceAliyunSlbServerGroupDelete(d *schema.ResourceData, meta interface{} return resource.NonRetryableError(err) } - if _, err := meta.(*AliyunClient).DescribeSlbVServerGroupAttribute(d.Id()); err != nil { + if _, err := slbService.DescribeSlbVServerGroupAttribute(d.Id()); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_slb_server_group_test.go b/alicloud/resource_alicloud_slb_server_group_test.go index c848fae14f4..c5c76293e8f 100644 --- a/alicloud/resource_alicloud_slb_server_group_test.go +++ b/alicloud/resource_alicloud_slb_server_group_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudSlbServerGroup_vpc(t *testing.T) { @@ -72,8 +73,9 @@ func testAccCheckSlbServerGroupExists(n string, group *slb.DescribeVServerGroupA return fmt.Errorf("No SLB Server Group ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - gr, err := client.DescribeSlbVServerGroupAttribute(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + slbService := SlbService{client} + gr, err := slbService.DescribeSlbVServerGroupAttribute(rs.Primary.ID) if err != nil { return err } @@ -85,7 +87,8 @@ func testAccCheckSlbServerGroupExists(n string, group *slb.DescribeVServerGroupA } func testAccCheckSlbServerGroupDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + slbService := SlbService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_slb_server_group" { @@ -93,7 +96,7 @@ func testAccCheckSlbServerGroupDestroy(s *terraform.State) error { } // Try to find the Slb server group - if _, err := client.DescribeSlbVServerGroupAttribute(rs.Primary.ID); err != nil { + if _, err := slbService.DescribeSlbVServerGroupAttribute(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_slb_test.go b/alicloud/resource_alicloud_slb_test.go index 8682f3db1bc..2e0fcd966e8 100644 --- a/alicloud/resource_alicloud_slb_test.go +++ b/alicloud/resource_alicloud_slb_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepSLBs(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -37,14 +38,17 @@ func testSweepSLBs(region string) error { var slbs []slb.LoadBalancer req := slb.CreateDescribeLoadBalancersRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.slbconn.DescribeLoadBalancers(req) + raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeLoadBalancers(req) + }) if err != nil { return fmt.Errorf("Error retrieving SLBs: %s", err) } + resp, _ := raw.(*slb.DescribeLoadBalancersResponse) if resp == nil || len(resp.LoadBalancers.LoadBalancer) < 1 { break } @@ -78,7 +82,10 @@ func testSweepSLBs(region string) error { log.Printf("[INFO] Deleting SLB: %s (%s)", name, id) req := slb.CreateDeleteLoadBalancerRequest() req.LoadBalancerId = id - if _, err := conn.slbconn.DeleteLoadBalancer(req); err != nil { + _, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DeleteLoadBalancer(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete SLB (%s (%s)): %s", name, id, err) } } @@ -193,8 +200,9 @@ func testAccCheckSlbExists(n string, slb *slb.DescribeLoadBalancerAttributeRespo return fmt.Errorf("No SLB ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeLoadBalancerAttribute(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + slbService := SlbService{client} + instance, err := slbService.DescribeLoadBalancerAttribute(rs.Primary.ID) if err != nil { return err @@ -206,7 +214,8 @@ func testAccCheckSlbExists(n string, slb *slb.DescribeLoadBalancerAttributeRespo } func testAccCheckSlbDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + slbService := SlbService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_slb" { @@ -214,7 +223,7 @@ func testAccCheckSlbDestroy(s *terraform.State) error { } // Try to find the Slb - if _, err := client.DescribeLoadBalancerAttribute(rs.Primary.ID); err != nil { + if _, err := slbService.DescribeLoadBalancerAttribute(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/resource_alicloud_snat.go b/alicloud/resource_alicloud_snat.go index 9b7e7c52d92..33ae1de3fe0 100644 --- a/alicloud/resource_alicloud_snat.go +++ b/alicloud/resource_alicloud_snat.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunSnatEntry() *schema.Resource { @@ -37,23 +38,26 @@ func resourceAliyunSnatEntry() *schema.Resource { } func resourceAliyunSnatEntryCreate(d *schema.ResourceData, meta interface{}) error { - conn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) request := vpc.CreateCreateSnatEntryRequest() - request.RegionId = string(getRegion(d, meta)) + request.RegionId = string(client.Region) request.SnatTableId = d.Get("snat_table_id").(string) request.SourceVSwitchId = d.Get("source_vswitch_id").(string) request.SnatIp = d.Get("snat_ip").(string) if err := resource.Retry(3*time.Minute, func() *resource.RetryError { ar := request - resp, err := conn.CreateSnatEntry(ar) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateSnatEntry(ar) + }) if err != nil { if IsExceptedError(err, EIP_NOT_IN_GATEWAY) { return resource.RetryableError(fmt.Errorf("CreateSnatEntry timeout and got an error: %#v.", err)) } return resource.NonRetryableError(fmt.Errorf("CreateSnatEntry got error: %#v.", err)) } + resp, _ := raw.(*vpc.CreateSnatEntryResponse) d.SetId(resp.SnatEntryId) return nil }); err != nil { @@ -64,9 +68,10 @@ func resourceAliyunSnatEntryCreate(d *schema.ResourceData, meta interface{}) err } func resourceAliyunSnatEntryRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - snatEntry, err := client.DescribeSnatEntry(d.Get("snat_table_id").(string), d.Id()) + snatEntry, err := vpcService.DescribeSnatEntry(d.Get("snat_table_id").(string), d.Id()) if err != nil { if NotFoundError(err) { @@ -83,9 +88,10 @@ func resourceAliyunSnatEntryRead(d *schema.ResourceData, meta interface{}) error } func resourceAliyunSnatEntryUpdate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - snatEntry, err := client.DescribeSnatEntry(d.Get("snat_table_id").(string), d.Id()) + snatEntry, err := vpcService.DescribeSnatEntry(d.Get("snat_table_id").(string), d.Id()) if err != nil { return err } @@ -93,7 +99,7 @@ func resourceAliyunSnatEntryUpdate(d *schema.ResourceData, meta interface{}) err d.Partial(true) attributeUpdate := false request := vpc.CreateModifySnatEntryRequest() - request.RegionId = string(getRegion(d, meta)) + request.RegionId = string(client.Region) request.SnatTableId = snatEntry.SnatTableId request.SnatEntryId = snatEntry.SnatEntryId @@ -111,7 +117,10 @@ func resourceAliyunSnatEntryUpdate(d *schema.ResourceData, meta interface{}) err } if attributeUpdate { - if _, err := client.vpcconn.ModifySnatEntry(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifySnatEntry(request) + }) + if err != nil { return err } } @@ -122,13 +131,16 @@ func resourceAliyunSnatEntryUpdate(d *schema.ResourceData, meta interface{}) err } func resourceAliyunSnatEntryDelete(d *schema.ResourceData, meta interface{}) error { - + client := meta.(*connectivity.AliyunClient) request := vpc.CreateDeleteSnatEntryRequest() - request.RegionId = string(getRegion(d, meta)) + request.RegionId = string(client.Region) request.SnatTableId = d.Get("snat_table_id").(string) request.SnatEntryId = d.Id() - if _, err := meta.(*AliyunClient).vpcconn.DeleteSnatEntry(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteSnatEntry(request) + }) + if err != nil { if IsExceptedError(err, InvalidSnatTableIdNotFound) { return nil } diff --git a/alicloud/resource_alicloud_snat_test.go b/alicloud/resource_alicloud_snat_test.go index f81e5a5eb38..6c51a9e0ba9 100644 --- a/alicloud/resource_alicloud_snat_test.go +++ b/alicloud/resource_alicloud_snat_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudSnat_basic(t *testing.T) { @@ -52,7 +53,8 @@ func TestAccAlicloudSnat_basic(t *testing.T) { } func testAccCheckSnatEntryDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_snat_entry" { @@ -60,7 +62,7 @@ func testAccCheckSnatEntryDestroy(s *terraform.State) error { } // Try to find the Snat entry - instance, err := client.DescribeSnatEntry(rs.Primary.Attributes["snat_table_id"], rs.Primary.ID) + instance, err := vpcService.DescribeSnatEntry(rs.Primary.Attributes["snat_table_id"], rs.Primary.ID) //this special deal cause the DescribeSnatEntry can't find the records would be throw "cant find the snatTable error" if err != nil { @@ -89,8 +91,9 @@ func testAccCheckSnatEntryExists(n string, snat *vpc.SnatTableEntry) resource.Te return fmt.Errorf("No SnatEntry ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeSnatEntry(rs.Primary.Attributes["snat_table_id"], rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} + instance, err := vpcService.DescribeSnatEntry(rs.Primary.Attributes["snat_table_id"], rs.Primary.ID) if err != nil { return err diff --git a/alicloud/resource_alicloud_ssl_vpn_client_cert.go b/alicloud/resource_alicloud_ssl_vpn_client_cert.go index 6784a11e410..94fe4e6ddbb 100644 --- a/alicloud/resource_alicloud_ssl_vpn_client_cert.go +++ b/alicloud/resource_alicloud_ssl_vpn_client_cert.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunSslVpnClientCert() *schema.Resource { @@ -37,20 +38,23 @@ func resourceAliyunSslVpnClientCert() *schema.Resource { } func resourceAliyunSslVpnClientCertCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} var sslVpnClientCert *vpc.CreateSslVpnClientCertResponse err := resource.Retry(3*time.Minute, func() *resource.RetryError { args := buildAliyunSslVpnClientCertArgs(d, meta) - resp, err := client.vpcconn.CreateSslVpnClientCert(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateSslVpnClientCert(args) + }) if err != nil { if IsExceptedError(err, VpnConfiguring) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } - sslVpnClientCert = resp + sslVpnClientCert, _ = raw.(*vpc.CreateSslVpnClientCertResponse) return nil }) @@ -60,7 +64,7 @@ func resourceAliyunSslVpnClientCertCreate(d *schema.ResourceData, meta interface d.SetId(sslVpnClientCert.SslVpnClientCertId) - err = client.WaitForSslVpnClientCert(d.Id(), Ssl_Cert_Normal, 60) + err = vpnGatewayService.WaitForSslVpnClientCert(d.Id(), Ssl_Cert_Normal, 60) if err != nil { return fmt.Errorf("Wait Ssl Vpn Client Cert %s ready got error: %#v", sslVpnClientCert.SslVpnClientCertId, err) } @@ -70,9 +74,10 @@ func resourceAliyunSslVpnClientCertCreate(d *schema.ResourceData, meta interface func resourceAliyunSslVpnClientCertRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} - resp, err := client.DescribeSslVpnClientCert(d.Id()) + resp, err := vpnGatewayService.DescribeSslVpnClientCert(d.Id()) if err != nil { if NotFoundError(err) { @@ -90,13 +95,16 @@ func resourceAliyunSslVpnClientCertRead(d *schema.ResourceData, meta interface{} } func resourceAliyunSslVpnClientCertUpdate(d *schema.ResourceData, meta interface{}) error { - + client := meta.(*connectivity.AliyunClient) request := vpc.CreateModifySslVpnClientCertRequest() request.SslVpnClientCertId = d.Id() if d.HasChange("name") { request.Name = d.Get("name").(string) - if _, err := meta.(*AliyunClient).vpcconn.ModifySslVpnClientCert(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifySslVpnClientCert(request) + }) + if err != nil { return err } } @@ -105,12 +113,15 @@ func resourceAliyunSslVpnClientCertUpdate(d *schema.ResourceData, meta interface } func resourceAliyunSslVpnClientCertDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} request := vpc.CreateDeleteSslVpnClientCertRequest() request.SslVpnClientCertId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.vpcconn.DeleteSslVpnClientCert(request) + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteSslVpnClientCert(request) + }) if err != nil { if IsExceptedError(err, SslVpnClientCertNotFound) { @@ -119,7 +130,8 @@ func resourceAliyunSslVpnClientCertDelete(d *schema.ResourceData, meta interface return resource.RetryableError(fmt.Errorf("Delete SslVpnClientCert %s timeout and got an error: %#v.", request.SslVpnClientCertId, err)) } - if _, err := client.DescribeSslVpnClientCert(d.Id()); err != nil { + _, err = vpnGatewayService.DescribeSslVpnClientCert(d.Id()) + if err != nil { if NotFoundError(err) { return nil } @@ -131,8 +143,9 @@ func resourceAliyunSslVpnClientCertDelete(d *schema.ResourceData, meta interface } func buildAliyunSslVpnClientCertArgs(d *schema.ResourceData, meta interface{}) *vpc.CreateSslVpnClientCertRequest { + client := meta.(*connectivity.AliyunClient) request := vpc.CreateCreateSslVpnClientCertRequest() - request.RegionId = string(getRegion(d, meta)) + request.RegionId = string(client.Region) request.SslVpnServerId = d.Get("ssl_vpn_server_id").(string) if v := d.Get("name").(string); v != "" { diff --git a/alicloud/resource_alicloud_ssl_vpn_client_cert_test.go b/alicloud/resource_alicloud_ssl_vpn_client_cert_test.go index b3772f7d67e..c1e6a253582 100644 --- a/alicloud/resource_alicloud_ssl_vpn_client_cert_test.go +++ b/alicloud/resource_alicloud_ssl_vpn_client_cert_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudSslVpnClientCert_basic(t *testing.T) { @@ -82,8 +83,9 @@ func testAccCheckSslVpnClientCertExists(n string, vpn *vpc.DescribeSslVpnClientC return fmt.Errorf("No VPN ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeSslVpnClientCert(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} + instance, err := vpnGatewayService.DescribeSslVpnClientCert(rs.Primary.ID) if err != nil { return err @@ -95,14 +97,15 @@ func testAccCheckSslVpnClientCertExists(n string, vpn *vpc.DescribeSslVpnClientC } func testAccCheckSslVpnClientCertDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_ssl_vpn_client_cert" { continue } - instance, err := client.DescribeSslVpnClientCert(rs.Primary.ID) + instance, err := vpnGatewayService.DescribeSslVpnClientCert(rs.Primary.ID) if err != nil { if NotFoundError(err) { diff --git a/alicloud/resource_alicloud_ssl_vpn_server.go b/alicloud/resource_alicloud_ssl_vpn_server.go index f1e603d9124..f043b0f0646 100644 --- a/alicloud/resource_alicloud_ssl_vpn_server.go +++ b/alicloud/resource_alicloud_ssl_vpn_server.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunSslVpnServer() *schema.Resource { @@ -85,12 +86,14 @@ func resourceAliyunSslVpnServer() *schema.Resource { } func resourceAliyunSslVpnServerCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) var sslVpnServer *vpc.CreateSslVpnServerResponse err := resource.Retry(3*time.Minute, func() *resource.RetryError { args := buildAliyunSslVpnServerArgs(d, meta) - resp, err := client.vpcconn.CreateSslVpnServer(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateSslVpnServer(args) + }) if err != nil { if IsExceptedError(err, VpnConfiguring) { time.Sleep(10 * time.Second) @@ -98,7 +101,7 @@ func resourceAliyunSslVpnServerCreate(d *schema.ResourceData, meta interface{}) } return resource.NonRetryableError(err) } - sslVpnServer = resp + sslVpnServer, _ = raw.(*vpc.CreateSslVpnServerResponse) return nil }) if err != nil { @@ -111,10 +114,10 @@ func resourceAliyunSslVpnServerCreate(d *schema.ResourceData, meta interface{}) } func resourceAliyunSslVpnServerRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} - client := meta.(*AliyunClient) - - resp, err := client.DescribeSslVpnServer(d.Id()) + resp, err := vpnGatewayService.DescribeSslVpnServer(d.Id()) if err != nil { if NotFoundError(err) { @@ -140,6 +143,7 @@ func resourceAliyunSslVpnServerRead(d *schema.ResourceData, meta interface{}) er } func resourceAliyunSslVpnServerUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) attributeUpdate := false request := vpc.CreateModifySslVpnServerRequest() request.SslVpnServerId = d.Id() @@ -182,7 +186,9 @@ func resourceAliyunSslVpnServerUpdate(d *schema.ResourceData, meta interface{}) if attributeUpdate { res := resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := meta.(*AliyunClient).vpcconn.ModifySslVpnServer(request) + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifySslVpnServer(request) + }) if err != nil { if IsExceptedError(err, VpnConfiguring) { @@ -202,12 +208,15 @@ func resourceAliyunSslVpnServerUpdate(d *schema.ResourceData, meta interface{}) } func resourceAliyunSslVpnServerDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} request := vpc.CreateDeleteSslVpnServerRequest() request.SslVpnServerId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.vpcconn.DeleteSslVpnServer(request) + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteSslVpnServer(request) + }) if err != nil { if IsExceptedError(err, VpnConfiguring) { @@ -221,7 +230,7 @@ func resourceAliyunSslVpnServerDelete(d *schema.ResourceData, meta interface{}) return resource.NonRetryableError(fmt.Errorf("Delete SslVpnServer timeout and got an error: %#v.", err)) } - if _, err := client.DescribeSslVpnServer(d.Id()); err != nil { + if _, err := vpnGatewayService.DescribeSslVpnServer(d.Id()); err != nil { if NotFoundError(err) { return nil } @@ -233,8 +242,9 @@ func resourceAliyunSslVpnServerDelete(d *schema.ResourceData, meta interface{}) } func buildAliyunSslVpnServerArgs(d *schema.ResourceData, meta interface{}) *vpc.CreateSslVpnServerRequest { + client := meta.(*connectivity.AliyunClient) request := vpc.CreateCreateSslVpnServerRequest() - request.RegionId = string(getRegion(d, meta)) + request.RegionId = string(client.Region) request.VpnGatewayId = d.Get("vpn_gateway_id").(string) request.ClientIpPool = d.Get("client_ip_pool").(string) request.LocalSubnet = d.Get("local_subnet").(string) diff --git a/alicloud/resource_alicloud_ssl_vpn_server_test.go b/alicloud/resource_alicloud_ssl_vpn_server_test.go index e182c16dfdc..861a51a9fca 100644 --- a/alicloud/resource_alicloud_ssl_vpn_server_test.go +++ b/alicloud/resource_alicloud_ssl_vpn_server_test.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudSslVpnServer_basic(t *testing.T) { @@ -111,8 +112,9 @@ func testAccCheckSslVpnServerExists(n string, vpn *vpc.SslVpnServer) resource.Te return fmt.Errorf("No VPN ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeSslVpnServer(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} + instance, err := vpnGatewayService.DescribeSslVpnServer(rs.Primary.ID) if err != nil { return err @@ -124,14 +126,15 @@ func testAccCheckSslVpnServerExists(n string, vpn *vpc.SslVpnServer) resource.Te } func testAccCheckSslVpnServerDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_ssl_vpn_server" { continue } - instance, err := client.DescribeSslVpnServer(rs.Primary.ID) + instance, err := vpnGatewayService.DescribeSslVpnServer(rs.Primary.ID) if err != nil { if NotFoundError(err) { diff --git a/alicloud/resource_alicloud_vpc.go b/alicloud/resource_alicloud_vpc.go index 6b3f849d810..b18e43d9b3b 100644 --- a/alicloud/resource_alicloud_vpc.go +++ b/alicloud/resource_alicloud_vpc.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunVpc() *schema.Resource { @@ -66,14 +67,16 @@ func resourceAliyunVpc() *schema.Resource { } func resourceAliyunVpcCreate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - client := meta.(*AliyunClient) - - var vpc *vpc.CreateVpcResponse + var vpcResponse *vpc.CreateVpcResponse request := buildAliyunVpcArgs(d, meta) err := resource.Retry(3*time.Minute, func() *resource.RetryError { args := *request - resp, err := client.vpcconn.CreateVpc(&args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateVpc(&args) + }) if err != nil { if IsExceptedError(err, VpcQuotaExceeded) { return resource.NonRetryableError(fmt.Errorf("The number of VPC has quota has reached the quota limit in your account, and please use existing VPCs or remove some of them.")) @@ -84,16 +87,16 @@ func resourceAliyunVpcCreate(d *schema.ResourceData, meta interface{}) error { } return resource.NonRetryableError(err) } - vpc = resp + vpcResponse, _ = raw.(*vpc.CreateVpcResponse) return nil }) if err != nil { return fmt.Errorf("Create vpc got an error :%#v", err) } - d.SetId(vpc.VpcId) + d.SetId(vpcResponse.VpcId) - err = client.WaitForVpc(d.Id(), Available, 60) + err = vpcService.WaitForVpc(d.Id(), Available, 60) if err != nil { return fmt.Errorf("Timeout when WaitForVpcAvailable") } @@ -102,10 +105,10 @@ func resourceAliyunVpcCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunVpcRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - client := meta.(*AliyunClient) - - resp, err := client.DescribeVpc(d.Id()) + resp, err := vpcService.DescribeVpc(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -119,15 +122,18 @@ func resourceAliyunVpcRead(d *schema.ResourceData, meta interface{}) error { d.Set("description", resp.Description) d.Set("router_id", resp.VRouterId) request := vpc.CreateDescribeVRoutersRequest() - request.RegionId = getRegionId(d, meta) + request.RegionId = client.RegionId request.VRouterId = resp.VRouterId var response vpc.DescribeVRoutersResponse if err := resource.Retry(6*time.Minute, func() *resource.RetryError { - r, e := client.vpcconn.DescribeVRouters(request) + raw, e := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVRouters(request) + }) if e != nil && IsExceptedErrors(err, []string{Throttling}) { time.Sleep(10 * time.Second) return resource.RetryableError(e) } + r, _ := raw.(*vpc.DescribeVRoutersResponse) response = *r return resource.NonRetryableError(e) }); err != nil { @@ -145,7 +151,7 @@ func resourceAliyunVpcRead(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunVpcUpdate(d *schema.ResourceData, meta interface{}) error { - + client := meta.(*connectivity.AliyunClient) d.Partial(true) attributeUpdate := false @@ -167,7 +173,10 @@ func resourceAliyunVpcUpdate(d *schema.ResourceData, meta interface{}) error { } if attributeUpdate { - if _, err := meta.(*AliyunClient).vpcconn.ModifyVpcAttribute(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyVpcAttribute(request) + }) + if err != nil { return err } } @@ -178,11 +187,14 @@ func resourceAliyunVpcUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunVpcDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} request := vpc.CreateDeleteVpcRequest() request.VpcId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.vpcconn.DeleteVpc(request) + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteVpc(request) + }) if err != nil { if IsExceptedError(err, InvalidVpcIDNotFound) || IsExceptedError(err, ForbiddenVpcNotFound) { @@ -191,7 +203,7 @@ func resourceAliyunVpcDelete(d *schema.ResourceData, meta interface{}) error { return resource.RetryableError(fmt.Errorf("Delete VPC timeout and got an error: %#v.", err)) } - if _, err := client.DescribeVpc(d.Id()); err != nil { + if _, err := vpcService.DescribeVpc(d.Id()); err != nil { if NotFoundError(err) { return nil } @@ -203,8 +215,9 @@ func resourceAliyunVpcDelete(d *schema.ResourceData, meta interface{}) error { } func buildAliyunVpcArgs(d *schema.ResourceData, meta interface{}) *vpc.CreateVpcRequest { + client := meta.(*connectivity.AliyunClient) request := vpc.CreateCreateVpcRequest() - request.RegionId = string(getRegion(d, meta)) + request.RegionId = string(client.Region) request.CidrBlock = d.Get("cidr_block").(string) if v := d.Get("name").(string); v != "" { diff --git a/alicloud/resource_alicloud_vpc_test.go b/alicloud/resource_alicloud_vpc_test.go index 3fa9198f2b6..2df0c6dc823 100644 --- a/alicloud/resource_alicloud_vpc_test.go +++ b/alicloud/resource_alicloud_vpc_test.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -30,11 +31,11 @@ func init() { } func testSweepVpcs(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -46,14 +47,17 @@ func testSweepVpcs(region string) error { var vpcs []vpc.Vpc req := vpc.CreateDescribeVpcsRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.vpcconn.DescribeVpcs(req) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVpcs(req) + }) if err != nil { return fmt.Errorf("Error retrieving VPCs: %s", err) } + resp, _ := raw.(*vpc.DescribeVpcsResponse) if resp == nil || len(resp.Vpcs.Vpc) < 1 { break } @@ -87,7 +91,10 @@ func testSweepVpcs(region string) error { log.Printf("[INFO] Deleting VPC: %s (%s)", name, id) req := vpc.CreateDeleteVpcRequest() req.VpcId = id - if _, err := conn.vpcconn.DeleteVpc(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteVpc(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete VPC (%s (%s)): %s", name, id, err) } } @@ -193,8 +200,9 @@ func testAccCheckVpcExists(n string, vpc *vpc.DescribeVpcAttributeResponse) reso return fmt.Errorf("No VPC ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeVpc(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} + instance, err := vpcService.DescribeVpc(rs.Primary.ID) if err != nil { return err @@ -206,7 +214,8 @@ func testAccCheckVpcExists(n string, vpc *vpc.DescribeVpcAttributeResponse) reso } func testAccCheckVpcDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_vpc" { @@ -214,7 +223,7 @@ func testAccCheckVpcDestroy(s *terraform.State) error { } // Try to find the VPC - instance, err := client.DescribeVpc(rs.Primary.ID) + instance, err := vpcService.DescribeVpc(rs.Primary.ID) if err != nil { if NotFoundError(err) { diff --git a/alicloud/resource_alicloud_vpn_connection.go b/alicloud/resource_alicloud_vpn_connection.go index d9c641d9a39..37bc9afc2ea 100644 --- a/alicloud/resource_alicloud_vpn_connection.go +++ b/alicloud/resource_alicloud_vpn_connection.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunVpnConnection() *schema.Resource { @@ -168,7 +169,7 @@ func resourceAliyunVpnConnection() *schema.Resource { func resourceAliyunVpnConnectionCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) var vpnConn *vpc.CreateVpnConnectionResponse err := resource.Retry(3*time.Minute, func() *resource.RetryError { @@ -177,7 +178,9 @@ func resourceAliyunVpnConnectionCreate(d *schema.ResourceData, meta interface{}) return resource.NonRetryableError(fmt.Errorf("Building buildAliyunVpnConnectionArgs got an error: %#v", err)) } - resp, err := client.vpcconn.CreateVpnConnection(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateVpnConnection(args) + }) if err != nil { if IsExceptedError(err, VpnConfiguring) { time.Sleep(10 * time.Second) @@ -185,7 +188,7 @@ func resourceAliyunVpnConnectionCreate(d *schema.ResourceData, meta interface{}) } return resource.NonRetryableError(err) } - vpnConn = resp + vpnConn, _ = raw.(*vpc.CreateVpnConnectionResponse) return nil }) if err != nil { @@ -199,8 +202,9 @@ func resourceAliyunVpnConnectionCreate(d *schema.ResourceData, meta interface{}) func resourceAliyunVpnConnectionRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) - resp, err := client.DescribeVpnConnection(d.Id()) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} + resp, err := vpnGatewayService.DescribeVpnConnection(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -229,11 +233,11 @@ func resourceAliyunVpnConnectionRead(d *schema.ResourceData, meta interface{}) e d.Set("effect_immediately", resp.EffectImmediately) d.Set("status", resp.Status) - if err := d.Set("ike_config", ParseIkeConfig(resp.IkeConfig)); err != nil { + if err := d.Set("ike_config", vpnGatewayService.ParseIkeConfig(resp.IkeConfig)); err != nil { return err } - if err := d.Set("ipsec_config", ParseIpsecConfig(resp.IpsecConfig)); err != nil { + if err := d.Set("ipsec_config", vpnGatewayService.ParseIpsecConfig(resp.IpsecConfig)); err != nil { return err } @@ -241,7 +245,8 @@ func resourceAliyunVpnConnectionRead(d *schema.ResourceData, meta interface{}) e } func resourceAliyunVpnConnectionUpdate(d *schema.ResourceData, meta interface{}) error { - + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} attributeUpdate := false request := vpc.CreateModifyVpnConnectionAttributeRequest() request.VpnConnectionId = d.Id() @@ -252,12 +257,12 @@ func resourceAliyunVpnConnectionUpdate(d *schema.ResourceData, meta interface{}) } if d.HasChange("local_subnet") { - request.LocalSubnet = AssembleNetworkSubnetToString(d.Get("local_subnet").(*schema.Set).List()) + request.LocalSubnet = vpnGatewayService.AssembleNetworkSubnetToString(d.Get("local_subnet").(*schema.Set).List()) attributeUpdate = true } if d.HasChange("remote_subnet") { - request.RemoteSubnet = AssembleNetworkSubnetToString(d.Get("remote_subnet").(*schema.Set).List()) + request.RemoteSubnet = vpnGatewayService.AssembleNetworkSubnetToString(d.Get("remote_subnet").(*schema.Set).List()) attributeUpdate = true } @@ -268,7 +273,7 @@ func resourceAliyunVpnConnectionUpdate(d *schema.ResourceData, meta interface{}) } if d.HasChange("ike_config") { - ike_config, err := AssembleIkeConfig(d.Get("ike_config").([]interface{})) + ike_config, err := vpnGatewayService.AssembleIkeConfig(d.Get("ike_config").([]interface{})) if err != nil { return fmt.Errorf("wrong ike_config: %#v", err) } @@ -277,7 +282,7 @@ func resourceAliyunVpnConnectionUpdate(d *schema.ResourceData, meta interface{}) } if d.HasChange("ipsec_config") { - ipsec_config, err := AssembleIpsecConfig(d.Get("ipsec_config").([]interface{})) + ipsec_config, err := vpnGatewayService.AssembleIpsecConfig(d.Get("ipsec_config").([]interface{})) if err != nil { return fmt.Errorf("wrong ipsec_config: %#v", err) } @@ -290,7 +295,10 @@ func resourceAliyunVpnConnectionUpdate(d *schema.ResourceData, meta interface{}) request.EffectImmediately = requests.NewBoolean(v.(bool)) } - if _, err := meta.(*AliyunClient).vpcconn.ModifyVpnConnectionAttribute(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyVpnConnectionAttribute(request) + }) + if err != nil { return err } } @@ -299,12 +307,15 @@ func resourceAliyunVpnConnectionUpdate(d *schema.ResourceData, meta interface{}) } func resourceAliyunVpnConnectionDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} request := vpc.CreateDeleteVpnConnectionRequest() request.VpnConnectionId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.vpcconn.DeleteVpnConnection(request) + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteVpnConnection(request) + }) if err != nil { if IsExceptedError(err, VpnConfiguring) { @@ -317,7 +328,7 @@ func resourceAliyunVpnConnectionDelete(d *schema.ResourceData, meta interface{}) return resource.NonRetryableError(fmt.Errorf("Delete VPN connection timeout and got an error: %#v.", err)) } - if _, err := client.DescribeVpnConnection(d.Id()); err != nil { + if _, err := vpnGatewayService.DescribeVpnConnection(d.Id()); err != nil { if NotFoundError(err) { return nil } @@ -329,12 +340,15 @@ func resourceAliyunVpnConnectionDelete(d *schema.ResourceData, meta interface{}) } func buildAliyunVpnConnectionArgs(d *schema.ResourceData, meta interface{}) (*vpc.CreateVpnConnectionRequest, error) { + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} + request := vpc.CreateCreateVpnConnectionRequest() - request.RegionId = getRegionId(d, meta) + request.RegionId = client.RegionId request.CustomerGatewayId = d.Get("customer_gateway_id").(string) request.VpnGatewayId = d.Get("vpn_gateway_id").(string) - request.LocalSubnet = AssembleNetworkSubnetToString(d.Get("local_subnet").(*schema.Set).List()) - request.RemoteSubnet = AssembleNetworkSubnetToString(d.Get("remote_subnet").(*schema.Set).List()) + request.LocalSubnet = vpnGatewayService.AssembleNetworkSubnetToString(d.Get("local_subnet").(*schema.Set).List()) + request.RemoteSubnet = vpnGatewayService.AssembleNetworkSubnetToString(d.Get("remote_subnet").(*schema.Set).List()) if v := d.Get("name").(string); v != "" { request.Name = v @@ -345,7 +359,7 @@ func buildAliyunVpnConnectionArgs(d *schema.ResourceData, meta interface{}) (*vp } if v, ok := d.GetOk("ike_config"); ok { - ikeConfig, err := AssembleIkeConfig(v.([]interface{})) + ikeConfig, err := vpnGatewayService.AssembleIkeConfig(v.([]interface{})) if err != nil { return nil, fmt.Errorf("wrong ike_config: %#v", err) } @@ -353,7 +367,7 @@ func buildAliyunVpnConnectionArgs(d *schema.ResourceData, meta interface{}) (*vp } if v, ok := d.GetOk("ipsec_config"); ok { - ipsecConfig, err := AssembleIpsecConfig(v.([]interface{})) + ipsecConfig, err := vpnGatewayService.AssembleIpsecConfig(v.([]interface{})) if err != nil { return nil, fmt.Errorf("wrong ipsec_config: %#v", err) } diff --git a/alicloud/resource_alicloud_vpn_connection_test.go b/alicloud/resource_alicloud_vpn_connection_test.go index 8ec291f0e9e..e6ba1bff2f7 100644 --- a/alicloud/resource_alicloud_vpn_connection_test.go +++ b/alicloud/resource_alicloud_vpn_connection_test.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudVpnConnection_basic(t *testing.T) { @@ -217,8 +218,9 @@ func testAccCheckVpnConnectionExists(n string, vpn *vpc.DescribeVpnConnectionRes return fmt.Errorf("No VPN ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeVpnConnection(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} + instance, err := vpnGatewayService.DescribeVpnConnection(rs.Primary.ID) if err != nil { return err @@ -230,14 +232,15 @@ func testAccCheckVpnConnectionExists(n string, vpn *vpc.DescribeVpnConnectionRes } func testAccCheckVpnConnectionDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_vpn_connection" { continue } - instance, err := client.DescribeVpnConnection(rs.Primary.ID) + instance, err := vpnGatewayService.DescribeVpnConnection(rs.Primary.ID) if err != nil { if NotFoundError(err) { diff --git a/alicloud/resource_alicloud_vpn_customer_gateway.go b/alicloud/resource_alicloud_vpn_customer_gateway.go index 437d9e9d745..6e50af5e187 100644 --- a/alicloud/resource_alicloud_vpn_customer_gateway.go +++ b/alicloud/resource_alicloud_vpn_customer_gateway.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunVpnCustomerGateway() *schema.Resource { @@ -38,16 +39,19 @@ func resourceAliyunVpnCustomerGateway() *schema.Resource { } func resourceAliyunVpnCustomerGatewayCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} var cgw *vpc.CreateCustomerGatewayResponse err := resource.Retry(3*time.Minute, func() *resource.RetryError { args := buildAliyunCustomerGatewayArgs(d, meta) - resp, err := client.vpcconn.CreateCustomerGateway(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateCustomerGateway(args) + }) if err != nil { return resource.NonRetryableError(err) } - cgw = resp + cgw, _ = raw.(*vpc.CreateCustomerGatewayResponse) return nil }) if err != nil { @@ -56,7 +60,7 @@ func resourceAliyunVpnCustomerGatewayCreate(d *schema.ResourceData, meta interfa d.SetId(cgw.CustomerGatewayId) - err = client.WaitForCustomerGateway(d.Id(), Available, 60) + err = vpnGatewayService.WaitForCustomerGateway(d.Id(), Available, 60) if err != nil { return fmt.Errorf("Timeout when WaitforCustomerGateway: %#v", err) } @@ -66,9 +70,10 @@ func resourceAliyunVpnCustomerGatewayCreate(d *schema.ResourceData, meta interfa func resourceAliyunVpnCustomerGatewayRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} - resp, err := client.DescribeCustomerGateway(d.Id()) + resp, err := vpnGatewayService.DescribeCustomerGateway(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -85,6 +90,7 @@ func resourceAliyunVpnCustomerGatewayRead(d *schema.ResourceData, meta interface } func resourceAliyunVpnCustomerGatewayUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) attributeUpdate := false request := vpc.CreateModifyCustomerGatewayAttributeRequest() request.CustomerGatewayId = d.Id() @@ -100,7 +106,10 @@ func resourceAliyunVpnCustomerGatewayUpdate(d *schema.ResourceData, meta interfa } if attributeUpdate { - if _, err := meta.(*AliyunClient).vpcconn.ModifyCustomerGatewayAttribute(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyCustomerGatewayAttribute(request) + }) + if err != nil { return err } } @@ -109,11 +118,14 @@ func resourceAliyunVpnCustomerGatewayUpdate(d *schema.ResourceData, meta interfa } func resourceAliyunVpnCustomerGatewayDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} request := vpc.CreateDeleteCustomerGatewayRequest() request.CustomerGatewayId = d.Id() return resource.Retry(2*time.Minute, func() *resource.RetryError { - _, err := client.vpcconn.DeleteCustomerGateway(request) + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteCustomerGateway(request) + }) if err != nil { if IsExceptedError(err, CgwNotFound) { @@ -127,7 +139,7 @@ func resourceAliyunVpnCustomerGatewayDelete(d *schema.ResourceData, meta interfa return resource.NonRetryableError(fmt.Errorf("Delete CustomerGateway timeout and got an error: %#v.", err)) } - if _, err := client.DescribeCustomerGateway(d.Id()); err != nil { + if _, err := vpnGatewayService.DescribeCustomerGateway(d.Id()); err != nil { if NotFoundError(err) { return nil } @@ -139,8 +151,9 @@ func resourceAliyunVpnCustomerGatewayDelete(d *schema.ResourceData, meta interfa } func buildAliyunCustomerGatewayArgs(d *schema.ResourceData, meta interface{}) *vpc.CreateCustomerGatewayRequest { + client := meta.(*connectivity.AliyunClient) request := vpc.CreateCreateCustomerGatewayRequest() - request.RegionId = getRegionId(d, meta) + request.RegionId = client.RegionId request.IpAddress = d.Get("ip_address").(string) if v := d.Get("name").(string); v != "" { diff --git a/alicloud/resource_alicloud_vpn_customer_gateway_test.go b/alicloud/resource_alicloud_vpn_customer_gateway_test.go index 08c3197eb97..17c97ba6f0e 100644 --- a/alicloud/resource_alicloud_vpn_customer_gateway_test.go +++ b/alicloud/resource_alicloud_vpn_customer_gateway_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepVPNCustomerGateways(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -37,14 +38,17 @@ func testSweepVPNCustomerGateways(region string) error { var gws []vpc.CustomerGateway req := vpc.CreateDescribeCustomerGatewaysRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.vpcconn.DescribeCustomerGateways(req) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeCustomerGateways(req) + }) if err != nil { return fmt.Errorf("Error retrieving VPN Customer Gateways: %s", err) } + resp, _ := raw.(*vpc.DescribeCustomerGatewaysResponse) if resp == nil || len(resp.CustomerGateways.CustomerGateway) < 1 { break } @@ -80,7 +84,10 @@ func testSweepVPNCustomerGateways(region string) error { log.Printf("[INFO] Deleting VPN Customer Gateway: %s (%s)", name, id) req := vpc.CreateDeleteCustomerGatewayRequest() req.CustomerGatewayId = id - if _, err := conn.vpcconn.DeleteCustomerGateway(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteCustomerGateway(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete VPN Customer Gateway (%s (%s)): %s", name, id, err) } } @@ -198,8 +205,9 @@ func testAccCheckVpnCustomerGatewayExists(n string, vpn *vpc.DescribeCustomerGat return fmt.Errorf("No VPN ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeCustomerGateway(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} + instance, err := vpnGatewayService.DescribeCustomerGateway(rs.Primary.ID) if err != nil { return err @@ -211,14 +219,15 @@ func testAccCheckVpnCustomerGatewayExists(n string, vpn *vpc.DescribeCustomerGat } func testAccCheckVpnCustomerGatewayDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_vpn_customer_gateway" { continue } - instance, err := client.DescribeCustomerGateway(rs.Primary.ID) + instance, err := vpnGatewayService.DescribeCustomerGateway(rs.Primary.ID) if err != nil { if NotFoundError(err) { diff --git a/alicloud/resource_alicloud_vpn_gateway.go b/alicloud/resource_alicloud_vpn_gateway.go index 3a659169eb3..9b4bfab59da 100644 --- a/alicloud/resource_alicloud_vpn_gateway.go +++ b/alicloud/resource_alicloud_vpn_gateway.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunVpnGateway() *schema.Resource { @@ -95,9 +96,10 @@ func resourceAliyunVpnGateway() *schema.Resource { } func resourceAliyunVpnGatewayCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} args := vpc.CreateCreateVpnGatewayRequest() - args.RegionId = getRegionId(d, meta) + args.RegionId = client.RegionId if v, ok := d.GetOk("name"); ok && v.(string) != "" { args.Name = d.Get("name").(string) @@ -133,16 +135,18 @@ func resourceAliyunVpnGatewayCreate(d *schema.ResourceData, meta interface{}) er args.AutoPay = requests.NewBoolean(true) - vpn, err := client.vpcconn.CreateVpnGateway(args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateVpnGateway(args) + }) if err != nil { return fmt.Errorf("Create Vpn got an error: %#v", err) } - + vpn, _ := raw.(*vpc.CreateVpnGatewayResponse) d.SetId(vpn.VpnGatewayId) time.Sleep(10 * time.Second) - if err := client.WaitForVpn(vpn.VpnGatewayId, Active, 2*DefaultTimeout); err != nil { + if err := vpnGatewayService.WaitForVpn(vpn.VpnGatewayId, Active, 2*DefaultTimeout); err != nil { return fmt.Errorf("WaitVpnGateway %s got error: %#v, %s", Active, err, vpn.VpnGatewayId) } @@ -151,9 +155,10 @@ func resourceAliyunVpnGatewayCreate(d *schema.ResourceData, meta interface{}) er func resourceAliyunVpnGatewayRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} - resp, err := client.DescribeVpnGateway(d.Id()) + resp, err := vpnGatewayService.DescribeVpnGateway(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -199,7 +204,7 @@ func resourceAliyunVpnGatewayRead(d *schema.ResourceData, meta interface{}) erro } func resourceAliyunVpnGatewayUpdate(d *schema.ResourceData, meta interface{}) error { - vpcconn := meta.(*AliyunClient).vpcconn + client := meta.(*connectivity.AliyunClient) req := vpc.CreateModifyVpnGatewayAttributeRequest() req.VpnGatewayId = d.Id() update := false @@ -215,7 +220,10 @@ func resourceAliyunVpnGatewayUpdate(d *schema.ResourceData, meta interface{}) er } if update { - if _, err := vpcconn.ModifyVpnGatewayAttribute(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyVpnGatewayAttribute(req) + }) + if err != nil { return fmt.Errorf("ModifyVpnGatewayAttribute got an error: %#v", err) } d.SetPartial("name") @@ -240,12 +248,16 @@ func resourceAliyunVpnGatewayUpdate(d *schema.ResourceData, meta interface{}) er } func resourceAliyunVpnGatewayDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} req := vpc.CreateDeleteVpnGatewayRequest() req.VpnGatewayId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := client.vpcconn.DeleteVpnGateway(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteVpnGateway(req) + }) + if err != nil { if IsExceptedError(err, VpnNotFound) { return nil } @@ -260,7 +272,7 @@ func resourceAliyunVpnGatewayDelete(d *schema.ResourceData, meta interface{}) er return resource.NonRetryableError(fmt.Errorf("Error deleting vpn failed: %#v", err)) } - if _, err := client.DescribeVpnGateway(d.Id()); err != nil { + if _, err := vpnGatewayService.DescribeVpnGateway(d.Id()); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_vpn_gateway_test.go b/alicloud/resource_alicloud_vpn_gateway_test.go index 81702f99649..809bfd26f5c 100644 --- a/alicloud/resource_alicloud_vpn_gateway_test.go +++ b/alicloud/resource_alicloud_vpn_gateway_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -21,11 +22,11 @@ func init() { } func testSweepVPNGateways(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -37,14 +38,17 @@ func testSweepVPNGateways(region string) error { var gws []vpc.VpnGateway req := vpc.CreateDescribeVpnGatewaysRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.vpcconn.DescribeVpnGateways(req) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVpnGateways(req) + }) if err != nil { return fmt.Errorf("Error retrieving VPN Gateways: %s", err) } + resp, _ := raw.(*vpc.DescribeVpnGatewaysResponse) if resp == nil || len(resp.VpnGateways.VpnGateway) < 1 { break } @@ -80,7 +84,10 @@ func testSweepVPNGateways(region string) error { log.Printf("[INFO] Deleting VPN Gateway: %s (%s)", name, id) req := vpc.CreateDeleteVpnGatewayRequest() req.VpnGatewayId = id - if _, err := conn.vpcconn.DeleteVpnGateway(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteVpnGateway(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete VPN Gateway (%s (%s)): %s", name, id, err) } } @@ -187,8 +194,9 @@ func testAccCheckVpnGatewayExists(n string, vpn *vpc.DescribeVpnGatewayResponse) return fmt.Errorf("No VPN ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeVpnGateway(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} + instance, err := vpnGatewayService.DescribeVpnGateway(rs.Primary.ID) if err != nil { return err @@ -200,14 +208,15 @@ func testAccCheckVpnGatewayExists(n string, vpn *vpc.DescribeVpnGatewayResponse) } func testAccCheckVpnGatewayDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpnGatewayService := VpnGatewayService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_vpn" { continue } - instance, err := client.DescribeVpnGateway(rs.Primary.ID) + instance, err := vpnGatewayService.DescribeVpnGateway(rs.Primary.ID) if err != nil { if NotFoundError(err) { diff --git a/alicloud/resource_alicloud_vroute_entry.go b/alicloud/resource_alicloud_vroute_entry.go index 5a4ff163ee0..83c07b71af2 100644 --- a/alicloud/resource_alicloud_vroute_entry.go +++ b/alicloud/resource_alicloud_vroute_entry.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunRouteEntry() *schema.Resource { @@ -52,14 +53,15 @@ func resourceAliyunRouteEntry() *schema.Resource { } func resourceAliyunRouteEntryCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} rtId := d.Get("route_table_id").(string) cidr := d.Get("destination_cidrblock").(string) nt := d.Get("nexthop_type").(string) ni := d.Get("nexthop_id").(string) - table, err := meta.(*AliyunClient).QueryRouteTableById(rtId) + table, err := vpcService.QueryRouteTableById(rtId) if err != nil { if NotFoundError(err) { @@ -72,11 +74,14 @@ func resourceAliyunRouteEntryCreate(d *schema.ResourceData, meta interface{}) er err = resource.Retry(3*time.Minute, func() *resource.RetryError { - if err := client.WaitForAllRouteEntries(rtId, Available, DefaultTimeout); err != nil { + if err := vpcService.WaitForAllRouteEntries(rtId, Available, DefaultTimeout); err != nil { return resource.NonRetryableError(fmt.Errorf("WaitFor route entries got error: %#v", err)) } args := *request - if _, err := client.vpcconn.CreateRouteEntry(&args); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateRouteEntry(&args) + }) + if err != nil { // Route Entry does not support concurrence when creating or deleting it; // Route Entry does not support creating or deleting within 5 seconds frequently // It must ensure all the route entries and vswitches' status must be available before creating or deleting route entry. @@ -85,7 +90,7 @@ func resourceAliyunRouteEntryCreate(d *schema.ResourceData, meta interface{}) er return resource.RetryableError(fmt.Errorf("Create route entry timeout and got an error: %#v", err)) } if IsExceptedError(err, RouterEntryConflictDuplicated) { - en, err := client.QueryRouteEntry(rtId, cidr, nt, ni) + en, err := vpcService.QueryRouteEntry(rtId, cidr, nt, ni) if err != nil { return resource.NonRetryableError(err) } @@ -104,14 +109,15 @@ func resourceAliyunRouteEntryCreate(d *schema.ResourceData, meta interface{}) er d.SetId(rtId + ":" + table.VRouterId + ":" + cidr + ":" + nt + ":" + ni) - if err := client.WaitForAllRouteEntries(rtId, Available, DefaultTimeout); err != nil { + if err := vpcService.WaitForAllRouteEntries(rtId, Available, DefaultTimeout); err != nil { return fmt.Errorf("WaitFor route entry got error: %#v", err) } return resourceAliyunRouteEntryRead(d, meta) } func resourceAliyunRouteEntryRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} parts := strings.Split(d.Id(), ":") rtId := parts[0] rId := parts[1] @@ -119,7 +125,7 @@ func resourceAliyunRouteEntryRead(d *schema.ResourceData, meta interface{}) erro nexthop_type := parts[3] nexthop_id := parts[4] - en, err := client.QueryRouteEntry(rtId, cidr, nexthop_type, nexthop_id) + en, err := vpcService.QueryRouteEntry(rtId, cidr, nexthop_type, nexthop_id) if err != nil { if NotFoundError(err) { @@ -143,7 +149,8 @@ func resourceAliyunRouteEntryDelete(d *schema.ResourceData, meta interface{}) er if err != nil { return err } - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} parts := strings.Split(d.Id(), ":") rtId := parts[0] cidr := parts[2] @@ -151,7 +158,7 @@ func resourceAliyunRouteEntryDelete(d *schema.ResourceData, meta interface{}) er nexthop_id := parts[4] return resource.Retry(5*time.Minute, func() *resource.RetryError { - en, err := client.QueryRouteEntry(rtId, cidr, nexthop_type, nexthop_id) + en, err := vpcService.QueryRouteEntry(rtId, cidr, nexthop_type, nexthop_id) if err != nil { if NotFoundError(err) { return nil @@ -163,7 +170,10 @@ func resourceAliyunRouteEntryDelete(d *schema.ResourceData, meta interface{}) er return resource.RetryableError(fmt.Errorf("Delete route entry timeout and got an error: %#v.", err)) } - if _, err := client.vpcconn.DeleteRouteEntry(args); err != nil { + _, err = client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteRouteEntry(args) + }) + if err != nil { if IsExceptedErrors(err, []string{IncorrectVpcStatus, TaskConflict, IncorrectRouteEntryStatus, RouterEntryForbbiden, UnknownError}) { // Route Entry does not support creating or deleting within 5 seconds frequently time.Sleep(5 * time.Second) diff --git a/alicloud/resource_alicloud_vroute_entry_test.go b/alicloud/resource_alicloud_vroute_entry_test.go index 69f39c47181..847262e0f0e 100644 --- a/alicloud/resource_alicloud_vroute_entry_test.go +++ b/alicloud/resource_alicloud_vroute_entry_test.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func TestAccAlicloudRouteEntry_Basic(t *testing.T) { @@ -67,9 +68,10 @@ func TestAccAlicloudRouteEntry_RouteInterface(t *testing.T) { } func testAccCheckRouteTableExists(rtId string, t *vpc.RouteTable) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} //query route table - rt, terr := client.QueryRouteTableById(rtId) + rt, terr := vpcService.QueryRouteTableById(rtId) if terr != nil { return terr @@ -84,9 +86,10 @@ func testAccCheckRouteTableExists(rtId string, t *vpc.RouteTable) error { } func testAccCheckRouteEntryExists(routeTableId, cidrBlock, nextHopType, nextHopId string, e *vpc.RouteEntry) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} //query route table entry - re, rerr := client.QueryRouteEntry(routeTableId, cidrBlock, nextHopType, nextHopId) + re, rerr := vpcService.QueryRouteEntry(routeTableId, cidrBlock, nextHopType, nextHopId) if rerr != nil { return rerr @@ -122,7 +125,8 @@ func testAccCheckRouteTableEntryExists(n string, t *vpc.RouteTable, e *vpc.Route } func testAccCheckRouteEntryDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} for _, rs := range s.RootModule().Resources { if rs.Type == "alicloud_route_entry" || rs.Type != "alicloud_route_entry" { @@ -130,7 +134,7 @@ func testAccCheckRouteEntryDestroy(s *terraform.State) error { } parts := strings.Split(rs.Primary.ID, ":") - entry, err := client.QueryRouteEntry(parts[0], parts[2], parts[3], parts[4]) + entry, err := vpcService.QueryRouteEntry(parts[0], parts[2], parts[3], parts[4]) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_vroute_table.go b/alicloud/resource_alicloud_vroute_table.go index 739f8ee46b4..4ec13d00ad0 100644 --- a/alicloud/resource_alicloud_vroute_table.go +++ b/alicloud/resource_alicloud_vroute_table.go @@ -8,6 +8,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunRouteTable() *schema.Resource { @@ -53,23 +54,27 @@ func resourceAliyunRouteTable() *schema.Resource { } func resourceAliyunRouteTableCreate(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + routeTableService := RouteTableService{client} request := vpc.CreateCreateRouteTableRequest() - request.RegionId = getRegionId(d, meta) + request.RegionId = client.RegionId request.VpcId = d.Get("vpc_id").(string) request.RouteTableName = d.Get("name").(string) request.Description = d.Get("description").(string) request.ClientToken = buildClientToken("TF-AllocateRouteTable") - routeTable, err := client.vpcconn.CreateRouteTable(request) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateRouteTable(request) + }) if err != nil { return err } + routeTable, _ := raw.(*vpc.CreateRouteTableResponse) d.SetId(routeTable.RouteTableId) - if err := client.WaitForRouteTable(routeTable.RouteTableId, DefaultTimeout); err != nil { + if err := routeTableService.WaitForRouteTable(routeTable.RouteTableId, DefaultTimeout); err != nil { return fmt.Errorf("Wait for route table got error: %#v", err) } @@ -77,9 +82,10 @@ func resourceAliyunRouteTableCreate(d *schema.ResourceData, meta interface{}) er } func resourceAliyunRouteTableRead(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + routeTableService := RouteTableService{client} - resp, err := client.DescribeRouteTable(d.Id()) + resp, err := routeTableService.DescribeRouteTable(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") @@ -96,6 +102,7 @@ func resourceAliyunRouteTableRead(d *schema.ResourceData, meta interface{}) erro } func resourceAliyunRouteTableUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) update := false request := vpc.CreateModifyRouteTableAttributesRequest() @@ -112,7 +119,10 @@ func resourceAliyunRouteTableUpdate(d *schema.ResourceData, meta interface{}) er } if update { - if _, err := meta.(*AliyunClient).vpcconn.ModifyRouteTableAttributes(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyRouteTableAttributes(request) + }) + if err != nil { return err } } @@ -121,17 +131,20 @@ func resourceAliyunRouteTableUpdate(d *schema.ResourceData, meta interface{}) er } func resourceAliyunRouteTableDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + routeTableService := RouteTableService{client} request := vpc.CreateDeleteRouteTableRequest() request.RouteTableId = d.Id() return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.vpcconn.DeleteRouteTable(request) + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteRouteTable(request) + }) if err != nil { return resource.NonRetryableError(err) } - if _, err := client.DescribeRouteTable(d.Id()); err != nil { + if _, err := routeTableService.DescribeRouteTable(d.Id()); err != nil { if NotFoundError(err) { return nil } diff --git a/alicloud/resource_alicloud_vroute_table_test.go b/alicloud/resource_alicloud_vroute_table_test.go index 74b81322931..d341ec05e40 100644 --- a/alicloud/resource_alicloud_vroute_table_test.go +++ b/alicloud/resource_alicloud_vroute_table_test.go @@ -11,6 +11,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -25,11 +26,11 @@ func init() { } func testSweepRouteTable(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -38,14 +39,17 @@ func testSweepRouteTable(region string) error { var routeTables []vpc.RouterTableListType req := vpc.CreateDescribeRouteTableListRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.vpcconn.DescribeRouteTableList(req) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeRouteTableList(req) + }) if err != nil { return fmt.Errorf("Error retrieving RouteTables: %s", err) } + resp, _ := raw.(*vpc.DescribeRouteTableListResponse) if resp == nil || len(resp.RouterTableList.RouterTableListType) < 1 { break } @@ -79,7 +83,10 @@ func testSweepRouteTable(region string) error { log.Printf("[INFO] Deleting Route Table: %s (%s)", name, id) req := vpc.CreateDeleteRouteTableRequest() req.RouteTableId = id - if _, err := conn.vpcconn.DeleteRouteTable(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteRouteTable(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete Route Table (%s (%s)): %s", name, id, err) } } @@ -122,8 +129,9 @@ func testAccCheckRouteTableListExists(n string, routeTable *vpc.DescribeRouteTab if rs.Primary.ID == "" { return fmt.Errorf("No Route Table ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeRouteTable(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + routeTableService := RouteTableService{client} + instance, err := routeTableService.DescribeRouteTable(rs.Primary.ID) if err != nil { return err } @@ -136,12 +144,13 @@ func testAccCheckRouteTableListExists(n string, routeTable *vpc.DescribeRouteTab } func testAccCheckRouteTableDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + routeTableService := RouteTableService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_route_table" { continue } - instance, err := client.DescribeRouteTable(rs.Primary.ID) + instance, err := routeTableService.DescribeRouteTable(rs.Primary.ID) if err != nil { if NotFoundError(err) { continue diff --git a/alicloud/resource_alicloud_vswitch.go b/alicloud/resource_alicloud_vswitch.go index 0ad345f2a74..717acc5d5f1 100644 --- a/alicloud/resource_alicloud_vswitch.go +++ b/alicloud/resource_alicloud_vswitch.go @@ -7,6 +7,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func resourceAliyunSubnet() *schema.Resource { @@ -49,8 +50,8 @@ func resourceAliyunSubnet() *schema.Resource { } func resourceAliyunSwitchCreate(d *schema.ResourceData, meta interface{}) error { - - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} var vswitchID string request, err := buildAliyunSwitchArgs(d, meta) @@ -59,7 +60,9 @@ func resourceAliyunSwitchCreate(d *schema.ResourceData, meta interface{}) error } if err := resource.Retry(5*time.Minute, func() *resource.RetryError { args := *request - resp, err := client.vpcconn.CreateVSwitch(&args) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.CreateVSwitch(&args) + }) if err != nil { if IsExceptedErrors(err, []string{TaskConflict, UnknownError, InvalidStatusRouteEntry, InvalidCidrBlockOverlapped, Throttling}) { @@ -68,6 +71,7 @@ func resourceAliyunSwitchCreate(d *schema.ResourceData, meta interface{}) error } return resource.NonRetryableError(err) } + resp, _ := raw.(*vpc.CreateVSwitchResponse) vswitchID = resp.VSwitchId return nil }); err != nil { @@ -76,7 +80,7 @@ func resourceAliyunSwitchCreate(d *schema.ResourceData, meta interface{}) error d.SetId(vswitchID) - if err := client.WaitForVSwitch(vswitchID, Available, 300); err != nil { + if err := vpcService.WaitForVSwitch(vswitchID, Available, 300); err != nil { return fmt.Errorf("WaitForVSwitchAvailable got a error: %s", err) } @@ -84,8 +88,10 @@ func resourceAliyunSwitchCreate(d *schema.ResourceData, meta interface{}) error } func resourceAliyunSwitchRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} - vswitch, err := meta.(*AliyunClient).DescribeVswitch(d.Id()) + vswitch, err := vpcService.DescribeVswitch(d.Id()) if err != nil { if NotFoundError(err) { @@ -105,6 +111,7 @@ func resourceAliyunSwitchRead(d *schema.ResourceData, meta interface{}) error { } func resourceAliyunSwitchUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*connectivity.AliyunClient) d.Partial(true) @@ -126,7 +133,10 @@ func resourceAliyunSwitchUpdate(d *schema.ResourceData, meta interface{}) error attributeUpdate = true } if attributeUpdate { - if _, err := meta.(*AliyunClient).vpcconn.ModifyVSwitchAttribute(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ModifyVSwitchAttribute(request) + }) + if err != nil { return err } @@ -138,12 +148,16 @@ func resourceAliyunSwitchUpdate(d *schema.ResourceData, meta interface{}) error } func resourceAliyunSwitchDelete(d *schema.ResourceData, meta interface{}) error { - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + vpcService := VpcService{client} request := vpc.CreateDeleteVSwitchRequest() request.VSwitchId = d.Id() return resource.Retry(6*time.Minute, func() *resource.RetryError { - if _, err := client.vpcconn.DeleteVSwitch(request); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteVSwitch(request) + }) + if err != nil { if IsExceptedError(err, VswitcInvalidRegionId) { return resource.NonRetryableError(err) } @@ -154,7 +168,7 @@ func resourceAliyunSwitchDelete(d *schema.ResourceData, meta interface{}) error return resource.RetryableError(fmt.Errorf("Delete vswitch timeout and got an error: %#v.", err)) } - if _, err := client.DescribeVswitch(d.Id()); err != nil { + if _, err := vpcService.DescribeVswitch(d.Id()); err != nil { if NotFoundError(err) { return nil } @@ -166,17 +180,17 @@ func resourceAliyunSwitchDelete(d *schema.ResourceData, meta interface{}) error } func buildAliyunSwitchArgs(d *schema.ResourceData, meta interface{}) (*vpc.CreateVSwitchRequest, error) { - - client := meta.(*AliyunClient) + client := meta.(*connectivity.AliyunClient) + ecsService := EcsService{client} zoneID := Trim(d.Get("availability_zone").(string)) - zone, err := client.DescribeZone(zoneID) + zone, err := ecsService.DescribeZone(zoneID) if err != nil { return nil, err } - err = client.ResourceAvailable(zone, ResourceTypeVSwitch) + err = ecsService.ResourceAvailable(zone, ResourceTypeVSwitch) if err != nil { return nil, err } diff --git a/alicloud/resource_alicloud_vswitch_test.go b/alicloud/resource_alicloud_vswitch_test.go index dc25f4842d7..c54d955250b 100644 --- a/alicloud/resource_alicloud_vswitch_test.go +++ b/alicloud/resource_alicloud_vswitch_test.go @@ -10,6 +10,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func init() { @@ -33,11 +34,11 @@ func init() { } func testSweepVSwitches(region string) error { - client, err := sharedClientForRegion(region) + rawClient, err := sharedClientForRegion(region) if err != nil { return fmt.Errorf("error getting Alicloud client: %s", err) } - conn := client.(*AliyunClient) + client := rawClient.(*connectivity.AliyunClient) prefixes := []string{ "tf-testAcc", @@ -49,14 +50,17 @@ func testSweepVSwitches(region string) error { var vswitches []vpc.VSwitch req := vpc.CreateDescribeVSwitchesRequest() - req.RegionId = conn.RegionId + req.RegionId = client.RegionId req.PageSize = requests.NewInteger(PageSizeLarge) req.PageNumber = requests.NewInteger(1) for { - resp, err := conn.vpcconn.DescribeVSwitches(req) + raw, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVSwitches(req) + }) if err != nil { return fmt.Errorf("Error retrieving VSwitches: %s", err) } + resp, _ := raw.(*vpc.DescribeVSwitchesResponse) if resp == nil || len(resp.VSwitches.VSwitch) < 1 { break } @@ -90,7 +94,10 @@ func testSweepVSwitches(region string) error { log.Printf("[INFO] Deleting VSwitch: %s (%s)", name, id) req := vpc.CreateDeleteVSwitchRequest() req.VSwitchId = id - if _, err := conn.vpcconn.DeleteVSwitch(req); err != nil { + _, err := client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeleteVSwitch(req) + }) + if err != nil { log.Printf("[ERROR] Failed to delete VSwitch (%s (%s)): %s", name, id, err) } } @@ -165,8 +172,9 @@ func testAccCheckVswitchExists(n string, vsw *vpc.DescribeVSwitchAttributesRespo return fmt.Errorf("No Vswitch ID is set") } - client := testAccProvider.Meta().(*AliyunClient) - instance, err := client.DescribeVswitch(rs.Primary.ID) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} + instance, err := vpcService.DescribeVswitch(rs.Primary.ID) if err != nil { return err @@ -178,7 +186,8 @@ func testAccCheckVswitchExists(n string, vsw *vpc.DescribeVSwitchAttributesRespo } func testAccCheckVswitchDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*AliyunClient) + client := testAccProvider.Meta().(*connectivity.AliyunClient) + vpcService := VpcService{client} for _, rs := range s.RootModule().Resources { if rs.Type != "alicloud_vswitch" { @@ -186,7 +195,7 @@ func testAccCheckVswitchDestroy(s *terraform.State) error { } // Try to find the Vswitch - if _, err := client.DescribeVswitch(rs.Primary.ID); err != nil { + if _, err := vpcService.DescribeVswitch(rs.Primary.ID); err != nil { if NotFoundError(err) { continue } diff --git a/alicloud/service_alicloud_api_gateway.go b/alicloud/service_alicloud_api_gateway.go index c4827ba2e1a..c52d44b1213 100644 --- a/alicloud/service_alicloud_api_gateway.go +++ b/alicloud/service_alicloud_api_gateway.go @@ -2,19 +2,27 @@ package alicloud import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/cloudapi" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) DescribeApiGroup(groupId string) (apiGroup *cloudapi.DescribeApiGroupResponse, err error) { +type CloudApiService struct { + client *connectivity.AliyunClient +} + +func (s *CloudApiService) DescribeApiGroup(groupId string) (apiGroup *cloudapi.DescribeApiGroupResponse, err error) { req := cloudapi.CreateDescribeApiGroupRequest() req.GroupId = groupId - apiGroup, err = client.cloudapiconn.DescribeApiGroup(req) + raw, err := s.client.WithCloudApiClient(func(cloudApiClient *cloudapi.Client) (interface{}, error) { + return cloudApiClient.DescribeApiGroup(req) + }) if err != nil { if IsExceptedError(err, ApiGroupNotFound) { err = GetNotFoundErrorFromString(GetNotFoundMessage("ApiGroup", groupId)) } return } + apiGroup, _ = raw.(*cloudapi.DescribeApiGroupResponse) if apiGroup == nil || apiGroup.GroupId == "" { err = GetNotFoundErrorFromString(GetNotFoundMessage("ApiGroup", groupId)) } diff --git a/alicloud/service_alicloud_cen.go b/alicloud/service_alicloud_cen.go index ff1530172ad..c1b59845042 100644 --- a/alicloud/service_alicloud_cen.go +++ b/alicloud/service_alicloud_cen.go @@ -7,15 +7,20 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/cbn" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) +type CenService struct { + client *connectivity.AliyunClient +} + const DefaultCenTimeout = 60 const DefaultCenTimeoutLong = 180 const ChildInstanceTypeVpc = "VPC" const ChildInstanceTypeVbr = "VBR" -func (client *AliyunClient) DescribeCenInstance(cenId string) (c cbn.Cen, err error) { +func (s *CenService) DescribeCenInstance(cenId string) (c cbn.Cen, err error) { request := cbn.CreateDescribeCensRequest() values := []string{cenId} @@ -28,7 +33,10 @@ func (client *AliyunClient) DescribeCenInstance(cenId string) (c cbn.Cen, err er invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := client.cenconn.DescribeCens(request) + raw, err := s.client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DescribeCens(request) + }) + resp, _ := raw.(*cbn.DescribeCensResponse) if err != nil { if IsExceptedError(err, ParameterCenInstanceIdNotExist) { return GetNotFoundErrorFromString(GetNotFoundMessage("CEN Instance", cenId)) @@ -45,13 +53,13 @@ func (client *AliyunClient) DescribeCenInstance(cenId string) (c cbn.Cen, err er return } -func (client *AliyunClient) WaitForCenInstance(cenId string, status Status, timeout int) error { +func (s *CenService) WaitForCenInstance(cenId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - cen, err := client.DescribeCenInstance(cenId) + cen, err := s.DescribeCenInstance(cenId) if err != nil { return err } @@ -68,13 +76,16 @@ func (client *AliyunClient) WaitForCenInstance(cenId string, status Status, time return nil } -func (client *AliyunClient) DescribeCenAttachedChildInstanceById(instanceId, cenId string) (c cbn.ChildInstance, err error) { +func (s *CenService) DescribeCenAttachedChildInstanceById(instanceId, cenId string) (c cbn.ChildInstance, err error) { request := cbn.CreateDescribeCenAttachedChildInstancesRequest() request.CenId = cenId for pageNum := 1; ; pageNum++ { request.PageNumber = requests.NewInteger(pageNum) - response, err := client.cenconn.DescribeCenAttachedChildInstances(request) + raw, err := s.client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DescribeCenAttachedChildInstances(request) + }) + response, _ := raw.(*cbn.DescribeCenAttachedChildInstancesResponse) if err != nil { return c, err } @@ -92,13 +103,13 @@ func (client *AliyunClient) DescribeCenAttachedChildInstanceById(instanceId, cen } } -func (client *AliyunClient) WaitForCenChildInstanceAttached(instanceId string, cenId string, status Status, timeout int) error { +func (s *CenService) WaitForCenChildInstanceAttached(instanceId string, cenId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - instance, err := client.DescribeCenAttachedChildInstanceById(instanceId, cenId) + instance, err := s.DescribeCenAttachedChildInstanceById(instanceId, cenId) if err != nil { return err } @@ -115,13 +126,13 @@ func (client *AliyunClient) WaitForCenChildInstanceAttached(instanceId string, c return nil } -func (client *AliyunClient) WaitForCenChildInstanceDetached(instanceId string, cenId string, timeout int) error { +func (s *CenService) WaitForCenChildInstanceDetached(instanceId string, cenId string, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - _, err := client.DescribeCenAttachedChildInstanceById(instanceId, cenId) + _, err := s.DescribeCenAttachedChildInstanceById(instanceId, cenId) if err != nil { if NotFoundError(err) { break @@ -140,11 +151,11 @@ func (client *AliyunClient) WaitForCenChildInstanceDetached(instanceId string, c return nil } -func (client *AliyunClient) DescribeCenBandwidthPackage(cenBwpId string) (c cbn.CenBandwidthPackage, err error) { +func (s *CenService) DescribeCenBandwidthPackage(cenBwpId string) (c cbn.CenBandwidthPackage, err error) { request := cbn.CreateDescribeCenBandwidthPackagesRequest() values := []string{cenBwpId} - filters := []cbn.DescribeCenBandwidthPackagesFilter{cbn.DescribeCenBandwidthPackagesFilter{ + filters := []cbn.DescribeCenBandwidthPackagesFilter{{ Key: "CenBandwidthPackageId", Value: &values, }} @@ -152,13 +163,16 @@ func (client *AliyunClient) DescribeCenBandwidthPackage(cenBwpId string) (c cbn. invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := client.cenconn.DescribeCenBandwidthPackages(request) + raw, err := s.client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DescribeCenBandwidthPackages(request) + }) if err != nil { if IsExceptedError(err, ParameterCenInstanceIdNotExist) { return GetNotFoundErrorFromString(GetNotFoundMessage("CEN Bandwidth Package", cenBwpId)) } return err } + resp, _ := raw.(*cbn.DescribeCenBandwidthPackagesResponse) if resp == nil || len(resp.CenBandwidthPackages.CenBandwidthPackage) <= 0 || resp.CenBandwidthPackages.CenBandwidthPackage[0].CenBandwidthPackageId != cenBwpId { return GetNotFoundErrorFromString(GetNotFoundMessage("CEN Bandwidth Package", cenBwpId)) } @@ -169,13 +183,13 @@ func (client *AliyunClient) DescribeCenBandwidthPackage(cenBwpId string) (c cbn. return } -func (client *AliyunClient) WaitForCenBandwidthPackage(cenBwpId string, status Status, timeout int) error { +func (s *CenService) WaitForCenBandwidthPackage(cenBwpId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - cenBwp, err := client.DescribeCenBandwidthPackage(cenBwpId) + cenBwp, err := s.DescribeCenBandwidthPackage(cenBwpId) if err != nil && !NotFoundError(err) { return err } @@ -192,13 +206,13 @@ func (client *AliyunClient) WaitForCenBandwidthPackage(cenBwpId string, status S return nil } -func (client *AliyunClient) WaitForCenBandwidthPackageUpdate(cenBwpId string, bandwidth int, timeout int) error { +func (s *CenService) WaitForCenBandwidthPackageUpdate(cenBwpId string, bandwidth int, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - cenBwp, err := client.DescribeCenBandwidthPackage(cenBwpId) + cenBwp, err := s.DescribeCenBandwidthPackage(cenBwpId) if err != nil { return err } @@ -216,13 +230,13 @@ func (client *AliyunClient) WaitForCenBandwidthPackageUpdate(cenBwpId string, ba return nil } -func (client *AliyunClient) WaitForCenBandwidthPackageAttachment(cenBwpId string, status Status, timeout int) error { +func (s *CenService) WaitForCenBandwidthPackageAttachment(cenBwpId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - cenBwp, err := client.DescribeCenBandwidthPackage(cenBwpId) + cenBwp, err := s.DescribeCenBandwidthPackage(cenBwpId) if err != nil { return err } @@ -239,8 +253,8 @@ func (client *AliyunClient) WaitForCenBandwidthPackageAttachment(cenBwpId string return nil } -func (client *AliyunClient) DescribeCenBandwidthPackageById(cenBwpId string) (c cbn.CenBandwidthPackage, err error) { - resp, err := client.DescribeCenBandwidthPackage(cenBwpId) +func (s *CenService) DescribeCenBandwidthPackageById(cenBwpId string) (c cbn.CenBandwidthPackage, err error) { + resp, err := s.DescribeCenBandwidthPackage(cenBwpId) if err != nil { return c, err } @@ -252,29 +266,34 @@ func (client *AliyunClient) DescribeCenBandwidthPackageById(cenBwpId string) (c return resp, nil } -func (client *AliyunClient) SetCenInterRegionBandwidthLimit(cenId, localRegionId, oppositeRegionId string, bandwidthLimit int) (err error) { +func (s *CenService) SetCenInterRegionBandwidthLimit(cenId, localRegionId, oppositeRegionId string, bandwidthLimit int) (err error) { request := cbn.CreateSetCenInterRegionBandwidthLimitRequest() request.CenId = cenId request.LocalRegionId = localRegionId request.OppositeRegionId = oppositeRegionId request.BandwidthLimit = requests.NewInteger(bandwidthLimit) - _, err = client.cenconn.SetCenInterRegionBandwidthLimit(request) + _, err = s.client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.SetCenInterRegionBandwidthLimit(request) + }) return err } -func (client *AliyunClient) DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId string) (c cbn.CenInterRegionBandwidthLimit, err error) { +func (s *CenService) DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId string) (c cbn.CenInterRegionBandwidthLimit, err error) { request := cbn.CreateDescribeCenInterRegionBandwidthLimitsRequest() request.CenId = cenId for pageNum := 1; ; pageNum++ { request.PageNumber = requests.NewInteger(pageNum) request.PageSize = requests.NewInteger(PageSizeLarge) - resp, err := client.cenconn.DescribeCenInterRegionBandwidthLimits(request) + raw, err := s.client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DescribeCenInterRegionBandwidthLimits(request) + }) if err != nil { return c, err } + resp, _ := raw.(*cbn.DescribeCenInterRegionBandwidthLimitsResponse) cenBandwidthLimitList := resp.CenInterRegionBandwidthLimits.CenInterRegionBandwidthLimit for limitNum := 0; limitNum <= len(cenBandwidthLimitList)-1; limitNum++ { @@ -293,13 +312,13 @@ func (client *AliyunClient) DescribeCenBandwidthLimit(cenId, localRegionId, oppo } } -func (client *AliyunClient) WaitForCenInterRegionBandwidthLimitActive(cenId string, localRegionId string, oppositeRegionId string, timeout int) error { +func (s *CenService) WaitForCenInterRegionBandwidthLimitActive(cenId string, localRegionId string, oppositeRegionId string, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - cenBandwidthLimit, err := client.DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId) + cenBandwidthLimit, err := s.DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId) if err != nil { return err } @@ -318,13 +337,13 @@ func (client *AliyunClient) WaitForCenInterRegionBandwidthLimitActive(cenId stri return nil } -func (client *AliyunClient) WaitForCenInterRegionBandwidthLimitDestroy(cenId string, localRegionId string, oppositeRegionId string, timeout int) error { +func (s *CenService) WaitForCenInterRegionBandwidthLimitDestroy(cenId string, localRegionId string, oppositeRegionId string, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - _, err := client.DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId) + _, err := s.DescribeCenBandwidthLimit(cenId, localRegionId, oppositeRegionId) if err != nil { if NotFoundError(err) { break @@ -342,9 +361,11 @@ func (client *AliyunClient) WaitForCenInterRegionBandwidthLimitDestroy(cenId str return nil } -func (client *AliyunClient) createCenRouteEntryParas(vtbId string) (childInstanceId string, instanceType string, err error) { +func (s *CenService) CreateCenRouteEntryParas(vtbId string) (childInstanceId string, instanceType string, err error) { + vpcService := VpcService{s.client} + routeTableService := RouteTableService{s.client} //Query VRouterId and judge whether it is a vbr - vtb1, err := client.QueryRouteTableById(vtbId) + vtb1, err := vpcService.QueryRouteTableById(vtbId) if err != nil { return childInstanceId, instanceType, err } @@ -353,14 +374,14 @@ func (client *AliyunClient) createCenRouteEntryParas(vtbId string) (childInstanc return vtb1.VRouterId, ChildInstanceTypeVbr, nil } //if the VRouterId belonged to a VPC, get the VPC ID - vtb2, err := client.DescribeRouteTable(vtbId) + vtb2, err := routeTableService.DescribeRouteTable(vtbId) if err != nil { return childInstanceId, instanceType, err } return vtb2.VpcId, ChildInstanceTypeVpc, nil } -func (client *AliyunClient) DescribePublishedRouteEntriesById(id string) (c cbn.PublishedRouteEntry, err error) { +func (s *CenService) DescribePublishedRouteEntriesById(id string) (c cbn.PublishedRouteEntry, err error) { parts := strings.Split(id, COLON_SEPARATED) if len(parts) != 3 { return c, fmt.Errorf("invalid resource id") @@ -369,7 +390,7 @@ func (client *AliyunClient) DescribePublishedRouteEntriesById(id string) (c cbn. vtbId := parts[1] cidr := parts[2] - childInstanceId, childInstanceType, err := client.createCenRouteEntryParas(vtbId) + childInstanceId, childInstanceType, err := s.CreateCenRouteEntryParas(vtbId) if err != nil { return c, err } @@ -378,19 +399,22 @@ func (client *AliyunClient) DescribePublishedRouteEntriesById(id string) (c cbn. request.CenId = cenId request.ChildInstanceId = childInstanceId request.ChildInstanceType = childInstanceType - request.ChildInstanceRegionId = client.RegionId + request.ChildInstanceRegionId = s.client.RegionId request.ChildInstanceRouteTableId = vtbId request.DestinationCidrBlock = cidr invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := client.cenconn.DescribePublishedRouteEntries(request) + raw, err := s.client.WithCenClient(func(cbnClient *cbn.Client) (interface{}, error) { + return cbnClient.DescribePublishedRouteEntries(request) + }) if err != nil { if IsExceptedErrors(err, []string{ParameterIllegal, ParameterIllegalCenInstanceId, InstanceNotExist}) { return GetNotFoundErrorFromString(GetNotFoundMessage("CEN RouteEntries", id)) } return err } + resp, _ := raw.(*cbn.DescribePublishedRouteEntriesResponse) if resp == nil || len(resp.PublishedRouteEntries.PublishedRouteEntry) <= 0 { return GetNotFoundErrorFromString(GetNotFoundMessage("CEN RouteEntries", id)) } @@ -402,13 +426,13 @@ func (client *AliyunClient) DescribePublishedRouteEntriesById(id string) (c cbn. return } -func (client *AliyunClient) WaitForRouterEntryPublished(id string, status Status, timeout int) error { +func (s *CenService) WaitForRouterEntryPublished(id string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - routeEntry, err := client.DescribePublishedRouteEntriesById(id) + routeEntry, err := s.DescribePublishedRouteEntriesById(id) if err != nil { return nil } @@ -427,7 +451,7 @@ func (client *AliyunClient) WaitForRouterEntryPublished(id string, status Status return nil } -func getCenIdAndAnotherId(id string) (string, string, error) { +func (s *CenService) GetCenIdAndAnotherId(id string) (string, string, error) { parts := strings.Split(id, COLON_SEPARATED) if len(parts) != 2 { @@ -437,7 +461,7 @@ func getCenIdAndAnotherId(id string) (string, string, error) { return parts[0], parts[1], nil } -func getCenAndRegionIds(id string) (retString []string, err error) { +func (s *CenService) GetCenAndRegionIds(id string) (retString []string, err error) { parts := strings.Split(id, COLON_SEPARATED) if len(parts) != 3 { @@ -447,7 +471,7 @@ func getCenAndRegionIds(id string) (retString []string, err error) { return parts, nil } -func getCenInstanceType(id string) (c string, e error) { +func (s *CenService) GetCenInstanceType(id string) (c string, e error) { if strings.HasPrefix(id, "vpc") { return ChildInstanceTypeVpc, nil } else if strings.HasPrefix(id, "vbr") { diff --git a/alicloud/service_alicloud_cms.go b/alicloud/service_alicloud_cms.go index d0e3dd2cac3..5eb762f3b4a 100644 --- a/alicloud/service_alicloud_cms.go +++ b/alicloud/service_alicloud_cms.go @@ -7,32 +7,38 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/cms" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func BuildCmsCommonRequest(region string) *requests.CommonRequest { +type CmsService struct { + client *connectivity.AliyunClient +} +func (s *CmsService) BuildCmsCommonRequest(region string) *requests.CommonRequest { request := requests.NewCommonRequest() - return request } -func (client *AliyunClient) BuildCmsAlarmRequest(id string) *requests.CommonRequest { +func (s *CmsService) BuildCmsAlarmRequest(id string) *requests.CommonRequest { - request := BuildCmsCommonRequest(client.RegionId) + request := s.BuildCmsCommonRequest(s.client.RegionId) request.QueryParams["Id"] = id return request } -func (client *AliyunClient) DescribeAlarm(id string) (alarm cms.AlarmInListAlarm, err error) { +func (s *CmsService) DescribeAlarm(id string) (alarm cms.AlarmInListAlarm, err error) { request := cms.CreateListAlarmRequest() request.Id = id - response, err := client.cmsconn.ListAlarm(request) + raw, err := s.client.WithCmsClient(func(cmsClient *cms.Client) (interface{}, error) { + return cmsClient.ListAlarm(request) + }) if err != nil { return alarm, err } + response, _ := raw.(*cms.ListAlarmResponse) if len(response.AlarmList.Alarm) < 1 { return alarm, GetNotFoundErrorFromString(GetNotFoundMessage("Alarm Rule", id)) @@ -41,13 +47,13 @@ func (client *AliyunClient) DescribeAlarm(id string) (alarm cms.AlarmInListAlarm return response.AlarmList.Alarm[0], nil } -func (client *AliyunClient) WaitForCmsAlarm(id string, enabled bool, timeout int) error { +func (s *CmsService) WaitForCmsAlarm(id string, enabled bool, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - alarm, err := client.DescribeAlarm(id) + alarm, err := s.DescribeAlarm(id) if err != nil { return err } diff --git a/alicloud/service_alicloud_common.go b/alicloud/service_alicloud_common.go deleted file mode 100644 index 8b9acb31c36..00000000000 --- a/alicloud/service_alicloud_common.go +++ /dev/null @@ -1,134 +0,0 @@ -package alicloud - -import ( - "bytes" - "encoding/json" - "log" - - "io/ioutil" - - "fmt" - "strings" - - "github.com/aliyun/alibaba-cloud-sdk-go/services/sts" - "github.com/denverdino/aliyungo/common" - "github.com/denverdino/aliyungo/location" - "github.com/mitchellh/go-homedir" - "gopkg.in/yaml.v2" -) - -func CompareJsonTemplateAreEquivalent(tem1, tem2 string) (bool, error) { - var obj1 interface{} - err := json.Unmarshal([]byte(tem1), &obj1) - if err != nil { - return false, err - } - - canonicalJson1, _ := json.Marshal(obj1) - - var obj2 interface{} - err = json.Unmarshal([]byte(tem2), &obj2) - if err != nil { - return false, err - } - - canonicalJson2, _ := json.Marshal(obj2) - - equal := bytes.Compare(canonicalJson1, canonicalJson2) == 0 - if !equal { - log.Printf("[DEBUG] Canonical template are not equal.\nFirst: %s\nSecond: %s\n", - canonicalJson1, canonicalJson2) - } - return equal, nil -} - -func CompareYmalTemplateAreEquivalent(tem1, tem2 string) (bool, error) { - var obj1 interface{} - err := yaml.Unmarshal([]byte(tem1), &obj1) - if err != nil { - return false, err - } - - canonicalYaml1, _ := yaml.Marshal(obj1) - - var obj2 interface{} - err = yaml.Unmarshal([]byte(tem2), &obj2) - if err != nil { - return false, err - } - - canonicalYaml2, _ := yaml.Marshal(obj2) - - equal := bytes.Compare(canonicalYaml1, canonicalYaml2) == 0 - if !equal { - log.Printf("[DEBUG] Canonical template are not equal.\nFirst: %s\nSecond: %s\n", - canonicalYaml1, canonicalYaml2) - } - return equal, nil -} - -// loadFileContent returns contents of a file in a given path -func loadFileContent(v string) ([]byte, error) { - filename, err := homedir.Expand(v) - if err != nil { - return nil, err - } - fileContent, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return fileContent, nil -} - -func (client *AliyunClient) DescribeEndpointByCode(region string, code ServiceCode) (string, error) { - endpointClient := location.NewClient(client.AccessKey, client.SecretKey) - endpointClient.SetSecurityToken(client.SecurityToken) - args := &location.DescribeEndpointsArgs{ - Id: common.Region(region), - ServiceCode: strings.ToLower(string(code)), - Type: "openAPI", - } - invoker := NewInvoker() - var endpoints *location.DescribeEndpointsResponse - if err := invoker.Run(func() error { - es, err := endpointClient.DescribeEndpoints(args) - if err != nil { - return err - } - endpoints = es - return nil - }); err != nil { - return "", fmt.Errorf("Describe %s endpoint using region: %#v got an error: %#v.", code, client.RegionId, err) - } - endpointItem := endpoints.Endpoints.Endpoint - var endpoint string - if endpointItem == nil || len(endpointItem) <= 0 { - log.Printf("Cannot find endpoint in the region: %#v", client.RegionId) - endpoint = "" - } else { - endpoint = endpointItem[0].Endpoint - } - - return endpoint, nil -} - -func (client *AliyunClient) GetCallerIdentity() (*sts.GetCallerIdentityResponse, error) { - args := sts.CreateGetCallerIdentityRequest() - args.Scheme = "https" - - var identityResponse *sts.GetCallerIdentityResponse - - invoker := NewInvoker() - err := invoker.Run(func() error { - identity, err := client.stsconn.GetCallerIdentity(args) - if err != nil { - return err - } - if identity == nil { - return GetNotFoundErrorFromString("Caller identity not found.") - } - identityResponse = identity - return nil - }) - return identityResponse, err -} diff --git a/alicloud/service_alicloud_cs.go b/alicloud/service_alicloud_cs.go index 26648b7d2af..3a021e977e9 100644 --- a/alicloud/service_alicloud_cs.go +++ b/alicloud/service_alicloud_cs.go @@ -6,18 +6,25 @@ import ( "time" "github.com/denverdino/aliyungo/cs" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) GetContainerClusterByName(name string) (cluster cs.ClusterType, err error) { +type CsService struct { + client *connectivity.AliyunClient +} + +func (s *CsService) GetContainerClusterByName(name string) (cluster cs.ClusterType, err error) { name = Trim(name) invoker := NewInvoker() var clusters []cs.ClusterType err = invoker.Run(func() error { - resp, e := client.csconn.DescribeClusters(name) + raw, e := s.client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.DescribeClusters(name) + }) if e != nil { return e } - clusters = resp + clusters, _ = raw.([]cs.ClusterType) return nil }) @@ -37,44 +44,41 @@ func (client *AliyunClient) GetContainerClusterByName(name string) (cluster cs.C return cluster, GetNotFoundErrorFromString(GetNotFoundMessage("Container Cluster", name)) } -func (client *AliyunClient) GetApplicationClientByClusterName(name string) (c *cs.ProjectClient, err error) { - cluster, err := client.GetContainerClusterByName(name) +func (s *CsService) GetContainerClusterAndCertsByName(name string) (*cs.ClusterType, *cs.ClusterCerts, error) { + cluster, err := s.GetContainerClusterByName(name) if err != nil { - return nil, err + return nil, nil, err } var certs cs.ClusterCerts invoker := NewInvoker() err = invoker.Run(func() error { - c, e := client.csconn.GetClusterCerts(cluster.ClusterID) + raw, e := s.client.WithCsClient(func(csClient *cs.Client) (interface{}, error) { + return csClient.GetClusterCerts(cluster.ClusterID) + }) if e != nil { return e } - certs = c + certs, _ = raw.(cs.ClusterCerts) return nil }) if err != nil { - return - } - - c, err = cs.NewProjectClient(cluster.ClusterID, cluster.MasterURL, certs) - - if err != nil { - return nil, fmt.Errorf("Getting Application Client failed by cluster id %s: %#v.", cluster.ClusterID, err) + return nil, nil, err } - c.SetDebug(false) - c.SetUserAgent(getUserAgent()) - return + return &cluster, &certs, nil } -func (client *AliyunClient) DescribeContainerApplication(clusterName, appName string) (app cs.GetProjectResponse, err error) { +func (s *CsService) DescribeContainerApplication(clusterName, appName string) (app cs.GetProjectResponse, err error) { appName = Trim(appName) - conn, err := client.GetApplicationClientByClusterName(clusterName) + cluster, certs, err := s.GetContainerClusterAndCertsByName(appName) if err != nil { return app, err } - app, err = conn.GetProject(appName) + raw, err := s.client.WithCsProjectClient(cluster.ClusterID, cluster.MasterURL, *certs, func(csProjectClient *cs.ProjectClient) (interface{}, error) { + return csProjectClient.GetProject(appName) + }) + app, _ = raw.(cs.GetProjectResponse) if err != nil { if IsExceptedError(err, ApplicationNotFound) { return app, GetNotFoundErrorFromString(GetNotFoundMessage("Container Application", appName)) @@ -87,13 +91,13 @@ func (client *AliyunClient) DescribeContainerApplication(clusterName, appName st return } -func (client *AliyunClient) WaitForContainerApplication(clusterName, appName string, status Status, timeout int) error { +func (s *CsService) WaitForContainerApplication(clusterName, appName string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - app, err := client.DescribeContainerApplication(clusterName, appName) + app, err := s.DescribeContainerApplication(clusterName, appName) if err != nil { return err } diff --git a/alicloud/service_alicloud_ecs.go b/alicloud/service_alicloud_ecs.go index f55ed3e9cb9..9f9979bca3f 100644 --- a/alicloud/service_alicloud_ecs.go +++ b/alicloud/service_alicloud_ecs.go @@ -12,16 +12,46 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) +type EcsService struct { + client *connectivity.AliyunClient +} + +func (s *EcsService) JudgeRegionValidation(key, region string) error { + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeRegions(ecs.CreateDescribeRegionsRequest()) + }) + if err != nil { + return fmt.Errorf("DescribeRegions got an error: %#v", err) + } + resp, _ := raw.(*ecs.DescribeRegionsResponse) + if resp == nil || len(resp.Regions.Region) < 1 { + return GetNotFoundErrorFromString("There is no any available region.") + } + + var rs []string + for _, v := range resp.Regions.Region { + if v.RegionId == region { + return nil + } + rs = append(rs, v.RegionId) + } + return fmt.Errorf("'%s' is invalid. Expected on %v.", key, strings.Join(rs, ", ")) +} + // DescribeZone validate zoneId is valid in region -func (client *AliyunClient) DescribeZone(zoneID string) (zone ecs.Zone, err error) { - resp, err := client.ecsconn.DescribeZones(ecs.CreateDescribeZonesRequest()) +func (s *EcsService) DescribeZone(zoneID string) (zone ecs.Zone, err error) { + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeZones(ecs.CreateDescribeZonesRequest()) + }) if err != nil { return } + resp, _ := raw.(*ecs.DescribeZonesResponse) if resp == nil || len(resp.Zones.Zone) < 1 { - return zone, fmt.Errorf("There is no any availability zone in region %s.", client.RegionId) + return zone, fmt.Errorf("There is no any availability zone in region %s.", s.client.RegionId) } zoneIds := []string{} @@ -31,17 +61,20 @@ func (client *AliyunClient) DescribeZone(zoneID string) (zone ecs.Zone, err erro } zoneIds = append(zoneIds, z.ZoneId) } - return zone, fmt.Errorf("availability_zone not exists in range %s, all zones are %s", client.RegionId, zoneIds) + return zone, fmt.Errorf("availability_zone not exists in range %s, all zones are %s", s.client.RegionId, zoneIds) } -func (client *AliyunClient) DescribeInstanceById(id string) (instance ecs.Instance, err error) { +func (s *EcsService) DescribeInstanceById(id string) (instance ecs.Instance, err error) { req := ecs.CreateDescribeInstancesRequest() req.InstanceIds = convertListToJsonString([]interface{}{id}) - resp, err := client.ecsconn.DescribeInstances(req) + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstances(req) + }) if err != nil { return } + resp, _ := raw.(*ecs.DescribeInstancesResponse) if resp == nil || len(resp.Instances.Instance) < 1 { return instance, GetNotFoundErrorFromString(GetNotFoundMessage("Instance", id)) } @@ -49,14 +82,17 @@ func (client *AliyunClient) DescribeInstanceById(id string) (instance ecs.Instan return resp.Instances.Instance[0], nil } -func (client *AliyunClient) DescribeInstanceAttribute(id string) (instance ecs.DescribeInstanceAttributeResponse, err error) { +func (s *EcsService) DescribeInstanceAttribute(id string) (instance ecs.DescribeInstanceAttributeResponse, err error) { req := ecs.CreateDescribeInstanceAttributeRequest() req.InstanceId = id - resp, err := client.ecsconn.DescribeInstanceAttribute(req) + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstanceAttribute(req) + }) if err != nil { return } + resp, _ := raw.(*ecs.DescribeInstanceAttributeResponse) if resp == nil { return instance, GetNotFoundErrorFromString(GetNotFoundMessage("Instance", id)) } @@ -64,15 +100,18 @@ func (client *AliyunClient) DescribeInstanceAttribute(id string) (instance ecs.D return *resp, nil } -func (client *AliyunClient) QueryInstanceSystemDisk(id string) (disk ecs.Disk, err error) { +func (s *EcsService) QueryInstanceSystemDisk(id string) (disk ecs.Disk, err error) { args := ecs.CreateDescribeDisksRequest() args.InstanceId = id args.DiskType = string(DiskTypeSystem) - resp, err := client.ecsconn.DescribeDisks(args) + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeDisks(args) + }) if err != nil { return } + resp, _ := raw.(*ecs.DescribeDisksResponse) if resp != nil && len(resp.Disks.Disk) < 1 { return disk, GetNotFoundErrorFromString(fmt.Sprintf("The specified system disk is not found by instance id %s.", id)) } @@ -81,30 +120,32 @@ func (client *AliyunClient) QueryInstanceSystemDisk(id string) (disk ecs.Disk, e } // ResourceAvailable check resource available for zone -func (client *AliyunClient) ResourceAvailable(zone ecs.Zone, resourceType ResourceType) error { +func (s *EcsService) ResourceAvailable(zone ecs.Zone, resourceType ResourceType) error { for _, res := range zone.AvailableResourceCreation.ResourceTypes { if res == string(resourceType) { return nil } } - return fmt.Errorf("%s is not available in %s zone of %s region", resourceType, zone.ZoneId, client.Region) + return fmt.Errorf("%s is not available in %s zone of %s region", resourceType, zone.ZoneId, s.client.Region) } -func (client *AliyunClient) DiskAvailable(zone ecs.Zone, diskCategory DiskCategory) error { +func (s *EcsService) DiskAvailable(zone ecs.Zone, diskCategory DiskCategory) error { for _, disk := range zone.AvailableDiskCategories.DiskCategories { if disk == string(diskCategory) { return nil } } - return fmt.Errorf("%s is not available in %s zone of %s region", diskCategory, zone.ZoneId, client.Region) + return fmt.Errorf("%s is not available in %s zone of %s region", diskCategory, zone.ZoneId, s.client.Region) } -func (client *AliyunClient) JoinSecurityGroups(instanceId string, securityGroupIds []string) error { +func (s *EcsService) JoinSecurityGroups(instanceId string, securityGroupIds []string) error { req := ecs.CreateJoinSecurityGroupRequest() req.InstanceId = instanceId for _, sid := range securityGroupIds { req.SecurityGroupId = sid - _, err := client.ecsconn.JoinSecurityGroup(req) + _, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.JoinSecurityGroup(req) + }) if err != nil && IsExceptedErrors(err, []string{InvalidInstanceIdAlreadyExists}) { return err } @@ -113,12 +154,14 @@ func (client *AliyunClient) JoinSecurityGroups(instanceId string, securityGroupI return nil } -func (client *AliyunClient) LeaveSecurityGroups(instanceId string, securityGroupIds []string) error { +func (s *EcsService) LeaveSecurityGroups(instanceId string, securityGroupIds []string) error { req := ecs.CreateLeaveSecurityGroupRequest() req.InstanceId = instanceId for _, sid := range securityGroupIds { req.SecurityGroupId = sid - _, err := client.ecsconn.LeaveSecurityGroup(req) + _, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.LeaveSecurityGroup(req) + }) if err != nil && IsExceptedErrors(err, []string{InvalidSecurityGroupIdNotFound}) { return err } @@ -127,14 +170,17 @@ func (client *AliyunClient) LeaveSecurityGroups(instanceId string, securityGroup return nil } -func (client *AliyunClient) DescribeSecurityGroupAttribute(securityGroupId string) (group ecs.DescribeSecurityGroupAttributeResponse, err error) { +func (s *EcsService) DescribeSecurityGroupAttribute(securityGroupId string) (group ecs.DescribeSecurityGroupAttributeResponse, err error) { args := ecs.CreateDescribeSecurityGroupAttributeRequest() args.SecurityGroupId = securityGroupId - resp, err := client.ecsconn.DescribeSecurityGroupAttribute(args) + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeSecurityGroupAttribute(args) + }) if err != nil { return } + resp, _ := raw.(*ecs.DescribeSecurityGroupAttributeResponse) if resp == nil { return group, GetNotFoundErrorFromString(GetNotFoundMessage("Security Group", securityGroupId)) } @@ -142,16 +188,19 @@ func (client *AliyunClient) DescribeSecurityGroupAttribute(securityGroupId strin return *resp, nil } -func (client *AliyunClient) DescribeSecurityGroupRule(groupId, direction, ipProtocol, portRange, nicType, cidr_ip, policy string, priority int) (rule ecs.Permission, err error) { +func (s *EcsService) DescribeSecurityGroupRule(groupId, direction, ipProtocol, portRange, nicType, cidr_ip, policy string, priority int) (rule ecs.Permission, err error) { args := ecs.CreateDescribeSecurityGroupAttributeRequest() args.SecurityGroupId = groupId args.Direction = direction args.NicType = nicType - resp, err := client.ecsconn.DescribeSecurityGroupAttribute(args) + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeSecurityGroupAttribute(args) + }) if err != nil { return } + resp, _ := raw.(*ecs.DescribeSecurityGroupAttributeResponse) if resp == nil { return rule, GetNotFoundErrorFromString(GetNotFoundMessage("Security Group", groupId)) } @@ -178,10 +227,10 @@ func (client *AliyunClient) DescribeSecurityGroupRule(groupId, direction, ipProt } -func (client *AliyunClient) DescribeAvailableResources(d *schema.ResourceData, meta interface{}, destination DestinationResource) (zoneId string, validZones []ecs.AvailableZone, err error) { +func (s *EcsService) DescribeAvailableResources(d *schema.ResourceData, meta interface{}, destination DestinationResource) (zoneId string, validZones []ecs.AvailableZone, err error) { + client := meta.(*connectivity.AliyunClient) // Before creating resources, check input parameters validity according available zone. // If availability zone is nil, it will return all of supported resources in the current. - conn := meta.(*AliyunClient).ecsconn args := ecs.CreateDescribeAvailableResourceRequest() args.DestinationResource = string(destination) args.IoOptimized = string(IOOptimized) @@ -189,7 +238,8 @@ func (client *AliyunClient) DescribeAvailableResources(d *schema.ResourceData, m if v, ok := d.GetOk("availability_zone"); ok && strings.TrimSpace(v.(string)) != "" { zoneId = strings.TrimSpace(v.(string)) } else if v, ok := d.GetOk("vswitch_id"); ok && strings.TrimSpace(v.(string)) != "" { - if vsw, err := meta.(*AliyunClient).DescribeVswitch(strings.TrimSpace(v.(string))); err == nil { + vpcService := VpcService{s.client} + if vsw, err := vpcService.DescribeVswitch(strings.TrimSpace(v.(string))); err == nil { zoneId = vsw.ZoneId } } @@ -210,13 +260,16 @@ func (client *AliyunClient) DescribeAvailableResources(d *schema.ResourceData, m args.IoOptimized = string(NoneOptimized) } - resources, e := conn.DescribeAvailableResource(args) - if e != nil { - return "", nil, fmt.Errorf("Error DescribeAvailableResource: %#v", e) + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeAvailableResource(args) + }) + if err != nil { + return "", nil, fmt.Errorf("Error DescribeAvailableResource: %#v", err) } + resources, _ := raw.(*ecs.DescribeAvailableResourceResponse) if resources == nil || len(resources.AvailableZones.AvailableZone) < 1 { - err = fmt.Errorf("There are no availability resources in the region: %s.", getRegionId(d, meta)) + err = fmt.Errorf("There are no availability resources in the region: %s.", client.RegionId) return } @@ -241,25 +294,25 @@ func (client *AliyunClient) DescribeAvailableResources(d *schema.ResourceData, m if zoneId != "" { if !valid { err = fmt.Errorf("Availability zone %s status is not available in the region %s. Expected availability zones: %s.", - zoneId, getRegionId(d, meta), strings.Join(expectedZones, ", ")) + zoneId, client.RegionId, strings.Join(expectedZones, ", ")) return } if soldout { err = fmt.Errorf("Availability zone %s status is sold out in the region %s. Expected availability zones: %s.", - zoneId, getRegionId(d, meta), strings.Join(expectedZones, ", ")) + zoneId, client.RegionId, strings.Join(expectedZones, ", ")) return } } if len(validZones) <= 0 { - err = fmt.Errorf("There is no availability resources in the region %s. Please choose another region.", getRegionId(d, meta)) + err = fmt.Errorf("There is no availability resources in the region %s. Please choose another region.", client.RegionId) return } return } -func (client *AliyunClient) InstanceTypeValidation(targetType, zoneId string, validZones []ecs.AvailableZone) error { +func (s *EcsService) InstanceTypeValidation(targetType, zoneId string, validZones []ecs.AvailableZone) error { mapInstanceTypeToZones := make(map[string]string) var expectedInstanceTypes []string @@ -288,23 +341,25 @@ func (client *AliyunClient) InstanceTypeValidation(targetType, zoneId string, va if zoneId != "" { return fmt.Errorf("The instance type %s is solded out or is not supported in the zone %s. Expected instance types: %s", targetType, zoneId, strings.Join(expectedInstanceTypes, ", ")) } - return fmt.Errorf("The instance type %s is solded out or is not supported in the region %s. Expected instance types: %s", targetType, client.RegionId, strings.Join(expectedInstanceTypes, ", ")) + return fmt.Errorf("The instance type %s is solded out or is not supported in the region %s. Expected instance types: %s", targetType, s.client.RegionId, strings.Join(expectedInstanceTypes, ", ")) } -func (client *AliyunClient) QueryInstancesWithKeyPair(instanceIdsStr, keypair string) (instanceIds []string, instances []ecs.Instance, err error) { +func (s *EcsService) QueryInstancesWithKeyPair(instanceIdsStr, keypair string) (instanceIds []string, instances []ecs.Instance, err error) { - conn := client.ecsconn args := ecs.CreateDescribeInstancesRequest() args.PageSize = requests.NewInteger(PageSizeLarge) args.PageNumber = requests.NewInteger(1) args.InstanceIds = instanceIdsStr args.KeyPairName = keypair for true { - resp, e := conn.DescribeInstances(args) + raw, e := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeInstances(args) + }) if e != nil { err = e return } + resp, _ := raw.(*ecs.DescribeInstancesResponse) if resp == nil || len(resp.Instances.Instance) < 0 { return } @@ -325,15 +380,17 @@ func (client *AliyunClient) QueryInstancesWithKeyPair(instanceIdsStr, keypair st return } -func (client *AliyunClient) DescribeKeyPair(keyName string) (keypair ecs.KeyPair, err error) { +func (s *EcsService) DescribeKeyPair(keyName string) (keypair ecs.KeyPair, err error) { req := ecs.CreateDescribeKeyPairsRequest() req.KeyPairName = keyName - resp, err := client.ecsconn.DescribeKeyPairs(req) + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeKeyPairs(req) + }) if err != nil { return } - + resp, _ := raw.(*ecs.DescribeKeyPairsResponse) if resp == nil || len(resp.KeyPairs.KeyPair) < 1 { return keypair, GetNotFoundErrorFromString(GetNotFoundMessage("KeyPair", keyName)) } @@ -341,17 +398,20 @@ func (client *AliyunClient) DescribeKeyPair(keyName string) (keypair ecs.KeyPair } -func (client *AliyunClient) DescribeDiskById(instanceId, diskId string) (disk ecs.Disk, err error) { +func (s *EcsService) DescribeDiskById(instanceId, diskId string) (disk ecs.Disk, err error) { req := ecs.CreateDescribeDisksRequest() if instanceId != "" { req.InstanceId = instanceId } req.DiskIds = convertListToJsonString([]interface{}{diskId}) - resp, err := client.ecsconn.DescribeDisks(req) + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeDisks(req) + }) if err != nil { return } + resp, _ := raw.(*ecs.DescribeDisksResponse) if resp == nil || len(resp.Disks.Disk) < 1 { err = GetNotFoundErrorFromString(GetNotFoundMessage("ECS disk", diskId)) return @@ -359,32 +419,38 @@ func (client *AliyunClient) DescribeDiskById(instanceId, diskId string) (disk ec return resp.Disks.Disk[0], nil } -func (client *AliyunClient) DescribeDisksByType(instanceId string, diskType DiskType) (disk []ecs.Disk, err error) { +func (s *EcsService) DescribeDisksByType(instanceId string, diskType DiskType) (disk []ecs.Disk, err error) { req := ecs.CreateDescribeDisksRequest() if instanceId != "" { req.InstanceId = instanceId } req.DiskType = string(diskType) - resp, err := client.ecsconn.DescribeDisks(req) + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeDisks(req) + }) if err != nil { return } + resp, _ := raw.(*ecs.DescribeDisksResponse) if resp == nil { return } return resp.Disks.Disk, nil } -func (client *AliyunClient) DescribeTags(resourceId string, resourceType TagResourceType) (tags []ecs.Tag, err error) { +func (s *EcsService) DescribeTags(resourceId string, resourceType TagResourceType) (tags []ecs.Tag, err error) { req := ecs.CreateDescribeTagsRequest() req.ResourceType = string(resourceType) req.ResourceId = resourceId - resp, err := client.ecsconn.DescribeTags(req) + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeTags(req) + }) if err != nil { return } + resp, _ := raw.(*ecs.DescribeTagsResponse) if resp == nil || len(resp.Tags.Tag) < 1 { err = GetNotFoundErrorFromString(fmt.Sprintf("Describe %s tag by id %s got an error.", resourceType, resourceId)) return @@ -393,13 +459,16 @@ func (client *AliyunClient) DescribeTags(resourceId string, resourceType TagReso return resp.Tags.Tag, nil } -func (client *AliyunClient) DescribeImageById(id string) (image ecs.Image, err error) { +func (s *EcsService) DescribeImageById(id string) (image ecs.Image, err error) { req := ecs.CreateDescribeImagesRequest() req.ImageId = id - resp, err := client.ecsconn.DescribeImages(req) + raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.DescribeImages(req) + }) if err != nil { return } + resp, _ := raw.(*ecs.DescribeImagesResponse) if resp == nil || len(resp.Images.Image) < 1 { return image, GetNotFoundErrorFromString(GetNotFoundMessage("Image", id)) } @@ -407,12 +476,12 @@ func (client *AliyunClient) DescribeImageById(id string) (image ecs.Image, err e } // WaitForInstance waits for instance to given status -func (client *AliyunClient) WaitForEcsInstance(instanceId string, status Status, timeout int) error { +func (s *EcsService) WaitForEcsInstance(instanceId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - instance, err := client.DescribeInstanceById(instanceId) + instance, err := s.DescribeInstanceById(instanceId) if err != nil { return err } @@ -432,12 +501,12 @@ func (client *AliyunClient) WaitForEcsInstance(instanceId string, status Status, } // WaitForInstance waits for instance to given status -func (client *AliyunClient) WaitForEcsDisk(diskId string, status Status, timeout int) error { +func (s *EcsService) WaitForEcsDisk(diskId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - instance, err := client.DescribeDiskById("", diskId) + instance, err := s.DescribeDiskById("", diskId) if err != nil { return err } @@ -456,12 +525,16 @@ func (client *AliyunClient) WaitForEcsDisk(diskId string, status Status, timeout return nil } -func (client *AliyunClient) AttachKeyPair(keyname string, instanceIds []interface{}) error { +func (s *EcsService) AttachKeyPair(keyname string, instanceIds []interface{}) error { args := ecs.CreateAttachKeyPairRequest() args.KeyPairName = keyname args.InstanceIds = convertListToJsonString(instanceIds) return resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := client.ecsconn.AttachKeyPair(args); err != nil { + _, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.AttachKeyPair(args) + }) + + if err != nil { if IsExceptedError(err, KeyPairServiceUnavailable) { return resource.RetryableError(fmt.Errorf("Attach Key Pair timeout and got an error: %#v.", err)) } diff --git a/alicloud/service_alicloud_ess.go b/alicloud/service_alicloud_ess.go index ef036a7674d..63ad3321620 100644 --- a/alicloud/service_alicloud_ess.go +++ b/alicloud/service_alicloud_ess.go @@ -8,17 +8,25 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/hashicorp/terraform/helper/resource" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) DescribeEssAlarmById(alarmTaskId string) (alarm ess.Alarm, err error) { +type EssService struct { + client *connectivity.AliyunClient +} + +func (s *EssService) DescribeEssAlarmById(alarmTaskId string) (alarm ess.Alarm, err error) { args := ess.CreateDescribeAlarmsRequest() args.AlarmTaskId = alarmTaskId - resp, err := client.essconn.DescribeAlarms(args) + raw, err := s.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeAlarms(args) + }) if err != nil { return } + resp, _ := raw.(*ess.DescribeAlarmsResponse) if resp == nil || len(resp.AlarmList.Alarm) == 0 { err = GetNotFoundErrorFromString(GetNotFoundMessage("Ess alarm", alarmTaskId)) return @@ -26,18 +34,20 @@ func (client *AliyunClient) DescribeEssAlarmById(alarmTaskId string) (alarm ess. return resp.AlarmList.Alarm[0], nil } -func (client *AliyunClient) DescribeLifecycleHookById(hookId string) (hook ess.LifecycleHook, err error) { +func (s *EssService) DescribeLifecycleHookById(hookId string) (hook ess.LifecycleHook, err error) { args := ess.CreateDescribeLifecycleHooksRequest() hookIds := []string{hookId} var hookIdsPtr *[]string hookIdsPtr = &hookIds args.LifecycleHookId = hookIdsPtr - resp, err := client.essconn.DescribeLifecycleHooks(args) + raw, err := s.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeLifecycleHooks(args) + }) if err != nil { return } - + resp, _ := raw.(*ess.DescribeLifecycleHooksResponse) if resp == nil || len(resp.LifecycleHooks.LifecycleHook) == 0 { err = GetNotFoundErrorFromString(GetNotFoundMessage("Lifecycle Hook", hookId)) return @@ -46,15 +56,17 @@ func (client *AliyunClient) DescribeLifecycleHookById(hookId string) (hook ess.L return resp.LifecycleHooks.LifecycleHook[0], nil } -func (client *AliyunClient) DescribeScalingGroupById(sgId string) (group ess.ScalingGroup, err error) { +func (s *EssService) DescribeScalingGroupById(sgId string) (group ess.ScalingGroup, err error) { args := ess.CreateDescribeScalingGroupsRequest() args.ScalingGroupId1 = sgId - resp, err := client.essconn.DescribeScalingGroups(args) + raw, err := s.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeScalingGroups(args) + }) if err != nil { return } - + resp, _ := raw.(*ess.DescribeScalingGroupsResponse) if resp == nil || len(resp.ScalingGroups.ScalingGroup) == 0 { err = GetNotFoundErrorFromString(GetNotFoundMessage("Scaling Group", sgId)) return @@ -63,15 +75,17 @@ func (client *AliyunClient) DescribeScalingGroupById(sgId string) (group ess.Sca return resp.ScalingGroups.ScalingGroup[0], nil } -func (client *AliyunClient) DescribeScalingConfigurationById(configId string) (config ess.ScalingConfiguration, err error) { +func (s *EssService) DescribeScalingConfigurationById(configId string) (config ess.ScalingConfiguration, err error) { args := ess.CreateDescribeScalingConfigurationsRequest() args.ScalingConfigurationId1 = configId - resp, err := client.essconn.DescribeScalingConfigurations(args) + raw, err := s.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeScalingConfigurations(args) + }) if err != nil { return } - + resp, _ := raw.(*ess.DescribeScalingConfigurationsResponse) if resp == nil || len(resp.ScalingConfigurations.ScalingConfiguration) < 1 { err = GetNotFoundErrorFromString(GetNotFoundMessage("Scaling Configuration", configId)) return @@ -80,17 +94,19 @@ func (client *AliyunClient) DescribeScalingConfigurationById(configId string) (c return resp.ScalingConfigurations.ScalingConfiguration[0], nil } -func (client *AliyunClient) ActiveScalingConfigurationById(sgId, configId string) error { +func (s *EssService) ActiveScalingConfigurationById(sgId, configId string) error { args := ess.CreateModifyScalingGroupRequest() args.ScalingGroupId = sgId args.ActiveScalingConfigurationId = configId - _, err := client.essconn.ModifyScalingGroup(args) + _, err := s.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.ModifyScalingGroup(args) + }) return err } // Flattens an array of datadisk into a []map[string]interface{} -func flattenDataDiskMappings(list []ess.DataDisk) []map[string]interface{} { +func (s *EssService) flattenDataDiskMappings(list []ess.DataDisk) []map[string]interface{} { result := make([]map[string]interface{}, 0, len(list)) for _, i := range list { l := map[string]interface{}{ @@ -105,19 +121,21 @@ func flattenDataDiskMappings(list []ess.DataDisk) []map[string]interface{} { return result } -func (client *AliyunClient) DescribeScalingRuleById(sgId, ruleId string) (rule ess.ScalingRule, err error) { +func (s *EssService) DescribeScalingRuleById(sgId, ruleId string) (rule ess.ScalingRule, err error) { args := ess.CreateDescribeScalingRulesRequest() args.ScalingGroupId = sgId args.ScalingRuleId1 = ruleId - resp, err := client.essconn.DescribeScalingRules(args) + raw, err := s.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeScalingRules(args) + }) if err != nil { if IsExceptedErrors(err, []string{InvalidScalingRuleIdNotFound}) { err = GetNotFoundErrorFromString(GetNotFoundMessage("Scaling rule", ruleId)) } return } - + resp, _ := raw.(*ess.DescribeScalingRulesResponse) if resp == nil || len(resp.ScalingRules.ScalingRule) < 1 { err = GetNotFoundErrorFromString(GetNotFoundMessage("Scaling rule", ruleId)) return @@ -126,23 +144,27 @@ func (client *AliyunClient) DescribeScalingRuleById(sgId, ruleId string) (rule e return resp.ScalingRules.ScalingRule[0], nil } -func (client *AliyunClient) DeleteScalingRuleById(ruleId string) error { +func (s *EssService) DeleteScalingRuleById(ruleId string) error { args := ess.CreateDeleteScalingRuleRequest() args.ScalingRuleId = ruleId - _, err := client.essconn.DeleteScalingRule(args) + _, err := s.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DeleteScalingRule(args) + }) return err } -func (client *AliyunClient) DescribeScheduleById(scheduleId string) (task ess.ScheduledTask, err error) { +func (s *EssService) DescribeScheduleById(scheduleId string) (task ess.ScheduledTask, err error) { args := ess.CreateDescribeScheduledTasksRequest() args.ScheduledTaskId1 = scheduleId - resp, err := client.essconn.DescribeScheduledTasks(args) + raw, err := s.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeScheduledTasks(args) + }) if err != nil { return } - + resp, _ := raw.(*ess.DescribeScheduledTasksResponse) if resp == nil || len(resp.ScheduledTasks.ScheduledTask) < 1 { err = GetNotFoundErrorFromString(GetNotFoundMessage("Schedule task", scheduleId)) return @@ -151,21 +173,25 @@ func (client *AliyunClient) DescribeScheduleById(scheduleId string) (task ess.Sc return resp.ScheduledTasks.ScheduledTask[0], nil } -func (client *AliyunClient) DeleteScheduleById(scheduleId string) error { +func (s *EssService) DeleteScheduleById(scheduleId string) error { args := ess.CreateDeleteScheduledTaskRequest() args.ScheduledTaskId = scheduleId - _, err := client.essconn.DeleteScheduledTask(args) + _, err := s.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DeleteScheduledTask(args) + }) return err } -func (client *AliyunClient) DeleteScalingGroupById(sgId string) error { +func (s *EssService) DeleteScalingGroupById(sgId string) error { req := ess.CreateDeleteScalingGroupRequest() req.ScalingGroupId = sgId req.ForceDelete = requests.NewBoolean(true) return resource.Retry(5*time.Minute, func() *resource.RetryError { - _, err := client.essconn.DeleteScalingGroup(req) + _, err := s.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DeleteScalingGroup(req) + }) if err != nil { if !IsExceptedErrors(err, []string{InvalidScalingGroupIdNotFound}) { @@ -173,7 +199,7 @@ func (client *AliyunClient) DeleteScalingGroupById(sgId string) error { } } - _, err = client.DescribeScalingGroupById(sgId) + _, err = s.DescribeScalingGroupById(sgId) if err != nil { if NotFoundError(err) { return nil @@ -185,7 +211,7 @@ func (client *AliyunClient) DeleteScalingGroupById(sgId string) error { }) } -func (client *AliyunClient) DescribeScalingInstances(groupId, configurationId string, instanceIds []string, creationType string) (instances []ess.ScalingInstance, err error) { +func (srv *EssService) DescribeScalingInstances(groupId, configurationId string, instanceIds []string, creationType string) (instances []ess.ScalingInstance, err error) { req := ess.CreateDescribeScalingInstancesRequest() req.ScalingGroupId = groupId @@ -198,10 +224,13 @@ func (client *AliyunClient) DescribeScalingInstances(groupId, configurationId st } } - resp, err := client.essconn.DescribeScalingInstances(req) + raw, err := srv.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeScalingInstances(req) + }) if err != nil { return } + resp, _ := raw.(*ess.DescribeScalingInstancesResponse) if resp == nil || len(resp.ScalingInstances.ScalingInstance) < 1 { return instances, GetNotFoundErrorFromString(fmt.Sprintf("There is no any instances in the scaling group %s.", groupId)) } @@ -209,17 +238,20 @@ func (client *AliyunClient) DescribeScalingInstances(groupId, configurationId st return resp.ScalingInstances.ScalingInstance, nil } -func (client *AliyunClient) DescribeScalingConfifurations(groupId string) (configs []ess.ScalingConfiguration, err error) { +func (s *EssService) DescribeScalingConfifurations(groupId string) (configs []ess.ScalingConfiguration, err error) { req := ess.CreateDescribeScalingConfigurationsRequest() req.ScalingGroupId = groupId req.PageNumber = requests.NewInteger(1) req.PageSize = requests.NewInteger(PageSizeLarge) for { - resp, err := client.essconn.DescribeScalingConfigurations(req) + raw, err := s.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.DescribeScalingConfigurations(req) + }) if err != nil { return configs, err } + resp, _ := raw.(*ess.DescribeScalingConfigurationsResponse) if resp == nil || len(resp.ScalingConfigurations.ScalingConfiguration) < 1 { break } @@ -237,12 +269,12 @@ func (client *AliyunClient) DescribeScalingConfifurations(groupId string) (confi return } -func (client *AliyunClient) EssRemoveInstances(groupId string, instanceIds []string) error { +func (srv *EssService) EssRemoveInstances(groupId string, instanceIds []string) error { if len(instanceIds) < 1 { return nil } - group, err := client.DescribeScalingGroupById(groupId) + group, err := srv.DescribeScalingGroupById(groupId) if err != nil { return fmt.Errorf("DescribeScalingGroupById %s error: %#v", groupId, err) @@ -251,7 +283,7 @@ func (client *AliyunClient) EssRemoveInstances(groupId string, instanceIds []str if group.LifecycleState == string(Inactive) { return fmt.Errorf("Scaling group current status is %s, please active it before attaching or removing ECS instances.", group.LifecycleState) } else { - if err := client.WaitForScalingGroup(group.ScalingGroupId, Active, DefaultTimeout); err != nil { + if err := srv.WaitForScalingGroup(group.ScalingGroupId, Active, DefaultTimeout); err != nil { if NotFoundError(err) { return nil } @@ -272,7 +304,10 @@ func (client *AliyunClient) EssRemoveInstances(groupId string, instanceIds []str } else { return nil } - if _, err := client.essconn.RemoveInstances(req); err != nil { + _, err := srv.client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { + return essClient.RemoveInstances(req) + }) + if err != nil { if IsExceptedError(err, IncorrectCapacityMinSize) { if group.MinSize == 0 { return resource.RetryableError(fmt.Errorf("Removing instances got an error: %#v", err)) @@ -290,7 +325,7 @@ func (client *AliyunClient) EssRemoveInstances(groupId string, instanceIds []str return resource.NonRetryableError(fmt.Errorf("Removing instances got an error: %#v", err)) } - instances, err := client.DescribeScalingInstances(groupId, "", instanceIds, "") + instances, err := srv.DescribeScalingInstances(groupId, "", instanceIds, "") if err != nil { if NotFoundError(err) || IsExceptedErrors(err, []string{InvalidScalingGroupIdNotFound}) { return nil @@ -310,12 +345,12 @@ func (client *AliyunClient) EssRemoveInstances(groupId string, instanceIds []str } // WaitForScalingGroup waits for group to given status -func (client *AliyunClient) WaitForScalingGroup(groupId string, status Status, timeout int) error { +func (s *EssService) WaitForScalingGroup(groupId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - sg, err := client.DescribeScalingGroupById(groupId) + sg, err := s.DescribeScalingGroupById(groupId) if err != nil { return err } @@ -336,7 +371,7 @@ func (client *AliyunClient) WaitForScalingGroup(groupId string, status Status, t } // ess dimensions to map -func flattenDimensionsToMap(dimensions []ess.Dimension) map[string]string { +func (s *EssService) flattenDimensionsToMap(dimensions []ess.Dimension) map[string]string { result := make(map[string]string) for _, dimension := range dimensions { if dimension.DimensionKey == UserId || dimension.DimensionKey == ScalingGroup { diff --git a/alicloud/service_alicloud_fc.go b/alicloud/service_alicloud_fc.go index 6b2c0678332..b8415e9fb00 100644 --- a/alicloud/service_alicloud_fc.go +++ b/alicloud/service_alicloud_fc.go @@ -4,15 +4,16 @@ import ( "fmt" "github.com/aliyun/fc-go-sdk" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) DescribeFcService(name string) (service *fc.GetServiceOutput, err error) { - conn, err := client.Fcconn() - if err != nil { - return - } - service, err = conn.GetService(&fc.GetServiceInput{ - ServiceName: &name, +type FcService struct { + client *connectivity.AliyunClient +} + +func (s *FcService) DescribeFcService(name string) (service *fc.GetServiceOutput, err error) { + raw, err := s.client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.GetService(&fc.GetServiceInput{ServiceName: &name}) }) if err != nil { if IsExceptedErrors(err, []string{ServiceNotFound}) { @@ -22,21 +23,19 @@ func (client *AliyunClient) DescribeFcService(name string) (service *fc.GetServi } return } + service, _ = raw.(*fc.GetServiceOutput) if service == nil || *service.ServiceName == "" { err = GetNotFoundErrorFromString(GetNotFoundMessage("FC Service", name)) } return } -func (client *AliyunClient) DescribeFcFunction(service, name string) (function *fc.GetFunctionOutput, err error) { - conn, err := client.Fcconn() - if err != nil { - return - } - - function, err = conn.GetFunction(&fc.GetFunctionInput{ - ServiceName: &service, - FunctionName: &name, +func (s *FcService) DescribeFcFunction(service, name string) (function *fc.GetFunctionOutput, err error) { + raw, err := s.client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.GetFunction(&fc.GetFunctionInput{ + ServiceName: &service, + FunctionName: &name, + }) }) if err != nil { if IsExceptedErrors(err, []string{ServiceNotFound, FunctionNotFound}) { @@ -46,22 +45,20 @@ func (client *AliyunClient) DescribeFcFunction(service, name string) (function * } return } + function, _ = raw.(*fc.GetFunctionOutput) if function == nil || *function.FunctionName == "" { err = GetNotFoundErrorFromString(GetNotFoundMessage("FC Function", name)) } return } -func (client *AliyunClient) DescribeFcTrigger(service, function, name string) (trigger *fc.GetTriggerOutput, err error) { - conn, err := client.Fcconn() - if err != nil { - return - } - - trigger, err = conn.GetTrigger(&fc.GetTriggerInput{ - ServiceName: &service, - FunctionName: &function, - TriggerName: &name, +func (s *FcService) DescribeFcTrigger(service, function, name string) (trigger *fc.GetTriggerOutput, err error) { + raw, err := s.client.WithFcClient(func(fcClient *fc.Client) (interface{}, error) { + return fcClient.GetTrigger(&fc.GetTriggerInput{ + ServiceName: &service, + FunctionName: &function, + TriggerName: &name, + }) }) if err != nil { if IsExceptedErrors(err, []string{ServiceNotFound, FunctionNotFound, TriggerNotFound}) { @@ -71,6 +68,7 @@ func (client *AliyunClient) DescribeFcTrigger(service, function, name string) (t } return } + trigger, _ = raw.(*fc.GetTriggerOutput) if trigger == nil || *trigger.TriggerName == "" { err = GetNotFoundErrorFromString(GetNotFoundMessage("FC Trigger", name)) } diff --git a/alicloud/service_alicloud_havip.go b/alicloud/service_alicloud_havip.go index e59530124ef..49fe636987f 100644 --- a/alicloud/service_alicloud_havip.go +++ b/alicloud/service_alicloud_havip.go @@ -8,9 +8,14 @@ import ( "github.com/hashicorp/terraform/helper/schema" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) DescribeHaVip(haVipId string) (v vpc.HaVip, err error) { +type HaVipService struct { + client *connectivity.AliyunClient +} + +func (s *HaVipService) DescribeHaVip(haVipId string) (v vpc.HaVip, err error) { request := vpc.CreateDescribeHaVipsRequest() values := []string{haVipId} filter := []vpc.DescribeHaVipsFilter{vpc.DescribeHaVipsFilter{ @@ -22,10 +27,13 @@ func (client *AliyunClient) DescribeHaVip(haVipId string) (v vpc.HaVip, err erro invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := client.vpcconn.DescribeHaVips(request) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeHaVips(request) + }) if err != nil { return err } + resp, _ := raw.(*vpc.DescribeHaVipsResponse) if resp == nil || len(resp.HaVips.HaVip) <= 0 || resp.HaVips.HaVip[0].HaVipId != haVipId { return GetNotFoundErrorFromString(GetNotFoundMessage("HaVip", haVipId)) @@ -36,13 +44,13 @@ func (client *AliyunClient) DescribeHaVip(haVipId string) (v vpc.HaVip, err erro return } -func (client *AliyunClient) WaitForHaVip(haVipId string, status Status, timeout int) error { +func (s *HaVipService) WaitForHaVip(haVipId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { //wait the order effective - havip, err := client.DescribeHaVip(haVipId) + havip, err := s.DescribeHaVip(haVipId) if err != nil { return err } @@ -58,10 +66,10 @@ func (client *AliyunClient) WaitForHaVip(haVipId string, status Status, timeout return nil } -func (client *AliyunClient) DescribeHaVipAttachment(haVipId string, instanceId string) (err error) { +func (s *HaVipService) DescribeHaVipAttachment(haVipId string, instanceId string) (err error) { invoker := NewInvoker() return invoker.Run(func() error { - haVip, err := client.DescribeHaVip(haVipId) + haVip, err := s.DescribeHaVip(haVipId) if err != nil { return err } @@ -74,13 +82,12 @@ func (client *AliyunClient) DescribeHaVipAttachment(haVipId string, instanceId s }) } -func (client *AliyunClient) WaitForHaVipAttachment(haVipId string, instanceId string, timeout int) error { - +func (s *HaVipService) WaitForHaVipAttachment(haVipId string, instanceId string, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - err := client.DescribeHaVipAttachment(haVipId, instanceId) + err := s.DescribeHaVipAttachment(haVipId, instanceId) if err != nil { if !NotFoundError(err) { diff --git a/alicloud/service_alicloud_kvstore.go b/alicloud/service_alicloud_kvstore.go index 46e404338e5..36d5e87b590 100644 --- a/alicloud/service_alicloud_kvstore.go +++ b/alicloud/service_alicloud_kvstore.go @@ -5,19 +5,26 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/r-kvstore" "github.com/denverdino/aliyungo/common" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) DescribeRKVInstanceById(id string) (instance *r_kvstore.DBInstanceAttribute, err error) { +type KvstoreService struct { + client *connectivity.AliyunClient +} + +func (s *KvstoreService) DescribeRKVInstanceById(id string) (instance *r_kvstore.DBInstanceAttribute, err error) { request := r_kvstore.CreateDescribeInstanceAttributeRequest() request.InstanceId = id - resp, err := client.rkvconn.DescribeInstanceAttribute(request) + raw, err := s.client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.DescribeInstanceAttribute(request) + }) if err != nil { if IsExceptedError(err, InvalidKVStoreInstanceIdNotFound) { return nil, GetNotFoundErrorFromString(GetNotFoundMessage("KVStore instance", id)) } return nil, err } - + resp, _ := raw.(*r_kvstore.DescribeInstanceAttributeResponse) if resp == nil || len(resp.Instances.DBInstanceAttribute) <= 0 { return nil, GetNotFoundErrorFromString(GetNotFoundMessage("KVStore instance", id)) } @@ -25,16 +32,19 @@ func (client *AliyunClient) DescribeRKVInstanceById(id string) (instance *r_kvst return &resp.Instances.DBInstanceAttribute[0], nil } -func (client *AliyunClient) DescribeRKVInstancebackupPolicy(id string) (policy *r_kvstore.DescribeBackupPolicyResponse, err error) { +func (s *KvstoreService) DescribeRKVInstancebackupPolicy(id string) (policy *r_kvstore.DescribeBackupPolicyResponse, err error) { request := r_kvstore.CreateDescribeBackupPolicyRequest() request.InstanceId = id - policy, err = client.rkvconn.DescribeBackupPolicy(request) + raw, err := s.client.WithRkvClient(func(rkvClient *r_kvstore.Client) (interface{}, error) { + return rkvClient.DescribeBackupPolicy(request) + }) if err != nil { if IsExceptedError(err, InvalidKVStoreInstanceIdNotFound) { return nil, GetNotFoundErrorFromString(GetNotFoundMessage("KVStore Instance Policy", id)) } return nil, err } + policy, _ = raw.(*r_kvstore.DescribeBackupPolicyResponse) if policy == nil { err = GetNotFoundErrorFromString(GetNotFoundMessage("KVStore Instance Policy", id)) @@ -43,12 +53,12 @@ func (client *AliyunClient) DescribeRKVInstancebackupPolicy(id string) (policy * return } -func (client *AliyunClient) WaitForRKVInstance(instanceId string, status Status, timeout int) error { +func (s *KvstoreService) WaitForRKVInstance(instanceId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - instance, err := client.DescribeRKVInstanceById(instanceId) + instance, err := s.DescribeRKVInstanceById(instanceId) if err != nil && !NotFoundError(err) { return err } diff --git a/alicloud/service_alicloud_log.go b/alicloud/service_alicloud_log.go index 75ed72731df..12310206bfb 100644 --- a/alicloud/service_alicloud_log.go +++ b/alicloud/service_alicloud_log.go @@ -6,22 +6,32 @@ import ( "github.com/aliyun/aliyun-log-go-sdk" "github.com/hashicorp/terraform/helper/resource" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) DescribeLogProject(name string) (project *sls.LogProject, err error) { - project, err = client.logconn.GetProject(name) +type LogService struct { + client *connectivity.AliyunClient +} + +func (s *LogService) DescribeLogProject(name string) (project *sls.LogProject, err error) { + raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return slsClient.GetProject(name) + }) if err != nil { return project, fmt.Errorf("GetProject %s got an error: %#v.", name, err) } + project, _ = raw.(*sls.LogProject) if project == nil || project.Name == "" { return project, GetNotFoundErrorFromString(GetNotFoundMessage("Log Project", name)) } return } -func (client *AliyunClient) DescribeLogStore(projectName, name string) (store *sls.LogStore, err error) { +func (s *LogService) DescribeLogStore(projectName, name string) (store *sls.LogStore, err error) { err = resource.Retry(2*time.Minute, func() *resource.RetryError { - store, err = client.logconn.GetLogStore(projectName, name) + raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return slsClient.GetLogStore(projectName, name) + }) if err != nil { if IsExceptedErrors(err, []string{ProjectNotExist, LogStoreNotExist}) { return resource.NonRetryableError(GetNotFoundErrorFromString(GetNotFoundMessage("Log Store", name))) @@ -31,6 +41,7 @@ func (client *AliyunClient) DescribeLogStore(projectName, name string) (store *s } return resource.NonRetryableError(fmt.Errorf("GetLogStore %s got an error: %#v.", name, err)) } + store, _ = raw.(*sls.LogStore) return nil }) @@ -44,9 +55,11 @@ func (client *AliyunClient) DescribeLogStore(projectName, name string) (store *s return } -func (client *AliyunClient) DescribeLogStoreIndex(projectName, name string) (index *sls.Index, err error) { +func (s *LogService) DescribeLogStoreIndex(projectName, name string) (index *sls.Index, err error) { err = resource.Retry(2*time.Minute, func() *resource.RetryError { - i, err := client.logconn.GetIndex(projectName, name) + raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return slsClient.GetIndex(projectName, name) + }) if err != nil { if IsExceptedErrors(err, []string{ProjectNotExist, LogStoreNotExist, IndexConfigNotExist}) { return resource.NonRetryableError(GetNotFoundErrorFromString(GetNotFoundMessage("Log Store", name))) @@ -56,7 +69,7 @@ func (client *AliyunClient) DescribeLogStoreIndex(projectName, name string) (ind } return resource.NonRetryableError(fmt.Errorf("GetLogStore %s got an error: %#v.", name, err)) } - index = i + index, _ = raw.(*sls.Index) return nil }) @@ -70,10 +83,12 @@ func (client *AliyunClient) DescribeLogStoreIndex(projectName, name string) (ind return } -func (client *AliyunClient) DescribeLogMachineGroup(projectName, groupName string) (group *sls.MachineGroup, err error) { +func (s *LogService) DescribeLogMachineGroup(projectName, groupName string) (group *sls.MachineGroup, err error) { err = resource.Retry(2*time.Minute, func() *resource.RetryError { - group, err = client.logconn.GetMachineGroup(projectName, groupName) + raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { + return slsClient.GetMachineGroup(projectName, groupName) + }) if err != nil { if IsExceptedErrors(err, []string{ProjectNotExist, GroupNotExist, MachineGroupNotExist}) { return resource.NonRetryableError(GetNotFoundErrorFromString(GetNotFoundMessage("Log Machine Group", groupName))) @@ -83,6 +98,7 @@ func (client *AliyunClient) DescribeLogMachineGroup(projectName, groupName strin } return resource.NonRetryableError(fmt.Errorf("GetLogMachineGroup %s got an error: %#v.", groupName, err)) } + group, _ = raw.(*sls.MachineGroup) return nil }) diff --git a/alicloud/service_alicloud_mns.go b/alicloud/service_alicloud_mns.go index f73bcc4196d..c4e00dba262 100644 --- a/alicloud/service_alicloud_mns.go +++ b/alicloud/service_alicloud_mns.go @@ -2,52 +2,23 @@ package alicloud import ( "strings" - - "github.com/dxh031/ali_mns" ) -func (client *AliyunClient) MnsQueueManager() (ali_mns.AliQueueManager, error) { - - mnsClient, err := client.Mnsconn() - if err != nil { - return nil, err - } - queueManager := ali_mns.NewMNSQueueManager(*mnsClient) - return queueManager, nil -} - -func (client *AliyunClient) MnsSubscriptionManager(topicName string) (ali_mns.AliMNSTopic, error) { - - mnsClient, err := client.Mnsconn() - if err != nil { - return nil, err - } - subscriptionManager := ali_mns.NewMNSTopic(topicName, *mnsClient) - return subscriptionManager, nil -} - -func (client *AliyunClient) MnsTopicManager() (ali_mns.AliTopicManager, error) { - - mnsClient, err := client.Mnsconn() - if err != nil { - return nil, err - } - topicManager := ali_mns.NewMNSTopicManager(*mnsClient) - return topicManager, nil +type MnsService struct { } -func GetTopicNameAndSubscriptionName(subscriptionId string) (string, string) { +func (s *MnsService) GetTopicNameAndSubscriptionName(subscriptionId string) (string, string) { arr := strings.Split(subscriptionId, COLON_SEPARATED) return arr[0], arr[1] } -func SubscriptionNotExistFunc(err error) bool { +func (s *MnsService) SubscriptionNotExistFunc(err error) bool { return strings.Contains(err.Error(), SubscriptionNotExist) } -func TopicNotExistFunc(err error) bool { +func (s *MnsService) TopicNotExistFunc(err error) bool { return strings.Contains(err.Error(), TopicNotExist) } -func QueueNotExistFunc(err error) bool { +func (s *MnsService) QueueNotExistFunc(err error) bool { return strings.Contains(err.Error(), QueueNotExist) } diff --git a/alicloud/service_alicloud_oss.go b/alicloud/service_alicloud_oss.go index 4c5b72b4941..4c28612a06b 100644 --- a/alicloud/service_alicloud_oss.go +++ b/alicloud/service_alicloud_oss.go @@ -2,14 +2,20 @@ package alicloud import ( "github.com/aliyun/aliyun-oss-go-sdk/oss" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) QueryOssBucketById(id string) (info *oss.BucketInfo, err error) { +type OssService struct { + client *connectivity.AliyunClient +} - bucket, err := client.ossconn.GetBucketInfo(id) +func (s *OssService) QueryOssBucketById(id string) (info *oss.BucketInfo, err error) { + raw, err := s.client.WithOssClient(func(ossClient *oss.Client) (interface{}, error) { + return ossClient.GetBucketInfo(id) + }) if err != nil { return nil, err } - + bucket, _ := raw.(oss.GetBucketInfoResult) return &bucket.BucketInfo, nil } diff --git a/alicloud/service_alicloud_ots.go b/alicloud/service_alicloud_ots.go index 5c8f57b7960..a93d60b5c49 100644 --- a/alicloud/service_alicloud_ots.go +++ b/alicloud/service_alicloud_ots.go @@ -1,27 +1,20 @@ package alicloud import ( - "fmt" "strings" "time" "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) buildTableClient(instanceName string) *tablestore.TableStoreClient { - endpoint := LoadEndpoint(client.RegionId, OTSCode) - if endpoint == "" { - endpoint = fmt.Sprintf("%s.%s.ots.aliyuncs.com", instanceName, client.RegionId) - } - if !strings.HasPrefix(endpoint, string(Https)) && !strings.HasPrefix(endpoint, string(Http)) { - endpoint = fmt.Sprintf("%s://%s", Https, endpoint) - } - return tablestore.NewClient(endpoint, instanceName, client.AccessKey, client.SecretKey) +type OtsService struct { + client *connectivity.AliyunClient } -func getPrimaryKeyType(primaryKeyType string) tablestore.PrimaryKeyType { +func (s *OtsService) getPrimaryKeyType(primaryKeyType string) tablestore.PrimaryKeyType { var keyType tablestore.PrimaryKeyType t := PrimaryKeyTypeString(primaryKeyType) switch t { @@ -35,35 +28,41 @@ func getPrimaryKeyType(primaryKeyType string) tablestore.PrimaryKeyType { return keyType } -func (client *AliyunClient) DescribeOtsTable(instanceName, tableName string) (table *tablestore.DescribeTableResponse, err error) { +func (s *OtsService) DescribeOtsTable(instanceName, tableName string) (table *tablestore.DescribeTableResponse, err error) { describeTableReq := new(tablestore.DescribeTableRequest) describeTableReq.TableName = tableName - table, err = client.buildTableClient(instanceName).DescribeTable(describeTableReq) + raw, err := s.client.WithTableStoreClient(instanceName, func(tableStoreClient *tablestore.TableStoreClient) (interface{}, error) { + return tableStoreClient.DescribeTable(describeTableReq) + }) if err != nil { if strings.HasPrefix(err.Error(), OTSObjectNotExist) { err = GetNotFoundErrorFromString(GetNotFoundMessage("OTS Table", tableName)) } return } + table, _ = raw.(*tablestore.DescribeTableResponse) if table == nil || table.TableMeta == nil || table.TableMeta.TableName != tableName { err = GetNotFoundErrorFromString(GetNotFoundMessage("OTS Table", tableName)) } return } -func (client *AliyunClient) DeleteOtsTable(instanceName, tableName string) (bool, error) { +func (s *OtsService) DeleteOtsTable(instanceName, tableName string) (bool, error) { deleteReq := new(tablestore.DeleteTableRequest) deleteReq.TableName = tableName - if _, err := client.buildTableClient(instanceName).DeleteTable(deleteReq); err != nil { + _, err := s.client.WithTableStoreClient(instanceName, func(tableStoreClient *tablestore.TableStoreClient) (interface{}, error) { + return tableStoreClient.DeleteTable(deleteReq) + }) + if err != nil { if NotFoundError(err) { return true, nil } return false, err } - describ, err := client.DescribeOtsTable(instanceName, tableName) + describ, err := s.DescribeOtsTable(instanceName, tableName) if err != nil { if NotFoundError(err) { @@ -80,7 +79,7 @@ func (client *AliyunClient) DeleteOtsTable(instanceName, tableName string) (bool } // Convert tablestore.PrimaryKeyType to PrimaryKeyTypeString -func convertPrimaryKeyType(t tablestore.PrimaryKeyType) PrimaryKeyTypeString { +func (s *OtsService) convertPrimaryKeyType(t tablestore.PrimaryKeyType) PrimaryKeyTypeString { var typeString PrimaryKeyTypeString switch t { case tablestore.PrimaryKeyType_INTEGER: @@ -93,44 +92,49 @@ func convertPrimaryKeyType(t tablestore.PrimaryKeyType) PrimaryKeyTypeString { return typeString } -func (client *AliyunClient) DescribeOtsInstance(name string) (inst ots.InstanceInfo, err error) { +func (s *OtsService) DescribeOtsInstance(name string) (inst ots.InstanceInfo, err error) { req := ots.CreateGetInstanceRequest() req.InstanceName = name req.Method = "GET" - resp, err := client.otsconn.GetInstance(req) + raw, err := s.client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.GetInstance(req) + }) // OTS instance not found error code is "NotFound" if err != nil { return } - + resp, _ := raw.(*ots.GetInstanceResponse) if resp == nil || resp.InstanceInfo.InstanceName != name { return inst, GetNotFoundErrorFromString(GetNotFoundMessage("OTS Instance", name)) } return resp.InstanceInfo, nil } -func (client *AliyunClient) DescribeOtsInstanceVpc(name string) (inst ots.VpcInfo, err error) { +func (s *OtsService) DescribeOtsInstanceVpc(name string) (inst ots.VpcInfo, err error) { req := ots.CreateListVpcInfoByInstanceRequest() req.Method = "GET" req.InstanceName = name - resp, err := client.otsconn.ListVpcInfoByInstance(req) + raw, err := s.client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.ListVpcInfoByInstance(req) + }) if err != nil { return inst, err } + resp, _ := raw.(*ots.ListVpcInfoByInstanceResponse) if resp == nil || resp.TotalCount < 1 { return inst, GetNotFoundErrorFromString(GetNotFoundMessage("OTS Instance VPC", name)) } return resp.VpcInfos.VpcInfo[0], nil } -func (client *AliyunClient) WaitForOtsInstance(name string, status Status, timeout int) error { +func (s *OtsService) WaitForOtsInstance(name string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - inst, err := client.DescribeOtsInstance(name) + inst, err := s.DescribeOtsInstance(name) if err != nil { return err } diff --git a/alicloud/service_alicloud_pvtz.go b/alicloud/service_alicloud_pvtz.go index 594303ed3b2..b3ebab649d1 100644 --- a/alicloud/service_alicloud_pvtz.go +++ b/alicloud/service_alicloud_pvtz.go @@ -4,22 +4,29 @@ import ( "strconv" "github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) DescribePvtzZoneInfo(zoneId string) (zone pvtz.DescribeZoneInfoResponse, err error) { - conn := client.pvtzconn +type PvtzService struct { + client *connectivity.AliyunClient +} + +func (s *PvtzService) DescribePvtzZoneInfo(zoneId string) (zone pvtz.DescribeZoneInfoResponse, err error) { request := pvtz.CreateDescribeZoneInfoRequest() request.ZoneId = zoneId invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := conn.DescribeZoneInfo(request) + raw, err := s.client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.DescribeZoneInfo(request) + }) if err != nil { if IsExceptedErrors(err, []string{ZoneNotExists, ZoneVpcNotExists}) { return GetNotFoundErrorFromString(GetNotFoundMessage("PrivateZone", zoneId)) } return err } + resp, _ := raw.(*pvtz.DescribeZoneInfoResponse) if resp == nil || resp.ZoneId != zoneId { return GetNotFoundErrorFromString(GetNotFoundMessage("PrivateZone", zoneId)) } @@ -31,14 +38,15 @@ func (client *AliyunClient) DescribePvtzZoneInfo(zoneId string) (zone pvtz.Descr } -func (client *AliyunClient) DescribeZoneRecord(recordId int, zoneId string) (record pvtz.Record, err error) { - conn := client.pvtzconn +func (s *PvtzService) DescribeZoneRecord(recordId int, zoneId string) (record pvtz.Record, err error) { request := pvtz.CreateDescribeZoneRecordsRequest() request.ZoneId = zoneId invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := conn.DescribeZoneRecords(request) + raw, err := s.client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { + return pvtzClient.DescribeZoneRecords(request) + }) recordIdStr := strconv.Itoa(recordId) @@ -48,6 +56,7 @@ func (client *AliyunClient) DescribeZoneRecord(recordId int, zoneId string) (rec } return err } + resp, _ := raw.(*pvtz.DescribeZoneRecordsResponse) if resp == nil { return GetNotFoundErrorFromString(GetNotFoundMessage("PrivateZoneRecord", recordIdStr)) } diff --git a/alicloud/service_alicloud_ram.go b/alicloud/service_alicloud_ram.go index 61ca80222c6..e9a140f1044 100644 --- a/alicloud/service_alicloud_ram.go +++ b/alicloud/service_alicloud_ram.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/denverdino/aliyungo/ram" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) type Effect string @@ -42,7 +43,11 @@ type Policy struct { Version string } -func ParseRolePolicyDocument(policyDocument string) (RolePolicy, error) { +type RamService struct { + client *connectivity.AliyunClient +} + +func (s *RamService) ParseRolePolicyDocument(policyDocument string) (RolePolicy, error) { var policy RolePolicy err := json.Unmarshal([]byte(policyDocument), &policy) if err != nil { @@ -51,7 +56,7 @@ func ParseRolePolicyDocument(policyDocument string) (RolePolicy, error) { return policy, nil } -func ParsePolicyDocument(policyDocument string) (statement []map[string]interface{}, version string, err error) { +func (s *RamService) ParsePolicyDocument(policyDocument string) (statement []map[string]interface{}, version string, err error) { policy := Policy{} err = json.Unmarshal([]byte(policyDocument), &policy) if err != nil { @@ -80,7 +85,7 @@ func ParsePolicyDocument(policyDocument string) (statement []map[string]interfac return } -func AssembleRolePolicyDocument(ramUser, service []interface{}, version string) (string, error) { +func (s *RamService) AssembleRolePolicyDocument(ramUser, service []interface{}, version string) (string, error) { services := expandStringList(service) users := expandStringList(ramUser) @@ -105,7 +110,7 @@ func AssembleRolePolicyDocument(ramUser, service []interface{}, version string) return string(data), nil } -func AssemblePolicyDocument(document []interface{}, version string) (string, error) { +func (s *RamService) AssemblePolicyDocument(document []interface{}, version string) (string, error) { var statements []PolicyStatement for _, v := range document { @@ -135,14 +140,15 @@ func AssemblePolicyDocument(document []interface{}, version string) (string, err } // Judge whether the role policy contains service "ecs.aliyuncs.com" -func (client *AliyunClient) JudgeRolePolicyPrincipal(roleName string) error { - conn := client.ramconn - resp, err := conn.GetRole(ram.RoleQueryRequest{RoleName: roleName}) +func (s *RamService) JudgeRolePolicyPrincipal(roleName string) error { + raw, err := s.client.WithRamClient(func(ramClient ram.RamClientInterface) (interface{}, error) { + return ramClient.GetRole(ram.RoleQueryRequest{RoleName: roleName}) + }) if err != nil { return fmt.Errorf("GetRole %s got an error: %#v", roleName, err) } - - policy, err := ParseRolePolicyDocument(resp.Role.AssumeRolePolicyDocument) + resp, _ := raw.(ram.RoleResponse) + policy, err := s.ParseRolePolicyDocument(resp.Role.AssumeRolePolicyDocument) if err != nil { return err } @@ -156,7 +162,7 @@ func (client *AliyunClient) JudgeRolePolicyPrincipal(roleName string) error { return fmt.Errorf("Role policy services must contains 'ecs.aliyuncs.com', Now is \n%v.", resp.Role.AssumeRolePolicyDocument) } -func GetIntersection(dataMap []map[string]interface{}, allDataMap map[string]interface{}) (allData []interface{}) { +func (s *RamService) GetIntersection(dataMap []map[string]interface{}, allDataMap map[string]interface{}) (allData []interface{}) { if len(dataMap) == 1 { allDataMap = dataMap[0] } else { diff --git a/alicloud/service_alicloud_rds.go b/alicloud/service_alicloud_rds.go index b2f7dcc9a15..95f56035716 100644 --- a/alicloud/service_alicloud_rds.go +++ b/alicloud/service_alicloud_rds.go @@ -8,8 +8,13 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/rds" "github.com/denverdino/aliyungo/common" "github.com/hashicorp/terraform/helper/resource" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) +type RdsService struct { + client *connectivity.AliyunClient +} + // // _______________ _______________ _______________ // | | ______param______\ | | _____request_____\ | | @@ -24,15 +29,17 @@ import ( // The API return 200 for resource not found. // When getInstance is empty, then throw InstanceNotfound error. // That the business layer only need to check error. -func (client *AliyunClient) DescribeDBInstanceById(id string) (instance *rds.DBInstanceAttribute, err error) { +func (s *RdsService) DescribeDBInstanceById(id string) (instance *rds.DBInstanceAttribute, err error) { request := rds.CreateDescribeDBInstanceAttributeRequest() request.DBInstanceId = id - resp, err := client.rdsconn.DescribeDBInstanceAttribute(request) + raw, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DescribeDBInstanceAttribute(request) + }) if err != nil { return nil, err } - + resp, _ := raw.(*rds.DescribeDBInstanceAttributeResponse) attr := resp.Items.DBInstanceAttribute if len(attr) <= 0 { @@ -42,43 +49,46 @@ func (client *AliyunClient) DescribeDBInstanceById(id string) (instance *rds.DBI return &attr[0], nil } -func (client *AliyunClient) DescribeDatabaseAccount(instanceId, accountName string) (ds *rds.DBInstanceAccount, err error) { - conn := client.rdsconn +func (s *RdsService) DescribeDatabaseAccount(instanceId, accountName string) (ds *rds.DBInstanceAccount, err error) { request := rds.CreateDescribeAccountsRequest() request.DBInstanceId = instanceId request.AccountName = accountName - resp, err := conn.DescribeAccounts(request) + raw, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DescribeAccounts(request) + }) if err != nil { return nil, err } - + resp, _ := raw.(*rds.DescribeAccountsResponse) if len(resp.Accounts.DBInstanceAccount) < 1 { return nil, GetNotFoundErrorFromString(fmt.Sprintf("Data account %s is not found in the instance %s.", accountName, instanceId)) } return &resp.Accounts.DBInstanceAccount[0], nil } -func (client *AliyunClient) DescribeDatabaseByName(instanceId, dbName string) (ds *rds.Database, err error) { +func (s *RdsService) DescribeDatabaseByName(instanceId, dbName string) (ds *rds.Database, err error) { request := rds.CreateDescribeDatabasesRequest() request.DBInstanceId = instanceId request.DBName = dbName err = resource.Retry(3*time.Minute, func() *resource.RetryError { - resp, err := client.rdsconn.DescribeDatabases(request) + raw, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DescribeDatabases(request) + }) if err != nil { if IsExceptedError(err, DBInternalError) { return resource.RetryableError(fmt.Errorf("Describe Databases got an error %#v.", err)) } - if NotFoundDBInstance(err) || IsExceptedErrors(err, []string{InvalidDBNameNotFound}) { + if s.NotFoundDBInstance(err) || IsExceptedErrors(err, []string{InvalidDBNameNotFound}) { return resource.NonRetryableError(GetNotFoundErrorFromString(fmt.Sprintf("Database %s is not found in the instance %s.", dbName, instanceId))) } return resource.NonRetryableError(fmt.Errorf("Describe Databases got an error %#v.", err)) } - + resp, _ := raw.(*rds.DescribeDatabasesResponse) if len(resp.Databases.Database) < 1 { return resource.NonRetryableError(GetNotFoundErrorFromString(fmt.Sprintf("Database %s is not found in the instance %s.", dbName, instanceId))) } @@ -89,20 +99,22 @@ func (client *AliyunClient) DescribeDatabaseByName(instanceId, dbName string) (d return ds, err } -func (client *AliyunClient) AllocateDBPublicConnection(instanceId, prefix, port string) error { - conn := client.rdsconn +func (s *RdsService) AllocateDBPublicConnection(instanceId, prefix, port string) error { request := rds.CreateAllocateInstancePublicConnectionRequest() request.DBInstanceId = instanceId request.ConnectionStringPrefix = prefix request.Port = port err := resource.Retry(5*time.Minute, func() *resource.RetryError { - if _, err := conn.AllocateInstancePublicConnection(request); err != nil { + _, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.AllocateInstancePublicConnection(request) + }) + if err != nil { if IsExceptedError(err, ConnectionOperationDenied) && IsExceptedError(err, ConnectionConflictMessage) { return resource.NonRetryableError(fmt.Errorf("Specified connection prefix %s has already been occupied. Please modify it and try again.", prefix)) } if IsExceptedError(err, NetTypeExists) { - connection, err := client.DescribeDBInstanceNetInfoByIpType(instanceId, Public) + connection, err := s.DescribeDBInstanceNetInfoByIpType(instanceId, Public) if err != nil { return resource.NonRetryableError(err) } @@ -122,26 +134,28 @@ func (client *AliyunClient) AllocateDBPublicConnection(instanceId, prefix, port return err } - if err := client.WaitForDBConnection(instanceId, Public, 300); err != nil { + if err := s.WaitForDBConnection(instanceId, Public, 300); err != nil { return fmt.Errorf("WaitForDBConnection got error: %#v", err) } // wait instance running after allocating - if err := client.WaitForDBInstance(instanceId, Running, 300); err != nil { + if err := s.WaitForDBInstance(instanceId, Running, 300); err != nil { return fmt.Errorf("WaitForInstance %s got error: %#v", Running, err) } return nil } -func (client *AliyunClient) DescribeDBInstanceNetInfos(instanceId string) ([]rds.DBInstanceNetInfo, error) { +func (s *RdsService) DescribeDBInstanceNetInfos(instanceId string) ([]rds.DBInstanceNetInfo, error) { request := rds.CreateDescribeDBInstanceNetInfoRequest() request.DBInstanceId = instanceId - resp, err := client.rdsconn.DescribeDBInstanceNetInfo(request) + raw, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DescribeDBInstanceNetInfo(request) + }) if err != nil { return nil, err } - + resp, _ := raw.(*rds.DescribeDBInstanceNetInfoResponse) if len(resp.DBInstanceNetInfos.DBInstanceNetInfo) < 1 { return nil, GetNotFoundErrorFromString(fmt.Sprintf("DB instance %s does not have any connection.", instanceId)) } @@ -149,9 +163,9 @@ func (client *AliyunClient) DescribeDBInstanceNetInfos(instanceId string) ([]rds return resp.DBInstanceNetInfos.DBInstanceNetInfo, nil } -func (client *AliyunClient) DescribeDBInstanceNetInfoByIpType(instanceId string, ipType IPType) (*rds.DBInstanceNetInfo, error) { +func (s *RdsService) DescribeDBInstanceNetInfoByIpType(instanceId string, ipType IPType) (*rds.DBInstanceNetInfo, error) { - resps, err := client.DescribeDBInstanceNetInfos(instanceId) + resps, err := s.DescribeDBInstanceNetInfos(instanceId) if err != nil { return nil, err @@ -170,7 +184,7 @@ func (client *AliyunClient) DescribeDBInstanceNetInfoByIpType(instanceId string, return nil, GetNotFoundErrorFromString(fmt.Sprintf("DB instance %s does not have specified type %s connection.", instanceId, ipType)) } -func (client *AliyunClient) GrantAccountPrivilege(instanceId, account, dbName, privilege string) error { +func (s *RdsService) GrantAccountPrivilege(instanceId, account, dbName, privilege string) error { request := rds.CreateGrantAccountPrivilegeRequest() request.DBInstanceId = instanceId request.AccountName = account @@ -179,7 +193,10 @@ func (client *AliyunClient) GrantAccountPrivilege(instanceId, account, dbName, p err := resource.Retry(3*time.Minute, func() *resource.RetryError { rq := request - if _, err := client.rdsconn.GrantAccountPrivilege(rq); err != nil { + _, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.GrantAccountPrivilege(rq) + }) + if err != nil { if IsExceptedErrors(err, OperationDeniedDBStatus) { return resource.RetryableError(fmt.Errorf("Grant DB %s account %s privilege got an error: %#v.", dbName, account, err)) } @@ -192,14 +209,14 @@ func (client *AliyunClient) GrantAccountPrivilege(instanceId, account, dbName, p return err } - if err := client.WaitForAccountPrivilege(instanceId, account, dbName, privilege, 300); err != nil { + if err := s.WaitForAccountPrivilege(instanceId, account, dbName, privilege, 300); err != nil { return fmt.Errorf("Wait for grantting DB %s account %s privilege got an error: %#v.", dbName, account, err) } return nil } -func (client *AliyunClient) RevokeAccountPrivilege(instanceId, account, dbName string) error { +func (s *RdsService) RevokeAccountPrivilege(instanceId, account, dbName string) error { request := rds.CreateRevokeAccountPrivilegeRequest() request.DBInstanceId = instanceId @@ -208,7 +225,10 @@ func (client *AliyunClient) RevokeAccountPrivilege(instanceId, account, dbName s err := resource.Retry(3*time.Minute, func() *resource.RetryError { ag := request - if _, err := client.rdsconn.RevokeAccountPrivilege(ag); err != nil { + _, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.RevokeAccountPrivilege(ag) + }) + if err != nil { if IsExceptedErrors(err, OperationDeniedDBStatus) { return resource.RetryableError(fmt.Errorf("Revoke DB %s account %s privilege got an error: %#v.", dbName, account, err)) } @@ -221,26 +241,29 @@ func (client *AliyunClient) RevokeAccountPrivilege(instanceId, account, dbName s return err } - if err := client.WaitForAccountPrivilegeRevoked(instanceId, account, dbName, 300); err != nil { + if err := s.WaitForAccountPrivilegeRevoked(instanceId, account, dbName, 300); err != nil { return fmt.Errorf("Wait for revoking DB %s account %s privilege got an error: %#v.", dbName, account, err) } return nil } -func (client *AliyunClient) ReleaseDBPublicConnection(instanceId, connection string) error { +func (s *RdsService) ReleaseDBPublicConnection(instanceId, connection string) error { request := rds.CreateReleaseInstancePublicConnectionRequest() request.DBInstanceId = instanceId request.CurrentConnectionString = connection - if _, err := client.rdsconn.ReleaseInstancePublicConnection(request); err != nil { + _, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.ReleaseInstancePublicConnection(request) + }) + if err != nil { return err } return nil } -func (client *AliyunClient) ModifyDBBackupPolicy(instanceId, backupTime, backupPeriod, retentionPeriod, backupLog, LogBackupRetentionPeriod string) error { +func (s *RdsService) ModifyDBBackupPolicy(instanceId, backupTime, backupPeriod, retentionPeriod, backupLog, LogBackupRetentionPeriod string) error { request := rds.CreateModifyBackupPolicyRequest() request.DBInstanceId = instanceId @@ -250,46 +273,55 @@ func (client *AliyunClient) ModifyDBBackupPolicy(instanceId, backupTime, backupP request.BackupLog = backupLog request.LogBackupRetentionPeriod = LogBackupRetentionPeriod - if _, err := client.rdsconn.ModifyBackupPolicy(request); err != nil { + _, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.ModifyBackupPolicy(request) + }) + if err != nil { return err } - if err := client.WaitForDBInstance(instanceId, Running, 600); err != nil { + if err := s.WaitForDBInstance(instanceId, Running, 600); err != nil { return err } return nil } -func (client *AliyunClient) ModifyDBSecurityIps(instanceId, ips string) error { +func (s *RdsService) ModifyDBSecurityIps(instanceId, ips string) error { request := rds.CreateModifySecurityIpsRequest() request.DBInstanceId = instanceId request.SecurityIps = ips - if _, err := client.rdsconn.ModifySecurityIps(request); err != nil { + _, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.ModifySecurityIps(request) + }) + if err != nil { return err } - if err := client.WaitForDBInstance(instanceId, Running, 600); err != nil { + if err := s.WaitForDBInstance(instanceId, Running, 600); err != nil { return err } return nil } -func (client *AliyunClient) DescribeDBSecurityIps(instanceId string) (ips []rds.DBInstanceIPArray, err error) { +func (s *RdsService) DescribeDBSecurityIps(instanceId string) (ips []rds.DBInstanceIPArray, err error) { request := rds.CreateDescribeDBInstanceIPArrayListRequest() request.DBInstanceId = instanceId - resp, err := client.rdsconn.DescribeDBInstanceIPArrayList(request) + raw, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DescribeDBInstanceIPArrayList(request) + }) if err != nil { return nil, err } + resp, _ := raw.(*rds.DescribeDBInstanceIPArrayListResponse) return resp.Items.DBInstanceIPArray, nil } -func (client *AliyunClient) GetSecurityIps(instanceId string) ([]string, error) { - arr, err := client.DescribeDBSecurityIps(instanceId) +func (s *RdsService) GetSecurityIps(instanceId string) ([]string, error) { + arr, err := s.DescribeDBSecurityIps(instanceId) if err != nil { return nil, err } @@ -316,16 +348,19 @@ func (client *AliyunClient) GetSecurityIps(instanceId string) ([]string, error) } // return multiIZ list of current region -func (client *AliyunClient) DescribeMultiIZByRegion() (izs []string, err error) { - resp, err := client.rdsconn.DescribeRegions(rds.CreateDescribeRegionsRequest()) +func (s *RdsService) DescribeMultiIZByRegion() (izs []string, err error) { + raw, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DescribeRegions(rds.CreateDescribeRegionsRequest()) + }) if err != nil { return nil, fmt.Errorf("error to list regions not found") } + resp, _ := raw.(*rds.DescribeRegionsResponse) regions := resp.Regions.RDSRegion zoneIds := []string{} for _, r := range regions { - if r.RegionId == string(client.Region) && strings.Contains(r.ZoneId, MULTI_IZ_SYMBOL) { + if r.RegionId == string(s.client.Region) && strings.Contains(r.ZoneId, MULTI_IZ_SYMBOL) { zoneIds = append(zoneIds, r.ZoneId) } } @@ -333,21 +368,24 @@ func (client *AliyunClient) DescribeMultiIZByRegion() (izs []string, err error) return zoneIds, nil } -func (client *AliyunClient) DescribeBackupPolicy(instanceId string) (policy *rds.DescribeBackupPolicyResponse, err error) { +func (s *RdsService) DescribeBackupPolicy(instanceId string) (policy *rds.DescribeBackupPolicyResponse, err error) { request := rds.CreateDescribeBackupPolicyRequest() request.DBInstanceId = instanceId - return client.rdsconn.DescribeBackupPolicy(request) + raw, err := s.client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) { + return rdsClient.DescribeBackupPolicy(request) + }) + return raw.(*rds.DescribeBackupPolicyResponse), err } // WaitForInstance waits for instance to given status -func (client *AliyunClient) WaitForDBInstance(instanceId string, status Status, timeout int) error { +func (s *RdsService) WaitForDBInstance(instanceId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - instance, err := client.DescribeDBInstanceById(instanceId) + instance, err := s.DescribeDBInstanceById(instanceId) if err != nil && !NotFoundError(err) && !IsExceptedError(err, InvalidDBInstanceIdNotFound) { return err } @@ -365,12 +403,12 @@ func (client *AliyunClient) WaitForDBInstance(instanceId string, status Status, return nil } -func (client *AliyunClient) WaitForDBConnection(instanceId string, netType IPType, timeout int) error { +func (s *RdsService) WaitForDBConnection(instanceId string, netType IPType, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - resp, err := client.DescribeDBInstanceNetInfoByIpType(instanceId, netType) + resp, err := s.DescribeDBInstanceNetInfoByIpType(instanceId, netType) if err != nil && !NotFoundError(err) { return err } @@ -390,13 +428,13 @@ func (client *AliyunClient) WaitForDBConnection(instanceId string, netType IPTyp return nil } -func (client *AliyunClient) WaitForAccount(instanceId string, accountName string, status Status, timeout int) error { +func (s *RdsService) WaitForAccount(instanceId string, accountName string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - account, err := client.DescribeDatabaseAccount(instanceId, accountName) + account, err := s.DescribeDatabaseAccount(instanceId, accountName) if err != nil { return err } @@ -416,13 +454,13 @@ func (client *AliyunClient) WaitForAccount(instanceId string, accountName string return nil } -func (client *AliyunClient) WaitForAccountPrivilege(instanceId, accountName, dbName, privilege string, timeout int) error { +func (s *RdsService) WaitForAccountPrivilege(instanceId, accountName, dbName, privilege string, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - account, err := client.DescribeDatabaseAccount(instanceId, accountName) + account, err := s.DescribeDatabaseAccount(instanceId, accountName) if err != nil { return err } @@ -452,12 +490,12 @@ func (client *AliyunClient) WaitForAccountPrivilege(instanceId, accountName, dbN return nil } -func (client *AliyunClient) WaitForAccountPrivilegeRevoked(instanceId, accountName, dbName string, timeout int) error { +func (s *RdsService) WaitForAccountPrivilegeRevoked(instanceId, accountName, dbName string, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - account, err := client.DescribeDatabaseAccount(instanceId, accountName) + account, err := s.DescribeDatabaseAccount(instanceId, accountName) if err != nil { return err } @@ -488,7 +526,7 @@ func (client *AliyunClient) WaitForAccountPrivilegeRevoked(instanceId, accountNa } // turn period to TimeType -func TransformPeriod2Time(period int, chargeType string) (ut int, tt common.TimeType) { +func (s *RdsService) TransformPeriod2Time(period int, chargeType string) (ut int, tt common.TimeType) { if chargeType == string(Postpaid) { return 1, common.Day } @@ -509,7 +547,7 @@ func TransformPeriod2Time(period int, chargeType string) (ut int, tt common.Time } // turn TimeType to Period -func TransformTime2Period(ut int, tt common.TimeType) (period int) { +func (s *RdsService) TransformTime2Period(ut int, tt common.TimeType) (period int) { if tt == common.Year { return 12 * ut } @@ -518,7 +556,7 @@ func TransformTime2Period(ut int, tt common.TimeType) (period int) { } -func flattenDBSecurityIPs(list []rds.DBInstanceIPArray) []map[string]interface{} { +func (s *RdsService) flattenDBSecurityIPs(list []rds.DBInstanceIPArray) []map[string]interface{} { result := make([]map[string]interface{}, 0, len(list)) for _, i := range list { l := map[string]interface{}{ @@ -529,7 +567,7 @@ func flattenDBSecurityIPs(list []rds.DBInstanceIPArray) []map[string]interface{} return result } -func NotFoundDBInstance(err error) bool { +func (s *RdsService) NotFoundDBInstance(err error) bool { if NotFoundError(err) || IsExceptedErrors(err, []string{InvalidDBInstanceIdNotFound, InvalidDBInstanceNameNotFound}) { return true } diff --git a/alicloud/service_alicloud_route_table.go b/alicloud/service_alicloud_route_table.go index c2bd35790d4..f6da4569016 100644 --- a/alicloud/service_alicloud_route_table.go +++ b/alicloud/service_alicloud_route_table.go @@ -8,18 +8,26 @@ import ( "github.com/hashicorp/terraform/helper/schema" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) DescribeRouteTable(routeTableId string) (v vpc.RouterTableListType, err error) { +type RouteTableService struct { + client *connectivity.AliyunClient +} + +func (s *RouteTableService) DescribeRouteTable(routeTableId string) (v vpc.RouterTableListType, err error) { request := vpc.CreateDescribeRouteTableListRequest() request.RouteTableId = routeTableId invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := client.vpcconn.DescribeRouteTableList(request) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeRouteTableList(request) + }) if err != nil { return err } + resp, _ := raw.(*vpc.DescribeRouteTableListResponse) length := len(resp.RouterTableList.RouterTableListType) if resp == nil || length <= 0 { return GetNotFoundErrorFromString(GetNotFoundMessage("RouteTable", routeTableId)) @@ -36,10 +44,10 @@ func (client *AliyunClient) DescribeRouteTable(routeTableId string) (v vpc.Route return } -func (client *AliyunClient) DescribeRouteTableAttachment(routeTableId string, vSwitchId string) (err error) { +func (s *RouteTableService) DescribeRouteTableAttachment(routeTableId string, vSwitchId string) (err error) { invoker := NewInvoker() return invoker.Run(func() error { - routeTable, err := client.DescribeRouteTable(routeTableId) + routeTable, err := s.DescribeRouteTable(routeTableId) if err != nil { return err } @@ -52,14 +60,14 @@ func (client *AliyunClient) DescribeRouteTableAttachment(routeTableId string, vS }) } -func (client *AliyunClient) WaitForRouteTable(routeTableId string, timeout int) error { +func (s *RouteTableService) WaitForRouteTable(routeTableId string, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { time.Sleep(DefaultIntervalShort * time.Second) - resp, err := client.DescribeRouteTable(routeTableId) + resp, err := s.DescribeRouteTable(routeTableId) if err != nil { return err @@ -74,13 +82,13 @@ func (client *AliyunClient) WaitForRouteTable(routeTableId string, timeout int) } } -func (client *AliyunClient) WaitForRouteTableAttachment(routeTableId string, vSwitchId string, timeout int) error { +func (s *RouteTableService) WaitForRouteTableAttachment(routeTableId string, vSwitchId string, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - err := client.DescribeRouteTableAttachment(routeTableId, vSwitchId) + err := s.DescribeRouteTableAttachment(routeTableId, vSwitchId) if err != nil { if !NotFoundError(err) { return err @@ -97,7 +105,7 @@ func (client *AliyunClient) WaitForRouteTableAttachment(routeTableId string, vSw return nil } -func getRouteTableIdAndVSwitchId(d *schema.ResourceData, meta interface{}) (string, string, error) { +func (s *RouteTableService) GetRouteTableIdAndVSwitchId(d *schema.ResourceData, meta interface{}) (string, string, error) { parts := strings.Split(d.Id(), COLON_SEPARATED) if len(parts) != 2 { diff --git a/alicloud/service_alicloud_slb.go b/alicloud/service_alicloud_slb.go index 39ad96e748c..f9483727081 100644 --- a/alicloud/service_alicloud_slb.go +++ b/alicloud/service_alicloud_slb.go @@ -3,6 +3,9 @@ package alicloud import ( "fmt" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" + "encoding/json" "strings" "time" @@ -11,25 +14,24 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" ) -func (client *AliyunClient) BuildSlbCommonRequest() *requests.CommonRequest { - request := requests.NewCommonRequest() - endpoint := LoadEndpoint(client.RegionId, SLBCode) - if endpoint == "" { - endpoint, _ = client.DescribeEndpointByCode(client.RegionId, SLBCode) - } - if endpoint == "" { - endpoint = fmt.Sprintf("slb.%s.aliyuncs.com", client.RegionId) - } - request.Domain = endpoint - request.Version = ApiVersion20140515 - request.RegionId = client.RegionId - return request +type SlbService struct { + client *connectivity.AliyunClient } -func (client *AliyunClient) DescribeLoadBalancerAttribute(slbId string) (loadBalancer *slb.DescribeLoadBalancerAttributeResponse, err error) { + +const max_num_per_time = 50 + +func (s *SlbService) BuildSlbCommonRequest() *requests.CommonRequest { + return s.client.NewCommonRequest(connectivity.SLBCode, connectivity.ApiVersion20140515) +} + +func (s *SlbService) DescribeLoadBalancerAttribute(slbId string) (loadBalancer *slb.DescribeLoadBalancerAttributeResponse, err error) { req := slb.CreateDescribeLoadBalancerAttributeRequest() req.LoadBalancerId = slbId - loadBalancer, err = client.slbconn.DescribeLoadBalancerAttribute(req) + raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeLoadBalancerAttribute(req) + }) + loadBalancer, _ = raw.(*slb.DescribeLoadBalancerAttributeResponse) if err != nil { if IsExceptedErrors(err, []string{LoadBalancerNotFound}) { @@ -43,64 +45,76 @@ func (client *AliyunClient) DescribeLoadBalancerAttribute(slbId string) (loadBal return } -func (client *AliyunClient) DescribeLoadBalancerRuleId(slbId string, port int, domain, url string) (string, error) { +func (s *SlbService) DescribeLoadBalancerRuleId(slbId string, port int, domain, url string) (string, error) { req := slb.CreateDescribeRulesRequest() req.LoadBalancerId = slbId req.ListenerPort = requests.NewInteger(port) - if rules, err := client.slbconn.DescribeRules(req); err != nil { + raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeRules(req) + }) + if err != nil { return "", fmt.Errorf("DescribeRules got an error: %#v", err) - } else { - for _, rule := range rules.Rules.Rule { - if rule.Domain == domain && rule.Url == url { - return rule.RuleId, nil - } + } + rules, _ := raw.(*slb.DescribeRulesResponse) + for _, rule := range rules.Rules.Rule { + if rule.Domain == domain && rule.Url == url { + return rule.RuleId, nil } } + return "", GetNotFoundErrorFromString(fmt.Sprintf("Rule is not found based on domain %s and url %s.", domain, url)) } -func (client *AliyunClient) DescribeLoadBalancerRuleAttribute(ruleId string) (*slb.DescribeRuleAttributeResponse, error) { +func (s *SlbService) DescribeLoadBalancerRuleAttribute(ruleId string) (*slb.DescribeRuleAttributeResponse, error) { req := slb.CreateDescribeRuleAttributeRequest() req.RuleId = ruleId - rule, err := client.slbconn.DescribeRuleAttribute(req) + raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeRuleAttribute(req) + }) if err != nil { if IsExceptedErrors(err, []string{InvalidRuleIdNotFound}) { return nil, GetNotFoundErrorFromString(GetNotFoundMessage("SLB Rule", ruleId)) } return nil, fmt.Errorf("DescribeLoadBalancerRuleAttribute got an error: %#v", err) } + rule, _ := raw.(*slb.DescribeRuleAttributeResponse) if rule == nil || rule.LoadBalancerId == "" { return nil, GetNotFoundErrorFromString(GetNotFoundMessage("SLB Rule", ruleId)) } return rule, err } -func (client *AliyunClient) DescribeSlbVServerGroupAttribute(groupId string) (*slb.DescribeVServerGroupAttributeResponse, error) { +func (s *SlbService) DescribeSlbVServerGroupAttribute(groupId string) (*slb.DescribeVServerGroupAttributeResponse, error) { req := slb.CreateDescribeVServerGroupAttributeRequest() req.VServerGroupId = groupId - group, err := client.slbconn.DescribeVServerGroupAttribute(req) + raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.DescribeVServerGroupAttribute(req) + }) if err != nil { if IsExceptedErrors(err, []string{VServerGroupNotFoundMessage, InvalidParameter}) { return nil, GetNotFoundErrorFromString(GetNotFoundMessage("SLB VServer Group", groupId)) } return nil, fmt.Errorf("DescribeSlbVServerGroupAttribute got an error: %#v", err) } + group, _ := raw.(*slb.DescribeVServerGroupAttributeResponse) if group == nil || group.VServerGroupId == "" { return nil, GetNotFoundErrorFromString(GetNotFoundMessage("SLB VServer Group", groupId)) } return group, err } -func (client *AliyunClient) DescribeLoadBalancerListenerAttribute(loadBalancerId string, port int, protocol Protocol) (listener map[string]interface{}, err error) { - req := client.BuildSlbCommonRequest() +func (s *SlbService) DescribeLoadBalancerListenerAttribute(loadBalancerId string, port int, protocol Protocol) (listener map[string]interface{}, err error) { + req := s.BuildSlbCommonRequest() req.ApiName = fmt.Sprintf("DescribeLoadBalancer%sListenerAttribute", strings.ToUpper(string(protocol))) req.QueryParams["LoadBalancerId"] = loadBalancerId req.QueryParams["ListenerPort"] = string(requests.NewInteger(port)) - resp, err := client.slbconn.ProcessCommonRequest(req) + raw, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.ProcessCommonRequest(req) + }) if err != nil { return } - + resp, _ := raw.(*responses.CommonResponse) if err = json.Unmarshal(resp.GetHttpContentBytes(), &listener); err != nil { err = fmt.Errorf("Unmarshalling body got an error: %#v.", err) } @@ -109,13 +123,13 @@ func (client *AliyunClient) DescribeLoadBalancerListenerAttribute(loadBalancerId } -func (client *AliyunClient) WaitForLoadBalancer(loadBalancerId string, status Status, timeout int) error { +func (s *SlbService) WaitForLoadBalancer(loadBalancerId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - lb, err := client.DescribeLoadBalancerAttribute(loadBalancerId) + lb, err := s.DescribeLoadBalancerAttribute(loadBalancerId) if err != nil { if !NotFoundError(err) { @@ -135,13 +149,13 @@ func (client *AliyunClient) WaitForLoadBalancer(loadBalancerId string, status St return nil } -func (client *AliyunClient) WaitForListener(loadBalancerId string, port int, protocol Protocol, status Status, timeout int) error { +func (s *SlbService) WaitForListener(loadBalancerId string, port int, protocol Protocol, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - listener, err := client.DescribeLoadBalancerListenerAttribute(loadBalancerId, port, protocol) + listener, err := s.DescribeLoadBalancerListenerAttribute(loadBalancerId, port, protocol) if err != nil && !IsExceptedErrors(err, []string{LoadBalancerNotFound}) { return err } @@ -160,14 +174,15 @@ func (client *AliyunClient) WaitForListener(loadBalancerId string, port int, pro return nil } -const max_num_per_time = 50 - -func slbRemoveAccessControlListEntryPerTime(client *slb.Client, list []interface{}, aclId string) error { +func (s *SlbService) slbRemoveAccessControlListEntryPerTime(list []interface{}, aclId string) error { req := slb.CreateRemoveAccessControlListEntryRequest() req.AclId = aclId b, _ := json.Marshal(list) req.AclEntrys = string(b) - if _, err := client.RemoveAccessControlListEntry(req); err != nil { + _, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.RemoveAccessControlListEntry(req) + }) + if err != nil { if !IsExceptedError(err, SlbAclEntryEmpty) { return fmt.Errorf("RemoveAccessControlListEntry got an error: %#v", err) } @@ -176,7 +191,7 @@ func slbRemoveAccessControlListEntryPerTime(client *slb.Client, list []interface return nil } -func slbRemoveAccessControlListEntry(client *slb.Client, list []interface{}, aclId string) error { +func (s *SlbService) SlbRemoveAccessControlListEntry(list []interface{}, aclId string) error { num := len(list) if num <= 0 { @@ -193,7 +208,7 @@ func slbRemoveAccessControlListEntry(client *slb.Client, list []interface{}, acl } slice := list[start:end] - if err := slbRemoveAccessControlListEntryPerTime(client, slice, aclId); err != nil { + if err := s.slbRemoveAccessControlListEntryPerTime(slice, aclId); err != nil { return err } } @@ -201,19 +216,22 @@ func slbRemoveAccessControlListEntry(client *slb.Client, list []interface{}, acl return nil } -func slbAddAccessControlListEntryPerTime(client *slb.Client, list []interface{}, aclId string) error { +func (s *SlbService) slbAddAccessControlListEntryPerTime(list []interface{}, aclId string) error { req := slb.CreateAddAccessControlListEntryRequest() req.AclId = aclId b, _ := json.Marshal(list) req.AclEntrys = string(b) - if _, err := client.AddAccessControlListEntry(req); err != nil { + _, err := s.client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { + return slbClient.AddAccessControlListEntry(req) + }) + if err != nil { return fmt.Errorf("AddAccessControlListEntry got an error: %#v", err) } return nil } -func slbAddAccessControlListEntry(client *slb.Client, list []interface{}, aclId string) error { +func (s *SlbService) SlbAddAccessControlListEntry(list []interface{}, aclId string) error { num := len(list) if num <= 0 { @@ -229,7 +247,7 @@ func slbAddAccessControlListEntry(client *slb.Client, list []interface{}, aclId end = num } slice := list[start:end] - if err := slbAddAccessControlListEntryPerTime(client, slice, aclId); err != nil { + if err := s.slbAddAccessControlListEntryPerTime(slice, aclId); err != nil { return err } } @@ -238,7 +256,7 @@ func slbAddAccessControlListEntry(client *slb.Client, list []interface{}, aclId } // Flattens an array of slb.AclEntry into a []map[string]string -func flattenSlbAclEntryMappings(list []slb.AclEntry) []map[string]interface{} { +func (s *SlbService) FlattenSlbAclEntryMappings(list []slb.AclEntry) []map[string]interface{} { result := make([]map[string]interface{}, 0, len(list)) for _, i := range list { @@ -253,7 +271,7 @@ func flattenSlbAclEntryMappings(list []slb.AclEntry) []map[string]interface{} { } // Flattens an array of slb.AclEntry into a []map[string]string -func flattenSlbRelatedListeneryMappings(list []slb.RelatedListener) []map[string]interface{} { +func (s *SlbService) flattenSlbRelatedListeneryMappings(list []slb.RelatedListener) []map[string]interface{} { result := make([]map[string]interface{}, 0, len(list)) for _, i := range list { diff --git a/alicloud/service_alicloud_vpc.go b/alicloud/service_alicloud_vpc.go index 0cdaf9653f3..7d26be0613b 100644 --- a/alicloud/service_alicloud_vpc.go +++ b/alicloud/service_alicloud_vpc.go @@ -7,38 +7,28 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) BuildVpcCommonRequest(region string) *requests.CommonRequest { - request := requests.NewCommonRequest() - endpoint := LoadEndpoint(client.RegionId, VPCCode) - if region == "" { - region = client.RegionId - } - if endpoint == "" { - endpoint, _ = client.DescribeEndpointByCode(region, VPCCode) - } - if endpoint == "" { - endpoint = fmt.Sprintf("vpc.%s.aliyuncs.com", region) - } - request.Domain = endpoint - request.Version = ApiVersion20160428 - request.RegionId = region - return request +type VpcService struct { + client *connectivity.AliyunClient } -func (client *AliyunClient) DescribeEipAddress(allocationId string) (eip vpc.EipAddress, err error) { +func (s *VpcService) DescribeEipAddress(allocationId string) (eip vpc.EipAddress, err error) { args := vpc.CreateDescribeEipAddressesRequest() - args.RegionId = string(client.Region) + args.RegionId = string(s.client.Region) args.AllocationId = allocationId invoker := NewInvoker() err = invoker.Run(func() error { - eips, err := client.vpcconn.DescribeEipAddresses(args) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeEipAddresses(args) + }) if err != nil { return err } + eips, _ := raw.(*vpc.DescribeEipAddressesResponse) if eips == nil || len(eips.EipAddresses.EipAddress) <= 0 { return GetNotFoundErrorFromString(GetNotFoundMessage("EIP", allocationId)) } @@ -48,22 +38,24 @@ func (client *AliyunClient) DescribeEipAddress(allocationId string) (eip vpc.Eip return } -func (client *AliyunClient) DescribeNatGateway(natGatewayId string) (nat vpc.NatGateway, err error) { +func (s *VpcService) DescribeNatGateway(natGatewayId string) (nat vpc.NatGateway, err error) { args := vpc.CreateDescribeNatGatewaysRequest() - args.RegionId = string(client.Region) + args.RegionId = string(s.client.Region) args.NatGatewayId = natGatewayId invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := client.vpcconn.DescribeNatGateways(args) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeNatGateways(args) + }) if err != nil { if IsExceptedError(err, InvalidNatGatewayIdNotFound) { return GetNotFoundErrorFromString(GetNotFoundMessage("Nat Gateway", natGatewayId)) } return err } - + resp, _ := raw.(*vpc.DescribeNatGatewaysResponse) if resp == nil || len(resp.NatGateways.NatGateway) <= 0 { return GetNotFoundErrorFromString(GetNotFoundMessage("Nat Gateway", natGatewayId)) } @@ -74,19 +66,22 @@ func (client *AliyunClient) DescribeNatGateway(natGatewayId string) (nat vpc.Nat return } -func (client *AliyunClient) DescribeVpc(vpcId string) (v vpc.DescribeVpcAttributeResponse, err error) { +func (s *VpcService) DescribeVpc(vpcId string) (v vpc.DescribeVpcAttributeResponse, err error) { request := vpc.CreateDescribeVpcAttributeRequest() request.VpcId = vpcId invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := client.vpcconn.DescribeVpcAttribute(request) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVpcAttribute(request) + }) if err != nil { if IsExceptedErrors(err, []string{InvalidVpcIDNotFound, ForbiddenVpcNotFound}) { return GetNotFoundErrorFromString(GetNotFoundMessage("VPC", vpcId)) } return err } + resp, _ := raw.(*vpc.DescribeVpcAttributeResponse) if resp == nil || resp.VpcId != vpcId { return GetNotFoundErrorFromString(GetNotFoundMessage("VPC", vpcId)) } @@ -96,19 +91,22 @@ func (client *AliyunClient) DescribeVpc(vpcId string) (v vpc.DescribeVpcAttribut return } -func (client *AliyunClient) DescribeVswitch(vswitchId string) (v vpc.DescribeVSwitchAttributesResponse, err error) { +func (s *VpcService) DescribeVswitch(vswitchId string) (v vpc.DescribeVSwitchAttributesResponse, err error) { request := vpc.CreateDescribeVSwitchAttributesRequest() request.VSwitchId = vswitchId invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := client.vpcconn.DescribeVSwitchAttributes(request) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVSwitchAttributes(request) + }) if err != nil { if IsExceptedError(err, InvalidVswitchIDNotFound) { return GetNotFoundErrorFromString(GetNotFoundMessage("VSwitch", vswitchId)) } return err } + resp, _ := raw.(*vpc.DescribeVSwitchAttributesResponse) if resp == nil || resp.VSwitchId != vswitchId { return GetNotFoundErrorFromString(GetNotFoundMessage("VSwitch", vswitchId)) } @@ -118,10 +116,10 @@ func (client *AliyunClient) DescribeVswitch(vswitchId string) (v vpc.DescribeVSw return } -func (client *AliyunClient) DescribeSnatEntry(snatTableId string, snatEntryId string) (snat vpc.SnatTableEntry, err error) { +func (s *VpcService) DescribeSnatEntry(snatTableId string, snatEntryId string) (snat vpc.SnatTableEntry, err error) { request := vpc.CreateDescribeSnatTableEntriesRequest() - request.RegionId = string(client.Region) + request.RegionId = string(s.client.Region) request.SnatTableId = snatTableId request.PageSize = requests.NewInteger(PageSizeLarge) @@ -129,8 +127,10 @@ func (client *AliyunClient) DescribeSnatEntry(snatTableId string, snatEntryId st invoker := NewInvoker() var snatEntries *vpc.DescribeSnatTableEntriesResponse err = invoker.Run(func() error { - resp, err := client.vpcconn.DescribeSnatTableEntries(request) - snatEntries = resp + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeSnatTableEntries(request) + }) + snatEntries, _ = raw.(*vpc.DescribeSnatTableEntriesResponse) return err }) @@ -166,15 +166,17 @@ func (client *AliyunClient) DescribeSnatEntry(snatTableId string, snatEntryId st return snat, GetNotFoundErrorFromString(GetNotFoundMessage("Snat Entry", snatEntryId)) } -func (client *AliyunClient) DescribeForwardEntry(forwardTableId string, forwardEntryId string) (entry vpc.ForwardTableEntry, err error) { +func (s *VpcService) DescribeForwardEntry(forwardTableId string, forwardEntryId string) (entry vpc.ForwardTableEntry, err error) { args := vpc.CreateDescribeForwardTableEntriesRequest() - args.RegionId = string(client.Region) + args.RegionId = string(s.client.Region) args.ForwardTableId = forwardTableId invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := client.vpcconn.DescribeForwardTableEntries(args) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeForwardTableEntries(args) + }) //this special deal cause the DescribeSnatEntry can't find the records would be throw "cant find the snatTable error" //so judge the snatEntries length priority if err != nil { @@ -183,7 +185,7 @@ func (client *AliyunClient) DescribeForwardEntry(forwardTableId string, forwardE } return err } - + resp, _ := raw.(*vpc.DescribeForwardTableEntriesResponse) if resp == nil || len(resp.ForwardTableEntries.ForwardTableEntry) <= 0 { return GetNotFoundErrorFromString(GetNotFoundMessage("Forward Entry", forwardTableId)) } @@ -200,17 +202,19 @@ func (client *AliyunClient) DescribeForwardEntry(forwardTableId string, forwardE return } -func (client *AliyunClient) QueryRouteTableById(routeTableId string) (rt vpc.RouteTable, err error) { +func (s *VpcService) QueryRouteTableById(routeTableId string) (rt vpc.RouteTable, err error) { request := vpc.CreateDescribeRouteTablesRequest() request.RouteTableId = routeTableId invoker := NewInvoker() err = invoker.Run(func() error { - rts, err := client.vpcconn.DescribeRouteTables(request) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeRouteTables(request) + }) if err != nil { return err } - + rts, _ := raw.(*vpc.DescribeRouteTablesResponse) if rts == nil || len(rts.RouteTables.RouteTable) == 0 || rts.RouteTables.RouteTable[0].RouteTableId != routeTableId { return GetNotFoundErrorFromString(GetNotFoundMessage("Route Table", routeTableId)) @@ -222,8 +226,8 @@ func (client *AliyunClient) QueryRouteTableById(routeTableId string) (rt vpc.Rou return } -func (client *AliyunClient) QueryRouteEntry(routeTableId, cidrBlock, nextHopType, nextHopId string) (rn vpc.RouteEntry, err error) { - rt, err := client.QueryRouteTableById(routeTableId) +func (s *VpcService) QueryRouteEntry(routeTableId, cidrBlock, nextHopType, nextHopId string) (rn vpc.RouteEntry, err error) { + rt, err := s.QueryRouteTableById(routeTableId) if err != nil { return } @@ -236,7 +240,7 @@ func (client *AliyunClient) QueryRouteEntry(routeTableId, cidrBlock, nextHopType return rn, GetNotFoundErrorFromString(GetNotFoundMessage("Route Entry", routeTableId)) } -func (client *AliyunClient) DescribeRouterInterface(regionId, interfaceId string) (ri vpc.RouterInterfaceTypeInDescribeRouterInterfaces, err error) { +func (s *VpcService) DescribeRouterInterface(regionId, interfaceId string) (ri vpc.RouterInterfaceTypeInDescribeRouterInterfaces, err error) { request := vpc.CreateDescribeRouterInterfacesRequest() request.RegionId = regionId values := []string{interfaceId} @@ -249,10 +253,13 @@ func (client *AliyunClient) DescribeRouterInterface(regionId, interfaceId string invoker := NewInvoker() err = invoker.Run(func() error { - resp, err := client.vpcconn.DescribeRouterInterfaces(request) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeRouterInterfaces(request) + }) if err != nil { return err } + resp, _ := raw.(*vpc.DescribeRouterInterfacesResponse) if resp == nil || len(resp.RouterInterfaceSet.RouterInterfaceType) <= 0 || resp.RouterInterfaceSet.RouterInterfaceType[0].RouterInterfaceId != interfaceId { return GetNotFoundErrorFromString(GetNotFoundMessage("Router Interface", interfaceId)) @@ -263,13 +270,13 @@ func (client *AliyunClient) DescribeRouterInterface(regionId, interfaceId string return } -func (client *AliyunClient) WaitForVpc(vpcId string, status Status, timeout int) error { +func (s *VpcService) WaitForVpc(vpcId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - vpc, err := client.DescribeVpc(vpcId) + vpc, err := s.DescribeVpc(vpcId) if err != nil { return err } @@ -285,13 +292,13 @@ func (client *AliyunClient) WaitForVpc(vpcId string, status Status, timeout int) return nil } -func (client *AliyunClient) WaitForVSwitch(vswitchId string, status Status, timeout int) error { +func (s *VpcService) WaitForVSwitch(vswitchId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - vswitch, err := client.DescribeVswitch(vswitchId) + vswitch, err := s.DescribeVswitch(vswitchId) if err != nil { return err } @@ -307,13 +314,13 @@ func (client *AliyunClient) WaitForVSwitch(vswitchId string, status Status, time return nil } -func (client *AliyunClient) WaitForAllRouteEntries(routeTableId string, status Status, timeout int) error { +func (s *VpcService) WaitForAllRouteEntries(routeTableId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - table, err := client.QueryRouteTableById(routeTableId) + table, err := s.QueryRouteTableById(routeTableId) if err != nil { return err @@ -339,13 +346,13 @@ func (client *AliyunClient) WaitForAllRouteEntries(routeTableId string, status S return nil } -func (client *AliyunClient) WaitForRouterInterface(regionId, interfaceId string, status Status, timeout int) error { +func (s *VpcService) WaitForRouterInterface(regionId, interfaceId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { time.Sleep(DefaultIntervalShort * time.Second) - result, err := client.DescribeRouterInterface(regionId, interfaceId) + result, err := s.DescribeRouterInterface(regionId, interfaceId) if err != nil { return err } else if result.Status == string(status) { @@ -361,13 +368,13 @@ func (client *AliyunClient) WaitForRouterInterface(regionId, interfaceId string, return nil } -func (client *AliyunClient) WaitForEip(allocationId string, status Status, timeout int) error { +func (s *VpcService) WaitForEip(allocationId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { - eip, err := client.DescribeEipAddress(allocationId) + eip, err := s.DescribeEipAddress(allocationId) if err != nil { if !NotFoundError(err) { return err @@ -384,19 +391,25 @@ func (client *AliyunClient) WaitForEip(allocationId string, status Status, timeo return nil } -func (client *AliyunClient) DeactivateRouterInterface(interfaceId string) error { +func (s *VpcService) DeactivateRouterInterface(interfaceId string) error { req := vpc.CreateDeactivateRouterInterfaceRequest() req.RouterInterfaceId = interfaceId - if _, err := client.vpcconn.DeactivateRouterInterface(req); err != nil { + _, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DeactivateRouterInterface(req) + }) + if err != nil { return fmt.Errorf("Deactivating RouterInterface %s got an error: %#v.", interfaceId, err) } return nil } -func (client *AliyunClient) ActivateRouterInterface(interfaceId string) error { +func (s *VpcService) ActivateRouterInterface(interfaceId string) error { req := vpc.CreateActivateRouterInterfaceRequest() req.RouterInterfaceId = interfaceId - if _, err := client.vpcconn.ActivateRouterInterface(req); err != nil { + _, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.ActivateRouterInterface(req) + }) + if err != nil { return fmt.Errorf("Activating RouterInterface %s got an error: %#v.", interfaceId, err) } return nil diff --git a/alicloud/service_alicloud_vpn_gateway.go b/alicloud/service_alicloud_vpn_gateway.go index e2459a5bef5..c141fe4ccfd 100644 --- a/alicloud/service_alicloud_vpn_gateway.go +++ b/alicloud/service_alicloud_vpn_gateway.go @@ -9,71 +9,87 @@ import ( "fmt" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) -func (client *AliyunClient) DescribeVpnGateway(vpnId string) (v vpc.DescribeVpnGatewayResponse, err error) { +type VpnGatewayService struct { + client *connectivity.AliyunClient +} + +func (s *VpnGatewayService) DescribeVpnGateway(vpnId string) (v vpc.DescribeVpnGatewayResponse, err error) { request := vpc.CreateDescribeVpnGatewayRequest() request.VpnGatewayId = vpnId - resp, err := client.vpcconn.DescribeVpnGateway(request) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVpnGateway(request) + }) if err != nil { if IsExceptedErrors(err, []string{VpnForbidden, VpnNotFound}) { return v, GetNotFoundErrorFromString(GetNotFoundMessage("VPN", vpnId)) } return } + resp, _ := raw.(*vpc.DescribeVpnGatewayResponse) if resp == nil || resp.VpnGatewayId != vpnId { return v, GetNotFoundErrorFromString(GetNotFoundMessage("VPN", vpnId)) } return *resp, nil } -func (client *AliyunClient) DescribeCustomerGateway(cgwId string) (v vpc.DescribeCustomerGatewayResponse, err error) { +func (s *VpnGatewayService) DescribeCustomerGateway(cgwId string) (v vpc.DescribeCustomerGatewayResponse, err error) { request := vpc.CreateDescribeCustomerGatewayRequest() request.CustomerGatewayId = cgwId - resp, err := client.vpcconn.DescribeCustomerGateway(request) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeCustomerGateway(request) + }) if err != nil { if IsExceptedErrors(err, []string{VpnForbidden, CgwNotFound}) { return v, GetNotFoundErrorFromString(GetNotFoundMessage("VPN customer gateway", cgwId)) } return } + resp, _ := raw.(*vpc.DescribeCustomerGatewayResponse) if resp == nil || resp.CustomerGatewayId != cgwId { return v, GetNotFoundErrorFromString(GetNotFoundMessage("VPN", cgwId)) } return *resp, nil } -func (client *AliyunClient) DescribeVpnConnection(id string) (v vpc.DescribeVpnConnectionResponse, err error) { +func (s *VpnGatewayService) DescribeVpnConnection(id string) (v vpc.DescribeVpnConnectionResponse, err error) { request := vpc.CreateDescribeVpnConnectionRequest() request.VpnConnectionId = id - resp, err := client.vpcconn.DescribeVpnConnection(request) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeVpnConnection(request) + }) if err != nil { if IsExceptedErrors(err, []string{VpnForbidden, VpnConnNotFound}) { return v, GetNotFoundErrorFromString(GetNotFoundMessage("VPN connection", id)) } return } + resp, _ := raw.(*vpc.DescribeVpnConnectionResponse) if resp == nil || resp.VpnConnectionId != id { return v, GetNotFoundErrorFromString(GetNotFoundMessage("VPN connection", id)) } return *resp, nil } -func (client *AliyunClient) DescribeSslVpnServer(sslId string) (v vpc.SslVpnServer, err error) { +func (s *VpnGatewayService) DescribeSslVpnServer(sslId string) (v vpc.SslVpnServer, err error) { request := vpc.CreateDescribeSslVpnServersRequest() request.SslVpnServerId = sslId - resp, err := client.vpcconn.DescribeSslVpnServers(request) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeSslVpnServers(request) + }) if err != nil { if IsExceptedErrors(err, []string{VpnForbidden, SslVpnServerNotFound}) { return v, GetNotFoundErrorFromString(GetNotFoundMessage("SSL VPN server", sslId)) } return } - + resp, _ := raw.(*vpc.DescribeSslVpnServersResponse) if resp == nil || 0 == len(resp.SslVpnServers.SslVpnServer) { return v, GetNotFoundErrorFromString(GetNotFoundMessage("SSL VPN server", sslId)) } @@ -85,31 +101,34 @@ func (client *AliyunClient) DescribeSslVpnServer(sslId string) (v vpc.SslVpnServ return resp.SslVpnServers.SslVpnServer[0], nil } -func (client *AliyunClient) DescribeSslVpnClientCert(id string) (v vpc.DescribeSslVpnClientCertResponse, err error) { +func (s *VpnGatewayService) DescribeSslVpnClientCert(id string) (v vpc.DescribeSslVpnClientCertResponse, err error) { request := vpc.CreateDescribeSslVpnClientCertRequest() request.SslVpnClientCertId = id - resp, err := client.vpcconn.DescribeSslVpnClientCert(request) + raw, err := s.client.WithVpcClient(func(vpcClient *vpc.Client) (interface{}, error) { + return vpcClient.DescribeSslVpnClientCert(request) + }) if err != nil { if IsExceptedErrors(err, []string{VpnForbidden, SslVpnClientCertNotFound}) { return v, GetNotFoundErrorFromString(GetNotFoundMessage("VPN", id)) } return } + resp, _ := raw.(*vpc.DescribeSslVpnClientCertResponse) if resp == nil || resp.SslVpnClientCertId != id { return v, GetNotFoundErrorFromString(GetNotFoundMessage("VPN", id)) } return *resp, nil } -func (client *AliyunClient) WaitForVpn(vpnId string, status Status, timeout int) error { +func (s *VpnGatewayService) WaitForVpn(vpnId string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } for { //wait the order effective - vpn, err := client.DescribeVpnGateway(vpnId) + vpn, err := s.DescribeVpnGateway(vpnId) if err != nil { return err } @@ -125,7 +144,7 @@ func (client *AliyunClient) WaitForVpn(vpnId string, status Status, timeout int) return nil } -func (client *AliyunClient) WaitForCustomerGateway(id string, status Status, timeout int) error { +func (s *VpnGatewayService) WaitForCustomerGateway(id string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } @@ -137,7 +156,7 @@ func (client *AliyunClient) WaitForCustomerGateway(id string, status Status, tim } time.Sleep(DefaultIntervalShort * time.Second) - _, err := client.DescribeCustomerGateway(id) + _, err := s.DescribeCustomerGateway(id) if err != nil { return err } else { @@ -147,7 +166,7 @@ func (client *AliyunClient) WaitForCustomerGateway(id string, status Status, tim return nil } -func (client *AliyunClient) WaitForSslVpnClientCert(id string, status Status, timeout int) error { +func (s *VpnGatewayService) WaitForSslVpnClientCert(id string, status Status, timeout int) error { if timeout <= 0 { timeout = DefaultTimeout } @@ -159,7 +178,7 @@ func (client *AliyunClient) WaitForSslVpnClientCert(id string, status Status, ti } time.Sleep(DefaultIntervalShort * time.Second) - resp, err := client.DescribeSslVpnClientCert(id) + resp, err := s.DescribeSslVpnClientCert(id) if err != nil { return err } @@ -171,7 +190,7 @@ func (client *AliyunClient) WaitForSslVpnClientCert(id string, status Status, ti return nil } -func ParseIkeConfig(ike vpc.IkeConfig) (ikeConfigs []map[string]interface{}) { +func (s *VpnGatewayService) ParseIkeConfig(ike vpc.IkeConfig) (ikeConfigs []map[string]interface{}) { item := map[string]interface{}{ "ike_auth_alg": ike.IkeAuthAlg, "ike_enc_alg": ike.IkeEncAlg, @@ -188,7 +207,7 @@ func ParseIkeConfig(ike vpc.IkeConfig) (ikeConfigs []map[string]interface{}) { return } -func ParseIpsecConfig(ipsec vpc.IpsecConfig) (ipsecConfigs []map[string]interface{}) { +func (s *VpnGatewayService) ParseIpsecConfig(ipsec vpc.IpsecConfig) (ipsecConfigs []map[string]interface{}) { item := map[string]interface{}{ "ipsec_auth_alg": ipsec.IpsecAuthAlg, "ipsec_enc_alg": ipsec.IpsecEncAlg, @@ -200,7 +219,7 @@ func ParseIpsecConfig(ipsec vpc.IpsecConfig) (ipsecConfigs []map[string]interfac return } -func AssembleIkeConfig(ikeCfgParam []interface{}) (string, error) { +func (s *VpnGatewayService) AssembleIkeConfig(ikeCfgParam []interface{}) (string, error) { var ikeCfg IkeConfig v := ikeCfgParam[0] item := v.(map[string]interface{}) @@ -223,7 +242,7 @@ func AssembleIkeConfig(ikeCfgParam []interface{}) (string, error) { return string(data), nil } -func AssembleIpsecConfig(ipsecCfgParam []interface{}) (string, error) { +func (s *VpnGatewayService) AssembleIpsecConfig(ipsecCfgParam []interface{}) (string, error) { var ipsecCfg IpsecConfig v := ipsecCfgParam[0] item := v.(map[string]interface{}) @@ -241,7 +260,7 @@ func AssembleIpsecConfig(ipsecCfgParam []interface{}) (string, error) { return string(data), nil } -func AssembleNetworkSubnetToString(list []interface{}) string { +func (s *VpnGatewayService) AssembleNetworkSubnetToString(list []interface{}) string { if len(list) < 1 { return "" } diff --git a/alicloud/tags.go b/alicloud/tags.go index 22e028e3d04..22ae95a58a2 100644 --- a/alicloud/tags.go +++ b/alicloud/tags.go @@ -9,6 +9,7 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-alicloud/alicloud/connectivity" ) func String(v string) *string { @@ -27,7 +28,7 @@ func tagsSchema() *schema.Schema { // setTags is a helper to set the tags for a resource. It expects the // tags field to be named "tags" -func setTags(client *AliyunClient, resourceType TagResourceType, d *schema.ResourceData) error { +func setTags(client *connectivity.AliyunClient, resourceType TagResourceType, d *schema.ResourceData) error { if d.HasChange("tags") { oraw, nraw := d.GetChange("tags") @@ -50,7 +51,10 @@ func setTags(client *AliyunClient, resourceType TagResourceType, d *schema.Resou }) } args.Tag = &tags - if _, err := client.ecsconn.RemoveTags(args); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.RemoveTags(args) + }) + if err != nil { return fmt.Errorf("Remove tags got error: %s", err) } } @@ -69,7 +73,10 @@ func setTags(client *AliyunClient, resourceType TagResourceType, d *schema.Resou }) } args.Tag = &tags - if _, err := client.ecsconn.AddTags(args); err != nil { + _, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { + return ecsClient.AddTags(args) + }) + if err != nil { return fmt.Errorf("Creating tags got error: %s", err) } }