func (s *clientSuite) TestClientModelUsers(c *gc.C) { client := s.APIState.Client() cleanup := api.PatchClientFacadeCall(client, func(request string, paramsIn interface{}, response interface{}) error { c.Assert(paramsIn, gc.IsNil) if response, ok := response.(*params.ModelUserInfoResults); ok { response.Results = []params.ModelUserInfoResult{ {Result: ¶ms.ModelUserInfo{UserName: "******"}}, {Result: ¶ms.ModelUserInfo{UserName: "******"}}, {Result: ¶ms.ModelUserInfo{UserName: "******"}}, } } else { c.Log("wrong output structure") c.Fail() } return nil }, ) defer cleanup() obtained, err := client.ModelUserInfo() c.Assert(err, jc.ErrorIsNil) c.Assert(obtained, jc.DeepEquals, []params.ModelUserInfo{ {UserName: "******"}, {UserName: "******"}, {UserName: "******"}, }) }
func (s *clientSuite) TestShareEnvironmentExistingUser(c *gc.C) { client := s.APIState.Client() user := s.Factory.MakeEnvUser(c, nil) cleanup := api.PatchClientFacadeCall(client, func(request string, paramsIn interface{}, response interface{}) error { if users, ok := paramsIn.(params.ModifyEnvironUsers); ok { c.Assert(users.Changes, gc.HasLen, 1) c.Logf(string(users.Changes[0].Action), gc.Equals, string(params.AddEnvUser)) c.Logf(users.Changes[0].UserTag, gc.Equals, user.UserTag().String()) } else { c.Fatalf("wrong input structure") } if result, ok := response.(*params.ErrorResults); ok { err := ¶ms.Error{Message: "failed to create environment user: env user already exists"} *result = params.ErrorResults{Results: []params.ErrorResult{{Error: err}}} } else { c.Fatalf("wrong input structure") } return nil }, ) defer cleanup() result, err := client.ShareEnvironment([]names.UserTag{user.UserTag()}) c.Assert(err, gc.IsNil) c.Assert(result.OneError().Error(), gc.Matches, "failed to create environment user: env user already exists") c.Assert(result.Results, gc.HasLen, 1) c.Assert(result.Results[0].Error, gc.ErrorMatches, `failed to create environment user: env user already exists`) }
func (s *clientSuite) TestUnshareEnvironmentMissingUser(c *gc.C) { client := s.APIState.Client() user := names.NewUserTag("bob@local") cleanup := api.PatchClientFacadeCall(client, func(request string, paramsIn interface{}, response interface{}) error { if users, ok := paramsIn.(params.ModifyEnvironUsers); ok { c.Assert(users.Changes, gc.HasLen, 1) c.Logf(string(users.Changes[0].Action), gc.Equals, string(params.RemoveEnvUser)) c.Logf(users.Changes[0].UserTag, gc.Equals, user.String()) } else { c.Fatalf("wrong input structure") } if result, ok := response.(*params.ErrorResults); ok { err := ¶ms.Error{ Message: "error message", Code: params.CodeNotFound, } *result = params.ErrorResults{Results: []params.ErrorResult{{Error: err}}} } else { c.Fatalf("wrong input structure") } return nil }, ) defer cleanup() err := client.UnshareEnvironment(user) c.Assert(err, jc.ErrorIsNil) logMsg := fmt.Sprintf("WARNING juju.api environment was not previously shared with user %s", user.Username()) c.Assert(c.GetTestLog(), jc.Contains, logMsg) }
func (s *clientSuite) TestUnshareEnvironmentThreeUsers(c *gc.C) { client := s.APIState.Client() missingUser := s.Factory.MakeEnvUser(c, nil) localUser := s.Factory.MakeUser(c, nil) newUserTag := names.NewUserTag("foo@bar") cleanup := api.PatchClientFacadeCall(client, func(request string, paramsIn interface{}, response interface{}) error { if users, ok := paramsIn.(params.ModifyEnvironUsers); ok { c.Assert(users.Changes, gc.HasLen, 3) c.Assert(string(users.Changes[0].Action), gc.Equals, string(params.RemoveEnvUser)) c.Assert(users.Changes[0].UserTag, gc.Equals, missingUser.UserTag().String()) c.Assert(string(users.Changes[1].Action), gc.Equals, string(params.RemoveEnvUser)) c.Assert(users.Changes[1].UserTag, gc.Equals, localUser.UserTag().String()) c.Assert(string(users.Changes[2].Action), gc.Equals, string(params.RemoveEnvUser)) c.Assert(users.Changes[2].UserTag, gc.Equals, newUserTag.String()) } else { c.Log("wrong input structure") c.Fail() } if result, ok := response.(*params.ErrorResults); ok { err := ¶ms.Error{Message: "error unsharing user"} *result = params.ErrorResults{Results: []params.ErrorResult{{Error: err}, {Error: nil}, {Error: nil}}} } else { c.Log("wrong output structure") c.Fail() } return nil }, ) defer cleanup() err := client.UnshareEnvironment(missingUser.UserTag(), localUser.UserTag(), newUserTag) c.Assert(err, gc.ErrorMatches, "error unsharing user") }
func (s *clientSuite) TestShareEnvironmentExistingUser(c *gc.C) { client := s.APIState.Client() user := s.Factory.MakeEnvUser(c, nil) cleanup := api.PatchClientFacadeCall(client, func(request string, paramsIn interface{}, response interface{}) error { if users, ok := paramsIn.(params.ModifyEnvironUsers); ok { c.Assert(users.Changes, gc.HasLen, 1) c.Logf(string(users.Changes[0].Action), gc.Equals, string(params.AddEnvUser)) c.Logf(users.Changes[0].UserTag, gc.Equals, user.UserTag().String()) } else { c.Fatalf("wrong input structure") } if result, ok := response.(*params.ErrorResults); ok { err := ¶ms.Error{ Message: "error message", Code: params.CodeAlreadyExists, } *result = params.ErrorResults{Results: []params.ErrorResult{{Error: err}}} } else { c.Fatalf("wrong input structure") } return nil }, ) defer cleanup() err := client.ShareEnvironment(user.UserTag()) c.Assert(err, jc.ErrorIsNil) logMsg := fmt.Sprintf("WARNING juju.api environment is already shared with %s", user.UserName()) c.Assert(c.GetTestLog(), jc.Contains, logMsg) }
func (s *clientSuite) TestDestroyEnvironment(c *gc.C) { client := s.APIState.Client() var called bool cleanup := api.PatchClientFacadeCall(client, func(req string, args interface{}, resp interface{}) error { c.Assert(req, gc.Equals, "DestroyEnvironment") called = true return nil }) defer cleanup() err := client.DestroyEnvironment() c.Assert(err, jc.ErrorIsNil) c.Assert(called, jc.IsTrue) }
func (s *clientSuite) TestAbortCurrentUpgrade(c *gc.C) { client := s.APIState.Client() someErr := errors.New("random") cleanup := api.PatchClientFacadeCall(client, func(request string, args interface{}, response interface{}) error { c.Assert(request, gc.Equals, "AbortCurrentUpgrade") c.Assert(args, gc.IsNil) c.Assert(response, gc.IsNil) return someErr }, ) defer cleanup() err := client.AbortCurrentUpgrade() c.Assert(err, gc.Equals, someErr) // Confirms that the correct facade was called }
func testMinVer(client *api.Client, t minverTest, c *gc.C) { charmMinVer := version.MustParse(t.charm) jujuVer := version.MustParse(t.juju) cleanup := api.PatchClientFacadeCall(client, func(request string, paramsIn interface{}, response interface{}) error { c.Assert(paramsIn, gc.IsNil) if response, ok := response.(*params.AgentVersionResult); ok { response.Version = jujuVer } else { c.Log("wrong output structure") c.Fail() } return nil }, ) defer cleanup() charmArchive := testcharms.Repo.CharmArchive(c.MkDir(), "dummy") curl := charm.MustParseURL( fmt.Sprintf("local:quantal/%s-%d", charmArchive.Meta().Name, charmArchive.Revision()), ) charmArchive.Meta().MinJujuVersion = charmMinVer _, err := client.AddLocalCharm(curl, charmArchive) if t.ok { if err != nil { c.Errorf("Unexpected non-nil error for jujuver %v, minver %v: %#v", t.juju, t.charm, err) } } else { if err == nil { c.Errorf("Unexpected nil error for jujuver %v, minver %v", t.juju, t.charm) } else if !api.IsMinVersionError(err) { c.Errorf("Wrong error for jujuver %v, minver %v: expected minVersionError, got: %#v", t.juju, t.charm, err) } } }