From 3a357b343de359c9c06e09e34f35605800bd108f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Fri, 23 Feb 2024 15:08:20 +0800 Subject: [PATCH] fix(keystone): support unset project admin user (#19538) --- pkg/apis/identity/input.go | 3 +++ pkg/keystone/models/projects.go | 22 ++++++++++++++++++++++ pkg/mcclient/options/identity/project.go | 1 + 3 files changed, 26 insertions(+) diff --git a/pkg/apis/identity/input.go b/pkg/apis/identity/input.go index c89c7c6f50..6ac282a78f 100644 --- a/pkg/apis/identity/input.go +++ b/pkg/apis/identity/input.go @@ -164,6 +164,9 @@ type ProjectListInput struct { // project tags filter imposed by policy PolicyProjectTags tagutils.TTagSetList `json:"policy_project_tags"` + + // 通过项目管理员id过滤 + AdminId string `json:"admin_id"` } type DomainListInput struct { diff --git a/pkg/keystone/models/projects.go b/pkg/keystone/models/projects.go index 7cba2a0343..88f75b6e0b 100644 --- a/pkg/keystone/models/projects.go +++ b/pkg/keystone/models/projects.go @@ -35,6 +35,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db/quotas" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/cloudcommon/notifyclient" + "yunion.io/x/onecloud/pkg/cloudcommon/validators" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/keystone/options" "yunion.io/x/onecloud/pkg/mcclient" @@ -286,6 +287,14 @@ func (manager *SProjectManager) ListItemFilter( } } + if len(query.AdminId) > 0 { + _, err := validators.ValidateModel(ctx, nil, UserManager, &query.AdminId) + if err != nil { + return nil, err + } + q = q.Equals("admin_id", query.AdminId) + } + groupStr := query.GroupId if len(groupStr) > 0 { groupObj, err := GroupManager.FetchById(groupStr) @@ -350,6 +359,14 @@ func (manager *SProjectManager) QueryDistinctExtraField(q *sqlchemy.SQuery, fiel return q, nil } + if field == "admin" { + userQuery := UserManager.Query("name", "id").Distinct().SubQuery() + q.AppendField(userQuery.Field("name", field)) + q = q.Join(userQuery, sqlchemy.Equals(q.Field("admin_id"), userQuery.Field("id"))) + q.GroupBy(userQuery.Field("name")) + return q, nil + } + return q, httperrors.ErrNotFound } @@ -822,6 +839,11 @@ func (project *SProject) PerformSetAdmin( query jsonutils.JSONObject, input api.SProjectSetAdminInput, ) (jsonutils.JSONObject, error) { + // unset admin + if len(input.UserId) == 0 { + return nil, project.setAdminId(ctx, userCred, input.UserId) + } + var user *SUser var role *SRole diff --git a/pkg/mcclient/options/identity/project.go b/pkg/mcclient/options/identity/project.go index be1428789f..a668a158cd 100644 --- a/pkg/mcclient/options/identity/project.go +++ b/pkg/mcclient/options/identity/project.go @@ -28,6 +28,7 @@ type ProjectListOptions struct { UserId string `help:"filter by user id"` GroupId string `help:"filter by group id"` IdpId string `help:"filter by idp id"` + AdminId string OrderByDomain string `help:"order by domain name" choices:"asc|desc"` }