github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/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  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/juju/apiserver/params"
    11  	"github.com/juju/juju/environs/imagemetadata"
    12  	"github.com/juju/juju/environs/instances"
    13  	"github.com/juju/juju/environs/simplestreams"
    14  	"github.com/juju/juju/instance"
    15  	"github.com/juju/juju/juju/arch"
    16  	"github.com/juju/juju/network"
    17  	"github.com/juju/juju/provider/common"
    18  	"github.com/juju/juju/provider/gce"
    19  	"github.com/juju/juju/testing"
    20  )
    21  
    22  type environBrokerSuite struct {
    23  	gce.BaseSuite
    24  
    25  	hardware      *instance.HardwareCharacteristics
    26  	spec          *instances.InstanceSpec
    27  	ic            *instances.InstanceConstraint
    28  	imageMetadata []*imagemetadata.ImageMetadata
    29  	resolveInfo   *simplestreams.ResolveInfo
    30  }
    31  
    32  var _ = gc.Suite(&environBrokerSuite{})
    33  
    34  func (s *environBrokerSuite) SetUpTest(c *gc.C) {
    35  	s.BaseSuite.SetUpTest(c)
    36  
    37  	mem := uint64(3750)
    38  	amd64 := arch.AMD64
    39  	cpuCores := uint64(1)
    40  	rootDiskMB := uint64(5)
    41  	zoneName := "home-zone"
    42  
    43  	s.hardware = &instance.HardwareCharacteristics{
    44  		Arch:             &amd64,
    45  		Mem:              &mem,
    46  		CpuCores:         &cpuCores,
    47  		CpuPower:         instances.CpuPower(275),
    48  		RootDisk:         &rootDiskMB,
    49  		AvailabilityZone: &zoneName,
    50  	}
    51  	s.spec = &instances.InstanceSpec{
    52  		InstanceType: s.InstanceType,
    53  		Image: instances.Image{
    54  			Id:       "ubuntu-1404-trusty-v20141212",
    55  			Arch:     amd64,
    56  			VirtType: "kvm",
    57  		},
    58  	}
    59  	s.ic = &instances.InstanceConstraint{
    60  		Region:      "home",
    61  		Series:      "trusty",
    62  		Arches:      []string{amd64},
    63  		Constraints: s.StartInstArgs.Constraints,
    64  	}
    65  	s.imageMetadata = []*imagemetadata.ImageMetadata{{
    66  		Id:         "ubuntu-1404-trusty-v20141212",
    67  		Arch:       "amd64",
    68  		Version:    "14.04",
    69  		RegionName: "us-central1",
    70  		Endpoint:   "https://www.googleapis.com",
    71  		Stream:     "<stream>",
    72  		VirtType:   "kvm",
    73  	}}
    74  	s.resolveInfo = &simplestreams.ResolveInfo{
    75  		Source:    "",
    76  		Signed:    true,
    77  		IndexURL:  "",
    78  		MirrorURL: "",
    79  	}
    80  }
    81  
    82  func (s *environBrokerSuite) TestStartInstance(c *gc.C) {
    83  	s.FakeEnviron.Spec = s.spec
    84  	s.FakeEnviron.Inst = s.BaseInstance
    85  	s.FakeEnviron.Hwc = s.hardware
    86  
    87  	result, err := s.Env.StartInstance(s.StartInstArgs)
    88  
    89  	c.Assert(err, jc.ErrorIsNil)
    90  	c.Check(result.Instance, gc.DeepEquals, s.Instance)
    91  	c.Check(result.Hardware, gc.DeepEquals, s.hardware)
    92  }
    93  
    94  func (s *environBrokerSuite) TestStartInstanceOpensAPIPort(c *gc.C) {
    95  	s.FakeEnviron.Spec = s.spec
    96  	s.FakeEnviron.Inst = s.BaseInstance
    97  	s.FakeEnviron.Hwc = s.hardware
    98  
    99  	// Get the API port from the fake environment config used to
   100  	// "bootstrap".
   101  	envConfig := testing.FakeConfig()
   102  	apiPort, ok := envConfig["api-port"].(int)
   103  	c.Assert(ok, jc.IsTrue)
   104  	c.Assert(apiPort, gc.Not(gc.Equals), 0)
   105  
   106  	// When StateServingInfo is not nil, verify OpenPorts was called
   107  	// for the API port.
   108  	s.StartInstArgs.InstanceConfig.StateServingInfo = &params.StateServingInfo{
   109  		APIPort: apiPort,
   110  	}
   111  
   112  	result, err := s.Env.StartInstance(s.StartInstArgs)
   113  
   114  	c.Assert(err, jc.ErrorIsNil)
   115  	c.Check(result.Instance, gc.DeepEquals, s.Instance)
   116  	c.Check(result.Hardware, gc.DeepEquals, s.hardware)
   117  
   118  	called, calls := s.FakeConn.WasCalled("OpenPorts")
   119  	c.Check(called, gc.Equals, true)
   120  	c.Check(calls, gc.HasLen, 1)
   121  	c.Check(calls[0].FirewallName, gc.Equals, gce.GlobalFirewallName(s.Env))
   122  	expectPorts := []network.PortRange{{
   123  		FromPort: apiPort,
   124  		ToPort:   apiPort,
   125  		Protocol: "tcp",
   126  	}}
   127  	c.Check(calls[0].PortRanges, jc.DeepEquals, expectPorts)
   128  }
   129  
   130  func (s *environBrokerSuite) TestFinishInstanceConfig(c *gc.C) {
   131  	err := gce.FinishInstanceConfig(s.Env, s.StartInstArgs, s.spec)
   132  
   133  	c.Assert(err, jc.ErrorIsNil)
   134  	c.Check(s.StartInstArgs.InstanceConfig.Tools, gc.NotNil)
   135  }
   136  
   137  func (s *environBrokerSuite) TestBuildInstanceSpec(c *gc.C) {
   138  	s.FakeEnviron.Spec = s.spec
   139  
   140  	spec, err := gce.BuildInstanceSpec(s.Env, s.StartInstArgs)
   141  
   142  	c.Assert(err, jc.ErrorIsNil)
   143  	c.Check(spec.InstanceType, gc.DeepEquals, s.InstanceType)
   144  }
   145  
   146  func (s *environBrokerSuite) TestFindInstanceSpec(c *gc.C) {
   147  	s.FakeImages.Metadata = s.imageMetadata
   148  	s.FakeImages.ResolveInfo = s.resolveInfo
   149  
   150  	spec, err := gce.FindInstanceSpec(s.Env, s.Env.Config().ImageStream(), s.ic)
   151  
   152  	c.Assert(err, jc.ErrorIsNil)
   153  	c.Check(spec, gc.DeepEquals, s.spec)
   154  }
   155  
   156  func (s *environBrokerSuite) TestNewRawInstance(c *gc.C) {
   157  	s.FakeConn.Inst = s.BaseInstance
   158  	s.FakeCommon.AZInstances = []common.AvailabilityZoneInstances{{
   159  		ZoneName:  "home-zone",
   160  		Instances: []instance.Id{s.Instance.Id()},
   161  	}}
   162  
   163  	inst, err := gce.NewRawInstance(s.Env, s.StartInstArgs, s.spec)
   164  
   165  	c.Assert(err, jc.ErrorIsNil)
   166  	c.Check(inst, gc.DeepEquals, s.BaseInstance)
   167  }
   168  
   169  func (s *environBrokerSuite) TestGetMetadata(c *gc.C) {
   170  	metadata, err := gce.GetMetadata(s.StartInstArgs)
   171  
   172  	c.Assert(err, jc.ErrorIsNil)
   173  	c.Check(metadata, gc.DeepEquals, s.Metadata)
   174  }
   175  
   176  func (s *environBrokerSuite) TestGetDisks(c *gc.C) {
   177  	diskSpecs := gce.GetDisks(s.spec, s.StartInstArgs.Constraints)
   178  
   179  	c.Assert(diskSpecs, gc.HasLen, 1)
   180  
   181  	diskSpec := diskSpecs[0]
   182  
   183  	c.Check(diskSpec.SizeHintGB, gc.Equals, uint64(8))
   184  	c.Check(diskSpec.ImageURL, gc.Equals, "projects/ubuntu-os-cloud/global/images/ubuntu-1404-trusty-v20141212")
   185  }
   186  
   187  func (s *environBrokerSuite) TestGetHardwareCharacteristics(c *gc.C) {
   188  	hwc := gce.GetHardwareCharacteristics(s.Env, s.spec, s.Instance)
   189  
   190  	c.Assert(hwc, gc.NotNil)
   191  	c.Check(*hwc.Arch, gc.Equals, "amd64")
   192  	c.Check(*hwc.AvailabilityZone, gc.Equals, "home-zone")
   193  	c.Check(*hwc.CpuCores, gc.Equals, uint64(1))
   194  	c.Check(*hwc.CpuPower, gc.Equals, uint64(275))
   195  	c.Check(*hwc.Mem, gc.Equals, uint64(3750))
   196  	c.Check(*hwc.RootDisk, gc.Equals, uint64(15360))
   197  }
   198  
   199  func (s *environBrokerSuite) TestAllInstances(c *gc.C) {
   200  	s.FakeEnviron.Insts = []instance.Instance{s.Instance}
   201  
   202  	insts, err := s.Env.AllInstances()
   203  	c.Assert(err, jc.ErrorIsNil)
   204  	c.Check(insts, jc.DeepEquals, []instance.Instance{s.Instance})
   205  }
   206  
   207  func (s *environBrokerSuite) TestStopInstances(c *gc.C) {
   208  	err := s.Env.StopInstances(s.Instance.Id())
   209  	c.Assert(err, jc.ErrorIsNil)
   210  
   211  	called, calls := s.FakeConn.WasCalled("RemoveInstances")
   212  	c.Check(called, gc.Equals, true)
   213  	c.Check(calls, gc.HasLen, 1)
   214  	c.Check(calls[0].Prefix, gc.Equals, "juju-2d02eeac-9dbb-11e4-89d3-123b93f75cba-machine-")
   215  	c.Check(calls[0].IDs, gc.DeepEquals, []string{"spam"})
   216  }