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