diff --git a/pkg/apis/identity/consts.go b/pkg/apis/identity/consts.go index 74d136de05..0c67ccdac7 100644 --- a/pkg/apis/identity/consts.go +++ b/pkg/apis/identity/consts.go @@ -117,6 +117,7 @@ var ( "platform_name", "enable_cloud_shell", "platform_names", + "enable_change_owner_auto_rename", }, } diff --git a/pkg/cloudcommon/consts/db.go b/pkg/cloudcommon/consts/db.go index 57aa780b36..79d302bfbf 100644 --- a/pkg/cloudcommon/consts/db.go +++ b/pkg/cloudcommon/consts/db.go @@ -26,6 +26,8 @@ var ( defaultDBConnectionString string defaultDBChecksumHashAlgorithm string + + enableChangeOwnerAutoRename = false ) func SetDefaultDB(dialect, connStr string) { @@ -52,3 +54,11 @@ func DefaultDBChecksumHashAlgorithm() string { } return "sha256" } + +func SetChangeOwnerAutoRename(enable bool) { + enableChangeOwnerAutoRename = enable +} + +func GetChangeOwnerAutoRename() bool { + return enableChangeOwnerAutoRename +} diff --git a/pkg/cloudcommon/db/virtualresource.go b/pkg/cloudcommon/db/virtualresource.go index a7d9be80bb..029fdd9bda 100644 --- a/pkg/cloudcommon/db/virtualresource.go +++ b/pkg/cloudcommon/db/virtualresource.go @@ -379,16 +379,18 @@ func (model *SVirtualResourceBase) PerformChangeOwner(ctx context.Context, userC return nil, errors.Wrap(err, "objectConfirmPolicyTags") } - q := manager.Query().Equals("name", model.GetName()) - q = manager.FilterByOwner(ctx, q, manager, userCred, ownerId, manager.NamespaceScope()) - q = manager.FilterBySystemAttributes(q, nil, nil, manager.ResourceScope()) - q = q.NotEquals("id", model.GetId()) - cnt, err := q.CountWithError() - if err != nil { - return nil, httperrors.NewInternalServerError("check name duplication error: %s", err) - } - if cnt > 0 { - return nil, httperrors.NewDuplicateNameError("name", model.GetName()) + if !consts.GetChangeOwnerAutoRename() { + q := manager.Query().Equals("name", model.GetName()) + q = manager.FilterByOwner(ctx, q, manager, userCred, ownerId, manager.NamespaceScope()) + q = manager.FilterBySystemAttributes(q, nil, nil, manager.ResourceScope()) + q = q.NotEquals("id", model.GetId()) + cnt, err := q.CountWithError() + if err != nil { + return nil, httperrors.NewInternalServerError("check name duplication error: %s", err) + } + if cnt > 0 { + return nil, httperrors.NewDuplicateNameError("name", model.GetName()) + } } former, _ := TenantCacheManager.FetchTenantById(ctx, model.ProjectId) if former == nil { @@ -428,7 +430,12 @@ func (model *SVirtualResourceBase) PerformChangeOwner(ctx context.Context, userC // cancel usage model.cleanModelUsages(ctx, userCred) + oldName := model.Name _, err = Update(model, func() error { + model.Name, err = GenerateName(ctx, manager, ownerId, oldName) + if err != nil { + return err + } model.DomainId = ownerId.GetProjectDomainId() model.ProjectId = ownerId.GetProjectId() model.ProjectSrc = string(apis.OWNER_SOURCE_LOCAL) @@ -438,6 +445,10 @@ func (model *SVirtualResourceBase) PerformChangeOwner(ctx context.Context, userC return nil, errors.Wrap(err, "Update") } + if oldName != model.Name { + model.SetMetadata(ctx, "old_name", oldName, userCred) + } + // add usage model.RecoverUsages(ctx, userCred) diff --git a/pkg/cloudcommon/options/changes.go b/pkg/cloudcommon/options/changes.go index 8b0cfd4a1c..ab53c90857 100644 --- a/pkg/cloudcommon/options/changes.go +++ b/pkg/cloudcommon/options/changes.go @@ -62,6 +62,10 @@ func OnBaseOptionsChange(oOpts, nOpts interface{}) bool { if oldOpts.ApiServer != newOpts.ApiServer { log.Debugf("api_server changed from %s to %s", oldOpts.ApiServer, newOpts.ApiServer) } + + if oldOpts.EnableChangeOwnerAutoRename != newOpts.EnableChangeOwnerAutoRename { + consts.SetChangeOwnerAutoRename(newOpts.EnableChangeOwnerAutoRename) + } return changed } diff --git a/pkg/cloudcommon/options/options.go b/pkg/cloudcommon/options/options.go index d75eb0c3fb..9cddd5f601 100644 --- a/pkg/cloudcommon/options/options.go +++ b/pkg/cloudcommon/options/options.go @@ -119,6 +119,8 @@ type BaseOptions struct { PlatformNames map[string]string `help:"identity name of this platform by language"` EnableAppProfiling bool `help:"enable profiling API" default:"false"` + + EnableChangeOwnerAutoRename bool `help:"Allows renaming when changing names" default:"false"` } const (