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