github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/api/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 "fmt" 8 "time" 9 10 "github.com/juju/names" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/api" 15 "github.com/juju/juju/api/systemmanager" 16 commontesting "github.com/juju/juju/apiserver/common/testing" 17 "github.com/juju/juju/apiserver/params" 18 "github.com/juju/juju/feature" 19 "github.com/juju/juju/juju" 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 systemManagerSuite struct { 28 jujutesting.JujuConnSuite 29 commontesting.BlockHelper 30 } 31 32 var _ = gc.Suite(&systemManagerSuite{}) 33 34 func (s *systemManagerSuite) SetUpTest(c *gc.C) { 35 s.SetInitialFeatureFlags(feature.JES) 36 s.JujuConnSuite.SetUpTest(c) 37 } 38 39 func (s *systemManagerSuite) OpenAPI(c *gc.C) *systemmanager.Client { 40 conn, err := juju.NewAPIState(s.AdminUserTag(c), s.Environ, api.DialOpts{}) 41 c.Assert(err, jc.ErrorIsNil) 42 s.AddCleanup(func(*gc.C) { conn.Close() }) 43 return systemmanager.NewClient(conn) 44 } 45 46 func (s *systemManagerSuite) TestAllEnvironments(c *gc.C) { 47 owner := names.NewUserTag("user@remote") 48 s.Factory.MakeEnvironment(c, &factory.EnvParams{ 49 Name: "first", Owner: owner}).Close() 50 s.Factory.MakeEnvironment(c, &factory.EnvParams{ 51 Name: "second", Owner: owner}).Close() 52 53 sysManager := s.OpenAPI(c) 54 envs, err := sysManager.AllEnvironments() 55 c.Assert(err, jc.ErrorIsNil) 56 c.Assert(envs, gc.HasLen, 3) 57 58 var obtained []string 59 for _, env := range envs { 60 obtained = append(obtained, fmt.Sprintf("%s/%s", env.Owner, env.Name)) 61 } 62 expected := []string{ 63 "dummy-admin@local/dummyenv", 64 "user@remote/first", 65 "user@remote/second", 66 } 67 c.Assert(obtained, jc.SameContents, expected) 68 } 69 70 func (s *systemManagerSuite) TestEnvironmentConfig(c *gc.C) { 71 sysManager := s.OpenAPI(c) 72 env, err := sysManager.EnvironmentConfig() 73 c.Assert(err, jc.ErrorIsNil) 74 c.Assert(env["name"], gc.Equals, "dummyenv") 75 } 76 77 func (s *systemManagerSuite) TestDestroySystem(c *gc.C) { 78 s.Factory.MakeEnvironment(c, &factory.EnvParams{Name: "foo"}).Close() 79 80 sysManager := s.OpenAPI(c) 81 err := sysManager.DestroySystem(false, false) 82 c.Assert(err, gc.ErrorMatches, "state server environment cannot be destroyed before all other environments are destroyed") 83 } 84 85 func (s *systemManagerSuite) TestListBlockedEnvironments(c *gc.C) { 86 err := s.State.SwitchBlockOn(state.ChangeBlock, "change block for state server") 87 err = s.State.SwitchBlockOn(state.DestroyBlock, "destroy block for state server") 88 c.Assert(err, jc.ErrorIsNil) 89 90 sysManager := s.OpenAPI(c) 91 results, err := sysManager.ListBlockedEnvironments() 92 c.Assert(err, jc.ErrorIsNil) 93 c.Assert(results, jc.DeepEquals, []params.EnvironmentBlockInfo{ 94 params.EnvironmentBlockInfo{ 95 Name: "dummyenv", 96 UUID: s.State.EnvironUUID(), 97 OwnerTag: s.AdminUserTag(c).String(), 98 Blocks: []string{ 99 "BlockChange", 100 "BlockDestroy", 101 }, 102 }, 103 }) 104 } 105 106 func (s *systemManagerSuite) TestRemoveBlocks(c *gc.C) { 107 s.State.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment") 108 s.State.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock") 109 110 sysManager := s.OpenAPI(c) 111 err := sysManager.RemoveBlocks() 112 c.Assert(err, jc.ErrorIsNil) 113 114 blocks, err := s.State.AllBlocksForSystem() 115 c.Assert(err, jc.ErrorIsNil) 116 c.Assert(blocks, gc.HasLen, 0) 117 } 118 119 func (s *systemManagerSuite) TestWatchAllEnvs(c *gc.C) { 120 // The WatchAllEnvs infrastructure is comprehensively tested 121 // else. This test just ensure that the API calls work end-to-end. 122 sysManager := s.OpenAPI(c) 123 124 w, err := sysManager.WatchAllEnvs() 125 c.Assert(err, jc.ErrorIsNil) 126 defer func() { 127 err := w.Stop() 128 c.Assert(err, jc.ErrorIsNil) 129 }() 130 131 deltasC := make(chan []multiwatcher.Delta) 132 go func() { 133 deltas, err := w.Next() 134 c.Assert(err, jc.ErrorIsNil) 135 deltasC <- deltas 136 }() 137 138 select { 139 case deltas := <-deltasC: 140 c.Assert(deltas, gc.HasLen, 1) 141 envInfo := deltas[0].Entity.(*multiwatcher.EnvironmentInfo) 142 143 env, err := s.State.Environment() 144 c.Assert(err, jc.ErrorIsNil) 145 146 c.Assert(envInfo.EnvUUID, gc.Equals, env.UUID()) 147 c.Assert(envInfo.Name, gc.Equals, env.Name()) 148 c.Assert(envInfo.Life, gc.Equals, multiwatcher.Life("alive")) 149 c.Assert(envInfo.Owner, gc.Equals, env.Owner().Id()) 150 c.Assert(envInfo.ServerUUID, gc.Equals, env.ServerUUID()) 151 case <-time.After(testing.LongWait): 152 c.Fatal("timed out") 153 } 154 }