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  }