github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/vsphere/environ_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package vsphere_test 5 6 import ( 7 "github.com/juju/errors" 8 jc "github.com/juju/testing/checkers" 9 "github.com/juju/version" 10 "github.com/vmware/govmomi/vim25/mo" 11 "github.com/vmware/govmomi/vim25/types" 12 "golang.org/x/net/context" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/environs" 16 environscontext "github.com/juju/juju/environs/context" 17 envtesting "github.com/juju/juju/environs/testing" 18 "github.com/juju/juju/provider/vsphere" 19 "github.com/juju/juju/testing" 20 ) 21 22 type environSuite struct { 23 EnvironFixture 24 } 25 26 var _ = gc.Suite(&environSuite{}) 27 28 func (s *environSuite) TestBootstrap(c *gc.C) { 29 s.PatchValue(&vsphere.Bootstrap, func( 30 ctx environs.BootstrapContext, 31 env environs.Environ, 32 callCtx environscontext.ProviderCallContext, 33 args environs.BootstrapParams, 34 ) (*environs.BootstrapResult, error) { 35 return nil, errors.New("Bootstrap called") 36 }) 37 38 _, err := s.env.Bootstrap(nil, s.callCtx, environs.BootstrapParams{ 39 ControllerConfig: testing.FakeControllerConfig(), 40 }) 41 c.Assert(err, gc.ErrorMatches, "Bootstrap called") 42 43 // We dial a connection before calling calling Bootstrap, 44 // in order to create the VM folder. 45 s.dialStub.CheckCallNames(c, "Dial") 46 s.client.CheckCallNames(c, "EnsureVMFolder", "Close") 47 ensureVMFolderCall := s.client.Calls()[0] 48 c.Assert(ensureVMFolderCall.Args, gc.HasLen, 2) 49 c.Assert(ensureVMFolderCall.Args[0], gc.Implements, new(context.Context)) 50 c.Assert(ensureVMFolderCall.Args[1], gc.Equals, 51 `Juju Controller (deadbeef-1bad-500d-9000-4b1d0d06f00d)/Model "testmodel" (2d02eeac-9dbb-11e4-89d3-123b93f75cba)`, 52 ) 53 } 54 55 func (s *environSuite) TestDestroy(c *gc.C) { 56 var destroyCalled bool 57 s.PatchValue(&vsphere.DestroyEnv, func(env environs.Environ, callCtx environscontext.ProviderCallContext) error { 58 destroyCalled = true 59 s.client.CheckNoCalls(c) 60 return nil 61 }) 62 err := s.env.Destroy(s.callCtx) 63 c.Assert(err, jc.ErrorIsNil) 64 c.Assert(destroyCalled, jc.IsTrue) 65 s.client.CheckCallNames(c, "DestroyVMFolder", "Close") 66 destroyVMFolderCall := s.client.Calls()[0] 67 c.Assert(destroyVMFolderCall.Args, gc.HasLen, 2) 68 c.Assert(destroyVMFolderCall.Args[0], gc.Implements, new(context.Context)) 69 c.Assert(destroyVMFolderCall.Args[1], gc.Equals, 70 `Juju Controller (*)/Model "testmodel" (2d02eeac-9dbb-11e4-89d3-123b93f75cba)`, 71 ) 72 } 73 74 func (s *environSuite) TestDestroyController(c *gc.C) { 75 s.client.datastores = []*mo.Datastore{{ 76 ManagedEntity: mo.ManagedEntity{Name: "foo"}, 77 }, { 78 ManagedEntity: mo.ManagedEntity{Name: "bar"}, 79 Summary: types.DatastoreSummary{ 80 Accessible: true, 81 }, 82 }, { 83 ManagedEntity: mo.ManagedEntity{Name: "baz"}, 84 Summary: types.DatastoreSummary{ 85 Accessible: true, 86 }, 87 }} 88 89 var destroyCalled bool 90 s.PatchValue(&vsphere.DestroyEnv, func(env environs.Environ, callCtx environscontext.ProviderCallContext) error { 91 destroyCalled = true 92 s.client.CheckNoCalls(c) 93 return nil 94 }) 95 err := s.env.DestroyController(s.callCtx, "foo") 96 c.Assert(err, jc.ErrorIsNil) 97 c.Assert(destroyCalled, jc.IsTrue) 98 99 s.dialStub.CheckCallNames(c, "Dial") 100 s.client.CheckCallNames(c, 101 "DestroyVMFolder", "RemoveVirtualMachines", "DestroyVMFolder", 102 "Datastores", "DeleteDatastoreFile", "DeleteDatastoreFile", 103 "Close", 104 ) 105 106 destroyModelVMFolderCall := s.client.Calls()[0] 107 c.Assert(destroyModelVMFolderCall.Args, gc.HasLen, 2) 108 c.Assert(destroyModelVMFolderCall.Args[0], gc.Implements, new(context.Context)) 109 c.Assert(destroyModelVMFolderCall.Args[1], gc.Equals, 110 `Juju Controller (*)/Model "testmodel" (2d02eeac-9dbb-11e4-89d3-123b93f75cba)`, 111 ) 112 113 removeVirtualMachinesCall := s.client.Calls()[1] 114 c.Assert(removeVirtualMachinesCall.Args, gc.HasLen, 2) 115 c.Assert(removeVirtualMachinesCall.Args[0], gc.Implements, new(context.Context)) 116 c.Assert(removeVirtualMachinesCall.Args[1], gc.Equals, 117 `Juju Controller (foo)/Model "*" (*)/*`, 118 ) 119 120 destroyControllerVMFolderCall := s.client.Calls()[2] 121 c.Assert(destroyControllerVMFolderCall.Args, gc.HasLen, 2) 122 c.Assert(destroyControllerVMFolderCall.Args[0], gc.Implements, new(context.Context)) 123 c.Assert(destroyControllerVMFolderCall.Args[1], gc.Equals, `Juju Controller (foo)`) 124 125 deleteDatastoreFileCall1 := s.client.Calls()[4] 126 c.Assert(deleteDatastoreFileCall1.Args, gc.HasLen, 2) 127 c.Assert(deleteDatastoreFileCall1.Args[0], gc.Implements, new(context.Context)) 128 c.Assert(deleteDatastoreFileCall1.Args[1], gc.Equals, "[bar] juju-vmdks/foo") 129 130 deleteDatastoreFileCall2 := s.client.Calls()[5] 131 c.Assert(deleteDatastoreFileCall2.Args, gc.HasLen, 2) 132 c.Assert(deleteDatastoreFileCall2.Args[0], gc.Implements, new(context.Context)) 133 c.Assert(deleteDatastoreFileCall2.Args[1], gc.Equals, "[baz] juju-vmdks/foo") 134 } 135 136 func (s *environSuite) TestAdoptResources(c *gc.C) { 137 err := s.env.AdoptResources(s.callCtx, "foo", version.Number{}) 138 c.Assert(err, jc.ErrorIsNil) 139 140 s.dialStub.CheckCallNames(c, "Dial") 141 s.client.CheckCallNames(c, "MoveVMFolderInto", "Close") 142 moveVMFolderIntoCall := s.client.Calls()[0] 143 c.Assert(moveVMFolderIntoCall.Args, gc.HasLen, 3) 144 c.Assert(moveVMFolderIntoCall.Args[0], gc.Implements, new(context.Context)) 145 c.Assert(moveVMFolderIntoCall.Args[1], gc.Equals, `Juju Controller (foo)`) 146 c.Assert(moveVMFolderIntoCall.Args[2], gc.Equals, 147 `Juju Controller (*)/Model "testmodel" (2d02eeac-9dbb-11e4-89d3-123b93f75cba)`, 148 ) 149 } 150 151 func (s *environSuite) TestPrepareForBootstrap(c *gc.C) { 152 err := s.env.PrepareForBootstrap(envtesting.BootstrapContext(c)) 153 c.Check(err, jc.ErrorIsNil) 154 } 155 156 func (s *environSuite) TestSupportsNetworking(c *gc.C) { 157 _, ok := environs.SupportsNetworking(s.env) 158 c.Assert(ok, jc.IsFalse) 159 } 160 161 func (s *environSuite) TestAdoptResourcesPermissionError(c *gc.C) { 162 AssertInvalidatesCredential(c, s.client, func(ctx environscontext.ProviderCallContext) error { 163 return s.env.AdoptResources(ctx, "foo", version.Number{}) 164 }) 165 } 166 167 func (s *environSuite) TestBootstrapPermissionError(c *gc.C) { 168 AssertInvalidatesCredential(c, s.client, func(ctx environscontext.ProviderCallContext) error { 169 _, err := s.env.Bootstrap(nil, ctx, environs.BootstrapParams{ 170 ControllerConfig: testing.FakeControllerConfig(), 171 }) 172 return err 173 }) 174 } 175 176 func (s *environSuite) TestDestroyPermissionError(c *gc.C) { 177 AssertInvalidatesCredential(c, s.client, func(ctx environscontext.ProviderCallContext) error { 178 return s.env.Destroy(ctx) 179 }) 180 } 181 182 func (s *environSuite) TestDestroyControllerPermissionError(c *gc.C) { 183 AssertInvalidatesCredential(c, s.client, func(ctx environscontext.ProviderCallContext) error { 184 return s.env.DestroyController(ctx, "foo") 185 }) 186 }