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