github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/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/v2" 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, 3) 49 c.Assert(ensureVMFolderCall.Args[0], gc.Implements, new(context.Context)) 50 c.Assert(ensureVMFolderCall.Args[2], 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 "Close", 103 ) 104 105 destroyModelVMFolderCall := s.client.Calls()[0] 106 c.Assert(destroyModelVMFolderCall.Args, gc.HasLen, 2) 107 c.Assert(destroyModelVMFolderCall.Args[0], gc.Implements, new(context.Context)) 108 c.Assert(destroyModelVMFolderCall.Args[1], gc.Equals, 109 `Juju Controller (*)/Model "testmodel" (2d02eeac-9dbb-11e4-89d3-123b93f75cba)`, 110 ) 111 112 removeVirtualMachinesCall := s.client.Calls()[1] 113 c.Assert(removeVirtualMachinesCall.Args, gc.HasLen, 2) 114 c.Assert(removeVirtualMachinesCall.Args[0], gc.Implements, new(context.Context)) 115 c.Assert(removeVirtualMachinesCall.Args[1], gc.Equals, 116 `Juju Controller (foo)/Model "*" (*)/*`, 117 ) 118 119 destroyControllerVMFolderCall := s.client.Calls()[2] 120 c.Assert(destroyControllerVMFolderCall.Args, gc.HasLen, 2) 121 c.Assert(destroyControllerVMFolderCall.Args[0], gc.Implements, new(context.Context)) 122 c.Assert(destroyControllerVMFolderCall.Args[1], gc.Equals, `Juju Controller (foo)`) 123 } 124 125 func (s *environSuite) TestAdoptResources(c *gc.C) { 126 err := s.env.AdoptResources(s.callCtx, "foo", version.Number{}) 127 c.Assert(err, jc.ErrorIsNil) 128 129 s.dialStub.CheckCallNames(c, "Dial") 130 s.client.CheckCallNames(c, "MoveVMFolderInto", "Close") 131 moveVMFolderIntoCall := s.client.Calls()[0] 132 c.Assert(moveVMFolderIntoCall.Args, gc.HasLen, 3) 133 c.Assert(moveVMFolderIntoCall.Args[0], gc.Implements, new(context.Context)) 134 c.Assert(moveVMFolderIntoCall.Args[1], gc.Equals, `Juju Controller (foo)`) 135 c.Assert(moveVMFolderIntoCall.Args[2], gc.Equals, 136 `Juju Controller (*)/Model "testmodel" (2d02eeac-9dbb-11e4-89d3-123b93f75cba)`, 137 ) 138 } 139 140 func (s *environSuite) TestPrepareForBootstrap(c *gc.C) { 141 err := s.env.PrepareForBootstrap(envtesting.BootstrapContext(context.TODO(), c), "controller-1") 142 c.Check(err, jc.ErrorIsNil) 143 } 144 145 func (s *environSuite) TestSupportsNetworking(c *gc.C) { 146 _, ok := environs.SupportsNetworking(s.env) 147 c.Assert(ok, jc.IsFalse) 148 } 149 150 func (s *environSuite) TestAdoptResourcesPermissionError(c *gc.C) { 151 AssertInvalidatesCredential(c, s.client, func(ctx environscontext.ProviderCallContext) error { 152 return s.env.AdoptResources(ctx, "foo", version.Number{}) 153 }) 154 } 155 156 func (s *environSuite) TestBootstrapPermissionError(c *gc.C) { 157 AssertInvalidatesCredential(c, s.client, func(ctx environscontext.ProviderCallContext) error { 158 _, err := s.env.Bootstrap(nil, ctx, environs.BootstrapParams{ 159 ControllerConfig: testing.FakeControllerConfig(), 160 SupportedBootstrapSeries: testing.FakeSupportedJujuSeries, 161 }) 162 return err 163 }) 164 } 165 166 func (s *environSuite) TestDestroyPermissionError(c *gc.C) { 167 AssertInvalidatesCredential(c, s.client, func(ctx environscontext.ProviderCallContext) error { 168 return s.env.Destroy(ctx) 169 }) 170 } 171 172 func (s *environSuite) TestDestroyControllerPermissionError(c *gc.C) { 173 AssertInvalidatesCredential(c, s.client, func(ctx environscontext.ProviderCallContext) error { 174 return s.env.DestroyController(ctx, "foo") 175 }) 176 }