From bb8df2b6ea3955a713b9fa4f1fbd02e6897a8d11 Mon Sep 17 00:00:00 2001 From: ioito Date: Thu, 10 Feb 2022 17:16:33 +0800 Subject: [PATCH] fix(region): associate manager with external project --- pkg/cloudprovider/resources.go | 2 ++ pkg/compute/models/external_projects.go | 20 ++++++++++++++++++++ pkg/multicloud/apsara/organization.go | 10 +--------- pkg/multicloud/apsara/project.go | 2 +- pkg/multicloud/azure/azure.go | 4 ++++ pkg/multicloud/azure/resourcegroup.go | 5 +++++ pkg/multicloud/project_base.go | 4 ++++ 7 files changed, 37 insertions(+), 10 deletions(-) diff --git a/pkg/cloudprovider/resources.go b/pkg/cloudprovider/resources.go index 2edaf81d6e..4c7c644518 100644 --- a/pkg/cloudprovider/resources.go +++ b/pkg/cloudprovider/resources.go @@ -847,6 +847,8 @@ type ICloudProject interface { GetDomainId() string GetDomainName() string + + GetAccountId() string } type ICloudNatGateway interface { diff --git a/pkg/compute/models/external_projects.go b/pkg/compute/models/external_projects.go index a9f5fc9e45..dc3d88c1be 100644 --- a/pkg/compute/models/external_projects.go +++ b/pkg/compute/models/external_projects.go @@ -82,10 +82,12 @@ func (manager *SExternalProjectManager) FetchCustomizeColumns( ) []api.ExternalProjectDetails { rows := make([]api.ExternalProjectDetails, len(objs)) virRows := manager.SVirtualResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) + managerRows := manager.SManagedResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) accountIds := make([]string, len(objs)) for i := range rows { rows[i] = api.ExternalProjectDetails{ VirtualResourceDetails: virRows[i], + ManagedResourceInfo: managerRows[i], } proj := objs[i].(*SExternalProject) accountIds[i] = proj.CloudaccountId @@ -186,10 +188,18 @@ func (self *SExternalProject) syncRemoveCloudProject(ctx context.Context, userCr func (self *SExternalProject) SyncWithCloudProject(ctx context.Context, userCred mcclient.TokenCredential, account *SCloudaccount, ext cloudprovider.ICloudProject) error { s := auth.GetAdminSession(ctx, consts.GetRegion(), "v1") + providers := account.GetCloudproviders() + providerMaps := map[string]string{} + for _, provider := range providers { + providerMaps[provider.Account] = provider.Id + } diff, err := db.UpdateWithLock(ctx, self, func() error { self.Name = ext.GetName() self.IsEmulated = ext.IsEmulated() self.Status = ext.GetStatus() + if accountId := ext.GetAccountId(); len(accountId) > 0 { + self.ManagerId, _ = providerMaps[accountId] + } share := account.GetSharedInfo() if self.DomainId != account.DomainId && !(share.PublicScope == rbacutils.ScopeSystem || (share.PublicScope == rbacutils.ScopeDomain && utils.IsInStringArray(self.DomainId, share.SharedDomains))) { @@ -312,6 +322,16 @@ func (manager *SExternalProjectManager) newFromCloudProject(ctx context.Context, project.DomainId = account.DomainId project.ProjectId = account.ProjectId project.ExternalDomainId = extProject.GetDomainId() + + providers := account.GetCloudproviders() + providerMaps := map[string]string{} + for _, provider := range providers { + providerMaps[provider.Account] = provider.Id + } + if accountId := extProject.GetAccountId(); len(accountId) > 0 { + project.ManagerId, _ = providerMaps[accountId] + } + domainName := extProject.GetDomainName() if len(project.ExternalDomainId) > 0 && len(domainName) > 0 { domainId, err := account.getOrCreateDomain(ctx, userCred, project.ExternalDomainId, domainName) diff --git a/pkg/multicloud/apsara/organization.go b/pkg/multicloud/apsara/organization.go index bb7d325b9b..b9f9fc45fa 100644 --- a/pkg/multicloud/apsara/organization.go +++ b/pkg/multicloud/apsara/organization.go @@ -133,7 +133,7 @@ func (self *SOrganizationTree) ListProjects() []SResourceGroupList { } type SProject struct { - multicloud.SResourceBase + multicloud.SProjectBase client *SApsaraClient Id string @@ -145,14 +145,6 @@ func (self *SProject) GetId() string { return self.Id } -func (self *SProject) GetDomainId() string { - return "" -} - -func (self *SProject) GetDomainName() string { - return "" -} - func (self *SProject) GetGlobalId() string { return self.Id } diff --git a/pkg/multicloud/apsara/project.go b/pkg/multicloud/apsara/project.go index 8e3e533ab4..0b1f163142 100644 --- a/pkg/multicloud/apsara/project.go +++ b/pkg/multicloud/apsara/project.go @@ -37,7 +37,7 @@ func (self DepartmentInfo) GetProjectId() string { } type SResourceGroup struct { - multicloud.SResourceBase + multicloud.SProjectBase multicloud.ApsaraTags client *SApsaraClient diff --git a/pkg/multicloud/azure/azure.go b/pkg/multicloud/azure/azure.go index ea1ad049fa..00942ccb74 100644 --- a/pkg/multicloud/azure/azure.go +++ b/pkg/multicloud/azure/azure.go @@ -578,6 +578,10 @@ func (self *SAzureClient) ListResourceGroups() ([]SResourceGroup, error) { if err != nil { return nil, errors.Wrap(err, "list") } + for i := range resourceGroups { + resourceGroups[i].client = self + resourceGroups[i].subId = self.subscriptionId + } return resourceGroups, nil } diff --git a/pkg/multicloud/azure/resourcegroup.go b/pkg/multicloud/azure/resourcegroup.go index c556e4ce4a..c57f531dbd 100644 --- a/pkg/multicloud/azure/resourcegroup.go +++ b/pkg/multicloud/azure/resourcegroup.go @@ -39,6 +39,7 @@ type SResourceGroup struct { Location string Properties GroupProperties ManagedBy string + subId string } func (self *SRegion) GetResourceGroupDetail(groupName string) (*SResourceGroup, error) { @@ -74,6 +75,10 @@ func (r *SResourceGroup) GetId() string { return r.ID } +func (self *SResourceGroup) GetAccountId() string { + return fmt.Sprintf("%s/%s", self.client.tenantId, self.subId) +} + func (r *SResourceGroup) GetGlobalId() string { return strings.ToLower(r.Name) } diff --git a/pkg/multicloud/project_base.go b/pkg/multicloud/project_base.go index 36f4d1826a..bed81b0da7 100644 --- a/pkg/multicloud/project_base.go +++ b/pkg/multicloud/project_base.go @@ -26,3 +26,7 @@ func (self *SProjectBase) GetDomainName() string { func (self *SProjectBase) GetDomainId() string { return "" } + +func (self *SProjectBase) GetAccountId() string { + return "" +}