From 5b232c2ff29851fa076e12ce58a546ada4971a8c Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Mon, 13 Sep 2021 22:35:50 +0800 Subject: [PATCH] fix: AWS asume role with optional name --- pkg/cloudevent/models/cloudproviders.go | 3 +- pkg/cloudid/models/cloudaccount.go | 3 +- pkg/cloudmon/collectors/common/basemon.go | 32 ++++++----------- pkg/cloudprovider/cloudprovider.go | 3 +- pkg/cloudprovider/extra.go | 19 ++++++++++ pkg/compute/models/cloudaccounts.go | 33 +++++------------ pkg/compute/models/cloudproviders.go | 13 +------ pkg/mcclient/options/cloudaccounts.go | 14 +++++++- pkg/multicloud/apsara/apsara.go | 42 +++++++++++----------- pkg/multicloud/apsara/bucket.go | 2 +- pkg/multicloud/apsara/provider/provider.go | 6 +++- pkg/multicloud/aws/aws.go | 18 +++++++++- pkg/multicloud/aws/aws_test.go | 30 ++++++++++++++++ pkg/multicloud/aws/provider/provider.go | 6 +++- pkg/multicloud/aws/utils.go | 4 +-- pkg/multicloud/hcso/bucket.go | 2 +- pkg/multicloud/hcso/huawei.go | 4 +-- pkg/multicloud/hcso/provider/provider.go | 6 +++- pkg/multicloud/hcso/saml_provider.go | 2 +- pkg/multicloud/hcso/wire.go | 4 +-- 20 files changed, 148 insertions(+), 98 deletions(-) create mode 100644 pkg/cloudprovider/extra.go create mode 100644 pkg/multicloud/aws/aws_test.go diff --git a/pkg/cloudevent/models/cloudproviders.go b/pkg/cloudevent/models/cloudproviders.go index 7d8171501b..8609f70ef9 100644 --- a/pkg/cloudevent/models/cloudproviders.go +++ b/pkg/cloudevent/models/cloudproviders.go @@ -408,8 +408,7 @@ func (self *SCloudprovider) GetProvider() (cloudprovider.ICloudProvider, error) ProxyFunc: proxyFunc, - SHCSOEndpoints: delegate.Options.SHCSOEndpoints, - SApsaraEndpoints: delegate.Options.SApsaraEndpoints, + Options: jsonutils.Marshal(delegate.Options).(*jsonutils.JSONDict), }, ) } diff --git a/pkg/cloudid/models/cloudaccount.go b/pkg/cloudid/models/cloudaccount.go index 8fbf5c67e5..3c1ffff3aa 100644 --- a/pkg/cloudid/models/cloudaccount.go +++ b/pkg/cloudid/models/cloudaccount.go @@ -568,8 +568,7 @@ func (account *SCloudDelegate) GetProvider() (cloudprovider.ICloudProvider, erro Secret: passwd, ProxyFunc: proxyFunc, - SApsaraEndpoints: account.Options.SApsaraEndpoints, - SHCSOEndpoints: account.Options.SHCSOEndpoints, + Options: jsonutils.Marshal(account.Options).(*jsonutils.JSONDict), AccountId: account.Id, }) diff --git a/pkg/cloudmon/collectors/common/basemon.go b/pkg/cloudmon/collectors/common/basemon.go index 72a90c4dd4..6718930b0b 100644 --- a/pkg/cloudmon/collectors/common/basemon.go +++ b/pkg/cloudmon/collectors/common/basemon.go @@ -123,31 +123,19 @@ func (self *CloudReportBase) InitProviderInstance() (cloudprovider.ICloudProvide if err != nil { return nil, errors.Wrap(err, "getCloudAccount error") } - endpoints := cloudprovider.SApsaraEndpoints{} - hwendpoints := cloudprovider.SHCSOEndpoints{} options, err := cloudAccout.Get("options") - if err == nil { - err := options.Unmarshal(&endpoints) - if err != nil { - log.Errorf("Unmarshal SApsaraEndpoints err: %v", err) - } - err = options.Unmarshal(&hwendpoints) - if err != nil { - log.Errorf("Unmarshal SHCSOEndpoints err: %v", err) - } - } else { - log.Errorf("get cloudAccout options err: %v", err) + if err != nil { + log.Errorf("get cloudAccout options err:%v", err) } cfg := cloudprovider.ProviderConfig{ - Id: self.SProvider.Id, - Name: self.SProvider.Name, - URL: self.SProvider.AccessUrl, - Account: self.SProvider.Account, - Secret: secretDe, - Vendor: self.SProvider.Provider, - ProxyFunc: proxyFunc, - SApsaraEndpoints: endpoints, - SHCSOEndpoints: hwendpoints, + Id: self.SProvider.Id, + Name: self.SProvider.Name, + URL: self.SProvider.AccessUrl, + Account: self.SProvider.Account, + Secret: secretDe, + Vendor: self.SProvider.Provider, + ProxyFunc: proxyFunc, + Options: options.(*jsonutils.JSONDict), } return cloudprovider.GetProvider(cfg) } diff --git a/pkg/cloudprovider/cloudprovider.go b/pkg/cloudprovider/cloudprovider.go index 0fc466fea1..1d907e34a0 100644 --- a/pkg/cloudprovider/cloudprovider.go +++ b/pkg/cloudprovider/cloudprovider.go @@ -160,8 +160,7 @@ type ProviderConfig struct { AccountId string - SApsaraEndpoints - SHCSOEndpoints + Options *jsonutils.JSONDict ProxyFunc httputils.TransportProxyFunc } diff --git a/pkg/cloudprovider/extra.go b/pkg/cloudprovider/extra.go new file mode 100644 index 0000000000..8c3142584c --- /dev/null +++ b/pkg/cloudprovider/extra.go @@ -0,0 +1,19 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cloudprovider + +type SAWSExtraOptions struct { + AWSAssumeRoleName string `json:"aws_assume_role_name"` +} diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 3af3a932db..3a00019239 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -437,15 +437,11 @@ func (manager *SCloudaccountManager) validateCreateData( } var endpointOptions jsonutils.JSONObject - endpoints := cloudprovider.SApsaraEndpoints{} if input.SCloudaccountCredential.SApsaraEndpoints != nil { - endpoints = *input.SCloudaccountCredential.SApsaraEndpoints endpointOptions = jsonutils.Marshal(input.SCloudaccountCredential.SApsaraEndpoints) } - hcsoEndpoints := cloudprovider.SHCSOEndpoints{} if input.SCloudaccountCredential.SHCSOEndpoints != nil { - hcsoEndpoints = *input.SCloudaccountCredential.SHCSOEndpoints endpointOptions = jsonutils.Marshal(input.SCloudaccountCredential.SHCSOEndpoints) } @@ -511,8 +507,7 @@ func (manager *SCloudaccountManager) validateCreateData( Secret: input.Secret, ProxyFunc: proxyFunc, - SApsaraEndpoints: endpoints, - SHCSOEndpoints: hcsoEndpoints, + Options: input.Options, }) if err != nil { if err == cloudprovider.ErrNoSuchProvder { @@ -740,12 +735,12 @@ func (self *SCloudaccount) PerformUpdateCredential(ctx context.Context, userCred } accountId, err := cloudprovider.IsValidCloudAccount(cloudprovider.ProviderConfig{ - Vendor: self.Provider, - URL: self.AccessUrl, - Account: account.Account, - Secret: account.Secret, - SHCSOEndpoints: hcsoEndpoints, - ProxyFunc: self.proxyFunc(), + Vendor: self.Provider, + URL: self.AccessUrl, + Account: account.Account, + Secret: account.Secret, + Options: self.Options, + ProxyFunc: self.proxyFunc(), }) if err != nil { return nil, httperrors.NewInputParameterError("invalid cloud account info error: %s", err.Error()) @@ -936,15 +931,6 @@ func (self *SCloudaccount) getProviderInternal() (cloudprovider.ICloudProvider, if err != nil { return nil, fmt.Errorf("Invalid password %s", err) } - endpoints := cloudprovider.SApsaraEndpoints{} - hcsoEndpoints := cloudprovider.SHCSOEndpoints{} - if self.Options != nil { - if self.Provider == api.CLOUD_PROVIDER_HCSO { - self.Options.Unmarshal(&hcsoEndpoints) - } else if self.Provider == api.CLOUD_PROVIDER_APSARA { - self.Options.Unmarshal(&endpoints) - } - } return cloudprovider.GetProvider(cloudprovider.ProviderConfig{ Id: self.Id, Name: self.Name, @@ -953,9 +939,8 @@ func (self *SCloudaccount) getProviderInternal() (cloudprovider.ICloudProvider, Account: self.Account, Secret: secret, - SApsaraEndpoints: endpoints, - SHCSOEndpoints: hcsoEndpoints, - ProxyFunc: self.proxyFunc(), + Options: self.Options, + ProxyFunc: self.proxyFunc(), }) } diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index ae81ffeaff..935b95c63e 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -874,16 +874,6 @@ func (self *SCloudprovider) GetProvider() (cloudprovider.ICloudProvider, error) account := self.GetCloudaccount() - endpoints := cloudprovider.SApsaraEndpoints{} - hscsoEndpoints := cloudprovider.SHCSOEndpoints{} - if account.Options != nil { - if self.Provider == api.CLOUD_PROVIDER_HCSO { - account.Options.Unmarshal(&hscsoEndpoints) - } else if self.Provider == api.CLOUD_PROVIDER_APSARA { - account.Options.Unmarshal(&endpoints) - } - } - return cloudprovider.GetProvider(cloudprovider.ProviderConfig{ Id: self.Id, Name: self.Name, @@ -893,8 +883,7 @@ func (self *SCloudprovider) GetProvider() (cloudprovider.ICloudProvider, error) Secret: passwd, ProxyFunc: account.proxyFunc(), - SApsaraEndpoints: endpoints, - SHCSOEndpoints: hscsoEndpoints, + Options: account.Options, }) } diff --git a/pkg/mcclient/options/cloudaccounts.go b/pkg/mcclient/options/cloudaccounts.go index 927faf5174..8d5c9f5dbd 100644 --- a/pkg/mcclient/options/cloudaccounts.go +++ b/pkg/mcclient/options/cloudaccounts.go @@ -228,6 +228,7 @@ type SAWSCloudAccountCreateOptions struct { OptionsBillingReportBucket string `help:"bucket that stores billing report" json:"-"` OptionsBillingBucketAccount string `help:"id of account that can access bucket, blank if this account can access" json:"-"` OptionsBillingFilePrefix string `help:"prefix of billing file name" json:"-"` + OptionsAssumeRoleName string `help:"assume role name" json:"-"` } func (opts *SAWSCloudAccountCreateOptions) Params() (jsonutils.JSONObject, error) { @@ -242,6 +243,9 @@ func (opts *SAWSCloudAccountCreateOptions) Params() (jsonutils.JSONObject, error if len(opts.OptionsBillingFilePrefix) > 0 { options.Add(jsonutils.NewString(opts.OptionsBillingFilePrefix), "billing_file_prefix") } + if len(opts.OptionsAssumeRoleName) > 0 { + options.Add(jsonutils.NewString(opts.OptionsAssumeRoleName), "aws_assume_role_name") + } if options.Size() > 0 { params.Add(options, "options") } @@ -540,7 +544,7 @@ type SCloudAccountUpdateBaseOptions struct { Name string `help:"New name to update"` SyncIntervalSeconds *int `help:"auto synchornize interval in seconds"` - AutoCreateProject *bool `help:"automatically create local project for new remote project"` + AutoCreateProject *bool `help:"automatically create local project for new remote project" negative:"no_auto_create_project"` ProxySetting string `help:"proxy setting name or id" json:"proxy_setting"` SamlAuth string `help:"Enable or disable saml auth" choices:"true|false"` @@ -706,6 +710,8 @@ type SAWSCloudAccountUpdateOptions struct { RemoveOptionsBillingBucketAccount bool `help:"remove id of account that can access bucket, blank if this account can access" json:"-"` OptionsBillingFilePrefix string `help:"update prefix of billing file name" json:"-"` RemoveOptionsBillingFilePrefix bool `help:"remove prefix of billing file name" json:"-"` + OptionsAssumeRoleName string `help:"name of assume role" json:"-"` + RemoveOptionsAssumeRoleName bool `help:"remove option of aws_assume_role_name"` } func (opts *SAWSCloudAccountUpdateOptions) Params() (jsonutils.JSONObject, error) { @@ -721,6 +727,9 @@ func (opts *SAWSCloudAccountUpdateOptions) Params() (jsonutils.JSONObject, error if len(opts.OptionsBillingFilePrefix) > 0 { options.Add(jsonutils.NewString(opts.OptionsBillingFilePrefix), "billing_file_prefix") } + if len(opts.OptionsAssumeRoleName) > 0 { + options.Add(jsonutils.NewString(opts.OptionsAssumeRoleName), "aws_assume_role_name") + } if options.Size() > 0 { params.Add(options, "options") } @@ -734,6 +743,9 @@ func (opts *SAWSCloudAccountUpdateOptions) Params() (jsonutils.JSONObject, error if opts.RemoveOptionsBillingFilePrefix { removeOptions = append(removeOptions, "billing_file_prefix") } + if opts.RemoveOptionsAssumeRoleName { + removeOptions = append(removeOptions, "aws_assume_role_name") + } if len(removeOptions) > 0 { params.Add(jsonutils.NewStringArray(removeOptions), "remove_options") } diff --git a/pkg/multicloud/apsara/apsara.go b/pkg/multicloud/apsara/apsara.go index cc7fdcbffd..0fe6ca1f26 100644 --- a/pkg/multicloud/apsara/apsara.go +++ b/pkg/multicloud/apsara/apsara.go @@ -72,14 +72,16 @@ type ApsaraClientConfig struct { accessKey string accessSecret string debug bool + + endpoints cloudprovider.SApsaraEndpoints } func NewApsaraClientConfig(accessKey, accessSecret string, endpoint string, endpoints cloudprovider.SApsaraEndpoints) *ApsaraClientConfig { cfg := &ApsaraClientConfig{ accessKey: accessKey, accessSecret: accessSecret, + endpoints: endpoints, } - cfg.cpcfg.SApsaraEndpoints = endpoints cfg.cpcfg.URL = endpoint return cfg } @@ -117,7 +119,7 @@ func NewApsaraClient(cfg *ApsaraClientConfig) (*SApsaraClient, error) { if err != nil { return nil, errors.Wrap(err, "fetchRegions") } - if len(client.cpcfg.OssEndpoint) > 0 { + if len(client.endpoints.OssEndpoint) > 0 { err = client.fetchBuckets() if err != nil { return nil, errors.Wrapf(err, "fetchBuckets") @@ -132,32 +134,32 @@ func NewApsaraClient(cfg *ApsaraClientConfig) (*SApsaraClient, error) { func (self *SApsaraClient) getDomain(product string) string { switch product { case APSARA_PRODUCT_ECS: - if len(self.cpcfg.EcsEndpoint) > 0 { - return self.cpcfg.EcsEndpoint + if len(self.endpoints.EcsEndpoint) > 0 { + return self.endpoints.EcsEndpoint } case APSARA_PRODUCT_RAM: - if len(self.cpcfg.RamEndpoint) > 0 { - return self.cpcfg.RamEndpoint + if len(self.endpoints.RamEndpoint) > 0 { + return self.endpoints.RamEndpoint } case APSARA_PRODUCT_RDS: - if len(self.cpcfg.RdsEndpoint) > 0 { - return self.cpcfg.RdsEndpoint + if len(self.endpoints.RdsEndpoint) > 0 { + return self.endpoints.RdsEndpoint } case APSARA_PRODUCT_SLB: - if len(self.cpcfg.SlbEndpoint) > 0 { - return self.cpcfg.SlbEndpoint + if len(self.endpoints.SlbEndpoint) > 0 { + return self.endpoints.SlbEndpoint } case APSARA_PRODUCT_STS: - if len(self.cpcfg.StsEndpoint) > 0 { - return self.cpcfg.StsEndpoint + if len(self.endpoints.StsEndpoint) > 0 { + return self.endpoints.StsEndpoint } case APSARA_PRODUCT_VPC: - if len(self.cpcfg.VpcEndpoint) > 0 { - return self.cpcfg.VpcEndpoint + if len(self.endpoints.VpcEndpoint) > 0 { + return self.endpoints.VpcEndpoint } case APSARA_PRODUCT_KVSTORE: - if len(self.cpcfg.KvsEndpoint) > 0 { - return self.cpcfg.KvsEndpoint + if len(self.endpoints.KvsEndpoint) > 0 { + return self.endpoints.KvsEndpoint } } return self.cpcfg.URL @@ -312,8 +314,8 @@ func (self *SApsaraClient) trialRequest(apiName string, params map[string]string func (self *SApsaraClient) fetchRegions() error { params := map[string]string{"AcceptLanguage": "zh-CN"} - if len(self.cpcfg.SApsaraEndpoints.DefaultRegion) > 0 { - params["RegionId"] = self.cpcfg.SApsaraEndpoints.DefaultRegion + if len(self.endpoints.DefaultRegion) > 0 { + params["RegionId"] = self.endpoints.DefaultRegion } body, err := self.ecsRequest("DescribeRegions", params) if err != nil { @@ -348,7 +350,7 @@ func (client *SApsaraClient) getOssClient(regionId string) (*oss.Client, error) cliOpts := []oss.ClientOption{ oss.HTTPClient(httpClient), } - cli, err := oss.New(client.cpcfg.OssEndpoint, client.accessKey, client.accessSecret, cliOpts...) + cli, err := oss.New(client.endpoints.OssEndpoint, client.accessKey, client.accessSecret, cliOpts...) if err != nil { return nil, errors.Wrap(err, "oss.New") } @@ -369,7 +371,7 @@ func (self *SApsaraClient) invalidateIBuckets() { } func (self *SApsaraClient) getIBuckets() ([]cloudprovider.ICloudBucket, error) { - if len(self.cpcfg.OssEndpoint) == 0 { + if len(self.endpoints.OssEndpoint) == 0 { return nil, fmt.Errorf("empty oss endpoint") } if self.iBuckets == nil { diff --git a/pkg/multicloud/apsara/bucket.go b/pkg/multicloud/apsara/bucket.go index 79a5bfd40c..79bed48267 100644 --- a/pkg/multicloud/apsara/bucket.go +++ b/pkg/multicloud/apsara/bucket.go @@ -87,7 +87,7 @@ func (b *SBucket) GetStorageClass() string { func (b *SBucket) GetAccessUrls() []cloudprovider.SBucketAccessUrl { return []cloudprovider.SBucketAccessUrl{ { - Url: fmt.Sprintf("%s.%s", b.Name, b.region.client.cpcfg.OssEndpoint), + Url: fmt.Sprintf("%s.%s", b.Name, b.region.client.endpoints.OssEndpoint), Description: "ExtranetEndpoint", Primary: true, }, diff --git a/pkg/multicloud/apsara/provider/provider.go b/pkg/multicloud/apsara/provider/provider.go index e2313ee557..5e59f08c04 100644 --- a/pkg/multicloud/apsara/provider/provider.go +++ b/pkg/multicloud/apsara/provider/provider.go @@ -79,12 +79,16 @@ func (self *SApsaraProviderFactory) ValidateUpdateCloudaccountCredential(ctx con } func (self *SApsaraProviderFactory) GetProvider(cfg cloudprovider.ProviderConfig) (cloudprovider.ICloudProvider, error) { + endpoints := cloudprovider.SApsaraEndpoints{} + if cfg.Options != nil { + cfg.Options.Unmarshal(&endpoints) + } client, err := apsara.NewApsaraClient( apsara.NewApsaraClientConfig( cfg.Account, cfg.Secret, cfg.URL, - cfg.SApsaraEndpoints, + endpoints, ).CloudproviderConfig(cfg), ) if err != nil { diff --git a/pkg/multicloud/aws/aws.go b/pkg/multicloud/aws/aws.go index f802d8cfa5..b64990bb5b 100644 --- a/pkg/multicloud/aws/aws.go +++ b/pkg/multicloud/aws/aws.go @@ -60,6 +60,8 @@ const ( AWS_CHINA_ARN_PREFIX = "arn:aws-cn:iam::aws:policy/" DEFAULT_S3_REGION_ID = "us-east-1" + + DefaultAssumeRoleName = "OrganizationAccountAccessRole" ) var ( @@ -75,6 +77,8 @@ type AwsClientConfig struct { accountId string debug bool + + assumeRoleName string } func NewAwsClientConfig(accessUrl, accessKey, accessSecret, accountId string) *AwsClientConfig { @@ -98,6 +102,18 @@ func (cfg *AwsClientConfig) Debug(debug bool) *AwsClientConfig { return cfg } +func (cfg *AwsClientConfig) SetAssumeRole(roleName string) *AwsClientConfig { + cfg.assumeRoleName = roleName + return cfg +} + +func (cfg *AwsClientConfig) getAssumeRoleName() string { + if len(cfg.assumeRoleName) > 0 { + return cfg.assumeRoleName + } + return DefaultAssumeRoleName +} + type SAwsClient struct { *AwsClientConfig @@ -261,7 +277,7 @@ func (client *SAwsClient) getAwsSession(regionId string, assumeRole bool) (*sess default: env = "aws-cn" } - roleARN := fmt.Sprintf("arn:%s:iam::%s:role/OrganizationAccountAccessRole", env, client.accountId) + roleARN := fmt.Sprintf("arn:%s:iam::%s:role/%s", env, client.accountId, client.getAssumeRoleName()) creds := stscreds.NewCredentials(s, roleARN) s = s.Copy(&aws.Config{Credentials: creds}) } diff --git a/pkg/multicloud/aws/aws_test.go b/pkg/multicloud/aws/aws_test.go new file mode 100644 index 0000000000..87964e788b --- /dev/null +++ b/pkg/multicloud/aws/aws_test.go @@ -0,0 +1,30 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package aws + +import ( + "testing" +) + +func TestAwsClientConfig(t *testing.T) { + cfg := NewAwsClientConfig("", "", "", "") + if cfg.getAssumeRoleName() != DefaultAssumeRoleName { + t.Errorf("getAssumeRoleName != %s", DefaultAssumeRoleName) + } + cfg = cfg.SetAssumeRole("newRole") + if cfg.getAssumeRoleName() != "newRole" { + t.Errorf("getAssumeRoleName != newRole") + } +} diff --git a/pkg/multicloud/aws/provider/provider.go b/pkg/multicloud/aws/provider/provider.go index 79fda9aa23..632ce73c6f 100644 --- a/pkg/multicloud/aws/provider/provider.go +++ b/pkg/multicloud/aws/provider/provider.go @@ -201,11 +201,15 @@ func parseAccount(account, secret string) (accessKey string, secretKey string, a } func (self *SAwsProviderFactory) GetProvider(cfg cloudprovider.ProviderConfig) (cloudprovider.ICloudProvider, error) { + extra := cloudprovider.SAWSExtraOptions{} + if cfg.Options != nil { + cfg.Options.Unmarshal(&extra) + } accessKey, secret, accountId := parseAccount(cfg.Account, cfg.Secret) client, err := aws.NewAwsClient( aws.NewAwsClientConfig( cfg.URL, accessKey, secret, accountId, - ).CloudproviderConfig(cfg), + ).SetAssumeRole(extra.AWSAssumeRoleName).CloudproviderConfig(cfg), ) if err != nil { return nil, errors.Wrap(err, "NewAwsClient") diff --git a/pkg/multicloud/aws/utils.go b/pkg/multicloud/aws/utils.go index 857355256e..8d88ace00e 100644 --- a/pkg/multicloud/aws/utils.go +++ b/pkg/multicloud/aws/utils.go @@ -443,7 +443,7 @@ func NextDeviceName(curDeviceNames []string) (string, error) { } for i := 0; i < 25; i++ { - device := fmt.Sprintf("/dev/sd%s", string(98+i)) + device := fmt.Sprintf("/dev/sd%c", byte(98+i)) found := false for _, item := range currents { if strings.HasPrefix(item, device) { @@ -457,7 +457,7 @@ func NextDeviceName(curDeviceNames []string) (string, error) { } for i := 0; i < 25; i++ { - device := fmt.Sprintf("/dev/vxd%s", string(98+i)) + device := fmt.Sprintf("/dev/vxd%c", byte(98+i)) found := false for _, item := range currents { if !strings.HasPrefix(item, device) { diff --git a/pkg/multicloud/hcso/bucket.go b/pkg/multicloud/hcso/bucket.go index 4f96bdf7df..00df3e0e71 100644 --- a/pkg/multicloud/hcso/bucket.go +++ b/pkg/multicloud/hcso/bucket.go @@ -600,7 +600,7 @@ func (b *SBucket) GetWebsiteConf() (cloudprovider.SBucketWebsiteConf, error) { } result.Index = out.IndexDocument.Suffix result.ErrorDocument = out.ErrorDocument.Key - endpoint := b.region.client.cpcfg.GetEndpoint("obs-website", b.region.GetId()) + endpoint := b.region.client.endpoints.GetEndpoint("obs-website", b.region.GetId()) result.Url = fmt.Sprintf("https://%s.%s", endpoint) return result, nil } diff --git a/pkg/multicloud/hcso/huawei.go b/pkg/multicloud/hcso/huawei.go index ab49605156..225ee53aac 100644 --- a/pkg/multicloud/hcso/huawei.go +++ b/pkg/multicloud/hcso/huawei.go @@ -243,7 +243,7 @@ func getOBSEndpoint(regionId string) string { } func (client *SHuaweiClient) getOBSClient(regionId string) (*obs.ObsClient, error) { - endpoint := client.cpcfg.SHCSOEndpoints.GetEndpoint("obs", regionId) + endpoint := client.endpoints.GetEndpoint("obs", regionId) return obs.New(client.accessKey, client.accessSecret, endpoint) } @@ -514,7 +514,7 @@ func (self *SHuaweiClient) GetOwnerId() (string, error) { } func (self *SHuaweiClient) GetSamlEntityId() string { - return fmt.Sprintf("auth.%s", self.cpcfg.EndpointDomain) + return fmt.Sprintf("auth.%s", self.endpoints.EndpointDomain) } func (self *SHuaweiClient) initOwner() error { diff --git a/pkg/multicloud/hcso/provider/provider.go b/pkg/multicloud/hcso/provider/provider.go index 3df6f8dd02..c5a22ea1d8 100644 --- a/pkg/multicloud/hcso/provider/provider.go +++ b/pkg/multicloud/hcso/provider/provider.go @@ -150,10 +150,14 @@ func parseAccount(account string) (accessKey string, projectId string) { } func (self *SHCSOProviderFactory) GetProvider(cfg cloudprovider.ProviderConfig) (cloudprovider.ICloudProvider, error) { + hscsoEndpoints := cloudprovider.SHCSOEndpoints{} + if cfg.Options != nil { + cfg.Options.Unmarshal(&hscsoEndpoints) + } accessKey, project_id := parseAccount(cfg.Account) client, err := huawei.NewHuaweiClient( huawei.NewHuaweiClientConfig( - accessKey, cfg.Secret, project_id, &cfg.SHCSOEndpoints, + accessKey, cfg.Secret, project_id, &hscsoEndpoints, ).CloudproviderConfig(cfg), ) if err != nil { diff --git a/pkg/multicloud/hcso/saml_provider.go b/pkg/multicloud/hcso/saml_provider.go index 26e85f8ddb..639b51cdc4 100644 --- a/pkg/multicloud/hcso/saml_provider.go +++ b/pkg/multicloud/hcso/saml_provider.go @@ -66,7 +66,7 @@ func (self *SAMLProvider) GetStatus() string { } func (self *SAMLProvider) GetAuthUrl() string { - return fmt.Sprintf("https://auth.%s/authui/federation/websso?domain_id=%s&idp=%s&protocol=saml", self.client.cpcfg.EndpointDomain, self.client.ownerId, self.Id) + return fmt.Sprintf("https://auth.%s/authui/federation/websso?domain_id=%s&idp=%s&protocol=saml", self.client.endpoints.EndpointDomain, self.client.ownerId, self.Id) } func (self *SAMLProvider) Delete() error { diff --git a/pkg/multicloud/hcso/wire.go b/pkg/multicloud/hcso/wire.go index 1d20cbfb2e..27c494cdf2 100644 --- a/pkg/multicloud/hcso/wire.go +++ b/pkg/multicloud/hcso/wire.go @@ -188,8 +188,8 @@ func (self *SRegion) createNetwork(vpcId string, name string, cidr string, desc // hard code for hcso // https://support.huaweicloud.com/dns_faq/dns_faq_002.html // https://support.huaweicloud.com/api-dns/dns_api_69001.html - if self.client != nil && len(self.client.cpcfg.SHCSOEndpoints.DefaultSubnetDns) > 0 { - dns := strings.Split(self.client.cpcfg.SHCSOEndpoints.DefaultSubnetDns, ",") + if self.client != nil && len(self.client.endpoints.DefaultSubnetDns) > 0 { + dns := strings.Split(self.client.endpoints.DefaultSubnetDns, ",") if len(dns) > 0 && len(dns[0]) > 0 { subnetObj.Add(jsonutils.NewString(dns[0]), "primary_dns") }