diff --git a/pkg/cloudid/models/cloudpolicy.go b/pkg/cloudid/models/cloudpolicy.go index e4c32f1cd1..05a5a5757f 100644 --- a/pkg/cloudid/models/cloudpolicy.go +++ b/pkg/cloudid/models/cloudpolicy.go @@ -259,17 +259,17 @@ func (self *SCloudpolicy) GetCloudgroups() ([]SCloudgroup, error) { func (self *SCloudpolicy) ValidateDeleteCondition(ctx context.Context) error { users, err := self.GetCloudusers() if err != nil { - return errors.Wrapf(err, "GetCloudusers") + return httperrors.NewGeneralError(errors.Wrapf(err, "GetCloudusers")) } if len(users) > 0 { - return errors.Wrapf(httperrors.ErrNotEmpty, "policy %s has %d users used", self.Name, len(users)) + return httperrors.NewNotEmptyError("policy %s has %d users used", self.Name, len(users)) } groups, err := self.GetCloudgroups() if err != nil { - return errors.Wrapf(err, "GetCloudgroups") + return httperrors.NewGeneralError(errors.Wrapf(err, "GetCloudgroups")) } if len(groups) > 0 { - return errors.Wrapf(httperrors.ErrNotEmpty, "policy %s has %d groups used", self.Name, len(groups)) + return httperrors.NewNotEmptyError("policy %s has %d groups used", self.Name, len(groups)) } return self.SStatusInfrasResourceBase.ValidateDeleteCondition(ctx) } diff --git a/pkg/cloudid/models/clouduser.go b/pkg/cloudid/models/clouduser.go index a5779841d3..d744f2bb1f 100644 --- a/pkg/cloudid/models/clouduser.go +++ b/pkg/cloudid/models/clouduser.go @@ -1429,21 +1429,39 @@ func (self *SClouduser) AllowPerformChangeOwner(ctx context.Context, userCred mc // 变更子账号所属本地用户 func (self *SClouduser) PerformChangeOwner(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.ClouduserChangeOwnerInput) (jsonutils.JSONObject, error) { - user, err := db.UserCacheManager.FetchUserById(ctx, input.UserId) - if err != nil { - return nil, httperrors.NewGeneralError(errors.Wrapf(err, "Not found user %s", input.UserId)) + oldUserId := self.OwnerId + newUserId := "" + if len(input.UserId) > 0 { + user, err := db.UserCacheManager.FetchUserById(ctx, input.UserId) + if err != nil { + return nil, httperrors.NewGeneralError(errors.Wrapf(err, "Not found user %s", input.UserId)) + } + newUserId = user.Id } - old := self.OwnerId - _, err = db.Update(self, func() error { - self.OwnerId = user.GetId() + + _, err := db.Update(self, func() error { + self.OwnerId = newUserId return nil }) - if err != nil { - return nil, httperrors.NewGeneralError(err) + return nil, httperrors.NewGeneralError(errors.Wrapf(err, "db.Update")) + } + + account, err := self.GetCloudaccount() + if err != nil { + return nil, httperrors.NewGeneralError(errors.Wrapf(err, "GetCloudaccount")) + } + + factory, err := account.GetProviderFactory() + if err != nil { + return nil, httperrors.NewGeneralError(errors.Wrapf(err, "GetProviderFactory")) + } + + logclient.AddSimpleActionLog(self, logclient.ACT_CHANGE_OWNER, map[string]interface{}{"old": oldUserId, "newUserId": newUserId}, userCred, true) + if len(newUserId) == 0 || !factory.IsSupportResetClouduserPassword() { + return nil, nil } - logclient.AddSimpleActionLog(self, logclient.ACT_CHANGE_OWNER, map[string]interface{}{"old": old, "new": user}, userCred, true) return nil, self.StartClouduserResetPasswordTask(ctx, userCred, "", "") } diff --git a/pkg/mcclient/options/clouduser.go b/pkg/mcclient/options/clouduser.go index 3b1c2a85d0..a93aca2fe1 100644 --- a/pkg/mcclient/options/clouduser.go +++ b/pkg/mcclient/options/clouduser.go @@ -90,11 +90,11 @@ func (opts *ClouduserPasswordOptions) Params() (jsonutils.JSONObject, error) { type ClouduserChangeOwnerOptions struct { ClouduserIdOption - USER_ID string `help:"local user id"` + UserId string `help:"local user id"` } func (opts *ClouduserChangeOwnerOptions) Params() (jsonutils.JSONObject, error) { - return jsonutils.Marshal(map[string]string{"user_id": opts.USER_ID}), nil + return jsonutils.Marshal(map[string]string{"user_id": opts.UserId}), nil } type ClouduserGroupOptions struct {