github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 Series: "trusty", 67 SizeHintGB: 15, 68 ImageURL: "some/image/path", 69 Boot: true, 70 Scratch: false, 71 Readonly: false, 72 AutoDelete: true, 73 } 74 s.AttachedDisk = compute.AttachedDisk{ 75 Type: "PERSISTENT", 76 Boot: true, 77 Mode: "READ_WRITE", 78 AutoDelete: true, 79 InitializeParams: &compute.AttachedDiskInitializeParams{ 80 DiskSizeGb: 10, 81 SourceImage: "some/image/path", 82 }, 83 } 84 s.NetworkSpec = NetworkSpec{ 85 Name: "somenetwork", 86 } 87 s.NetworkInterface = compute.NetworkInterface{ 88 Network: "global/networks/somenetwork", 89 NetworkIP: "10.0.0.1", 90 AccessConfigs: []*compute.AccessConfig{{ 91 Name: "somenetif", 92 Type: NetworkAccessOneToOneNAT, 93 }}, 94 } 95 s.Addresses = []network.Address{{ 96 Value: "10.0.0.1", 97 Type: network.IPv4Address, 98 Scope: network.ScopeCloudLocal, 99 }} 100 s.RawMetadata = compute.Metadata{ 101 Items: []*compute.MetadataItems{{ 102 Key: "eggs", 103 Value: StringPtr("steak"), 104 }}, 105 Fingerprint: "heymumwatchthis", 106 } 107 s.Metadata = map[string]string{ 108 "eggs": "steak", 109 } 110 s.RawInstance = compute.Instance{ 111 Name: "spam", 112 Status: StatusRunning, 113 NetworkInterfaces: []*compute.NetworkInterface{&s.NetworkInterface}, 114 Metadata: &s.RawMetadata, 115 Disks: []*compute.AttachedDisk{&s.AttachedDisk}, 116 Tags: &compute.Tags{Items: []string{"spam"}}, 117 } 118 s.RawInstanceFull = s.RawInstance 119 s.RawInstanceFull.Zone = "a-zone" 120 s.RawInstanceFull.Status = StatusRunning 121 s.RawInstanceFull.MachineType = "zones/a-zone/machineTypes/mtype" 122 s.InstanceSpec = InstanceSpec{ 123 ID: "spam", 124 Type: "mtype", 125 Disks: []DiskSpec{s.DiskSpec}, 126 Network: s.NetworkSpec, 127 NetworkInterfaces: []string{"somenetif"}, 128 Metadata: s.Metadata, 129 Tags: []string{"spam"}, 130 AvailabilityZone: "a-zone", 131 } 132 s.Instance = Instance{ 133 InstanceSummary: InstanceSummary{ 134 ID: "spam", 135 ZoneName: "a-zone", 136 Status: StatusRunning, 137 Metadata: s.Metadata, 138 Addresses: s.Addresses, 139 NetworkInterfaces: s.RawInstance.NetworkInterfaces, 140 }, 141 spec: &s.InstanceSpec, 142 } 143 } 144 145 func (s *BaseSuite) NewWaitError(op *compute.Operation, cause error) error { 146 return waitError{op, cause} 147 } 148 149 func StringPtr(val string) *string { 150 return &val 151 } 152 153 type fakeCall struct { 154 FuncName string 155 156 ProjectID string 157 Region string 158 ZoneName string 159 Name string 160 ID string 161 Prefix string 162 Statuses []string 163 Instance *compute.Instance 164 InstValue compute.Instance 165 Firewall *compute.Firewall 166 InstanceId string 167 AttachedDisk *compute.AttachedDisk 168 DeviceName string 169 ComputeDisk *compute.Disk 170 Metadata *compute.Metadata 171 LabelFingerprint string 172 Labels map[string]string 173 } 174 175 type fakeConn struct { 176 Calls []fakeCall 177 178 Project *compute.Project 179 Instance *compute.Instance 180 Instances []*compute.Instance 181 Firewalls []*compute.Firewall 182 Zones []*compute.Zone 183 Err error 184 FailOnCall int 185 Disks []*compute.Disk 186 Disk *compute.Disk 187 AttachedDisks []*compute.AttachedDisk 188 Networks []*compute.Network 189 Subnetworks []*compute.Subnetwork 190 } 191 192 func (rc *fakeConn) GetProject(projectID string) (*compute.Project, error) { 193 call := fakeCall{ 194 FuncName: "GetProject", 195 ProjectID: projectID, 196 } 197 rc.Calls = append(rc.Calls, call) 198 199 err := rc.Err 200 if len(rc.Calls) != rc.FailOnCall+1 { 201 err = nil 202 } 203 return rc.Project, err 204 } 205 206 func (rc *fakeConn) GetInstance(projectID, zone, id string) (*compute.Instance, error) { 207 call := fakeCall{ 208 FuncName: "GetInstance", 209 ProjectID: projectID, 210 ZoneName: zone, 211 ID: id, 212 } 213 rc.Calls = append(rc.Calls, call) 214 215 err := rc.Err 216 if len(rc.Calls) != rc.FailOnCall+1 { 217 err = nil 218 } 219 return rc.Instance, err 220 } 221 222 func (rc *fakeConn) ListInstances(projectID, prefix string, statuses ...string) ([]*compute.Instance, error) { 223 call := fakeCall{ 224 FuncName: "ListInstances", 225 ProjectID: projectID, 226 Prefix: prefix, 227 Statuses: statuses, 228 } 229 rc.Calls = append(rc.Calls, call) 230 231 err := rc.Err 232 if len(rc.Calls) != rc.FailOnCall+1 { 233 err = nil 234 } 235 return rc.Instances, err 236 } 237 238 func (rc *fakeConn) AddInstance(projectID, zoneName string, spec *compute.Instance) error { 239 call := fakeCall{ 240 FuncName: "AddInstance", 241 ProjectID: projectID, 242 ZoneName: zoneName, 243 Instance: spec, 244 InstValue: *spec, 245 } 246 rc.Calls = append(rc.Calls, call) 247 248 err := rc.Err 249 if len(rc.Calls) != rc.FailOnCall+1 { 250 err = nil 251 } 252 return err 253 } 254 255 func (rc *fakeConn) RemoveInstance(projectID, zone, id string) error { 256 call := fakeCall{ 257 FuncName: "RemoveInstance", 258 ProjectID: projectID, 259 ID: id, 260 ZoneName: zone, 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 err 269 } 270 271 func (rc *fakeConn) GetFirewalls(projectID, name string) ([]*compute.Firewall, error) { 272 call := fakeCall{ 273 FuncName: "GetFirewalls", 274 ProjectID: projectID, 275 Name: name, 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 rc.Firewalls, err 284 } 285 286 func (rc *fakeConn) AddFirewall(projectID string, firewall *compute.Firewall) error { 287 call := fakeCall{ 288 FuncName: "AddFirewall", 289 ProjectID: projectID, 290 Firewall: firewall, 291 } 292 rc.Calls = append(rc.Calls, call) 293 294 err := rc.Err 295 if len(rc.Calls) != rc.FailOnCall+1 { 296 err = nil 297 } 298 return err 299 } 300 301 func (rc *fakeConn) UpdateFirewall(projectID, name string, firewall *compute.Firewall) error { 302 call := fakeCall{ 303 FuncName: "UpdateFirewall", 304 ProjectID: projectID, 305 Name: name, 306 Firewall: firewall, 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) RemoveFirewall(projectID, name string) error { 318 call := fakeCall{ 319 FuncName: "RemoveFirewall", 320 ProjectID: projectID, 321 Name: name, 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 err 330 } 331 332 func (rc *fakeConn) ListAvailabilityZones(projectID, region string) ([]*compute.Zone, error) { 333 call := fakeCall{ 334 FuncName: "ListAvailabilityZones", 335 ProjectID: projectID, 336 Region: region, 337 } 338 rc.Calls = append(rc.Calls, call) 339 340 err := rc.Err 341 if len(rc.Calls) != rc.FailOnCall+1 { 342 err = nil 343 } 344 return rc.Zones, err 345 } 346 347 func (rc *fakeConn) CreateDisk(project, zone string, spec *compute.Disk) error { 348 call := fakeCall{ 349 FuncName: "CreateDisk", 350 ProjectID: project, 351 ZoneName: zone, 352 ComputeDisk: spec, 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 err 361 } 362 363 func (rc *fakeConn) ListDisks(project string) ([]*compute.Disk, error) { 364 call := fakeCall{ 365 FuncName: "ListDisks", 366 ProjectID: project, 367 } 368 rc.Calls = append(rc.Calls, call) 369 370 err := rc.Err 371 if len(rc.Calls) != rc.FailOnCall+1 { 372 err = nil 373 } 374 return rc.Disks, err 375 } 376 377 func (rc *fakeConn) RemoveDisk(project, zone, id string) error { 378 call := fakeCall{ 379 FuncName: "RemoveDisk", 380 ProjectID: project, 381 ZoneName: zone, 382 ID: id, 383 } 384 rc.Calls = append(rc.Calls, call) 385 386 err := rc.Err 387 if len(rc.Calls) != rc.FailOnCall+1 { 388 err = nil 389 } 390 return err 391 } 392 393 func (rc *fakeConn) GetDisk(project, zone, id string) (*compute.Disk, error) { 394 call := fakeCall{ 395 FuncName: "GetDisk", 396 ProjectID: project, 397 ZoneName: zone, 398 ID: id, 399 } 400 rc.Calls = append(rc.Calls, call) 401 402 err := rc.Err 403 if len(rc.Calls) != rc.FailOnCall+1 { 404 err = nil 405 } 406 return rc.Disk, err 407 } 408 409 func (rc *fakeConn) SetDiskLabels(project, zone, id, labelFingerprint string, labels map[string]string) error { 410 call := fakeCall{ 411 FuncName: "SetDiskLabels", 412 ProjectID: project, 413 ZoneName: zone, 414 ID: id, 415 LabelFingerprint: labelFingerprint, 416 Labels: labels, 417 } 418 rc.Calls = append(rc.Calls, call) 419 420 err := rc.Err 421 if len(rc.Calls) != rc.FailOnCall+1 { 422 err = nil 423 } 424 return err 425 } 426 427 func (rc *fakeConn) AttachDisk(project, zone, instanceId string, attachedDisk *compute.AttachedDisk) error { 428 call := fakeCall{ 429 FuncName: "AttachDisk", 430 ProjectID: project, 431 ZoneName: zone, 432 InstanceId: instanceId, 433 AttachedDisk: attachedDisk, 434 } 435 rc.Calls = append(rc.Calls, call) 436 437 err := rc.Err 438 if len(rc.Calls) != rc.FailOnCall+1 { 439 err = nil 440 } 441 return err 442 } 443 444 func (rc *fakeConn) DetachDisk(project, zone, instanceId, diskDeviceName string) error { 445 call := fakeCall{ 446 FuncName: "DetachDisk", 447 ProjectID: project, 448 ZoneName: zone, 449 InstanceId: instanceId, 450 DeviceName: diskDeviceName, 451 } 452 rc.Calls = append(rc.Calls, call) 453 454 err := rc.Err 455 if len(rc.Calls) != rc.FailOnCall+1 { 456 err = nil 457 } 458 return err 459 } 460 461 func (rc *fakeConn) InstanceDisks(project, zone, instanceId string) ([]*compute.AttachedDisk, error) { 462 call := fakeCall{ 463 FuncName: "InstanceDisks", 464 ProjectID: project, 465 ZoneName: zone, 466 InstanceId: instanceId, 467 } 468 rc.Calls = append(rc.Calls, call) 469 470 err := rc.Err 471 if len(rc.Calls) != rc.FailOnCall+1 { 472 err = nil 473 } 474 return rc.AttachedDisks, err 475 } 476 477 func (rc *fakeConn) ListMachineTypes(projectID, zone string) (*compute.MachineTypeList, error) { 478 call := fakeCall{ 479 FuncName: "ListMachineTypes", 480 ProjectID: projectID, 481 ZoneName: zone, 482 } 483 rc.Calls = append(rc.Calls, call) 484 machineType := compute.MachineTypeList{ 485 Items: []*compute.MachineType{ 486 {Name: "type-1", MemoryMb: 1024}, 487 {Name: "type-2", MemoryMb: 2048}, 488 }, 489 } 490 return &machineType, nil 491 492 } 493 494 func (rc *fakeConn) SetMetadata(projectID, zone, instanceID string, metadata *compute.Metadata) error { 495 call := fakeCall{ 496 FuncName: "SetMetadata", 497 ProjectID: projectID, 498 ZoneName: zone, 499 InstanceId: instanceID, 500 Metadata: metadata, 501 } 502 rc.Calls = append(rc.Calls, call) 503 504 err := rc.Err 505 if len(rc.Calls) != rc.FailOnCall+1 { 506 err = nil 507 } 508 return err 509 } 510 511 func (rc *fakeConn) ListNetworks(projectID string) ([]*compute.Network, error) { 512 call := fakeCall{ 513 FuncName: "ListNetworks", 514 ProjectID: projectID, 515 } 516 rc.Calls = append(rc.Calls, call) 517 518 err := rc.Err 519 if len(rc.Calls) != rc.FailOnCall+1 { 520 err = nil 521 } 522 if err != nil { 523 return nil, err 524 } 525 return rc.Networks, nil 526 } 527 528 func (rc *fakeConn) ListSubnetworks(projectID, region string) ([]*compute.Subnetwork, error) { 529 call := fakeCall{ 530 FuncName: "ListSubnetworks", 531 ProjectID: projectID, 532 Region: region, 533 } 534 rc.Calls = append(rc.Calls, call) 535 536 err := rc.Err 537 if len(rc.Calls) != rc.FailOnCall+1 { 538 err = nil 539 } 540 if err != nil { 541 return nil, err 542 } 543 return rc.Subnetworks, nil 544 }