From d1fbe1f4d8b1a602a46ea87cc914870b44926653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Tue, 12 Sep 2023 18:54:14 +0800 Subject: [PATCH] fix(region): external project (#17996) --- pkg/cloudcommon/db/keystonecache.go | 1 + pkg/cloudcommon/db/tenantcache.go | 12 ++++++++++++ pkg/cloudcommon/db/tenantcacheitem.go | 19 ++++++++++++------- pkg/compute/models/cloudproviders.go | 3 +++ pkg/compute/models/cloudsync.go | 1 + pkg/compute/models/external_projects.go | 17 ++++++++++++----- 6 files changed, 41 insertions(+), 12 deletions(-) diff --git a/pkg/cloudcommon/db/keystonecache.go b/pkg/cloudcommon/db/keystonecache.go index 474640766e..7a1afbc98d 100644 --- a/pkg/cloudcommon/db/keystonecache.go +++ b/pkg/cloudcommon/db/keystonecache.go @@ -26,6 +26,7 @@ type SKeystoneCacheObjectManager struct { type SKeystoneCacheObject struct { SStandaloneResourceBase + SPendingDeletedBase DomainId string `width:"128" charset:"ascii" nullable:"true"` Domain string `width:"128" charset:"utf8" nullable:"true"` diff --git a/pkg/cloudcommon/db/tenantcache.go b/pkg/cloudcommon/db/tenantcache.go index bba92d994f..9cb45d8072 100644 --- a/pkg/cloudcommon/db/tenantcache.go +++ b/pkg/cloudcommon/db/tenantcache.go @@ -350,6 +350,10 @@ func (manager *STenantCacheManager) Save(ctx context.Context, item SCachedTenant if obj.Id == item.Id && obj.Name == item.Name && obj.Domain == item.ProjectDomain && obj.DomainId == item.DomainId { Update(obj, func() error { obj.LastCheck = now + obj.PendingDeleted = item.PendingDeleted + if obj.PendingDeleted { + obj.PendingDeletedAt = item.PendingDeletedAt + } return nil }) if saveMeta { @@ -363,6 +367,10 @@ func (manager *STenantCacheManager) Save(ctx context.Context, item SCachedTenant obj.Domain = item.ProjectDomain obj.DomainId = item.DomainId obj.LastCheck = now + obj.PendingDeleted = item.PendingDeleted + if obj.PendingDeleted { + obj.PendingDeletedAt = item.PendingDeletedAt + } return nil }) if err != nil { @@ -381,6 +389,10 @@ func (manager *STenantCacheManager) Save(ctx context.Context, item SCachedTenant obj.Domain = item.ProjectDomain obj.DomainId = item.DomainId obj.LastCheck = now + obj.PendingDeleted = item.PendingDeleted + if obj.PendingDeleted { + obj.PendingDeletedAt = item.PendingDeletedAt + } err = manager.TableSpec().InsertOrUpdate(ctx, obj) if err != nil { return nil, errors.Wrap(err, "InsertOrUpdate") diff --git a/pkg/cloudcommon/db/tenantcacheitem.go b/pkg/cloudcommon/db/tenantcacheitem.go index 1e2e95cb63..f8f5e12e0a 100644 --- a/pkg/cloudcommon/db/tenantcacheitem.go +++ b/pkg/cloudcommon/db/tenantcacheitem.go @@ -14,15 +14,20 @@ package db -import identityapi "yunion.io/x/onecloud/pkg/apis/identity" +import ( + "time" + + identityapi "yunion.io/x/onecloud/pkg/apis/identity" +) type SCachedTenant struct { - Id string `json:"id"` - Name string `json:"name"` - DomainId string `json:"domain_id"` - ProjectDomain string `json:"project_domain"` - Metadata map[string]string `json:"metadata"` - PendingDeleted bool `json:"pending_deleted"` + Id string `json:"id"` + Name string `json:"name"` + DomainId string `json:"domain_id"` + ProjectDomain string `json:"project_domain"` + Metadata map[string]string `json:"metadata"` + PendingDeleted bool `json:"pending_deleted"` + PendingDeletedAt time.Time `json:"pending_deleted_at"` } func (s SCachedTenant) objType() string { diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 2b49dc5957..2225317936 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -444,6 +444,9 @@ func (account *SCloudaccount) getOrCreateTenant(ctx context.Context, name, domai } return createTenant(ctx, name, domainId, desc) } + if tenant.PendingDeleted { + return createTenant(ctx, name, domainId, desc) + } share := account.GetSharedInfo() if tenant.DomainId == account.DomainId || (share.PublicScope == rbacscope.ScopeSystem || (share.PublicScope == rbacscope.ScopeDomain && utils.IsInStringArray(tenant.DomainId, share.SharedDomains))) { diff --git a/pkg/compute/models/cloudsync.go b/pkg/compute/models/cloudsync.go index 4c917dd6f9..4b035bcb8b 100644 --- a/pkg/compute/models/cloudsync.go +++ b/pkg/compute/models/cloudsync.go @@ -2619,6 +2619,7 @@ func syncProjects(ctx context.Context, userCred mcclient.TokenCredential, syncRe msg := result.Result() notes := fmt.Sprintf("SyncProjects for account %s result: %s", account.Name, msg) + log.Infof(notes) account.SyncError(result, notes, userCred) if result.IsError() { return err diff --git a/pkg/compute/models/external_projects.go b/pkg/compute/models/external_projects.go index 6a5e9d85d2..9610fd3a42 100644 --- a/pkg/compute/models/external_projects.go +++ b/pkg/compute/models/external_projects.go @@ -436,14 +436,21 @@ func (self *SExternalProject) SyncWithCloudProject(ctx context.Context, userCred self.DomainId = domainId self.ProjectId = projectId } + cache, err := db.TenantCacheManager.FetchTenantByIdOrNameInDomain(ctx, self.ProjectId, self.DomainId) + if err != nil { + return errors.Wrapf(err, "FetchProject %s", self.ProjectId) + } + if cache.PendingDeleted { + desc := fmt.Sprintf("auto create from cloud project %s (%s)", self.Name, self.ExternalId) + _, self.ProjectId, err = account.getOrCreateTenant(ctx, self.Name, self.DomainId, "", desc) + if err != nil { + return errors.Wrapf(err, "getOrCreateTenant") + } + return nil + } if pm == nil && account.AutoCreateProject && options.Options.EnableAutoRenameProject && oldName != self.Name { count, _ := self.GetProjectCount() if count == 1 { - cache, err := db.TenantCacheManager.FetchTenantByIdOrNameInDomain(ctx, self.ProjectId, self.DomainId) - if err != nil { - log.Errorf("FetchByIdOrName %s", self.ProjectId) - return nil - } params := map[string]string{"name": self.Name} _, err = identity.Projects.Update(s, self.ProjectId, jsonutils.Marshal(params)) if err != nil {