github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/provider/gce/google/testing_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package google 5 6 import ( 7 "google.golang.org/api/compute/v1" 8 gc "gopkg.in/check.v1" 9 10 "github.com/juju/juju/network" 11 "github.com/juju/juju/testing" 12 ) 13 14 type BaseSuite struct { 15 testing.BaseSuite 16 17 Credentials *Credentials 18 ConnCfg ConnectionConfig 19 Conn *Connection 20 FakeConn *fakeConn 21 22 DiskSpec DiskSpec 23 AttachedDisk compute.AttachedDisk 24 NetworkSpec NetworkSpec 25 NetworkInterface compute.NetworkInterface 26 Addresses []network.Address 27 RawMetadata compute.Metadata 28 Metadata map[string]string 29 RawInstance compute.Instance 30 RawInstanceFull compute.Instance 31 InstanceSpec InstanceSpec 32 Instance Instance 33 } 34 35 var _ = gc.Suite(&BaseSuite{}) 36 37 func (s *BaseSuite) SetUpTest(c *gc.C) { 38 s.BaseSuite.SetUpTest(c) 39 40 s.Credentials = &Credentials{ 41 ClientID: "spam", 42 ClientEmail: "user@mail.com", 43 PrivateKey: []byte("<some-key>"), 44 JSONKey: []byte(` 45 { 46 "private_key_id": "mnopq", 47 "private_key": "<some-key>", 48 "client_email": "user@mail.com", 49 "client_id": "spam", 50 "type": "service_account" 51 }`[1:]), 52 } 53 s.ConnCfg = ConnectionConfig{ 54 Region: "a", 55 ProjectID: "spam", 56 } 57 fake := &fakeConn{} 58 s.Conn = &Connection{ 59 raw: fake, 60 region: "a", 61 projectID: "spam", 62 } 63 s.FakeConn = fake 64 65 s.DiskSpec = DiskSpec{ 66 SizeHintGB: 15, 67 ImageURL: "some/image/path", 68 Boot: true, 69 Scratch: false, 70 Readonly: false, 71 AutoDelete: true, 72 } 73 s.AttachedDisk = compute.AttachedDisk{ 74 Type: "PERSISTENT", 75 Boot: true, 76 Mode: "READ_WRITE", 77 AutoDelete: true, 78 InitializeParams: &compute.AttachedDiskInitializeParams{ 79 DiskSizeGb: 10, 80 SourceImage: "some/image/path", 81 }, 82 } 83 s.NetworkSpec = NetworkSpec{ 84 Name: "somenetwork", 85 } 86 s.NetworkInterface = compute.NetworkInterface{ 87 Network: "global/networks/somenetwork", 88 NetworkIP: "10.0.0.1", 89 AccessConfigs: []*compute.AccessConfig{{ 90 Name: "somenetif", 91 Type: NetworkAccessOneToOneNAT, 92 }}, 93 } 94 s.Addresses = []network.Address{{ 95 Value: "10.0.0.1", 96 Type: network.IPv4Address, 97 Scope: network.ScopeCloudLocal, 98 }} 99 s.RawMetadata = compute.Metadata{Items: []*compute.MetadataItems{{ 100 Key: "eggs", 101 Value: "steak", 102 }}} 103 s.Metadata = map[string]string{ 104 "eggs": "steak", 105 } 106 s.RawInstance = compute.Instance{ 107 Name: "spam", 108 Status: StatusRunning, 109 NetworkInterfaces: []*compute.NetworkInterface{&s.NetworkInterface}, 110 Metadata: &s.RawMetadata, 111 Disks: []*compute.AttachedDisk{&s.AttachedDisk}, 112 Tags: &compute.Tags{Items: []string{"spam"}}, 113 } 114 s.RawInstanceFull = s.RawInstance 115 s.RawInstanceFull.Zone = "a-zone" 116 s.RawInstanceFull.Status = StatusRunning 117 s.RawInstanceFull.MachineType = "zones/a-zone/machineTypes/mtype" 118 s.InstanceSpec = InstanceSpec{ 119 ID: "spam", 120 Type: "mtype", 121 Disks: []DiskSpec{s.DiskSpec}, 122 Network: s.NetworkSpec, 123 NetworkInterfaces: []string{"somenetif"}, 124 Metadata: s.Metadata, 125 Tags: []string{"spam"}, 126 } 127 s.Instance = Instance{ 128 InstanceSummary: InstanceSummary{ 129 ID: "spam", 130 ZoneName: "a-zone", 131 Status: StatusRunning, 132 Metadata: s.Metadata, 133 Addresses: s.Addresses, 134 }, 135 spec: &s.InstanceSpec, 136 } 137 } 138 139 func (s *BaseSuite) NewWaitError(op *compute.Operation, cause error) error { 140 return waitError{op, cause} 141 } 142 143 type fakeCall struct { 144 FuncName string 145 146 ProjectID string 147 Region string 148 ZoneName string 149 Name string 150 ID string 151 Prefix string 152 Statuses []string 153 Instance *compute.Instance 154 InstValue compute.Instance 155 Firewall *compute.Firewall 156 InstanceId string 157 AttachedDisk *compute.AttachedDisk 158 DeviceName string 159 ComputeDisk *compute.Disk 160 } 161 162 type fakeConn struct { 163 Calls []fakeCall 164 165 Project *compute.Project 166 Instance *compute.Instance 167 Instances []*compute.Instance 168 Firewall *compute.Firewall 169 Zones []*compute.Zone 170 Err error 171 FailOnCall int 172 Disks []*compute.Disk 173 Disk *compute.Disk 174 AttachedDisks []*compute.AttachedDisk 175 } 176 177 func (rc *fakeConn) GetProject(projectID string) (*compute.Project, error) { 178 call := fakeCall{ 179 FuncName: "GetProject", 180 ProjectID: projectID, 181 } 182 rc.Calls = append(rc.Calls, call) 183 184 err := rc.Err 185 if len(rc.Calls) != rc.FailOnCall+1 { 186 err = nil 187 } 188 return rc.Project, err 189 } 190 191 func (rc *fakeConn) GetInstance(projectID, zone, id string) (*compute.Instance, error) { 192 call := fakeCall{ 193 FuncName: "GetInstance", 194 ProjectID: projectID, 195 ZoneName: zone, 196 ID: id, 197 } 198 rc.Calls = append(rc.Calls, call) 199 200 err := rc.Err 201 if len(rc.Calls) != rc.FailOnCall+1 { 202 err = nil 203 } 204 return rc.Instance, err 205 } 206 207 func (rc *fakeConn) ListInstances(projectID, prefix string, statuses ...string) ([]*compute.Instance, error) { 208 call := fakeCall{ 209 FuncName: "ListInstances", 210 ProjectID: projectID, 211 Prefix: prefix, 212 Statuses: statuses, 213 } 214 rc.Calls = append(rc.Calls, call) 215 216 err := rc.Err 217 if len(rc.Calls) != rc.FailOnCall+1 { 218 err = nil 219 } 220 return rc.Instances, err 221 } 222 223 func (rc *fakeConn) AddInstance(projectID, zoneName string, spec *compute.Instance) error { 224 call := fakeCall{ 225 FuncName: "AddInstance", 226 ProjectID: projectID, 227 ZoneName: zoneName, 228 Instance: spec, 229 InstValue: *spec, 230 } 231 rc.Calls = append(rc.Calls, call) 232 233 err := rc.Err 234 if len(rc.Calls) != rc.FailOnCall+1 { 235 err = nil 236 } 237 return err 238 } 239 240 func (rc *fakeConn) RemoveInstance(projectID, zone, id string) error { 241 call := fakeCall{ 242 FuncName: "RemoveInstance", 243 ProjectID: projectID, 244 ID: id, 245 ZoneName: zone, 246 } 247 rc.Calls = append(rc.Calls, call) 248 249 err := rc.Err 250 if len(rc.Calls) != rc.FailOnCall+1 { 251 err = nil 252 } 253 return err 254 } 255 256 func (rc *fakeConn) GetFirewall(projectID, name string) (*compute.Firewall, error) { 257 call := fakeCall{ 258 FuncName: "GetFirewall", 259 ProjectID: projectID, 260 Name: name, 261 } 262 rc.Calls = append(rc.Calls, call) 263 264 err := rc.Err 265 if len(rc.Calls) != rc.FailOnCall+1 { 266 err = nil 267 } 268 return rc.Firewall, err 269 } 270 271 func (rc *fakeConn) AddFirewall(projectID string, firewall *compute.Firewall) error { 272 call := fakeCall{ 273 FuncName: "AddFirewall", 274 ProjectID: projectID, 275 Firewall: firewall, 276 } 277 rc.Calls = append(rc.Calls, call) 278 279 err := rc.Err 280 if len(rc.Calls) != rc.FailOnCall+1 { 281 err = nil 282 } 283 return err 284 } 285 286 func (rc *fakeConn) UpdateFirewall(projectID, name string, firewall *compute.Firewall) error { 287 call := fakeCall{ 288 FuncName: "UpdateFirewall", 289 ProjectID: projectID, 290 Name: name, 291 Firewall: firewall, 292 } 293 rc.Calls = append(rc.Calls, call) 294 295 err := rc.Err 296 if len(rc.Calls) != rc.FailOnCall+1 { 297 err = nil 298 } 299 return err 300 } 301 302 func (rc *fakeConn) RemoveFirewall(projectID, name string) error { 303 call := fakeCall{ 304 FuncName: "RemoveFirewall", 305 ProjectID: projectID, 306 Name: name, 307 } 308 rc.Calls = append(rc.Calls, call) 309 310 err := rc.Err 311 if len(rc.Calls) != rc.FailOnCall+1 { 312 err = nil 313 } 314 return err 315 } 316 317 func (rc *fakeConn) ListAvailabilityZones(projectID, region string) ([]*compute.Zone, error) { 318 call := fakeCall{ 319 FuncName: "ListAvailabilityZones", 320 ProjectID: projectID, 321 Region: region, 322 } 323 rc.Calls = append(rc.Calls, call) 324 325 err := rc.Err 326 if len(rc.Calls) != rc.FailOnCall+1 { 327 err = nil 328 } 329 return rc.Zones, err 330 } 331 332 func (rc *fakeConn) CreateDisk(project, zone string, spec *compute.Disk) error { 333 call := fakeCall{ 334 FuncName: "CreateDisk", 335 ProjectID: project, 336 ZoneName: zone, 337 ComputeDisk: spec, 338 } 339 rc.Calls = append(rc.Calls, call) 340 341 err := rc.Err 342 if len(rc.Calls) != rc.FailOnCall+1 { 343 err = nil 344 } 345 return err 346 } 347 348 func (rc *fakeConn) ListDisks(project, zone string) ([]*compute.Disk, error) { 349 call := fakeCall{ 350 FuncName: "ListDisks", 351 ProjectID: project, 352 ZoneName: zone, 353 } 354 rc.Calls = append(rc.Calls, call) 355 356 err := rc.Err 357 if len(rc.Calls) != rc.FailOnCall+1 { 358 err = nil 359 } 360 return rc.Disks, err 361 } 362 363 func (rc *fakeConn) RemoveDisk(project, zone, id string) error { 364 call := fakeCall{ 365 FuncName: "RemoveDisk", 366 ProjectID: project, 367 ZoneName: zone, 368 ID: id, 369 } 370 rc.Calls = append(rc.Calls, call) 371 372 err := rc.Err 373 if len(rc.Calls) != rc.FailOnCall+1 { 374 err = nil 375 } 376 return err 377 } 378 379 func (rc *fakeConn) GetDisk(project, zone, id string) (*compute.Disk, error) { 380 call := fakeCall{ 381 FuncName: "GetDisk", 382 ProjectID: project, 383 ZoneName: zone, 384 ID: id, 385 } 386 rc.Calls = append(rc.Calls, call) 387 388 err := rc.Err 389 if len(rc.Calls) != rc.FailOnCall+1 { 390 err = nil 391 } 392 return rc.Disk, err 393 } 394 395 func (rc *fakeConn) AttachDisk(project, zone, instanceId string, attachedDisk *compute.AttachedDisk) error { 396 call := fakeCall{ 397 FuncName: "AttachDisk", 398 ProjectID: project, 399 ZoneName: zone, 400 InstanceId: instanceId, 401 AttachedDisk: attachedDisk, 402 } 403 rc.Calls = append(rc.Calls, call) 404 405 err := rc.Err 406 if len(rc.Calls) != rc.FailOnCall+1 { 407 err = nil 408 } 409 return err 410 } 411 412 func (rc *fakeConn) DetachDisk(project, zone, instanceId, diskDeviceName string) error { 413 call := fakeCall{ 414 FuncName: "DetachDisk", 415 ProjectID: project, 416 ZoneName: zone, 417 InstanceId: instanceId, 418 DeviceName: diskDeviceName, 419 } 420 rc.Calls = append(rc.Calls, call) 421 422 err := rc.Err 423 if len(rc.Calls) != rc.FailOnCall+1 { 424 err = nil 425 } 426 return err 427 } 428 429 func (rc *fakeConn) InstanceDisks(project, zone, instanceId string) ([]*compute.AttachedDisk, error) { 430 call := fakeCall{ 431 FuncName: "InstanceDisks", 432 ProjectID: project, 433 ZoneName: zone, 434 InstanceId: instanceId, 435 } 436 rc.Calls = append(rc.Calls, call) 437 438 err := rc.Err 439 if len(rc.Calls) != rc.FailOnCall+1 { 440 err = nil 441 } 442 return rc.AttachedDisks, err 443 }