github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/provider/gce/environ_policy_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package gce_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	"github.com/juju/utils/series"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/constraints"
    13  	"github.com/juju/juju/provider/gce"
    14  	"github.com/juju/juju/provider/gce/google"
    15  )
    16  
    17  type environPolSuite struct {
    18  	gce.BaseSuite
    19  }
    20  
    21  var _ = gc.Suite(&environPolSuite{})
    22  
    23  func (s *environPolSuite) TestPrecheckInstance(c *gc.C) {
    24  	cons := constraints.Value{}
    25  	placement := ""
    26  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    27  
    28  	c.Check(err, jc.ErrorIsNil)
    29  }
    30  
    31  func (s *environPolSuite) TestPrecheckInstanceAPI(c *gc.C) {
    32  	s.FakeConn.Zones = []google.AvailabilityZone{
    33  		google.NewZone("a-zone", google.StatusUp, "", ""),
    34  	}
    35  
    36  	cons := constraints.Value{}
    37  	placement := ""
    38  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    39  	c.Assert(err, jc.ErrorIsNil)
    40  
    41  	c.Check(s.FakeConn.Calls, gc.HasLen, 0)
    42  }
    43  
    44  func (s *environPolSuite) TestPrecheckInstanceFullAPI(c *gc.C) {
    45  	s.FakeConn.Zones = []google.AvailabilityZone{
    46  		google.NewZone("home-zone", google.StatusUp, "", ""),
    47  	}
    48  
    49  	cons := constraints.MustParse("instance-type=n1-standard-1 arch=amd64 root-disk=1G")
    50  	placement := "zone=home-zone"
    51  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    52  	c.Assert(err, jc.ErrorIsNil)
    53  
    54  	c.Check(s.FakeConn.Calls, gc.HasLen, 1)
    55  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "AvailabilityZones")
    56  	c.Check(s.FakeConn.Calls[0].Region, gc.Equals, "us-east1")
    57  }
    58  
    59  func (s *environPolSuite) TestPrecheckInstanceValidInstanceType(c *gc.C) {
    60  	cons := constraints.MustParse("instance-type=n1-standard-1")
    61  	placement := ""
    62  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    63  
    64  	c.Check(err, jc.ErrorIsNil)
    65  }
    66  
    67  func (s *environPolSuite) TestPrecheckInstanceInvalidInstanceType(c *gc.C) {
    68  	cons := constraints.MustParse("instance-type=n1-standard-1.invalid")
    69  	placement := ""
    70  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    71  
    72  	c.Check(err, gc.ErrorMatches, `.*invalid GCE instance type.*`)
    73  }
    74  
    75  func (s *environPolSuite) TestPrecheckInstanceDiskSize(c *gc.C) {
    76  	cons := constraints.MustParse("instance-type=n1-standard-1 root-disk=1G")
    77  	placement := ""
    78  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    79  
    80  	c.Check(err, jc.ErrorIsNil)
    81  }
    82  
    83  func (s *environPolSuite) TestPrecheckInstanceUnsupportedArch(c *gc.C) {
    84  	cons := constraints.MustParse("instance-type=n1-standard-1 arch=i386")
    85  	placement := ""
    86  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    87  
    88  	c.Check(err, jc.ErrorIsNil)
    89  }
    90  
    91  func (s *environPolSuite) TestPrecheckInstanceAvailZone(c *gc.C) {
    92  	s.FakeConn.Zones = []google.AvailabilityZone{
    93  		google.NewZone("a-zone", google.StatusUp, "", ""),
    94  	}
    95  
    96  	cons := constraints.Value{}
    97  	placement := "zone=a-zone"
    98  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
    99  
   100  	c.Check(err, jc.ErrorIsNil)
   101  }
   102  
   103  func (s *environPolSuite) TestPrecheckInstanceAvailZoneUnavailable(c *gc.C) {
   104  	s.FakeConn.Zones = []google.AvailabilityZone{
   105  		google.NewZone("a-zone", google.StatusDown, "", ""),
   106  	}
   107  
   108  	cons := constraints.Value{}
   109  	placement := "zone=a-zone"
   110  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
   111  
   112  	c.Check(err, gc.ErrorMatches, `.*availability zone "a-zone" is DOWN`)
   113  }
   114  
   115  func (s *environPolSuite) TestPrecheckInstanceAvailZoneUnknown(c *gc.C) {
   116  	s.FakeConn.Zones = []google.AvailabilityZone{
   117  		google.NewZone("home-zone", google.StatusUp, "", ""),
   118  	}
   119  
   120  	cons := constraints.Value{}
   121  	placement := "zone=a-zone"
   122  	err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement)
   123  
   124  	c.Check(err, jc.Satisfies, errors.IsNotFound)
   125  }
   126  
   127  func (s *environPolSuite) TestConstraintsValidator(c *gc.C) {
   128  	validator, err := s.Env.ConstraintsValidator()
   129  	c.Assert(err, jc.ErrorIsNil)
   130  
   131  	cons := constraints.MustParse("arch=amd64")
   132  	unsupported, err := validator.Validate(cons)
   133  	c.Assert(err, jc.ErrorIsNil)
   134  	c.Check(unsupported, gc.HasLen, 0)
   135  }
   136  
   137  func (s *environPolSuite) TestConstraintsValidatorEmpty(c *gc.C) {
   138  	validator, err := s.Env.ConstraintsValidator()
   139  	c.Assert(err, jc.ErrorIsNil)
   140  
   141  	unsupported, err := validator.Validate(constraints.Value{})
   142  	c.Assert(err, jc.ErrorIsNil)
   143  
   144  	c.Check(unsupported, gc.HasLen, 0)
   145  }
   146  
   147  func (s *environPolSuite) TestConstraintsValidatorUnsupported(c *gc.C) {
   148  	validator, err := s.Env.ConstraintsValidator()
   149  	c.Assert(err, jc.ErrorIsNil)
   150  
   151  	cons := constraints.MustParse("arch=amd64 tags=foo virt-type=kvm")
   152  	unsupported, err := validator.Validate(cons)
   153  	c.Assert(err, jc.ErrorIsNil)
   154  
   155  	c.Check(unsupported, jc.SameContents, []string{"tags", "virt-type"})
   156  }
   157  
   158  func (s *environPolSuite) TestConstraintsValidatorVocabInstType(c *gc.C) {
   159  	validator, err := s.Env.ConstraintsValidator()
   160  	c.Assert(err, jc.ErrorIsNil)
   161  
   162  	cons := constraints.MustParse("instance-type=foo")
   163  	_, err = validator.Validate(cons)
   164  
   165  	c.Check(err, gc.ErrorMatches, "invalid constraint value: instance-type=foo\nvalid values are:.*")
   166  }
   167  
   168  func (s *environPolSuite) TestConstraintsValidatorVocabContainer(c *gc.C) {
   169  	validator, err := s.Env.ConstraintsValidator()
   170  	c.Assert(err, jc.ErrorIsNil)
   171  
   172  	cons := constraints.MustParse("container=lxd")
   173  	_, err = validator.Validate(cons)
   174  
   175  	c.Check(err, gc.ErrorMatches, "invalid constraint value: container=lxd\nvalid values are:.*")
   176  }
   177  
   178  func (s *environPolSuite) TestConstraintsValidatorConflicts(c *gc.C) {
   179  	validator, err := s.Env.ConstraintsValidator()
   180  	c.Assert(err, jc.ErrorIsNil)
   181  
   182  	cons := constraints.MustParse("instance-type=n1-standard-1")
   183  	// We do not check arch or container since there is only one valid
   184  	// value for each and will always match.
   185  	consFallback := constraints.MustParse("cores=2 cpu-power=1000 mem=10000 tags=bar")
   186  	merged, err := validator.Merge(consFallback, cons)
   187  	c.Assert(err, jc.ErrorIsNil)
   188  
   189  	// tags is not supported, but we're not validating here...
   190  	expected := constraints.MustParse("instance-type=n1-standard-1 tags=bar")
   191  	c.Check(merged, jc.DeepEquals, expected)
   192  }
   193  
   194  func (s *environPolSuite) TestSupportNetworks(c *gc.C) {
   195  	isSupported := s.Env.SupportNetworks()
   196  
   197  	c.Check(isSupported, jc.IsFalse)
   198  }