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