101
102
return result, nil
105
// ParseModelAccess parses an access permission argument into
106
// a type suitable for making an API facade call.
107
func ParseModelAccess(access string) (params.ModelAccessPermission, error) {
108
var fail params.ModelAccessPermission
110
modelAccess, err := permission.ParseModelAccess(access)
112
return fail, errors.Trace(err)
114
var accessPermission params.ModelAccessPermission
116
case permission.ModelReadAccess:
117
accessPermission = params.ModelReadAccess
118
case permission.ModelWriteAccess:
119
accessPermission = params.ModelWriteAccess
121
return fail, errors.Errorf("unsupported model access permission %v", modelAccess)
123
return accessPermission, nil
126
// GrantModel grants a user access to the specified models.
127
func (c *Client) GrantModel(user, access string, modelUUIDs ...string) error {
128
return c.modifyModelUser(params.GrantModelAccess, user, access, modelUUIDs)
131
// RevokeModel revokes a user's access to the specified models.
132
func (c *Client) RevokeModel(user, access string, modelUUIDs ...string) error {
133
return c.modifyModelUser(params.RevokeModelAccess, user, access, modelUUIDs)
136
func (c *Client) modifyModelUser(action params.ModelAction, user, access string, modelUUIDs []string) error {
137
var args params.ModifyModelAccessRequest
139
if !names.IsValidUser(user) {
140
return errors.Errorf("invalid username: %q", user)
142
userTag := names.NewUserTag(user)
144
accessPermission, err := ParseModelAccess(access)
146
return errors.Trace(err)
148
for _, model := range modelUUIDs {
149
if !names.IsValidModel(model) {
150
return errors.Errorf("invalid model: %q", model)
152
modelTag := names.NewModelTag(model)
153
args.Changes = append(args.Changes, params.ModifyModelAccess{
154
UserTag: userTag.String(),
156
Access: accessPermission,
157
ModelTag: modelTag.String(),
161
var result params.ErrorResults
162
err = c.facade.FacadeCall("ModifyModelAccess", args, &result)
164
return errors.Trace(err)
166
if len(result.Results) != len(args.Changes) {
167
return errors.Errorf("expected %d results, got %d", len(args.Changes), len(result.Results))
170
for i, r := range result.Results {
171
if r.Error != nil && r.Error.Code == params.CodeAlreadyExists {
172
logger.Warningf("model %q is already shared with %q", modelUUIDs[i], userTag.Canonical())
173
result.Results[i].Error = nil
176
return result.Combine()