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  }