github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/apiserver/systemmanager/systemmanager_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package systemmanager_test 5 6 import ( 7 "time" 8 9 "github.com/juju/loggo" 10 "github.com/juju/names" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/apiserver" 15 "github.com/juju/juju/apiserver/common" 16 "github.com/juju/juju/apiserver/params" 17 "github.com/juju/juju/apiserver/systemmanager" 18 apiservertesting "github.com/juju/juju/apiserver/testing" 19 jujutesting "github.com/juju/juju/juju/testing" 20 "github.com/juju/juju/state" 21 "github.com/juju/juju/state/multiwatcher" 22 "github.com/juju/juju/testing" 23 "github.com/juju/juju/testing/factory" 24 ) 25 26 type systemManagerSuite struct { 27 jujutesting.JujuConnSuite 28 29 systemManager *systemmanager.SystemManagerAPI 30 resources *common.Resources 31 authorizer apiservertesting.FakeAuthorizer 32 } 33 34 var _ = gc.Suite(&systemManagerSuite{}) 35 36 func (s *systemManagerSuite) SetUpTest(c *gc.C) { 37 s.JujuConnSuite.SetUpTest(c) 38 s.resources = common.NewResources() 39 s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() }) 40 41 s.authorizer = apiservertesting.FakeAuthorizer{ 42 Tag: s.AdminUserTag(c), 43 } 44 45 systemManager, err := systemmanager.NewSystemManagerAPI(s.State, s.resources, s.authorizer) 46 c.Assert(err, jc.ErrorIsNil) 47 s.systemManager = systemManager 48 49 loggo.GetLogger("juju.apiserver.systemmanager").SetLogLevel(loggo.TRACE) 50 } 51 52 func (s *systemManagerSuite) TestNewAPIRefusesNonClient(c *gc.C) { 53 anAuthoriser := apiservertesting.FakeAuthorizer{ 54 Tag: names.NewUnitTag("mysql/0"), 55 } 56 endPoint, err := systemmanager.NewSystemManagerAPI(s.State, s.resources, anAuthoriser) 57 c.Assert(endPoint, gc.IsNil) 58 c.Assert(err, gc.ErrorMatches, "permission denied") 59 } 60 61 func (s *systemManagerSuite) TestNewAPIRefusesNonAdmins(c *gc.C) { 62 user := s.Factory.MakeUser(c, &factory.UserParams{NoEnvUser: true}) 63 anAuthoriser := apiservertesting.FakeAuthorizer{ 64 Tag: user.Tag(), 65 } 66 endPoint, err := systemmanager.NewSystemManagerAPI(s.State, s.resources, anAuthoriser) 67 c.Assert(endPoint, gc.IsNil) 68 c.Assert(err, gc.ErrorMatches, "permission denied") 69 } 70 71 func (s *systemManagerSuite) checkEnvironmentMatches(c *gc.C, env params.Environment, expected *state.Environment) { 72 c.Check(env.Name, gc.Equals, expected.Name()) 73 c.Check(env.UUID, gc.Equals, expected.UUID()) 74 c.Check(env.OwnerTag, gc.Equals, expected.Owner().String()) 75 } 76 77 func (s *systemManagerSuite) TestAllEnvironments(c *gc.C) { 78 admin := s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar"}) 79 80 s.Factory.MakeEnvironment(c, &factory.EnvParams{ 81 Name: "owned", Owner: admin.UserTag()}).Close() 82 remoteUserTag := names.NewUserTag("user@remote") 83 st := s.Factory.MakeEnvironment(c, &factory.EnvParams{ 84 Name: "user", Owner: remoteUserTag}) 85 defer st.Close() 86 st.AddEnvironmentUser(admin.UserTag(), remoteUserTag, "Foo Bar") 87 88 s.Factory.MakeEnvironment(c, &factory.EnvParams{ 89 Name: "no-access", Owner: remoteUserTag}).Close() 90 91 response, err := s.systemManager.AllEnvironments() 92 c.Assert(err, jc.ErrorIsNil) 93 // The results are sorted. 94 expected := []string{"dummyenv", "no-access", "owned", "user"} 95 var obtained []string 96 for _, env := range response.UserEnvironments { 97 obtained = append(obtained, env.Name) 98 stateEnv, err := s.State.GetEnvironment(names.NewEnvironTag(env.UUID)) 99 c.Assert(err, jc.ErrorIsNil) 100 s.checkEnvironmentMatches(c, env.Environment, stateEnv) 101 } 102 c.Assert(obtained, jc.DeepEquals, expected) 103 } 104 105 func (s *systemManagerSuite) TestListBlockedEnvironments(c *gc.C) { 106 st := s.Factory.MakeEnvironment(c, &factory.EnvParams{ 107 Name: "test"}) 108 defer st.Close() 109 110 s.State.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment") 111 s.State.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock") 112 st.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment") 113 st.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock") 114 115 list, err := s.systemManager.ListBlockedEnvironments() 116 c.Assert(err, jc.ErrorIsNil) 117 118 c.Assert(list.Environments, jc.DeepEquals, []params.EnvironmentBlockInfo{ 119 params.EnvironmentBlockInfo{ 120 Name: "dummyenv", 121 UUID: s.State.EnvironUUID(), 122 OwnerTag: s.AdminUserTag(c).String(), 123 Blocks: []string{ 124 "BlockDestroy", 125 "BlockChange", 126 }, 127 }, 128 params.EnvironmentBlockInfo{ 129 Name: "test", 130 UUID: st.EnvironUUID(), 131 OwnerTag: s.AdminUserTag(c).String(), 132 Blocks: []string{ 133 "BlockDestroy", 134 "BlockChange", 135 }, 136 }, 137 }) 138 139 } 140 141 func (s *systemManagerSuite) TestListBlockedEnvironmentsNoBlocks(c *gc.C) { 142 list, err := s.systemManager.ListBlockedEnvironments() 143 c.Assert(err, jc.ErrorIsNil) 144 c.Assert(list.Environments, gc.HasLen, 0) 145 } 146 147 func (s *systemManagerSuite) TestEnvironmentConfig(c *gc.C) { 148 env, err := s.systemManager.EnvironmentConfig() 149 c.Assert(err, jc.ErrorIsNil) 150 c.Assert(env.Config["name"], gc.Equals, "dummyenv") 151 } 152 153 func (s *systemManagerSuite) TestEnvironmentConfigFromNonStateServer(c *gc.C) { 154 st := s.Factory.MakeEnvironment(c, &factory.EnvParams{ 155 Name: "test"}) 156 defer st.Close() 157 158 authorizer := &apiservertesting.FakeAuthorizer{Tag: s.AdminUserTag(c)} 159 systemManager, err := systemmanager.NewSystemManagerAPI(st, common.NewResources(), authorizer) 160 c.Assert(err, jc.ErrorIsNil) 161 env, err := systemManager.EnvironmentConfig() 162 c.Assert(err, jc.ErrorIsNil) 163 c.Assert(env.Config["name"], gc.Equals, "dummyenv") 164 } 165 166 func (s *systemManagerSuite) TestRemoveBlocks(c *gc.C) { 167 st := s.Factory.MakeEnvironment(c, &factory.EnvParams{ 168 Name: "test"}) 169 defer st.Close() 170 171 s.State.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment") 172 s.State.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock") 173 st.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment") 174 st.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock") 175 176 err := s.systemManager.RemoveBlocks(params.RemoveBlocksArgs{All: true}) 177 c.Assert(err, jc.ErrorIsNil) 178 179 blocks, err := s.State.AllBlocksForSystem() 180 c.Assert(err, jc.ErrorIsNil) 181 c.Assert(blocks, gc.HasLen, 0) 182 } 183 184 func (s *systemManagerSuite) TestRemoveBlocksNotAll(c *gc.C) { 185 err := s.systemManager.RemoveBlocks(params.RemoveBlocksArgs{}) 186 c.Assert(err, gc.ErrorMatches, "not supported") 187 } 188 189 func (s *systemManagerSuite) TestWatchAllEnvs(c *gc.C) { 190 watcherId, err := s.systemManager.WatchAllEnvs() 191 c.Assert(err, jc.ErrorIsNil) 192 193 watcherAPI_, err := apiserver.NewAllWatcher(s.State, s.resources, s.authorizer, watcherId.AllWatcherId) 194 c.Assert(err, jc.ErrorIsNil) 195 watcherAPI := watcherAPI_.(*apiserver.SrvAllWatcher) 196 defer func() { 197 err := watcherAPI.Stop() 198 c.Assert(err, jc.ErrorIsNil) 199 }() 200 201 resultC := make(chan params.AllWatcherNextResults) 202 go func() { 203 result, err := watcherAPI.Next() 204 c.Assert(err, jc.ErrorIsNil) 205 resultC <- result 206 }() 207 208 select { 209 case result := <-resultC: 210 // Expect to see the initial environment be reported. 211 deltas := result.Deltas 212 c.Assert(deltas, gc.HasLen, 1) 213 envInfo := deltas[0].Entity.(*multiwatcher.EnvironmentInfo) 214 c.Assert(envInfo.EnvUUID, gc.Equals, s.State.EnvironUUID()) 215 case <-time.After(testing.LongWait): 216 c.Fatal("timed out") 217 } 218 }