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 }