github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/gce/environ_broker_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  	"errors"
     8  
     9  	jujuos "github.com/juju/os"
    10  	"github.com/juju/os/series"
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/utils/arch"
    13  	"github.com/juju/version"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/core/instance"
    17  	"github.com/juju/juju/environs"
    18  	"github.com/juju/juju/environs/imagemetadata"
    19  	"github.com/juju/juju/environs/instances"
    20  	"github.com/juju/juju/environs/simplestreams"
    21  	"github.com/juju/juju/provider/common"
    22  	"github.com/juju/juju/provider/gce"
    23  	"github.com/juju/juju/storage"
    24  )
    25  
    26  type environBrokerSuite struct {
    27  	gce.BaseSuite
    28  
    29  	hardware      *instance.HardwareCharacteristics
    30  	spec          *instances.InstanceSpec
    31  	ic            *instances.InstanceConstraint
    32  	imageMetadata []*imagemetadata.ImageMetadata
    33  	resolveInfo   *simplestreams.ResolveInfo
    34  }
    35  
    36  var _ = gc.Suite(&environBrokerSuite{})
    37  
    38  func (s *environBrokerSuite) SetUpTest(c *gc.C) {
    39  	s.BaseSuite.SetUpTest(c)
    40  
    41  	mem := uint64(3750)
    42  	amd64 := arch.AMD64
    43  	cpuCores := uint64(1)
    44  	rootDiskMB := uint64(5)
    45  	zoneName := "home-zone"
    46  
    47  	s.hardware = &instance.HardwareCharacteristics{
    48  		Arch:             &amd64,
    49  		Mem:              &mem,
    50  		CpuCores:         &cpuCores,
    51  		CpuPower:         instances.CpuPower(275),
    52  		RootDisk:         &rootDiskMB,
    53  		AvailabilityZone: &zoneName,
    54  	}
    55  	s.spec = &instances.InstanceSpec{
    56  		InstanceType: s.InstanceType,
    57  		Image: instances.Image{
    58  			Id:       "ubuntu-1404-trusty-v20141212",
    59  			Arch:     amd64,
    60  			VirtType: "kvm",
    61  		},
    62  	}
    63  	s.ic = &instances.InstanceConstraint{
    64  		Region:      "home",
    65  		Series:      "trusty",
    66  		Arches:      []string{amd64},
    67  		Constraints: s.StartInstArgs.Constraints,
    68  	}
    69  	s.imageMetadata = []*imagemetadata.ImageMetadata{{
    70  		Id:         "ubuntu-1404-trusty-v20141212",
    71  		Arch:       "amd64",
    72  		Version:    "14.04",
    73  		RegionName: "us-central1",
    74  		Endpoint:   "https://www.googleapis.com",
    75  		Stream:     "<stream>",
    76  		VirtType:   "kvm",
    77  	}}
    78  	s.resolveInfo = &simplestreams.ResolveInfo{
    79  		Source:    "",
    80  		Signed:    true,
    81  		IndexURL:  "",
    82  		MirrorURL: "",
    83  	}
    84  }
    85  
    86  func (s *environBrokerSuite) TestStartInstance(c *gc.C) {
    87  	s.FakeEnviron.Spec = s.spec
    88  	s.FakeEnviron.Inst = s.BaseInstance
    89  	s.FakeEnviron.Hwc = s.hardware
    90  
    91  	result, err := s.Env.StartInstance(s.CallCtx, s.StartInstArgs)
    92  
    93  	c.Assert(err, jc.ErrorIsNil)
    94  	c.Check(result.Instance, jc.DeepEquals, s.Instance)
    95  	c.Check(result.Hardware, jc.DeepEquals, s.hardware)
    96  }
    97  
    98  func (s *environBrokerSuite) TestStartInstanceAvailabilityZoneIndependentError(c *gc.C) {
    99  	s.FakeEnviron.Err = errors.New("blargh")
   100  
   101  	_, err := s.Env.StartInstance(s.CallCtx, s.StartInstArgs)
   102  	c.Assert(err, gc.ErrorMatches, "blargh")
   103  	c.Assert(err, jc.Satisfies, environs.IsAvailabilityZoneIndependent)
   104  }
   105  
   106  func (s *environBrokerSuite) TestStartInstanceVolumeAvailabilityZone(c *gc.C) {
   107  	s.FakeEnviron.Spec = s.spec
   108  	s.FakeEnviron.Inst = s.BaseInstance
   109  	s.FakeEnviron.Hwc = s.hardware
   110  
   111  	s.StartInstArgs.VolumeAttachments = []storage.VolumeAttachmentParams{{
   112  		VolumeId: "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4",
   113  	}}
   114  	derivedZones, err := s.Env.DeriveAvailabilityZones(s.CallCtx, s.StartInstArgs)
   115  	c.Assert(err, jc.ErrorIsNil)
   116  	c.Assert(derivedZones, gc.HasLen, 1)
   117  	s.StartInstArgs.AvailabilityZone = derivedZones[0]
   118  
   119  	result, err := s.Env.StartInstance(s.CallCtx, s.StartInstArgs)
   120  
   121  	c.Assert(err, jc.ErrorIsNil)
   122  	c.Assert(*result.Hardware.AvailabilityZone, gc.Equals, derivedZones[0])
   123  }
   124  
   125  func (s *environBrokerSuite) TestFinishInstanceConfig(c *gc.C) {
   126  	err := gce.FinishInstanceConfig(s.Env, s.StartInstArgs, s.spec)
   127  
   128  	c.Assert(err, jc.ErrorIsNil)
   129  	c.Check(s.StartInstArgs.InstanceConfig.AgentVersion(), gc.Not(gc.Equals), version.Binary{})
   130  }
   131  
   132  func (s *environBrokerSuite) TestBuildInstanceSpec(c *gc.C) {
   133  	s.FakeEnviron.Spec = s.spec
   134  
   135  	spec, err := gce.BuildInstanceSpec(s.Env, s.StartInstArgs)
   136  
   137  	c.Assert(err, jc.ErrorIsNil)
   138  	c.Check(spec.InstanceType, jc.DeepEquals, s.InstanceType)
   139  }
   140  
   141  func (s *environBrokerSuite) TestFindInstanceSpec(c *gc.C) {
   142  	spec, err := gce.FindInstanceSpec(s.Env, s.ic, s.imageMetadata)
   143  
   144  	c.Assert(err, jc.ErrorIsNil)
   145  	c.Check(spec, jc.DeepEquals, s.spec)
   146  }
   147  
   148  func (s *environBrokerSuite) TestNewRawInstance(c *gc.C) {
   149  	s.FakeConn.Inst = s.BaseInstance
   150  	s.FakeCommon.AZInstances = []common.AvailabilityZoneInstances{{
   151  		ZoneName:  "home-zone",
   152  		Instances: []instance.Id{s.Instance.Id()},
   153  	}}
   154  
   155  	inst, err := gce.NewRawInstance(s.Env, s.CallCtx, s.StartInstArgs, s.spec)
   156  
   157  	c.Assert(err, jc.ErrorIsNil)
   158  	c.Check(inst, jc.DeepEquals, s.BaseInstance)
   159  }
   160  
   161  func (s *environBrokerSuite) TestNewRawInstanceZoneInvalidCredentialError(c *gc.C) {
   162  	s.FakeConn.Err = gce.InvalidCredentialError
   163  	c.Assert(s.InvalidatedCredentials, jc.IsFalse)
   164  	_, err := gce.NewRawInstance(s.Env, s.CallCtx, s.StartInstArgs, s.spec)
   165  	c.Check(err, gc.NotNil)
   166  	c.Assert(s.InvalidatedCredentials, jc.IsTrue)
   167  	c.Assert(err, gc.Not(jc.Satisfies), environs.IsAvailabilityZoneIndependent)
   168  }
   169  
   170  func (s *environBrokerSuite) TestNewRawInstanceZoneSpecificError(c *gc.C) {
   171  	s.FakeConn.Err = errors.New("blargh")
   172  
   173  	_, err := gce.NewRawInstance(s.Env, s.CallCtx, s.StartInstArgs, s.spec)
   174  	c.Assert(err, gc.ErrorMatches, "blargh")
   175  	c.Assert(err, gc.Not(jc.Satisfies), environs.IsAvailabilityZoneIndependent)
   176  }
   177  
   178  func (s *environBrokerSuite) TestGetMetadataUbuntu(c *gc.C) {
   179  	metadata, err := gce.GetMetadata(s.StartInstArgs, jujuos.Ubuntu)
   180  
   181  	c.Assert(err, jc.ErrorIsNil)
   182  	c.Check(metadata, jc.DeepEquals, s.UbuntuMetadata)
   183  
   184  }
   185  
   186  func (s *environBrokerSuite) TestGetMetadataWindows(c *gc.C) {
   187  	metadata, err := gce.GetMetadata(s.StartInstArgs, jujuos.Windows)
   188  
   189  	c.Assert(err, jc.ErrorIsNil)
   190  	c.Check(metadata["windows-startup-script-ps1"], gc.Equals, s.WindowsMetadata["windows-startup-script-ps1"])
   191  	c.Check(metadata["sysprep-specialize-script-ps1"], gc.Matches, s.WindowsMetadata["sysprep-specialize-script-ps1"])
   192  }
   193  
   194  func (s *environBrokerSuite) TestGetMetadataOSNotSupported(c *gc.C) {
   195  	metadata, err := gce.GetMetadata(s.StartInstArgs, jujuos.GenericLinux)
   196  
   197  	c.Assert(metadata, gc.IsNil)
   198  	c.Assert(err, gc.ErrorMatches, "cannot pack metadata for os GenericLinux on the gce provider")
   199  }
   200  
   201  var getDisksTests = []struct {
   202  	Series   string
   203  	basePath string
   204  	error    error
   205  }{
   206  	{"trusty", gce.UbuntuImageBasePath, nil},
   207  	{"win2012r2", gce.WindowsImageBasePath, nil},
   208  	{"arch", "", errors.New("os Arch is not supported on the gce provider")},
   209  }
   210  
   211  func (s *environBrokerSuite) TestGetDisks(c *gc.C) {
   212  	for _, test := range getDisksTests {
   213  		diskSpecs, err := gce.GetDisks(s.spec, s.StartInstArgs.Constraints, test.Series, "32f7d570-5bac-4b72-b169-250c24a94b2b", false)
   214  		if test.error != nil {
   215  			c.Assert(err, gc.Equals, err)
   216  		} else {
   217  			c.Assert(err, jc.ErrorIsNil)
   218  			c.Assert(diskSpecs, gc.HasLen, 1)
   219  
   220  			diskSpec := diskSpecs[0]
   221  
   222  			os, err := series.GetOSFromSeries(test.Series)
   223  			c.Assert(err, jc.ErrorIsNil)
   224  			switch os {
   225  			case jujuos.Ubuntu:
   226  				c.Check(diskSpec.SizeHintGB, gc.Equals, uint64(8))
   227  			case jujuos.Windows:
   228  				c.Check(diskSpec.SizeHintGB, gc.Equals, uint64(40))
   229  			default:
   230  				c.Check(diskSpec.SizeHintGB, gc.Equals, uint64(8))
   231  			}
   232  			c.Check(diskSpec.ImageURL, gc.Equals, test.basePath+s.spec.Image.Id)
   233  		}
   234  	}
   235  
   236  	diskSpecs, err := gce.GetDisks(s.spec, s.StartInstArgs.Constraints, "trusty", "32f7d570-5bac-4b72-b169-250c24a94b2b", true)
   237  	c.Assert(err, jc.ErrorIsNil)
   238  	c.Assert(diskSpecs, gc.HasLen, 1)
   239  	spec := diskSpecs[0]
   240  	c.Assert(spec.ImageURL, gc.Equals, gce.UbuntuDailyImageBasePath+s.spec.Image.Id)
   241  }
   242  
   243  func (s *environBrokerSuite) TestGetHardwareCharacteristics(c *gc.C) {
   244  	hwc := gce.GetHardwareCharacteristics(s.Env, s.spec, s.Instance)
   245  
   246  	c.Assert(hwc, gc.NotNil)
   247  	c.Check(*hwc.Arch, gc.Equals, "amd64")
   248  	c.Check(*hwc.AvailabilityZone, gc.Equals, "home-zone")
   249  	c.Check(*hwc.CpuCores, gc.Equals, uint64(1))
   250  	c.Check(*hwc.CpuPower, gc.Equals, uint64(275))
   251  	c.Check(*hwc.Mem, gc.Equals, uint64(3750))
   252  	c.Check(*hwc.RootDisk, gc.Equals, uint64(15360))
   253  }
   254  
   255  func (s *environBrokerSuite) TestAllInstances(c *gc.C) {
   256  	s.FakeEnviron.Insts = []instances.Instance{s.Instance}
   257  
   258  	insts, err := s.Env.AllInstances(s.CallCtx)
   259  	c.Assert(err, jc.ErrorIsNil)
   260  	c.Check(insts, jc.DeepEquals, []instances.Instance{s.Instance})
   261  }
   262  
   263  func (s *environBrokerSuite) TestStopInstances(c *gc.C) {
   264  	err := s.Env.StopInstances(s.CallCtx, s.Instance.Id())
   265  	c.Assert(err, jc.ErrorIsNil)
   266  
   267  	called, calls := s.FakeConn.WasCalled("RemoveInstances")
   268  	c.Check(called, gc.Equals, true)
   269  	c.Check(calls, gc.HasLen, 1)
   270  	c.Check(calls[0].Prefix, gc.Equals, s.Prefix())
   271  	c.Check(calls[0].IDs, jc.DeepEquals, []string{"spam"})
   272  }
   273  
   274  func (s *environBrokerSuite) TestStopInstancesInvalidCredentialError(c *gc.C) {
   275  	s.FakeConn.Err = gce.InvalidCredentialError
   276  	c.Assert(s.InvalidatedCredentials, jc.IsFalse)
   277  	err := s.Env.StopInstances(s.CallCtx, s.Instance.Id())
   278  	c.Check(err, gc.NotNil)
   279  	c.Assert(s.InvalidatedCredentials, jc.IsTrue)
   280  }