diff --git a/cmd/climc/shell/users.go b/cmd/climc/shell/users.go index c5adb8766c..b6b977e307 100644 --- a/cmd/climc/shell/users.go +++ b/cmd/climc/shell/users.go @@ -8,11 +8,13 @@ import ( func init() { type UserListOptions struct { - Domain string `help:"Filter by domain"` - Name string `help:"Filter by name"` - Limit int64 `help:"Limit, default 0, i.e. no limit"` - Offset int64 `help:"Offset, default 0, i.e. no offset"` - Search string `help:"Search by name"` + Domain string `help:"Filter by domain"` + Name string `help:"Filter by name"` + Limit int64 `help:"Limit, default 0, i.e. no limit"` + Offset int64 `help:"Offset, default 0, i.e. no offset"` + Search string `help:"Search by name"` + DefaultProject string `help:"Filter by default_project_id"` + NoDefaultProject bool `help:"Filter users without valid default_project_id"` } R(&UserListOptions{}, "user-list", "List users", func(s *mcclient.ClientSession, args *UserListOptions) error { mod, err := modules.GetModule(s, "users") @@ -39,6 +41,15 @@ func init() { if args.Offset > 0 { params.Add(jsonutils.NewInt(args.Offset), "offset") } + if len(args.DefaultProject) > 0 { + projId, err := modules.Projects.GetId(s, args.DefaultProject, nil) + if err != nil { + return err + } + params.Add(jsonutils.NewString(projId), "default_project_id") + } else if args.NoDefaultProject { + params.Add(jsonutils.NewString(""), "default_project_id__iempty") + } result, err := mod.List(s, params) if err != nil { return err @@ -219,6 +230,8 @@ func init() { Mobile string `help:"Mobile"` Enabled bool `help:"Enabled"` Disabled bool `help:"Disabled"` + + DefaultProject string `help:"Default project"` // Option []string `help:"User options"` } R(&UserUpdateOptions{}, "user-update", "Update a user", func(s *mcclient.ClientSession, args *UserUpdateOptions) error { @@ -258,6 +271,13 @@ func init() { } else if !args.Enabled && args.Disabled { params.Add(jsonutils.JSONFalse, "enabled") } + if len(args.DefaultProject) > 0 { + projId, err := modules.Projects.GetId(s, args.DefaultProject, nil) + if err != nil { + return err + } + params.Add(jsonutils.NewString(projId), "default_project_id") + } /* if len(args.Option) > 0 { uoptions := jsonutils.NewDict() diff --git a/pkg/cloudcommon/db/db_joint_dispatcher.go b/pkg/cloudcommon/db/db_joint_dispatcher.go index af7ccc1b4b..01b5a41344 100644 --- a/pkg/cloudcommon/db/db_joint_dispatcher.go +++ b/pkg/cloudcommon/db/db_joint_dispatcher.go @@ -154,7 +154,14 @@ func (dispatcher *DBJointModelDispatcher) Get(ctx context.Context, id1 string, i } func attachItems(dispatcher *DBJointModelDispatcher, master IStandaloneModel, slave IStandaloneModel, ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { - if !dispatcher.JointModelManager().AllowAttach(ctx, userCred, master, slave) { + var isAllow bool + if consts.IsRbacEnabled() { + isAllow = isObjectRbacAllowed(master.GetModelManager(), master, userCred, policy.PolicyActionPerform, "attach") && + isObjectRbacAllowed(slave.GetModelManager(), slave, userCred, policy.PolicyActionPerform, "attach") + } else { + isAllow = dispatcher.JointModelManager().AllowAttach(ctx, userCred, master, slave) + } + if !isAllow { return nil, httperrors.NewForbiddenError("Not allow to attach") } ownerProjId, err := fetchOwnerProjectId(ctx, dispatcher.JointModelManager(), userCred, data) diff --git a/pkg/cloudcommon/db/interface.go b/pkg/cloudcommon/db/interface.go index 841ee1f18b..aca43f4d0f 100644 --- a/pkg/cloudcommon/db/interface.go +++ b/pkg/cloudcommon/db/interface.go @@ -118,6 +118,7 @@ type IModel interface { PostDelete(ctx context.Context, userCred mcclient.TokenCredential) GetOwnerProjectId() string + IsSharable() bool CustomizedGetDetailsBody(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) } @@ -186,7 +187,7 @@ type ISharableVirtualModelManager interface { type ISharableVirtualModel interface { IVirtualModel - IsSharable() bool + // IsSharable() bool } type IAdminSharableVirtualModelManager interface { diff --git a/pkg/cloudcommon/db/jointbase.go b/pkg/cloudcommon/db/jointbase.go index 17a3276b1d..844c87d41d 100644 --- a/pkg/cloudcommon/db/jointbase.go +++ b/pkg/cloudcommon/db/jointbase.go @@ -103,11 +103,11 @@ func (manager *SJointResourceBaseManager) FetchByIds(masterId string, slaveId st } func (manager *SJointResourceBaseManager) AllowListDescendent(ctx context.Context, userCred mcclient.TokenCredential, model IStandaloneModel, query jsonutils.JSONObject) bool { - return false + return IsAdminAllowList(userCred, manager) } func (manager *SJointResourceBaseManager) AllowAttach(ctx context.Context, userCred mcclient.TokenCredential, master IStandaloneModel, slave IStandaloneModel) bool { - return false + return IsAdminAllowCreate(userCred, manager) } func JointModelExtra(jointModel IJointModel, extra *jsonutils.JSONDict) *jsonutils.JSONDict { diff --git a/pkg/cloudcommon/db/modelbase.go b/pkg/cloudcommon/db/modelbase.go index 1adfd7f702..7c5501d40a 100644 --- a/pkg/cloudcommon/db/modelbase.go +++ b/pkg/cloudcommon/db/modelbase.go @@ -311,6 +311,10 @@ func (model *SModelBase) GetOwnerProjectId() string { return "" } +func (model *SModelBase) IsSharable() bool { + return false +} + func (model *SModelBase) CustomizedGetDetailsBody(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) { return nil, nil } diff --git a/pkg/cloudcommon/db/rbac.go b/pkg/cloudcommon/db/rbac.go index 894429f9a1..439af73377 100644 --- a/pkg/cloudcommon/db/rbac.go +++ b/pkg/cloudcommon/db/rbac.go @@ -92,7 +92,7 @@ func isObjectRbacAllowed(manager IModelManager, model IModel, userCred mcclient. if len(ownerId) > 0 { objOwnerId := model.GetOwnerProjectId() - if ownerId == objOwnerId { + if ownerId == objOwnerId || model.IsSharable() { isOwner = true requireAdmin = false } else { diff --git a/pkg/compute/guestdrivers/kvm.go b/pkg/compute/guestdrivers/kvm.go index c4b440b43f..1624d37548 100644 --- a/pkg/compute/guestdrivers/kvm.go +++ b/pkg/compute/guestdrivers/kvm.go @@ -313,7 +313,7 @@ func (self *SKVMGuestDriver) RequestGuestCreateAllDisks(ctx context.Context, gue } func (self *SKVMGuestDriver) RequestGuestHotAddIso(ctx context.Context, guest *models.SGuest, path string, task taskman.ITask) error { - return guest.StartSyncstatus(ctx, task.GetUserCred(), task.GetTaskId()) + return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) } func (self *SKVMGuestDriver) RequestRebuildRootDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 05abf42cb9..111b77d2a7 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -104,7 +104,11 @@ func (self *SGuest) PerformSaveImage(ctx context.Context, userCred mcclient.Toke if notes, err := data.GetString("notes"); err != nil && len(notes) > 0 { properties.Add(jsonutils.NewString(notes), "notes") } - properties.Add(jsonutils.NewString(self.OsType), "os_type") + osType := self.OsType + if len(osType) == 0 { + osType = "Linux" + } + properties.Add(jsonutils.NewString(osType), "os_type") kwargs.Add(properties, "properties") kwargs.Add(jsonutils.NewBool(restart), "restart") diff --git a/pkg/compute/tasks/cloud_provider_sync_onpremise_info_task.go b/pkg/compute/tasks/cloud_provider_sync_onpremise_info_task.go index ceb15a3f7c..6c6761db62 100644 --- a/pkg/compute/tasks/cloud_provider_sync_onpremise_info_task.go +++ b/pkg/compute/tasks/cloud_provider_sync_onpremise_info_task.go @@ -36,7 +36,7 @@ func syncOnPremiseCloudProviderInfo(ctx context.Context, provider *models.SCloud log.Infof(notes) if result.IsError() { logSyncFailed(provider, task, msg) - return + // return } db.OpsLog.LogEvent(provider, db.ACT_SYNC_HOST_COMPLETE, msg, task.UserCred) logclient.AddActionLog(provider, getAction(task.Params), notes, task.UserCred, true) diff --git a/pkg/mcclient/modules/mod_users.go b/pkg/mcclient/modules/mod_users.go index a42c58cc08..727f3d1908 100644 --- a/pkg/mcclient/modules/mod_users.go +++ b/pkg/mcclient/modules/mod_users.go @@ -160,7 +160,7 @@ func init() { UsersV3 = UserManagerV3{NewIdentityV3Manager("user", "users", []string{}, - []string{"ID", "Name", "Domain_Id", + []string{"ID", "Name", "Domain_Id", "default_project_id", "Enabled", "Email", "Mobile"})} register(&UsersV3)