github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/api/controller/controller_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package controller_test 5 6 import ( 7 "fmt" 8 "time" 9 10 "github.com/juju/errors" 11 "github.com/juju/names" 12 jc "github.com/juju/testing/checkers" 13 "github.com/juju/utils" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/api/base" 17 "github.com/juju/juju/api/controller" 18 commontesting "github.com/juju/juju/apiserver/common/testing" 19 "github.com/juju/juju/apiserver/params" 20 jujutesting "github.com/juju/juju/juju/testing" 21 "github.com/juju/juju/state" 22 "github.com/juju/juju/state/multiwatcher" 23 "github.com/juju/juju/testing" 24 "github.com/juju/juju/testing/factory" 25 ) 26 27 type controllerSuite struct { 28 jujutesting.JujuConnSuite 29 commontesting.BlockHelper 30 } 31 32 var _ = gc.Suite(&controllerSuite{}) 33 34 func (s *controllerSuite) SetUpTest(c *gc.C) { 35 s.JujuConnSuite.SetUpTest(c) 36 } 37 38 func (s *controllerSuite) OpenAPI(c *gc.C) *controller.Client { 39 return controller.NewClient(s.APIState) 40 } 41 42 func (s *controllerSuite) TestAllModels(c *gc.C) { 43 owner := names.NewUserTag("user@remote") 44 s.Factory.MakeModel(c, &factory.ModelParams{ 45 Name: "first", Owner: owner}).Close() 46 s.Factory.MakeModel(c, &factory.ModelParams{ 47 Name: "second", Owner: owner}).Close() 48 49 sysManager := s.OpenAPI(c) 50 envs, err := sysManager.AllModels() 51 c.Assert(err, jc.ErrorIsNil) 52 c.Assert(envs, gc.HasLen, 3) 53 54 var obtained []string 55 for _, env := range envs { 56 obtained = append(obtained, fmt.Sprintf("%s/%s", env.Owner, env.Name)) 57 } 58 expected := []string{ 59 "admin@local/admin", 60 "user@remote/first", 61 "user@remote/second", 62 } 63 c.Assert(obtained, jc.SameContents, expected) 64 } 65 66 func (s *controllerSuite) TestModelConfig(c *gc.C) { 67 sysManager := s.OpenAPI(c) 68 env, err := sysManager.ModelConfig() 69 c.Assert(err, jc.ErrorIsNil) 70 c.Assert(env["name"], gc.Equals, "admin") 71 } 72 73 func (s *controllerSuite) TestDestroyController(c *gc.C) { 74 st := s.Factory.MakeModel(c, &factory.ModelParams{Name: "foo"}) 75 factory.NewFactory(st).MakeMachine(c, nil) // make it non-empty 76 st.Close() 77 78 sysManager := s.OpenAPI(c) 79 err := sysManager.DestroyController(false) 80 c.Assert(err, gc.ErrorMatches, `failed to destroy model: hosting 1 other models \(controller has hosted models\)`) 81 } 82 83 func (s *controllerSuite) TestListBlockedModels(c *gc.C) { 84 err := s.State.SwitchBlockOn(state.ChangeBlock, "change block for controller") 85 err = s.State.SwitchBlockOn(state.DestroyBlock, "destroy block for controller") 86 c.Assert(err, jc.ErrorIsNil) 87 88 sysManager := s.OpenAPI(c) 89 results, err := sysManager.ListBlockedModels() 90 c.Assert(err, jc.ErrorIsNil) 91 c.Assert(results, jc.DeepEquals, []params.ModelBlockInfo{ 92 params.ModelBlockInfo{ 93 Name: "admin", 94 UUID: s.State.ModelUUID(), 95 OwnerTag: s.AdminUserTag(c).String(), 96 Blocks: []string{ 97 "BlockChange", 98 "BlockDestroy", 99 }, 100 }, 101 }) 102 } 103 104 func (s *controllerSuite) TestRemoveBlocks(c *gc.C) { 105 s.State.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyModel") 106 s.State.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock") 107 108 sysManager := s.OpenAPI(c) 109 err := sysManager.RemoveBlocks() 110 c.Assert(err, jc.ErrorIsNil) 111 112 blocks, err := s.State.AllBlocksForController() 113 c.Assert(err, jc.ErrorIsNil) 114 c.Assert(blocks, gc.HasLen, 0) 115 } 116 117 func (s *controllerSuite) TestWatchAllModels(c *gc.C) { 118 // The WatchAllModels infrastructure is comprehensively tested 119 // else. This test just ensure that the API calls work end-to-end. 120 sysManager := s.OpenAPI(c) 121 122 w, err := sysManager.WatchAllModels() 123 c.Assert(err, jc.ErrorIsNil) 124 defer func() { 125 err := w.Stop() 126 c.Assert(err, jc.ErrorIsNil) 127 }() 128 129 deltasC := make(chan []multiwatcher.Delta) 130 go func() { 131 deltas, err := w.Next() 132 c.Assert(err, jc.ErrorIsNil) 133 deltasC <- deltas 134 }() 135 136 select { 137 case deltas := <-deltasC: 138 c.Assert(deltas, gc.HasLen, 1) 139 modelInfo := deltas[0].Entity.(*multiwatcher.ModelInfo) 140 141 env, err := s.State.Model() 142 c.Assert(err, jc.ErrorIsNil) 143 144 c.Assert(modelInfo.ModelUUID, gc.Equals, env.UUID()) 145 c.Assert(modelInfo.Name, gc.Equals, env.Name()) 146 c.Assert(modelInfo.Life, gc.Equals, multiwatcher.Life("alive")) 147 c.Assert(modelInfo.Owner, gc.Equals, env.Owner().Id()) 148 c.Assert(modelInfo.ServerUUID, gc.Equals, env.ControllerUUID()) 149 case <-time.After(testing.LongWait): 150 c.Fatal("timed out") 151 } 152 } 153 154 func (s *controllerSuite) TestModelStatus(c *gc.C) { 155 controller := s.OpenAPI(c) 156 modelTag := s.State.ModelTag() 157 results, err := controller.ModelStatus(modelTag) 158 c.Assert(err, jc.ErrorIsNil) 159 c.Assert(results, jc.DeepEquals, []base.ModelStatus{{ 160 UUID: modelTag.Id(), 161 HostedMachineCount: 0, 162 ServiceCount: 0, 163 Owner: "admin@local", 164 Life: params.Alive, 165 }}) 166 } 167 168 func (s *controllerSuite) TestInitiateModelMigration(c *gc.C) { 169 st := s.Factory.MakeModel(c, nil) 170 defer st.Close() 171 172 _, err := st.GetModelMigration() 173 c.Assert(errors.IsNotFound(err), jc.IsTrue) 174 175 spec := controller.ModelMigrationSpec{ 176 ModelUUID: st.ModelUUID(), 177 TargetControllerUUID: randomUUID(), 178 TargetAddrs: []string{"1.2.3.4:5"}, 179 TargetCACert: "cert", 180 TargetUser: "someone", 181 TargetPassword: "secret", 182 } 183 184 controller := s.OpenAPI(c) 185 id, err := controller.InitiateModelMigration(spec) 186 c.Assert(err, jc.ErrorIsNil) 187 expectedId := st.ModelUUID() + ":0" 188 c.Check(id, gc.Equals, expectedId) 189 190 // Check database. 191 mig, err := st.GetModelMigration() 192 c.Assert(err, jc.ErrorIsNil) 193 c.Check(mig.Id(), gc.Equals, expectedId) 194 } 195 196 func (s *controllerSuite) TestInitiateModelMigrationError(c *gc.C) { 197 spec := controller.ModelMigrationSpec{ 198 ModelUUID: randomUUID(), // Model doesn't exist. 199 TargetControllerUUID: randomUUID(), 200 TargetAddrs: []string{"1.2.3.4:5"}, 201 TargetCACert: "cert", 202 TargetUser: "someone", 203 TargetPassword: "secret", 204 } 205 206 controller := s.OpenAPI(c) 207 id, err := controller.InitiateModelMigration(spec) 208 c.Check(id, gc.Equals, "") 209 c.Check(err, gc.ErrorMatches, "unable to read model: .+") 210 } 211 212 func randomUUID() string { 213 return utils.MustNewUUID().String() 214 }