github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/apiserver/client/destroy_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package client_test 5 6 import ( 7 "fmt" 8 9 gc "launchpad.net/gocheck" 10 11 "launchpad.net/juju-core/environs" 12 coreerrors "launchpad.net/juju-core/errors" 13 "launchpad.net/juju-core/instance" 14 "launchpad.net/juju-core/juju/testing" 15 "launchpad.net/juju-core/state" 16 jc "launchpad.net/juju-core/testing/checkers" 17 ) 18 19 type destroyEnvironmentSuite struct { 20 baseSuite 21 } 22 23 var _ = gc.Suite(&destroyEnvironmentSuite{}) 24 25 // setUpManual adds "manually provisioned" machines to state: 26 // one manager machine, and one non-manager. 27 func (s *destroyEnvironmentSuite) setUpManual(c *gc.C) (m0, m1 *state.Machine) { 28 m0, err := s.State.AddMachine("precise", state.JobManageEnviron) 29 c.Assert(err, gc.IsNil) 30 err = m0.SetProvisioned(instance.Id("manual:0"), "manual:0:fake_nonce", nil) 31 c.Assert(err, gc.IsNil) 32 m1, err = s.State.AddMachine("precise", state.JobHostUnits) 33 c.Assert(err, gc.IsNil) 34 err = m1.SetProvisioned(instance.Id("manual:1"), "manual:1:fake_nonce", nil) 35 c.Assert(err, gc.IsNil) 36 return m0, m1 37 } 38 39 // setUpInstances adds machines to state backed by instances: 40 // one manager machine, and one non-manager. 41 func (s *destroyEnvironmentSuite) setUpInstances(c *gc.C) (m0, m1 *state.Machine) { 42 m0, err := s.State.AddMachine("precise", state.JobManageEnviron) 43 c.Assert(err, gc.IsNil) 44 inst, _ := testing.AssertStartInstance(c, s.APIConn.Environ, m0.Id()) 45 err = m0.SetProvisioned(inst.Id(), "fake_nonce", nil) 46 c.Assert(err, gc.IsNil) 47 m1, err = s.State.AddMachine("precise", state.JobHostUnits) 48 c.Assert(err, gc.IsNil) 49 inst, _ = testing.AssertStartInstance(c, s.APIConn.Environ, m1.Id()) 50 err = m1.SetProvisioned(inst.Id(), "fake_nonce", nil) 51 c.Assert(err, gc.IsNil) 52 return m0, m1 53 } 54 55 func (s *destroyEnvironmentSuite) TestDestroyEnvironmentManual(c *gc.C) { 56 _, nonManager := s.setUpManual(c) 57 58 // If there are any non-manager manual machines in state, DestroyEnvironment will 59 // error. It will not set the Dying flag on the environment. 60 err := s.APIState.Client().DestroyEnvironment() 61 c.Assert(err, gc.ErrorMatches, fmt.Sprintf("manually provisioned machines must first be destroyed with `juju destroy-machine %s`", nonManager.Id())) 62 env, err := s.State.Environment() 63 c.Assert(err, gc.IsNil) 64 c.Assert(env.Life(), gc.Equals, state.Alive) 65 66 // If we remove the non-manager machine, it should pass. 67 // Manager machines will remain. 68 err = nonManager.EnsureDead() 69 c.Assert(err, gc.IsNil) 70 err = nonManager.Remove() 71 c.Assert(err, gc.IsNil) 72 err = s.APIState.Client().DestroyEnvironment() 73 c.Assert(err, gc.IsNil) 74 err = env.Refresh() 75 c.Assert(err, gc.IsNil) 76 c.Assert(env.Life(), gc.Equals, state.Dying) 77 } 78 79 func (s *destroyEnvironmentSuite) TestDestroyEnvironment(c *gc.C) { 80 manager, nonManager := s.setUpInstances(c) 81 managerId, _ := manager.InstanceId() 82 nonManagerId, _ := nonManager.InstanceId() 83 84 instances, err := s.APIConn.Environ.Instances([]instance.Id{managerId, nonManagerId}) 85 c.Assert(err, gc.IsNil) 86 for _, inst := range instances { 87 c.Assert(inst, gc.NotNil) 88 } 89 90 services, err := s.State.AllServices() 91 c.Assert(err, gc.IsNil) 92 93 err = s.APIState.Client().DestroyEnvironment() 94 c.Assert(err, gc.IsNil) 95 96 // After DestroyEnvironment returns, we should have: 97 // - all non-manager instances stopped 98 instances, err = s.APIConn.Environ.Instances([]instance.Id{managerId, nonManagerId}) 99 c.Assert(err, gc.Equals, environs.ErrPartialInstances) 100 c.Assert(instances[0], gc.NotNil) 101 c.Assert(instances[1], gc.IsNil) 102 // - all services in state are Dying or Dead (or removed altogether), 103 // after running the state Cleanups. 104 needsCleanup, err := s.State.NeedsCleanup() 105 c.Assert(err, gc.IsNil) 106 c.Assert(needsCleanup, jc.IsTrue) 107 err = s.State.Cleanup() 108 c.Assert(err, gc.IsNil) 109 for _, s := range services { 110 err = s.Refresh() 111 if err != nil { 112 c.Assert(err, jc.Satisfies, coreerrors.IsNotFoundError) 113 } else { 114 c.Assert(s.Life(), gc.Not(gc.Equals), state.Alive) 115 } 116 } 117 // - environment is Dying 118 env, err := s.State.Environment() 119 c.Assert(err, gc.IsNil) 120 c.Assert(env.Life(), gc.Equals, state.Dying) 121 }