mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-06-05 10:41:14 +08:00
fix(region): fix cloudaccount sync projectMapping (#18424)
Co-authored-by: 马鸿飞 <mahongfei@yunion.cn>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user