github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/provider/vsphere/environ_policy_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  	jc "github.com/juju/testing/checkers"
     8  	"github.com/vmware/govmomi/object"
     9  	"github.com/vmware/govmomi/vim25/mo"
    10  	"github.com/vmware/govmomi/vim25/types"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/core/constraints"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/provider/vsphere/internal/vsphereclient"
    16  )
    17  
    18  type environPolSuite struct {
    19  	EnvironFixture
    20  }
    21  
    22  var _ = gc.Suite(&environPolSuite{})
    23  
    24  func (s *environPolSuite) TestConstraintsValidator(c *gc.C) {
    25  	validator, err := s.env.ConstraintsValidator(s.callCtx)
    26  	c.Assert(err, jc.ErrorIsNil)
    27  
    28  	cons := constraints.MustParse("arch=amd64")
    29  	unsupported, err := validator.Validate(cons)
    30  	c.Assert(err, jc.ErrorIsNil)
    31  
    32  	c.Check(unsupported, gc.HasLen, 0)
    33  }
    34  
    35  func (s *environPolSuite) TestConstraintsValidatorEmpty(c *gc.C) {
    36  	validator, err := s.env.ConstraintsValidator(s.callCtx)
    37  	c.Assert(err, jc.ErrorIsNil)
    38  
    39  	unsupported, err := validator.Validate(constraints.Value{})
    40  	c.Assert(err, jc.ErrorIsNil)
    41  
    42  	c.Check(unsupported, gc.HasLen, 0)
    43  }
    44  
    45  func (s *environPolSuite) TestConstraintsValidatorUnsupported(c *gc.C) {
    46  	validator, err := s.env.ConstraintsValidator(s.callCtx)
    47  	c.Assert(err, jc.ErrorIsNil)
    48  
    49  	cons := constraints.MustParse("arch=amd64 tags=foo virt-type=kvm")
    50  	unsupported, err := validator.Validate(cons)
    51  	c.Assert(err, jc.ErrorIsNil)
    52  
    53  	c.Check(unsupported, jc.SameContents, []string{"tags", "virt-type"})
    54  }
    55  
    56  func (s *environPolSuite) TestConstraintsValidatorVocabArch(c *gc.C) {
    57  	validator, err := s.env.ConstraintsValidator(s.callCtx)
    58  	c.Assert(err, jc.ErrorIsNil)
    59  
    60  	cons := constraints.MustParse("arch=ppc64el")
    61  	_, err = validator.Validate(cons)
    62  	c.Check(err, gc.ErrorMatches, "invalid constraint value: arch=ppc64el\nvalid values are:.*")
    63  }
    64  
    65  func (s *environPolSuite) TestPrecheckInstanceChecksPlacementZone(c *gc.C) {
    66  	s.client.folders = makeFolders("/DC/host")
    67  	err := s.env.PrecheckInstance(s.callCtx, environs.PrecheckInstanceParams{
    68  		Placement: "zone=some-zone",
    69  	})
    70  	c.Assert(err, gc.ErrorMatches, `availability zone "some-zone" not found`)
    71  
    72  	s.client.computeResources = []vsphereclient.ComputeResource{
    73  		{Resource: newComputeResource("z1"), Path: "/DC/host/z1"},
    74  		{Resource: newComputeResource("z2"), Path: "/DC/host/z2"},
    75  	}
    76  	s.client.resourcePools = map[string][]*object.ResourcePool{
    77  		"/DC/host/z1/...": {makeResourcePool("pool-1", "/DC/host/z1/Resources")},
    78  	}
    79  	err = s.env.PrecheckInstance(s.callCtx, environs.PrecheckInstanceParams{
    80  		Placement: "zone=z1",
    81  	})
    82  	c.Assert(err, jc.ErrorIsNil)
    83  }
    84  
    85  func (s *environPolSuite) TestPrecheckInstanceChecksConstraintZones(c *gc.C) {
    86  	s.client.folders = makeFolders("/DC/host")
    87  	s.client.computeResources = []vsphereclient.ComputeResource{
    88  		{Resource: newComputeResource("z1"), Path: "/DC/host/z1"},
    89  		{Resource: newComputeResource("z2"), Path: "/DC/host/z2"},
    90  	}
    91  	s.client.resourcePools = map[string][]*object.ResourcePool{
    92  		"/DC/host/z1/...": {makeResourcePool("pool-1", "/DC/host/z1/Resources")},
    93  		"/DC/host/z2/...": {
    94  			// Check we don't get broken by trailing slashes.
    95  			makeResourcePool("pool-2", "/DC/host/z2/Resources/"),
    96  			makeResourcePool("pool-3", "/DC/host/z2/Resources/child"),
    97  			makeResourcePool("pool-4", "/DC/host/z2/Resources/child/nested"),
    98  			makeResourcePool("pool-5", "/DC/host/z2/Resources/child/nested/other/"),
    99  		},
   100  	}
   101  	err := s.env.PrecheckInstance(s.callCtx, environs.PrecheckInstanceParams{
   102  		Constraints: constraints.MustParse("zones=z1,z2/child,z2/fish"),
   103  	})
   104  	c.Assert(err, gc.ErrorMatches, `availability zone "z2/fish" not found`)
   105  
   106  	err = s.env.PrecheckInstance(s.callCtx, environs.PrecheckInstanceParams{
   107  		Constraints: constraints.MustParse("zones=z2/fish"),
   108  	})
   109  	c.Assert(err, gc.ErrorMatches, `availability zone "z2/fish" not found`)
   110  
   111  	err = s.env.PrecheckInstance(s.callCtx, environs.PrecheckInstanceParams{
   112  		Constraints: constraints.MustParse("zones=z1,z2/child"),
   113  	})
   114  	c.Assert(err, jc.ErrorIsNil)
   115  }
   116  
   117  func (s *environPolSuite) TestPrecheckInstanceChecksConstraintDatastore(c *gc.C) {
   118  	s.client.datastores = []mo.Datastore{{
   119  		ManagedEntity: mo.ManagedEntity{Name: "foo"},
   120  	}, {
   121  		ManagedEntity: mo.ManagedEntity{Name: "bar"},
   122  		Summary: types.DatastoreSummary{
   123  			Accessible: true,
   124  		},
   125  	}}
   126  
   127  	err := s.env.PrecheckInstance(s.callCtx, environs.PrecheckInstanceParams{
   128  		Constraints: constraints.MustParse("root-disk-source=blam"),
   129  	})
   130  	c.Assert(err, gc.ErrorMatches, `datastore "blam" not found`)
   131  
   132  	err = s.env.PrecheckInstance(s.callCtx, environs.PrecheckInstanceParams{
   133  		Constraints: constraints.MustParse("root-disk-source=foo"),
   134  	})
   135  	c.Assert(err, gc.ErrorMatches, `datastore "foo" not found`)
   136  
   137  	err = s.env.PrecheckInstance(s.callCtx, environs.PrecheckInstanceParams{
   138  		Constraints: constraints.MustParse("root-disk-source=bar"),
   139  	})
   140  	c.Assert(err, jc.ErrorIsNil)
   141  }