github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/featuretests/api_model_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package featuretests 5 6 import ( 7 "bytes" 8 "time" 9 10 "github.com/juju/errors" 11 jc "github.com/juju/testing/checkers" 12 "github.com/juju/version" 13 gc "gopkg.in/check.v1" 14 "gopkg.in/juju/names.v2" 15 16 "github.com/juju/juju/api" 17 "github.com/juju/juju/api/modelmanager" 18 "github.com/juju/juju/apiserver/params" 19 jujunames "github.com/juju/juju/juju/names" 20 "github.com/juju/juju/juju/testing" 21 "github.com/juju/juju/permission" 22 "github.com/juju/juju/state" 23 coretesting "github.com/juju/juju/testing" 24 "github.com/juju/juju/testing/factory" 25 ) 26 27 type apiEnvironmentSuite struct { 28 testing.JujuConnSuite 29 client *api.Client 30 } 31 32 func (s *apiEnvironmentSuite) SetUpTest(c *gc.C) { 33 s.JujuConnSuite.SetUpTest(c) 34 s.client = s.APIState.Client() 35 c.Assert(s.client, gc.NotNil) 36 s.AddCleanup(func(*gc.C) { 37 s.client.ClientFacade.Close() 38 }) 39 } 40 41 func (s *apiEnvironmentSuite) TestGrantModel(c *gc.C) { 42 username := "foo@ubuntuone" 43 model, err := s.State.Model() 44 c.Assert(err, jc.ErrorIsNil) 45 mm := modelmanager.NewClient(s.OpenControllerAPI(c)) 46 defer mm.Close() 47 err = mm.GrantModel(username, "read", model.UUID()) 48 c.Assert(err, jc.ErrorIsNil) 49 50 user := names.NewUserTag(username) 51 modelUser, err := s.State.UserAccess(user, model.ModelTag()) 52 c.Assert(err, jc.ErrorIsNil) 53 c.Assert(modelUser.UserName, gc.Equals, user.Id()) 54 lastConn, err := s.State.LastModelConnection(modelUser.UserTag) 55 c.Assert(err, jc.Satisfies, state.IsNeverConnectedError) 56 c.Assert(lastConn.IsZero(), jc.IsTrue) 57 } 58 59 func (s *apiEnvironmentSuite) TestRevokeModel(c *gc.C) { 60 // First share an environment with a user. 61 user := s.Factory.MakeModelUser(c, &factory.ModelUserParams{User: "foo@ubuntuone"}) 62 model, err := s.State.Model() 63 c.Assert(err, jc.ErrorIsNil) 64 mm := modelmanager.NewClient(s.OpenControllerAPI(c)) 65 defer mm.Close() 66 67 modelUser, err := s.State.UserAccess(user.UserTag, s.State.ModelTag()) 68 c.Assert(err, jc.ErrorIsNil) 69 c.Assert(modelUser, gc.Not(gc.DeepEquals), permission.UserAccess{}) 70 71 // Then test unsharing the environment. 72 err = mm.RevokeModel(user.UserName, "read", model.UUID()) 73 c.Assert(err, jc.ErrorIsNil) 74 75 modelUser, err = s.State.UserAccess(user.UserTag, s.State.ModelTag()) 76 c.Assert(errors.IsNotFound(err), jc.IsTrue) 77 c.Assert(modelUser, gc.DeepEquals, permission.UserAccess{}) 78 } 79 80 func (s *apiEnvironmentSuite) TestEnvironmentUserInfo(c *gc.C) { 81 modelUser := s.Factory.MakeModelUser(c, &factory.ModelUserParams{User: "bobjohns@ubuntuone", DisplayName: "Bob Johns"}) 82 mod, err := s.State.Model() 83 c.Assert(err, jc.ErrorIsNil) 84 owner, err := s.State.UserAccess(mod.Owner(), mod.ModelTag()) 85 c.Assert(err, jc.ErrorIsNil) 86 87 obtained, err := s.client.ModelUserInfo() 88 c.Assert(err, jc.ErrorIsNil) 89 c.Assert(obtained, gc.DeepEquals, []params.ModelUserInfo{ 90 { 91 UserName: owner.UserName, 92 DisplayName: owner.DisplayName, 93 Access: "admin", 94 LastConnection: lastConnPointer(c, s.State, owner), 95 }, { 96 UserName: "bobjohns@ubuntuone", 97 DisplayName: "Bob Johns", 98 Access: "admin", 99 LastConnection: lastConnPointer(c, s.State, modelUser), 100 }, 101 }) 102 } 103 104 func lastConnPointer(c *gc.C, st *state.State, modelUser permission.UserAccess) *time.Time { 105 lastConn, err := st.LastModelConnection(modelUser.UserTag) 106 if err != nil { 107 if state.IsNeverConnectedError(err) { 108 return nil 109 } 110 c.Fatal(err) 111 } 112 return &lastConn 113 } 114 115 func (s *apiEnvironmentSuite) TestUploadToolsOtherEnvironment(c *gc.C) { 116 // setup other environment 117 otherState := s.Factory.MakeModel(c, nil) 118 defer otherState.Close() 119 info := s.APIInfo(c) 120 info.ModelTag = otherState.ModelTag() 121 otherAPIState, err := api.Open(info, api.DefaultDialOpts()) 122 c.Assert(err, jc.ErrorIsNil) 123 defer otherAPIState.Close() 124 otherClient := otherAPIState.Client() 125 defer otherClient.ClientFacade.Close() 126 127 newVersion := version.MustParseBinary("5.4.3-quantal-amd64") 128 vers := newVersion.String() 129 130 // build fake tools 131 tgz, checksum := coretesting.TarGz( 132 coretesting.NewTarFile(jujunames.Jujud, 0777, "jujud contents "+vers)) 133 134 toolsList, err := otherClient.UploadTools(bytes.NewReader(tgz), newVersion) 135 c.Assert(err, jc.ErrorIsNil) 136 c.Assert(toolsList, gc.HasLen, 1) 137 c.Assert(toolsList[0].SHA256, gc.Equals, checksum) 138 139 toolStrg, err := otherState.ToolsStorage() 140 defer toolStrg.Close() 141 c.Assert(err, jc.ErrorIsNil) 142 meta, closer, err := toolStrg.Open(vers) 143 defer closer.Close() 144 c.Assert(err, jc.ErrorIsNil) 145 c.Assert(meta.SHA256, gc.Equals, checksum) 146 c.Assert(meta.Version, gc.Equals, vers) 147 }