github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/provider/lxd/environ_policy_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  // +build go1.3
     5  
     6  package lxd_test
     7  
     8  import (
     9  	"strings"
    10  
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/utils/arch"
    13  	"github.com/juju/utils/series"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/constraints"
    17  	"github.com/juju/juju/provider/lxd"
    18  )
    19  
    20  type environPolSuite struct {
    21  	lxd.BaseSuite
    22  }
    23  
    24  var _ = gc.Suite(&environPolSuite{})
    25  
    26  func (s *environPolSuite) TestPrecheckInstanceOkay(c *gc.C) {
    27  	cons := constraints.Value{}
    28  	placement := ""
    29  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    30  
    31  	c.Check(err, jc.ErrorIsNil)
    32  }
    33  
    34  func (s *environPolSuite) TestPrecheckInstanceAPI(c *gc.C) {
    35  	cons := constraints.Value{}
    36  	placement := ""
    37  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    38  	c.Assert(err, jc.ErrorIsNil)
    39  
    40  	s.CheckNoAPI(c)
    41  }
    42  
    43  func (s *environPolSuite) TestPrecheckInstanceHasInstanceType(c *gc.C) {
    44  	cons := constraints.MustParse("instance-type=some-instance-type")
    45  	placement := ""
    46  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    47  
    48  	c.Check(err, gc.ErrorMatches, `LXD does not support instance types.*`)
    49  }
    50  
    51  func (s *environPolSuite) TestPrecheckInstanceDiskSize(c *gc.C) {
    52  	cons := constraints.MustParse("root-disk=1G")
    53  	placement := ""
    54  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    55  
    56  	c.Check(err, jc.ErrorIsNil)
    57  }
    58  
    59  func (s *environPolSuite) TestPrecheckInstanceUnsupportedArch(c *gc.C) {
    60  	s.Policy.Arches = []string{arch.AMD64}
    61  
    62  	cons := constraints.MustParse("arch=i386")
    63  	placement := ""
    64  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    65  
    66  	c.Check(err, jc.ErrorIsNil)
    67  }
    68  
    69  func (s *environPolSuite) TestPrecheckInstanceAvailZone(c *gc.C) {
    70  	cons := constraints.Value{}
    71  	placement := "zone=a-zone"
    72  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    73  
    74  	c.Check(err, gc.ErrorMatches, `unknown placement directive: .*`)
    75  }
    76  
    77  func (s *environPolSuite) TestSupportedArchitecturesOkay(c *gc.C) {
    78  	s.Policy.Arches = []string{arch.AMD64}
    79  
    80  	archList, err := s.Env.SupportedArchitectures()
    81  	c.Assert(err, jc.ErrorIsNil)
    82  
    83  	c.Check(archList, jc.SameContents, []string{arch.AMD64})
    84  }
    85  
    86  func (s *environPolSuite) TestConstraintsValidatorOkay(c *gc.C) {
    87  	s.Policy.Arches = []string{arch.AMD64}
    88  
    89  	validator, err := s.Env.ConstraintsValidator()
    90  	c.Assert(err, jc.ErrorIsNil)
    91  
    92  	cons := constraints.MustParse("arch=amd64")
    93  	unsupported, err := validator.Validate(cons)
    94  	c.Assert(err, jc.ErrorIsNil)
    95  
    96  	c.Check(unsupported, gc.HasLen, 0)
    97  }
    98  
    99  func (s *environPolSuite) TestConstraintsValidatorEmpty(c *gc.C) {
   100  	validator, err := s.Env.ConstraintsValidator()
   101  	c.Assert(err, jc.ErrorIsNil)
   102  
   103  	unsupported, err := validator.Validate(constraints.Value{})
   104  	c.Assert(err, jc.ErrorIsNil)
   105  
   106  	c.Check(unsupported, gc.HasLen, 0)
   107  }
   108  
   109  func (s *environPolSuite) TestConstraintsValidatorUnsupported(c *gc.C) {
   110  	s.Policy.Arches = []string{arch.AMD64}
   111  
   112  	validator, err := s.Env.ConstraintsValidator()
   113  	c.Assert(err, jc.ErrorIsNil)
   114  
   115  	cons := constraints.MustParse(strings.Join([]string{
   116  		"arch=amd64",
   117  		"tags=foo",
   118  		"mem=3",
   119  		"instance-type=some-type",
   120  		"cpu-cores=2",
   121  		"cpu-power=250",
   122  		"virt-type=kvm",
   123  	}, " "))
   124  	unsupported, err := validator.Validate(cons)
   125  	c.Assert(err, jc.ErrorIsNil)
   126  
   127  	expected := []string{
   128  		"tags",
   129  		"instance-type",
   130  		"cpu-cores",
   131  		"cpu-power",
   132  		"virt-type",
   133  	}
   134  	c.Check(unsupported, jc.SameContents, expected)
   135  }
   136  
   137  func (s *environPolSuite) TestConstraintsValidatorVocabArchKnown(c *gc.C) {
   138  	s.Policy.Arches = []string{arch.AMD64}
   139  
   140  	validator, err := s.Env.ConstraintsValidator()
   141  	c.Assert(err, jc.ErrorIsNil)
   142  
   143  	cons := constraints.MustParse("arch=amd64")
   144  	_, err = validator.Validate(cons)
   145  
   146  	c.Check(err, jc.ErrorIsNil)
   147  }
   148  
   149  func (s *environPolSuite) TestConstraintsValidatorVocabArchUnknown(c *gc.C) {
   150  	s.Policy.Arches = []string{arch.AMD64}
   151  
   152  	validator, err := s.Env.ConstraintsValidator()
   153  	c.Assert(err, jc.ErrorIsNil)
   154  
   155  	cons := constraints.MustParse("arch=ppc64el")
   156  	_, err = validator.Validate(cons)
   157  
   158  	c.Check(err, gc.ErrorMatches, "invalid constraint value: arch=ppc64el\nvalid values are:.*")
   159  }
   160  
   161  func (s *environPolSuite) TestConstraintsValidatorVocabContainerUnknown(c *gc.C) {
   162  	c.Skip("this will fail until we add a container vocabulary")
   163  	validator, err := s.Env.ConstraintsValidator()
   164  	c.Assert(err, jc.ErrorIsNil)
   165  
   166  	cons := constraints.MustParse("container=lxc")
   167  	_, err = validator.Validate(cons)
   168  
   169  	c.Check(err, gc.ErrorMatches, "invalid constraint value: container=lxc\nvalid values are:.*")
   170  }
   171  
   172  func (s *environPolSuite) TestConstraintsValidatorConflicts(c *gc.C) {
   173  	s.Policy.Arches = []string{arch.AMD64}
   174  
   175  	validator, err := s.Env.ConstraintsValidator()
   176  	c.Assert(err, jc.ErrorIsNil)
   177  
   178  	cons := constraints.MustParse("instance-type=n1-standard-1")
   179  	consFallback := constraints.MustParse("cpu-cores=2 cpu-power=1000 mem=10000 tags=bar")
   180  	merged, err := validator.Merge(consFallback, cons)
   181  	c.Assert(err, jc.ErrorIsNil)
   182  
   183  	// tags is not supported, but we're not validating here...
   184  	expected := constraints.MustParse("instance-type=n1-standard-1 tags=bar cpu-cores=2 cpu-power=1000 mem=10000")
   185  	c.Check(merged, jc.DeepEquals, expected)
   186  }
   187  
   188  func (s *environPolSuite) TestSupportNetworks(c *gc.C) {
   189  	isSupported := s.Env.SupportNetworks()
   190  
   191  	c.Check(isSupported, jc.IsFalse)
   192  }
   193  
   194  func (s *environPolSuite) TestSupportAddressAllocation(c *gc.C) {
   195  	isSupported, err := s.Env.SupportAddressAllocation("some-network")
   196  	c.Assert(err, jc.ErrorIsNil)
   197  
   198  	c.Check(isSupported, jc.IsFalse)
   199  }
   200  
   201  func (s *environPolSuite) TestSupportAddressAllocationEmpty(c *gc.C) {
   202  	isSupported, err := s.Env.SupportAddressAllocation("")
   203  	c.Assert(err, jc.ErrorIsNil)
   204  
   205  	c.Check(isSupported, jc.IsFalse)
   206  }