~juju-qa/ubuntu/xenial/juju/xenial-2.0-beta3

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/api/modelmanager/modelmanager.go

  • Committer: Martin Packman
  • Date: 2016-03-30 19:31:08 UTC
  • mfrom: (1.1.41)
  • Revision ID: martin.packman@canonical.com-20160330193108-h9iz3ak334uk0z5r
Merge new upstream source 2.0~beta3

Show diffs side-by-side

added added

removed removed

Lines of Context:
10
10
 
11
11
        "github.com/juju/juju/api/base"
12
12
        "github.com/juju/juju/apiserver/params"
 
13
        "github.com/juju/juju/juju/permission"
13
14
)
14
15
 
15
16
var logger = loggo.GetLogger("juju.api.modelmanager")
100
101
        }
101
102
        return result, nil
102
103
}
 
104
 
 
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
 
109
 
 
110
        modelAccess, err := permission.ParseModelAccess(access)
 
111
        if err != nil {
 
112
                return fail, errors.Trace(err)
 
113
        }
 
114
        var accessPermission params.ModelAccessPermission
 
115
        switch modelAccess {
 
116
        case permission.ModelReadAccess:
 
117
                accessPermission = params.ModelReadAccess
 
118
        case permission.ModelWriteAccess:
 
119
                accessPermission = params.ModelWriteAccess
 
120
        default:
 
121
                return fail, errors.Errorf("unsupported model access permission %v", modelAccess)
 
122
        }
 
123
        return accessPermission, nil
 
124
}
 
125
 
 
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)
 
129
}
 
130
 
 
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)
 
134
}
 
135
 
 
136
func (c *Client) modifyModelUser(action params.ModelAction, user, access string, modelUUIDs []string) error {
 
137
        var args params.ModifyModelAccessRequest
 
138
 
 
139
        if !names.IsValidUser(user) {
 
140
                return errors.Errorf("invalid username: %q", user)
 
141
        }
 
142
        userTag := names.NewUserTag(user)
 
143
 
 
144
        accessPermission, err := ParseModelAccess(access)
 
145
        if err != nil {
 
146
                return errors.Trace(err)
 
147
        }
 
148
        for _, model := range modelUUIDs {
 
149
                if !names.IsValidModel(model) {
 
150
                        return errors.Errorf("invalid model: %q", model)
 
151
                }
 
152
                modelTag := names.NewModelTag(model)
 
153
                args.Changes = append(args.Changes, params.ModifyModelAccess{
 
154
                        UserTag:  userTag.String(),
 
155
                        Action:   action,
 
156
                        Access:   accessPermission,
 
157
                        ModelTag: modelTag.String(),
 
158
                })
 
159
        }
 
160
 
 
161
        var result params.ErrorResults
 
162
        err = c.facade.FacadeCall("ModifyModelAccess", args, &result)
 
163
        if err != nil {
 
164
                return errors.Trace(err)
 
165
        }
 
166
        if len(result.Results) != len(args.Changes) {
 
167
                return errors.Errorf("expected %d results, got %d", len(args.Changes), len(result.Results))
 
168
        }
 
169
 
 
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
 
174
                }
 
175
        }
 
176
        return result.Combine()
 
177
}