github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/provider/gce/environ_instance_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  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/constraints"
    12  	"github.com/juju/juju/environs"
    13  	"github.com/juju/juju/instance"
    14  	"github.com/juju/juju/provider/gce"
    15  	"github.com/juju/juju/provider/gce/google"
    16  )
    17  
    18  type environInstSuite struct {
    19  	gce.BaseSuite
    20  }
    21  
    22  var _ = gc.Suite(&environInstSuite{})
    23  
    24  func (s *environInstSuite) TestInstances(c *gc.C) {
    25  	spam := s.NewInstance(c, "spam")
    26  	ham := s.NewInstance(c, "ham")
    27  	eggs := s.NewInstance(c, "eggs")
    28  	s.FakeEnviron.Insts = []instance.Instance{spam, ham, eggs}
    29  
    30  	ids := []instance.Id{"spam", "eggs", "ham"}
    31  	insts, err := s.Env.Instances(ids)
    32  	c.Assert(err, jc.ErrorIsNil)
    33  
    34  	c.Check(insts, jc.DeepEquals, []instance.Instance{spam, eggs, ham})
    35  }
    36  
    37  func (s *environInstSuite) TestInstancesEmptyArg(c *gc.C) {
    38  	_, err := s.Env.Instances(nil)
    39  
    40  	c.Check(err, gc.Equals, environs.ErrNoInstances)
    41  }
    42  
    43  func (s *environInstSuite) TestInstancesInstancesFailed(c *gc.C) {
    44  	failure := errors.New("<unknown>")
    45  	s.FakeEnviron.Err = failure
    46  
    47  	ids := []instance.Id{"spam"}
    48  	insts, err := s.Env.Instances(ids)
    49  
    50  	c.Check(insts, jc.DeepEquals, []instance.Instance{nil})
    51  	c.Check(errors.Cause(err), gc.Equals, failure)
    52  }
    53  
    54  func (s *environInstSuite) TestInstancesPartialMatch(c *gc.C) {
    55  	s.FakeEnviron.Insts = []instance.Instance{s.Instance}
    56  
    57  	ids := []instance.Id{"spam", "eggs"}
    58  	insts, err := s.Env.Instances(ids)
    59  
    60  	c.Check(insts, jc.DeepEquals, []instance.Instance{s.Instance, nil})
    61  	c.Check(errors.Cause(err), gc.Equals, environs.ErrPartialInstances)
    62  }
    63  
    64  func (s *environInstSuite) TestInstancesNoMatch(c *gc.C) {
    65  	s.FakeEnviron.Insts = []instance.Instance{s.Instance}
    66  
    67  	ids := []instance.Id{"eggs"}
    68  	insts, err := s.Env.Instances(ids)
    69  
    70  	c.Check(insts, jc.DeepEquals, []instance.Instance{nil})
    71  	c.Check(errors.Cause(err), gc.Equals, environs.ErrNoInstances)
    72  }
    73  
    74  func (s *environInstSuite) TestBasicInstances(c *gc.C) {
    75  	spam := s.NewBaseInstance(c, "spam")
    76  	ham := s.NewBaseInstance(c, "ham")
    77  	eggs := s.NewBaseInstance(c, "eggs")
    78  	s.FakeConn.Insts = []google.Instance{*spam, *ham, *eggs}
    79  
    80  	insts, err := gce.GetInstances(s.Env)
    81  	c.Assert(err, jc.ErrorIsNil)
    82  
    83  	c.Check(insts, jc.DeepEquals, []instance.Instance{
    84  		s.NewInstance(c, "spam"),
    85  		s.NewInstance(c, "ham"),
    86  		s.NewInstance(c, "eggs"),
    87  	})
    88  }
    89  
    90  func (s *environInstSuite) TestBasicInstancesAPI(c *gc.C) {
    91  	s.FakeConn.Insts = []google.Instance{*s.BaseInstance}
    92  
    93  	_, err := gce.GetInstances(s.Env)
    94  	c.Assert(err, jc.ErrorIsNil)
    95  
    96  	c.Check(s.FakeConn.Calls, gc.HasLen, 1)
    97  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "Instances")
    98  	c.Check(s.FakeConn.Calls[0].Prefix, gc.Equals, s.Prefix())
    99  	c.Check(s.FakeConn.Calls[0].Statuses, jc.DeepEquals, []string{google.StatusPending, google.StatusStaging, google.StatusRunning})
   100  }
   101  
   102  func (s *environInstSuite) TestControllerInstances(c *gc.C) {
   103  	s.FakeConn.Insts = []google.Instance{*s.BaseInstance}
   104  
   105  	ids, err := s.Env.ControllerInstances(s.ControllerUUID)
   106  	c.Assert(err, jc.ErrorIsNil)
   107  
   108  	c.Check(ids, jc.DeepEquals, []instance.Id{"spam"})
   109  }
   110  
   111  func (s *environInstSuite) TestControllerInstancesAPI(c *gc.C) {
   112  	s.FakeConn.Insts = []google.Instance{*s.BaseInstance}
   113  
   114  	_, err := s.Env.ControllerInstances(s.ControllerUUID)
   115  	c.Assert(err, jc.ErrorIsNil)
   116  
   117  	c.Check(s.FakeConn.Calls, gc.HasLen, 1)
   118  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "Instances")
   119  	c.Check(s.FakeConn.Calls[0].Prefix, gc.Equals, s.Prefix())
   120  	c.Check(s.FakeConn.Calls[0].Statuses, jc.DeepEquals, []string{google.StatusPending, google.StatusStaging, google.StatusRunning})
   121  }
   122  
   123  func (s *environInstSuite) TestControllerInstancesNotBootstrapped(c *gc.C) {
   124  	_, err := s.Env.ControllerInstances(s.ControllerUUID)
   125  
   126  	c.Check(err, gc.Equals, environs.ErrNotBootstrapped)
   127  }
   128  
   129  func (s *environInstSuite) TestControllerInstancesMixed(c *gc.C) {
   130  	other := google.NewInstance(google.InstanceSummary{}, nil)
   131  	s.FakeConn.Insts = []google.Instance{*s.BaseInstance, *other}
   132  
   133  	ids, err := s.Env.ControllerInstances(s.ControllerUUID)
   134  	c.Assert(err, jc.ErrorIsNil)
   135  
   136  	c.Check(ids, jc.DeepEquals, []instance.Id{"spam"})
   137  }
   138  
   139  func (s *environInstSuite) TestParsePlacement(c *gc.C) {
   140  	zone := google.NewZone("a-zone", google.StatusUp, "", "")
   141  	s.FakeConn.Zones = []google.AvailabilityZone{zone}
   142  
   143  	placement, err := gce.ParsePlacement(s.Env, "zone=a-zone")
   144  	c.Assert(err, jc.ErrorIsNil)
   145  
   146  	c.Check(placement.Zone, jc.DeepEquals, &zone)
   147  }
   148  
   149  func (s *environInstSuite) TestParsePlacementZoneFailure(c *gc.C) {
   150  	failure := errors.New("<unknown>")
   151  	s.FakeConn.Err = failure
   152  
   153  	_, err := gce.ParsePlacement(s.Env, "zone=a-zone")
   154  
   155  	c.Check(errors.Cause(err), gc.Equals, failure)
   156  }
   157  
   158  func (s *environInstSuite) TestParsePlacementMissingDirective(c *gc.C) {
   159  	_, err := gce.ParsePlacement(s.Env, "a-zone")
   160  
   161  	c.Check(err, gc.ErrorMatches, `.*unknown placement directive: .*`)
   162  }
   163  
   164  func (s *environInstSuite) TestParsePlacementUnknownDirective(c *gc.C) {
   165  	_, err := gce.ParsePlacement(s.Env, "inst=spam")
   166  
   167  	c.Check(err, gc.ErrorMatches, `.*unknown placement directive: .*`)
   168  }
   169  
   170  func (s *environInstSuite) TestCheckInstanceType(c *gc.C) {
   171  	typ := "n1-standard-1"
   172  	cons := constraints.Value{
   173  		InstanceType: &typ,
   174  	}
   175  	matched := gce.CheckInstanceType(cons)
   176  
   177  	c.Check(matched, jc.IsTrue)
   178  }
   179  
   180  func (s *environInstSuite) TestCheckInstanceTypeUnknown(c *gc.C) {
   181  	typ := "n1-standard-1.unknown"
   182  	cons := constraints.Value{
   183  		InstanceType: &typ,
   184  	}
   185  	matched := gce.CheckInstanceType(cons)
   186  
   187  	c.Check(matched, jc.IsFalse)
   188  }