github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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  	"github.com/juju/version"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/core/constraints"
    13  	"github.com/juju/juju/core/instance"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/environs/instances"
    16  	"github.com/juju/juju/environs/tags"
    17  	"github.com/juju/juju/provider/gce"
    18  	"github.com/juju/juju/provider/gce/google"
    19  )
    20  
    21  type environInstSuite struct {
    22  	gce.BaseSuite
    23  }
    24  
    25  var _ = gc.Suite(&environInstSuite{})
    26  
    27  func (s *environInstSuite) TestInstances(c *gc.C) {
    28  	spam := s.NewInstance(c, "spam")
    29  	ham := s.NewInstance(c, "ham")
    30  	eggs := s.NewInstance(c, "eggs")
    31  	s.FakeEnviron.Insts = []instances.Instance{spam, ham, eggs}
    32  
    33  	ids := []instance.Id{"spam", "eggs", "ham"}
    34  	insts, err := s.Env.Instances(s.CallCtx, ids)
    35  	c.Assert(err, jc.ErrorIsNil)
    36  
    37  	c.Check(insts, jc.DeepEquals, []instances.Instance{spam, eggs, ham})
    38  }
    39  
    40  func (s *environInstSuite) TestInstancesEmptyArg(c *gc.C) {
    41  	_, err := s.Env.Instances(s.CallCtx, nil)
    42  
    43  	c.Check(err, gc.Equals, environs.ErrNoInstances)
    44  }
    45  
    46  func (s *environInstSuite) TestInstancesInstancesFailed(c *gc.C) {
    47  	failure := errors.New("<unknown>")
    48  	s.FakeEnviron.Err = failure
    49  
    50  	ids := []instance.Id{"spam"}
    51  	insts, err := s.Env.Instances(s.CallCtx, ids)
    52  
    53  	c.Check(insts, jc.DeepEquals, []instances.Instance{nil})
    54  	c.Check(errors.Cause(err), gc.Equals, failure)
    55  }
    56  
    57  func (s *environInstSuite) TestInstancesPartialMatch(c *gc.C) {
    58  	s.FakeEnviron.Insts = []instances.Instance{s.Instance}
    59  
    60  	ids := []instance.Id{"spam", "eggs"}
    61  	insts, err := s.Env.Instances(s.CallCtx, ids)
    62  
    63  	c.Check(insts, jc.DeepEquals, []instances.Instance{s.Instance, nil})
    64  	c.Check(errors.Cause(err), gc.Equals, environs.ErrPartialInstances)
    65  }
    66  
    67  func (s *environInstSuite) TestInstancesNoMatch(c *gc.C) {
    68  	s.FakeEnviron.Insts = []instances.Instance{s.Instance}
    69  
    70  	ids := []instance.Id{"eggs"}
    71  	insts, err := s.Env.Instances(s.CallCtx, ids)
    72  
    73  	c.Check(insts, jc.DeepEquals, []instances.Instance{nil})
    74  	c.Check(errors.Cause(err), gc.Equals, environs.ErrNoInstances)
    75  }
    76  
    77  func (s *environInstSuite) TestBasicInstances(c *gc.C) {
    78  	spam := s.NewBaseInstance(c, "spam")
    79  	ham := s.NewBaseInstance(c, "ham")
    80  	eggs := s.NewBaseInstance(c, "eggs")
    81  	s.FakeConn.Insts = []google.Instance{*spam, *ham, *eggs}
    82  
    83  	insts, err := gce.GetInstances(s.Env, s.CallCtx)
    84  	c.Assert(err, jc.ErrorIsNil)
    85  
    86  	c.Check(insts, jc.DeepEquals, []instances.Instance{
    87  		s.NewInstance(c, "spam"),
    88  		s.NewInstance(c, "ham"),
    89  		s.NewInstance(c, "eggs"),
    90  	})
    91  }
    92  
    93  func (s *environInstSuite) TestBasicInstancesAPI(c *gc.C) {
    94  	s.FakeConn.Insts = []google.Instance{*s.BaseInstance}
    95  
    96  	_, err := gce.GetInstances(s.Env, s.CallCtx)
    97  	c.Assert(err, jc.ErrorIsNil)
    98  
    99  	c.Check(s.FakeConn.Calls, gc.HasLen, 1)
   100  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "Instances")
   101  	c.Check(s.FakeConn.Calls[0].Prefix, gc.Equals, s.Prefix())
   102  	c.Check(s.FakeConn.Calls[0].Statuses, jc.DeepEquals, []string{google.StatusPending, google.StatusStaging, google.StatusRunning})
   103  }
   104  
   105  func (s *environInstSuite) TestControllerInstances(c *gc.C) {
   106  	s.FakeConn.Insts = []google.Instance{*s.BaseInstance}
   107  
   108  	ids, err := s.Env.ControllerInstances(s.CallCtx, s.ControllerUUID)
   109  	c.Assert(err, jc.ErrorIsNil)
   110  
   111  	c.Check(ids, jc.DeepEquals, []instance.Id{"spam"})
   112  }
   113  
   114  func (s *environInstSuite) TestControllerInstancesAPI(c *gc.C) {
   115  	s.FakeConn.Insts = []google.Instance{*s.BaseInstance}
   116  
   117  	_, err := s.Env.ControllerInstances(s.CallCtx, s.ControllerUUID)
   118  	c.Assert(err, jc.ErrorIsNil)
   119  
   120  	c.Check(s.FakeConn.Calls, gc.HasLen, 1)
   121  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "Instances")
   122  	c.Check(s.FakeConn.Calls[0].Prefix, gc.Equals, s.Prefix())
   123  	c.Check(s.FakeConn.Calls[0].Statuses, jc.DeepEquals, []string{google.StatusPending, google.StatusStaging, google.StatusRunning})
   124  }
   125  
   126  func (s *environInstSuite) TestControllerInstancesNotBootstrapped(c *gc.C) {
   127  	_, err := s.Env.ControllerInstances(s.CallCtx, s.ControllerUUID)
   128  
   129  	c.Check(err, gc.Equals, environs.ErrNotBootstrapped)
   130  }
   131  
   132  func (s *environInstSuite) TestControllerInstancesMixed(c *gc.C) {
   133  	other := google.NewInstance(google.InstanceSummary{}, nil)
   134  	s.FakeConn.Insts = []google.Instance{*s.BaseInstance, *other}
   135  
   136  	ids, err := s.Env.ControllerInstances(s.CallCtx, s.ControllerUUID)
   137  	c.Assert(err, jc.ErrorIsNil)
   138  
   139  	c.Check(ids, jc.DeepEquals, []instance.Id{"spam"})
   140  }
   141  
   142  func (s *environInstSuite) TestParsePlacement(c *gc.C) {
   143  	zone := google.NewZone("a-zone", google.StatusUp, "", "")
   144  	s.FakeConn.Zones = []google.AvailabilityZone{zone}
   145  
   146  	placement, err := gce.ParsePlacement(s.Env, s.CallCtx, "zone=a-zone")
   147  	c.Assert(err, jc.ErrorIsNil)
   148  
   149  	c.Check(placement.Zone, jc.DeepEquals, &zone)
   150  }
   151  
   152  func (s *environInstSuite) TestParsePlacementZoneFailure(c *gc.C) {
   153  	failure := errors.New("<unknown>")
   154  	s.FakeConn.Err = failure
   155  
   156  	_, err := gce.ParsePlacement(s.Env, s.CallCtx, "zone=a-zone")
   157  
   158  	c.Check(errors.Cause(err), gc.Equals, failure)
   159  }
   160  
   161  func (s *environInstSuite) TestParsePlacementMissingDirective(c *gc.C) {
   162  	_, err := gce.ParsePlacement(s.Env, s.CallCtx, "a-zone")
   163  
   164  	c.Check(err, gc.ErrorMatches, `.*unknown placement directive: .*`)
   165  }
   166  
   167  func (s *environInstSuite) TestParsePlacementUnknownDirective(c *gc.C) {
   168  	_, err := gce.ParsePlacement(s.Env, s.CallCtx, "inst=spam")
   169  
   170  	c.Check(err, gc.ErrorMatches, `.*unknown placement directive: .*`)
   171  }
   172  
   173  func (s *environInstSuite) TestCheckInstanceType(c *gc.C) {
   174  	typ := "n1-standard-1"
   175  	cons := constraints.Value{
   176  		InstanceType: &typ,
   177  	}
   178  	matched := gce.CheckInstanceType(cons)
   179  
   180  	c.Check(matched, jc.IsTrue)
   181  }
   182  
   183  func (s *environInstSuite) TestCheckInstanceTypeUnknown(c *gc.C) {
   184  	typ := "n1-standard-1.unknown"
   185  	cons := constraints.Value{
   186  		InstanceType: &typ,
   187  	}
   188  	matched := gce.CheckInstanceType(cons)
   189  
   190  	c.Check(matched, jc.IsFalse)
   191  }
   192  
   193  func (s *environInstSuite) TestPrecheckInstanceInvalidCredentialError(c *gc.C) {
   194  	zone := google.NewZone("a-zone", google.StatusUp, "", "")
   195  	s.FakeConn.Zones = []google.AvailabilityZone{zone}
   196  	mem := uint64(1025)
   197  	s.FakeConn.Err = gce.InvalidCredentialError
   198  
   199  	c.Assert(s.InvalidatedCredentials, jc.IsFalse)
   200  	_, err := s.Env.InstanceTypes(s.CallCtx, constraints.Value{Mem: &mem})
   201  	c.Check(err, gc.NotNil)
   202  	c.Assert(s.InvalidatedCredentials, jc.IsTrue)
   203  }
   204  
   205  func (s *environInstSuite) TestListMachineTypes(c *gc.C) {
   206  	_, err := s.Env.InstanceTypes(s.CallCtx, constraints.Value{})
   207  	c.Assert(err, gc.ErrorMatches, "no instance types in  matching constraints \"\"")
   208  
   209  	zone := google.NewZone("a-zone", google.StatusUp, "", "")
   210  	s.FakeConn.Zones = []google.AvailabilityZone{zone}
   211  
   212  	mem := uint64(1025)
   213  	types, err := s.Env.InstanceTypes(s.CallCtx, constraints.Value{Mem: &mem})
   214  	c.Assert(err, jc.ErrorIsNil)
   215  	c.Assert(types.InstanceTypes, gc.HasLen, 1)
   216  
   217  }
   218  
   219  func (s *environInstSuite) TestAdoptResources(c *gc.C) {
   220  	john := s.NewInstance(c, "john")
   221  	misty := s.NewInstance(c, "misty")
   222  	s.FakeEnviron.Insts = []instances.Instance{john, misty}
   223  
   224  	err := s.Env.AdoptResources(s.CallCtx, "other-uuid", version.MustParse("1.2.3"))
   225  	c.Assert(err, jc.ErrorIsNil)
   226  	c.Assert(s.FakeConn.Calls, gc.HasLen, 1)
   227  	call := s.FakeConn.Calls[0]
   228  	c.Check(call.FuncName, gc.Equals, "UpdateMetadata")
   229  	c.Check(call.IDs, gc.DeepEquals, []string{"john", "misty"})
   230  	c.Check(call.Key, gc.Equals, tags.JujuController)
   231  	c.Check(call.Value, gc.Equals, "other-uuid")
   232  }
   233  
   234  func (s *environInstSuite) TestAdoptResourcesInvalidCredentialError(c *gc.C) {
   235  	s.FakeConn.Err = gce.InvalidCredentialError
   236  	c.Assert(s.InvalidatedCredentials, jc.IsFalse)
   237  	john := s.NewInstance(c, "john")
   238  	misty := s.NewInstance(c, "misty")
   239  	s.FakeEnviron.Insts = []instances.Instance{john, misty}
   240  
   241  	err := s.Env.AdoptResources(s.CallCtx, "other-uuid", version.MustParse("1.2.3"))
   242  	c.Check(err, gc.NotNil)
   243  	c.Assert(s.InvalidatedCredentials, jc.IsTrue)
   244  }