From f1be0adf6e906032b6a10e33fa79ec1be97f203e Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Tue, 10 Nov 2020 20:30:27 +0800 Subject: [PATCH] allow delete role-policy-binding --- cmd/climc/shell/identity/rolepolicies.go | 12 +++++++++++ pkg/keystone/models/rolepolicies.go | 26 ++++++++++++++++++++++++ pkg/mcclient/modules/mod_rolepolicies.go | 2 +- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/cmd/climc/shell/identity/rolepolicies.go b/cmd/climc/shell/identity/rolepolicies.go index 1dcc66ac42..1cf6083e2e 100644 --- a/cmd/climc/shell/identity/rolepolicies.go +++ b/cmd/climc/shell/identity/rolepolicies.go @@ -73,4 +73,16 @@ func init() { printObject(result) return nil }) + + type RolePolicyDeleteOptions struct { + ID string `json:"-" help:"id or role policy binding"` + } + R(&RolePolicyDeleteOptions{}, "role-policy-delete", "Delete role policy binding", func(s *mcclient.ClientSession, args *RolePolicyDeleteOptions) error { + result, err := modules.RolePolicies.Delete(s, args.ID, nil) + if err != nil { + return err + } + printObject(result) + return nil + }) } diff --git a/pkg/keystone/models/rolepolicies.go b/pkg/keystone/models/rolepolicies.go index 12b3c840d7..7ccd5375bb 100644 --- a/pkg/keystone/models/rolepolicies.go +++ b/pkg/keystone/models/rolepolicies.go @@ -449,3 +449,29 @@ func (manager *SRolePolicyManager) fetchByRoleId(roleId string) ([]SRolePolicy, } return rps, nil } + +func (manager *SRolePolicyManager) FilterById(q *sqlchemy.SQuery, idStr string) *sqlchemy.SQuery { + parts := strings.Split(idStr, ":") + if len(parts) == 3 { + return q.Equals("role_id", parts[0]).Equals("project_id", parts[1]).Equals("policy_id", parts[2]) + } else { + return q.Equals("ips", idStr) + } +} + +func (manager *SRolePolicyManager) FilterByNotId(q *sqlchemy.SQuery, idStr string) *sqlchemy.SQuery { + parts := strings.Split(idStr, ":") + if len(parts) == 3 { + return q.Filter(sqlchemy.OR( + sqlchemy.NotEquals(q.Field("role_id"), parts[0]), + sqlchemy.NotEquals(q.Field("project_id"), parts[1]), + sqlchemy.NotEquals(q.Field("policy_id"), parts[2]), + )) + } else { + return q + } +} + +func (manager *SRolePolicyManager) FilterByName(q *sqlchemy.SQuery, name string) *sqlchemy.SQuery { + return manager.FilterById(q, name) +} diff --git a/pkg/mcclient/modules/mod_rolepolicies.go b/pkg/mcclient/modules/mod_rolepolicies.go index 82358cc4d0..16c5c519dc 100644 --- a/pkg/mcclient/modules/mod_rolepolicies.go +++ b/pkg/mcclient/modules/mod_rolepolicies.go @@ -59,7 +59,7 @@ func init() { RolePolicies = SRolePolicyManager{NewIdentityV3Manager( "rolepolicy", "rolepolicies", - []string{"role", "role_id", "project", "project_id", "policy", "policy_id", "ips", "scope"}, + []string{"id", "name", "role", "role_id", "project", "project_id", "policy", "policy_id", "ips", "scope"}, []string{}, )}