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 }