From 8ba89c272d09cf6a01d53e69031a09e8381ce4d1 Mon Sep 17 00:00:00 2001 From: ioito Date: Mon, 23 May 2022 18:01:19 +0800 Subject: [PATCH] fix(region): input apsara organization id --- pkg/cloudprovider/cloudprovider.go | 3 +++ pkg/mcclient/options/cloudaccounts.go | 1 + pkg/multicloud/apsara/apsara.go | 20 ++++++++++++++------ pkg/multicloud/apsara/monitor.go | 2 +- pkg/multicloud/apsara/organization.go | 12 ++++++------ pkg/multicloud/apsara/provider/provider.go | 16 ++++++++++++++-- pkg/multicloud/apsara/shell/resourcegroup.go | 2 +- 7 files changed, 40 insertions(+), 16 deletions(-) diff --git a/pkg/cloudprovider/cloudprovider.go b/pkg/cloudprovider/cloudprovider.go index 2e8baeb4a0..4dc682da98 100644 --- a/pkg/cloudprovider/cloudprovider.go +++ b/pkg/cloudprovider/cloudprovider.go @@ -85,6 +85,9 @@ type SCloudaccountCredential struct { //秘钥key (Qcloud) SecretKey string `json:"secret_key"` + // 飞天允许的最高组织id, 默认为1 + OrganizationId int `json:"organization_id"` + // Google服务账号email (gcp) GCPClientEmail string `json:"gcp_client_email"` // Google服务账号project id (gcp) diff --git a/pkg/mcclient/options/cloudaccounts.go b/pkg/mcclient/options/cloudaccounts.go index 2ee7f56a73..97f9c3dc31 100644 --- a/pkg/mcclient/options/cloudaccounts.go +++ b/pkg/mcclient/options/cloudaccounts.go @@ -435,6 +435,7 @@ func (opts *SAliyunCloudAccountUpdateCredentialOptions) Params() (jsonutils.JSON type SApsaraCloudAccountUpdateCredentialOptions struct { SCloudAccountIdOptions SAccessKeyCredential + OrganizationId int } func (opts *SApsaraCloudAccountUpdateCredentialOptions) Params() (jsonutils.JSONObject, error) { diff --git a/pkg/multicloud/apsara/apsara.go b/pkg/multicloud/apsara/apsara.go index 3385a3eae7..4989874e03 100644 --- a/pkg/multicloud/apsara/apsara.go +++ b/pkg/multicloud/apsara/apsara.go @@ -72,16 +72,21 @@ const ( ) type ApsaraClientConfig struct { - cpcfg cloudprovider.ProviderConfig - accessKey string - accessSecret string - debug bool + cpcfg cloudprovider.ProviderConfig + accessKey string + accessSecret string + organizationId string + debug bool } func NewApsaraClientConfig(accessKey, accessSecret string, endpoint string) *ApsaraClientConfig { cfg := &ApsaraClientConfig{ - accessKey: accessKey, - accessSecret: accessSecret, + accessKey: accessKey, + accessSecret: accessSecret, + organizationId: "1", + } + if info := strings.Split(accessKey, "/"); len(info) == 2 { + cfg.accessKey, cfg.organizationId = info[0], info[1] } return cfg } @@ -414,6 +419,9 @@ func (self *SApsaraClient) GetSubAccounts() ([]cloudprovider.SSubAccount, error) subAccount := cloudprovider.SSubAccount{} subAccount.Name = self.cpcfg.Name subAccount.Account = self.accessKey + if self.organizationId != "1" { + subAccount.Account = fmt.Sprintf("%s/%s", self.accessKey, self.organizationId) + } subAccount.HealthStatus = api.CLOUD_PROVIDER_HEALTH_NORMAL return []cloudprovider.SSubAccount{subAccount}, nil } diff --git a/pkg/multicloud/apsara/monitor.go b/pkg/multicloud/apsara/monitor.go index 5ba42aa988..27e6741c3d 100644 --- a/pkg/multicloud/apsara/monitor.go +++ b/pkg/multicloud/apsara/monitor.go @@ -197,7 +197,7 @@ func (r *SRegion) fetchMetricData(department string, name string, ns string, sin func (r *SRegion) FetchMetricData(name string, ns string, since time.Time, until time.Time) ([]jsonutils.JSONObject, error) { data := make([]jsonutils.JSONObject, 0) - part, err := r.fetchMetricData("1", name, ns, since, until) + part, err := r.fetchMetricData(r.client.organizationId, name, ns, since, until) if err == nil { return part, nil } diff --git a/pkg/multicloud/apsara/organization.go b/pkg/multicloud/apsara/organization.go index 8630a46588..6d0065d0c6 100644 --- a/pkg/multicloud/apsara/organization.go +++ b/pkg/multicloud/apsara/organization.go @@ -98,12 +98,12 @@ func (self *SOrganizationTree) GetProject(tags []string) []SProject { return ret } -func (self *SApsaraClient) GetOrganizationTree(id int) (*SOrganizationTree, error) { - if id == 0 { - id = 1 +func (self *SApsaraClient) GetOrganizationTree(id string) (*SOrganizationTree, error) { + if len(id) == 0 { + id = "1" } params := map[string]string{ - "Id": fmt.Sprintf("%d", id), + "Id": id, } resp, err := self.ascmRequest("GetOrganizationTree", params) if err != nil { @@ -118,7 +118,7 @@ func (self *SApsaraClient) GetOrganizationTree(id int) (*SOrganizationTree, erro } func (self *SApsaraClient) GetOrganizationList() ([]SOrganization, error) { - params := map[string]string{"Id": "1"} + params := map[string]string{"Id": self.organizationId} resp, err := self.ascmRequest("GetOrganizationList", params) if err != nil { return nil, err @@ -185,7 +185,7 @@ func (self *SProject) GetTags() (map[string]string, error) { } func (self *SApsaraClient) GetIProjects() ([]cloudprovider.ICloudProject, error) { - tree, err := self.GetOrganizationTree(1) + tree, err := self.GetOrganizationTree(self.organizationId) if err != nil { return nil, errors.Wrapf(err, "GetOrganizationTree") } diff --git a/pkg/multicloud/apsara/provider/provider.go b/pkg/multicloud/apsara/provider/provider.go index fbdd9a40eb..ca282a9558 100644 --- a/pkg/multicloud/apsara/provider/provider.go +++ b/pkg/multicloud/apsara/provider/provider.go @@ -16,6 +16,7 @@ package provider import ( "context" + "fmt" "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" @@ -56,6 +57,9 @@ func (self *SApsaraProviderFactory) ValidateCreateCloudaccountData(ctx context.C return output, errors.Wrap(httperrors.ErrMissingParameter, "access_key_secret") } output.Account = input.AccessKeyId + if input.OrganizationId > 0 { + output.Account = fmt.Sprintf("%s/%d", input.AccessKeyId, input.OrganizationId) + } output.Secret = input.AccessKeySecret if len(input.Endpoint) == 0 { return output, httperrors.NewMissingParameterError("endpoint") @@ -75,8 +79,12 @@ func (self *SApsaraProviderFactory) ValidateUpdateCloudaccountCredential(ctx con if len(input.AccessKeySecret) == 0 { return output, errors.Wrap(httperrors.ErrMissingParameter, "access_key_secret") } + account := input.AccessKeyId + if input.OrganizationId > 0 { + account = fmt.Sprintf("%s/%d", input.AccessKeyId, input.OrganizationId) + } output = cloudprovider.SCloudaccount{ - Account: input.AccessKeyId, + Account: account, Secret: input.AccessKeySecret, } return output, nil @@ -100,11 +108,15 @@ func (self *SApsaraProviderFactory) GetProvider(cfg cloudprovider.ProviderConfig } func (self *SApsaraProviderFactory) GetClientRC(info cloudprovider.SProviderInfo) (map[string]string, error) { + region := "" + if info.Options != nil { + region, _ = info.Options.GetString("default_region") + } return map[string]string{ "APSARA_ACCESS_KEY": info.Account, "APSARA_SECRET": info.Secret, "APSARA_ENDPOINT": info.Url, - "APSARA_REGION": "", + "APSARA_REGION": region, }, nil } diff --git a/pkg/multicloud/apsara/shell/resourcegroup.go b/pkg/multicloud/apsara/shell/resourcegroup.go index 4e34cfeac6..75715ea17f 100644 --- a/pkg/multicloud/apsara/shell/resourcegroup.go +++ b/pkg/multicloud/apsara/shell/resourcegroup.go @@ -60,7 +60,7 @@ func init() { }) type OrganizationListOptions struct { - Id int + Id string } shellutils.R(&OrganizationListOptions{}, "organization-tree", "List organization tree", func(cli *apsara.SRegion, args *OrganizationListOptions) error {