From fcae8612e50cd47447dc5ca82aee745a04e8de2b Mon Sep 17 00:00:00 2001 From: gouqi11 <66834753+gouqi11@users.noreply.github.com> Date: Wed, 25 Oct 2023 20:53:43 +0800 Subject: [PATCH] fix(region): fix cloudaccount sync projectMapping (#18424) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 马鸿飞 --- pkg/compute/models/cloudaccounts.go | 24 ++++++++++++++++++++++++ pkg/compute/models/cloudproviders.go | 14 +++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 296ad7b639..e854de8f15 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -1118,6 +1118,29 @@ func (self *SCloudaccount) importSubAccount(ctx context.Context, userCred mcclie if err != nil { return nil, isNew, errors.Wrapf(err, "q.First") } + err = func() error { + // 根据云订阅归属且云订阅之前没有手动指定过项目 + if self.AutoCreateProjectForProvider && provider.ProjectSrc != string(apis.OWNER_SOURCE_LOCAL) { + lockman.LockRawObject(ctx, CloudproviderManager.Keyword(), "name") + defer lockman.ReleaseRawObject(ctx, CloudproviderManager.Keyword(), "name") + // 根据云订阅名称获取或创建项目 + domainId, projectId, err := self.getOrCreateTenant(ctx, provider.Name, provider.DomainId, "", subAccount.Desc) + if err != nil { + return errors.Wrapf(err, "getOrCreateTenant err,provider_name :%s", provider.Name) + } + // 覆盖云订阅项目 + db.Update(provider, func() error { + provider.ProjectId = projectId + provider.DomainId = domainId + return nil + }) + } + return nil + }() + if err != nil { + return nil, isNew, errors.Wrapf(err, "sync autro create project for provider") + } + // 没有项目归属时以默认最初项目做归属 if len(provider.ProjectId) == 0 { db.Update(provider, func() error { if len(subAccount.DefaultProjectId) > 0 { @@ -1151,6 +1174,7 @@ func (self *SCloudaccount) importSubAccount(ctx context.Context, userCred mcclie newCloudprovider, err := func() (*SCloudprovider, error) { newCloudprovider := SCloudprovider{} + newCloudprovider.ProjectSrc = string(apis.OWNER_SOURCE_CLOUD) newCloudprovider.Account = subAccount.Account newCloudprovider.Secret = self.Secret newCloudprovider.CloudaccountId = self.Id diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index a7f5f33aa8..ddb6648421 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -112,6 +112,10 @@ type SCloudprovider struct { // 云账号的平台信息 Provider string `width:"64" charset:"ascii" list:"domain" create:"domain_required"` + // 云上同步资源是否在本地被更改过配置, local: 更改过, cloud: 未更改过 + // example: local + ProjectSrc string `width:"10" charset:"ascii" nullable:"false" list:"user" default:"cloud" json:"project_src"` + SProjectMappingResourceBase } @@ -467,14 +471,18 @@ func (cprvd *SCloudprovider) syncProject(ctx context.Context, userCred mcclient. return errors.Wrap(err, "getOrCreateTenant") } - return cprvd.saveProject(userCred, domainId, projectId) + return cprvd.saveProject(userCred, domainId, projectId, true) } -func (cprvd *SCloudprovider) saveProject(userCred mcclient.TokenCredential, domainId, projectId string) error { +func (cprvd *SCloudprovider) saveProject(userCred mcclient.TokenCredential, domainId, projectId string, auto bool) error { if projectId != cprvd.ProjectId { diff, err := db.Update(cprvd, func() error { cprvd.DomainId = domainId cprvd.ProjectId = projectId + // 自动改变项目时不改变配置,仅在performChangeOnwer(手动更改项目)时改变 + if !auto { + cprvd.ProjectSrc = string(apis.OWNER_SOURCE_LOCAL) + } return nil }) if err != nil { @@ -742,7 +750,7 @@ func (cprvd *SCloudprovider) PerformChangeProject(ctx context.Context, userCred NewDomain: tenant.Domain, } - err = cprvd.saveProject(userCred, tenant.DomainId, tenant.Id) + err = cprvd.saveProject(userCred, tenant.DomainId, tenant.Id, false) if err != nil { log.Errorf("Update cloudprovider error: %v", err) return nil, httperrors.NewGeneralError(err)