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