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 = ¶ms.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 }