163
func (s *serverSuite) TestShareModelAddMissingLocalFails(c *gc.C) {
164
args := params.ModifyModelUsers{
165
Changes: []params.ModifyModelUser{{
166
UserTag: names.NewLocalUserTag("foobar").String(),
167
Action: params.AddModelUser,
170
result, err := s.client.ShareModel(args)
171
c.Assert(err, jc.ErrorIsNil)
172
expectedErr := `could not share model: user "foobar" does not exist locally: user "foobar" not found`
173
c.Assert(result.OneError(), gc.ErrorMatches, expectedErr)
174
c.Assert(result.Results, gc.HasLen, 1)
175
c.Assert(result.Results[0].Error, gc.ErrorMatches, expectedErr)
178
func (s *serverSuite) TestUnshareModel(c *gc.C) {
179
user := s.Factory.MakeModelUser(c, nil)
180
_, err := s.State.ModelUser(user.UserTag())
181
c.Assert(err, jc.ErrorIsNil)
183
args := params.ModifyModelUsers{
184
Changes: []params.ModifyModelUser{{
185
UserTag: user.UserTag().String(),
186
Action: params.RemoveModelUser,
189
result, err := s.client.ShareModel(args)
190
c.Assert(err, jc.ErrorIsNil)
191
c.Assert(result.OneError(), gc.IsNil)
192
c.Assert(result.Results, gc.HasLen, 1)
193
c.Assert(result.Results[0].Error, gc.IsNil)
195
_, err = s.State.ModelUser(user.UserTag())
196
c.Assert(errors.IsNotFound(err), jc.IsTrue)
199
func (s *serverSuite) TestUnshareModelMissingUser(c *gc.C) {
200
user := names.NewUserTag("bob")
201
args := params.ModifyModelUsers{
202
Changes: []params.ModifyModelUser{{
203
UserTag: user.String(),
204
Action: params.RemoveModelUser,
207
result, err := s.client.ShareModel(args)
208
c.Assert(err, jc.ErrorIsNil)
209
c.Assert(result.OneError(), gc.ErrorMatches, `could not unshare model: env user "bob@local" does not exist: transaction aborted`)
211
c.Assert(result.Results, gc.HasLen, 1)
212
c.Assert(result.Results[0].Error, gc.NotNil)
214
_, err = s.State.ModelUser(user)
215
c.Assert(errors.IsNotFound(err), jc.IsTrue)
218
func (s *serverSuite) TestShareModelAddLocalUser(c *gc.C) {
219
user := s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar", NoModelUser: true})
220
args := params.ModifyModelUsers{
221
Changes: []params.ModifyModelUser{{
222
UserTag: user.Tag().String(),
223
Action: params.AddModelUser,
226
result, err := s.client.ShareModel(args)
227
c.Assert(err, jc.ErrorIsNil)
228
c.Assert(result.OneError(), gc.IsNil)
229
c.Assert(result.Results, gc.HasLen, 1)
230
c.Assert(result.Results[0].Error, gc.IsNil)
232
modelUser, err := s.State.ModelUser(user.UserTag())
233
c.Assert(err, jc.ErrorIsNil)
234
c.Assert(modelUser.UserName(), gc.Equals, user.UserTag().Canonical())
235
c.Assert(modelUser.CreatedBy(), gc.Equals, "admin@local")
236
lastConn, err := modelUser.LastConnection()
237
c.Assert(err, jc.Satisfies, state.IsNeverConnectedError)
238
c.Assert(lastConn, gc.Equals, time.Time{})
241
func (s *serverSuite) TestShareModelAddRemoteUser(c *gc.C) {
242
user := names.NewUserTag("foobar@ubuntuone")
243
args := params.ModifyModelUsers{
244
Changes: []params.ModifyModelUser{{
245
UserTag: user.String(),
246
Action: params.AddModelUser,
249
result, err := s.client.ShareModel(args)
250
c.Assert(err, jc.ErrorIsNil)
251
c.Assert(result.OneError(), gc.IsNil)
252
c.Assert(result.Results, gc.HasLen, 1)
253
c.Assert(result.Results[0].Error, gc.IsNil)
255
modelUser, err := s.State.ModelUser(user)
256
c.Assert(err, jc.ErrorIsNil)
257
c.Assert(modelUser.UserName(), gc.Equals, user.Canonical())
258
c.Assert(modelUser.CreatedBy(), gc.Equals, "admin@local")
259
lastConn, err := modelUser.LastConnection()
260
c.Assert(err, jc.Satisfies, state.IsNeverConnectedError)
261
c.Assert(lastConn.IsZero(), jc.IsTrue)
264
func (s *serverSuite) TestShareModelAddUserTwice(c *gc.C) {
265
user := s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar"})
266
args := params.ModifyModelUsers{
267
Changes: []params.ModifyModelUser{{
268
UserTag: user.Tag().String(),
269
Action: params.AddModelUser,
272
_, err := s.client.ShareModel(args)
273
c.Assert(err, jc.ErrorIsNil)
275
result, err := s.client.ShareModel(args)
276
c.Assert(err, jc.ErrorIsNil)
277
c.Assert(result.OneError(), gc.ErrorMatches, "could not share model: model user \"foobar@local\" already exists")
278
c.Assert(result.Results, gc.HasLen, 1)
279
c.Assert(result.Results[0].Error, gc.ErrorMatches, "could not share model: model user \"foobar@local\" already exists")
280
c.Assert(result.Results[0].Error.Code, gc.Matches, params.CodeAlreadyExists)
282
modelUser, err := s.State.ModelUser(user.UserTag())
283
c.Assert(err, jc.ErrorIsNil)
284
c.Assert(modelUser.UserName(), gc.Equals, user.UserTag().Canonical())
287
func (s *serverSuite) TestShareModelInvalidTags(c *gc.C) {
288
for _, testParam := range []struct {
298
tag: "relation-wordpress:db mysql:db",
307
tag: "user-Mua^h^h^h^arh",
313
tag: "user@ubuntuone",
316
tag: "user@ubuntuone",
329
var expectedErr string
330
errPart := `could not share model: "` + regexp.QuoteMeta(testParam.tag) + `" is not a valid `
332
if testParam.validTag {
334
// The string is a valid tag, but not a user tag.
335
expectedErr = errPart + `user tag`
338
// The string is not a valid tag of any kind.
339
expectedErr = errPart + `tag`
342
args := params.ModifyModelUsers{
343
Changes: []params.ModifyModelUser{{
344
UserTag: testParam.tag,
345
Action: params.AddModelUser,
348
_, err := s.client.ShareModel(args)
349
result, err := s.client.ShareModel(args)
350
c.Assert(err, jc.ErrorIsNil)
351
c.Assert(result.OneError(), gc.ErrorMatches, expectedErr)
352
c.Assert(result.Results, gc.HasLen, 1)
353
c.Assert(result.Results[0].Error, gc.ErrorMatches, expectedErr)
357
func (s *serverSuite) TestShareModelZeroArgs(c *gc.C) {
358
args := params.ModifyModelUsers{Changes: []params.ModifyModelUser{{}}}
360
_, err := s.client.ShareModel(args)
361
result, err := s.client.ShareModel(args)
362
c.Assert(err, jc.ErrorIsNil)
363
expectedErr := `could not share model: "" is not a valid tag`
364
c.Assert(result.OneError(), gc.ErrorMatches, expectedErr)
365
c.Assert(result.Results, gc.HasLen, 1)
366
c.Assert(result.Results[0].Error, gc.ErrorMatches, expectedErr)
369
func (s *serverSuite) TestShareModelInvalidAction(c *gc.C) {
370
var dance params.ModelAction = "dance"
371
args := params.ModifyModelUsers{
372
Changes: []params.ModifyModelUser{{
373
UserTag: "user-user@local",
377
_, err := s.client.ShareModel(args)
378
result, err := s.client.ShareModel(args)
379
c.Assert(err, jc.ErrorIsNil)
380
expectedErr := `unknown action "dance"`
381
c.Assert(result.OneError(), gc.ErrorMatches, expectedErr)
382
c.Assert(result.Results, gc.HasLen, 1)
383
c.Assert(result.Results[0].Error, gc.ErrorMatches, expectedErr)
386
164
func (s *serverSuite) TestSetEnvironAgentVersion(c *gc.C) {
387
165
args := params.SetModelAgentVersion{
388
166
Version: version.MustParse("9.8.7"),