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