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  }