github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/apiserver/systemmanager/destroy_test.go (about)

     1  // Copyright 2012-2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package systemmanager_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names"
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/apiserver/common"
    13  	commontesting "github.com/juju/juju/apiserver/common/testing"
    14  	"github.com/juju/juju/apiserver/params"
    15  	"github.com/juju/juju/apiserver/systemmanager"
    16  	apiservertesting "github.com/juju/juju/apiserver/testing"
    17  	jujutesting "github.com/juju/juju/juju/testing"
    18  	"github.com/juju/juju/state"
    19  	"github.com/juju/juju/testing"
    20  	"github.com/juju/juju/testing/factory"
    21  )
    22  
    23  // NOTE: the testing of the general environment destruction code
    24  // is found in apiserver/common/environdestroy_test.go.
    25  //
    26  // The tests here are around the validation and behaviour of
    27  // the flags passed in to the system manager destroy system call.
    28  
    29  type destroySystemSuite struct {
    30  	jujutesting.JujuConnSuite
    31  	commontesting.BlockHelper
    32  
    33  	systemManager *systemmanager.SystemManagerAPI
    34  
    35  	otherState    *state.State
    36  	otherEnvOwner names.UserTag
    37  	otherEnvUUID  string
    38  }
    39  
    40  var _ = gc.Suite(&destroySystemSuite{})
    41  
    42  func (s *destroySystemSuite) SetUpTest(c *gc.C) {
    43  	s.JujuConnSuite.SetUpTest(c)
    44  
    45  	s.BlockHelper = commontesting.NewBlockHelper(s.APIState)
    46  	s.AddCleanup(func(*gc.C) { s.BlockHelper.Close() })
    47  
    48  	resources := common.NewResources()
    49  	s.AddCleanup(func(_ *gc.C) { resources.StopAll() })
    50  
    51  	authoriser := apiservertesting.FakeAuthorizer{
    52  		Tag: s.AdminUserTag(c),
    53  	}
    54  	systemManager, err := systemmanager.NewSystemManagerAPI(s.State, resources, authoriser)
    55  	c.Assert(err, jc.ErrorIsNil)
    56  	s.systemManager = systemManager
    57  
    58  	s.otherEnvOwner = names.NewUserTag("jess@dummy")
    59  	s.otherState = factory.NewFactory(s.State).MakeEnvironment(c, &factory.EnvParams{
    60  		Name:    "dummytoo",
    61  		Owner:   s.otherEnvOwner,
    62  		Prepare: true,
    63  		ConfigAttrs: testing.Attrs{
    64  			"state-server": false,
    65  		},
    66  	})
    67  	s.AddCleanup(func(c *gc.C) { s.otherState.Close() })
    68  	s.otherEnvUUID = s.otherState.EnvironUUID()
    69  }
    70  
    71  func (s *destroySystemSuite) TestDestroySystemKillsHostedEnvsWithBlocks(c *gc.C) {
    72  	s.BlockDestroyEnvironment(c, "TestBlockDestroyEnvironment")
    73  	s.BlockRemoveObject(c, "TestBlockRemoveObject")
    74  	s.otherState.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment")
    75  	s.otherState.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock")
    76  
    77  	err := s.systemManager.DestroySystem(params.DestroySystemArgs{
    78  		DestroyEnvironments: true,
    79  		IgnoreBlocks:        true,
    80  	})
    81  	c.Assert(err, jc.ErrorIsNil)
    82  
    83  	_, err = s.otherState.Environment()
    84  	c.Assert(errors.IsNotFound(err), jc.IsTrue)
    85  
    86  	env, err := s.State.Environment()
    87  	c.Assert(err, jc.ErrorIsNil)
    88  	c.Assert(env.Life(), gc.Equals, state.Dying)
    89  }
    90  
    91  func (s *destroySystemSuite) TestDestroySystemReturnsBlockedEnvironmentsErr(c *gc.C) {
    92  	s.BlockDestroyEnvironment(c, "TestBlockDestroyEnvironment")
    93  	s.BlockRemoveObject(c, "TestBlockRemoveObject")
    94  	s.otherState.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment")
    95  	s.otherState.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock")
    96  
    97  	err := s.systemManager.DestroySystem(params.DestroySystemArgs{
    98  		DestroyEnvironments: true,
    99  	})
   100  	c.Assert(params.IsCodeOperationBlocked(err), jc.IsTrue)
   101  
   102  	numBlocks, err := s.State.AllBlocksForSystem()
   103  	c.Assert(err, jc.ErrorIsNil)
   104  	c.Assert(len(numBlocks), gc.Equals, 4)
   105  
   106  	_, err = s.otherState.Environment()
   107  	c.Assert(err, jc.ErrorIsNil)
   108  }
   109  
   110  func (s *destroySystemSuite) TestDestroySystemKillsHostedEnvs(c *gc.C) {
   111  	err := s.systemManager.DestroySystem(params.DestroySystemArgs{
   112  		DestroyEnvironments: true,
   113  	})
   114  	c.Assert(err, jc.ErrorIsNil)
   115  
   116  	_, err = s.otherState.Environment()
   117  	c.Assert(errors.IsNotFound(err), jc.IsTrue)
   118  
   119  	env, err := s.State.Environment()
   120  	c.Assert(err, jc.ErrorIsNil)
   121  	c.Assert(env.Life(), gc.Equals, state.Dying)
   122  }
   123  
   124  func (s *destroySystemSuite) TestDestroySystemLeavesBlocksIfNotKillAll(c *gc.C) {
   125  	s.BlockDestroyEnvironment(c, "TestBlockDestroyEnvironment")
   126  	s.BlockRemoveObject(c, "TestBlockRemoveObject")
   127  	s.otherState.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment")
   128  	s.otherState.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock")
   129  
   130  	err := s.systemManager.DestroySystem(params.DestroySystemArgs{
   131  		IgnoreBlocks: true,
   132  	})
   133  	c.Assert(err, gc.ErrorMatches, "state server environment cannot be destroyed before all other environments are destroyed")
   134  
   135  	numBlocks, err := s.State.AllBlocksForSystem()
   136  	c.Assert(err, jc.ErrorIsNil)
   137  	c.Assert(len(numBlocks), gc.Equals, 4)
   138  }
   139  
   140  func (s *destroySystemSuite) TestDestroySystemNoHostedEnvs(c *gc.C) {
   141  	err := common.DestroyEnvironment(s.State, s.otherState.EnvironTag())
   142  	c.Assert(err, jc.ErrorIsNil)
   143  
   144  	err = s.systemManager.DestroySystem(params.DestroySystemArgs{})
   145  	c.Assert(err, jc.ErrorIsNil)
   146  
   147  	env, err := s.State.Environment()
   148  	c.Assert(err, jc.ErrorIsNil)
   149  	c.Assert(env.Life(), gc.Equals, state.Dying)
   150  }
   151  
   152  func (s *destroySystemSuite) TestDestroySystemNoHostedEnvsWithBlock(c *gc.C) {
   153  	err := common.DestroyEnvironment(s.State, s.otherState.EnvironTag())
   154  	c.Assert(err, jc.ErrorIsNil)
   155  
   156  	s.BlockDestroyEnvironment(c, "TestBlockDestroyEnvironment")
   157  	s.BlockRemoveObject(c, "TestBlockRemoveObject")
   158  
   159  	err = s.systemManager.DestroySystem(params.DestroySystemArgs{
   160  		IgnoreBlocks: true,
   161  	})
   162  	c.Assert(err, jc.ErrorIsNil)
   163  
   164  	env, err := s.State.Environment()
   165  	c.Assert(err, jc.ErrorIsNil)
   166  	c.Assert(env.Life(), gc.Equals, state.Dying)
   167  }
   168  
   169  func (s *destroySystemSuite) TestDestroySystemNoHostedEnvsWithBlockFail(c *gc.C) {
   170  	err := common.DestroyEnvironment(s.State, s.otherState.EnvironTag())
   171  	c.Assert(err, jc.ErrorIsNil)
   172  
   173  	s.BlockDestroyEnvironment(c, "TestBlockDestroyEnvironment")
   174  	s.BlockRemoveObject(c, "TestBlockRemoveObject")
   175  
   176  	err = s.systemManager.DestroySystem(params.DestroySystemArgs{})
   177  	c.Assert(params.IsCodeOperationBlocked(err), jc.IsTrue)
   178  
   179  	numBlocks, err := s.State.AllBlocksForSystem()
   180  	c.Assert(err, jc.ErrorIsNil)
   181  	c.Assert(len(numBlocks), gc.Equals, 2)
   182  }