fix(region): fix cloudaccount sync projectMapping (#18424)

Co-authored-by: 马鸿飞 <mahongfei@yunion.cn>
This commit is contained in:
gouqi11
2023-10-25 20:53:43 +08:00
committed by GitHub
parent da63874dc9
commit fcae8612e5
2 changed files with 35 additions and 3 deletions

View File

@@ -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

View File

@@ -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)