1
// Copyright 2014 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
7
"google.golang.org/api/compute/v1"
10
"github.com/juju/juju/network"
11
"github.com/juju/juju/testing"
14
type BaseSuite struct {
17
Credentials *Credentials
18
ConnCfg ConnectionConfig
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
35
var _ = gc.Suite(&BaseSuite{})
37
func (s *BaseSuite) SetUpTest(c *gc.C) {
38
s.BaseSuite.SetUpTest(c)
40
s.Credentials = &Credentials{
42
ClientEmail: "user@mail.com",
43
PrivateKey: []byte("<some-key>"),
46
"private_key_id": "mnopq",
47
"private_key": "<some-key>",
48
"client_email": "user@mail.com",
50
"type": "service_account"
53
s.ConnCfg = ConnectionConfig{
65
s.DiskSpec = DiskSpec{
68
ImageURL: "some/image/path",
74
s.AttachedDisk = compute.AttachedDisk{
79
InitializeParams: &compute.AttachedDiskInitializeParams{
81
SourceImage: "some/image/path",
84
s.NetworkSpec = NetworkSpec{
87
s.NetworkInterface = compute.NetworkInterface{
88
Network: "global/networks/somenetwork",
89
NetworkIP: "10.0.0.1",
90
AccessConfigs: []*compute.AccessConfig{{
92
Type: NetworkAccessOneToOneNAT,
95
s.Addresses = []network.Address{{
97
Type: network.IPv4Address,
98
Scope: network.ScopeCloudLocal,
100
s.RawMetadata = compute.Metadata{Items: []*compute.MetadataItems{{
104
s.Metadata = map[string]string{
107
s.RawInstance = compute.Instance{
109
Status: StatusRunning,
110
NetworkInterfaces: []*compute.NetworkInterface{&s.NetworkInterface},
111
Metadata: &s.RawMetadata,
112
Disks: []*compute.AttachedDisk{&s.AttachedDisk},
113
Tags: &compute.Tags{Items: []string{"spam"}},
115
s.RawInstanceFull = s.RawInstance
116
s.RawInstanceFull.Zone = "a-zone"
117
s.RawInstanceFull.Status = StatusRunning
118
s.RawInstanceFull.MachineType = "zones/a-zone/machineTypes/mtype"
119
s.InstanceSpec = InstanceSpec{
122
Disks: []DiskSpec{s.DiskSpec},
123
Network: s.NetworkSpec,
124
NetworkInterfaces: []string{"somenetif"},
125
Metadata: s.Metadata,
126
Tags: []string{"spam"},
128
s.Instance = Instance{
129
InstanceSummary: InstanceSummary{
132
Status: StatusRunning,
133
Metadata: s.Metadata,
134
Addresses: s.Addresses,
136
spec: &s.InstanceSpec,
140
func (s *BaseSuite) NewWaitError(op *compute.Operation, cause error) error {
141
return waitError{op, cause}
144
type fakeCall struct {
154
Instance *compute.Instance
155
InstValue compute.Instance
156
Firewall *compute.Firewall
158
AttachedDisk *compute.AttachedDisk
160
ComputeDisk *compute.Disk
163
type fakeConn struct {
166
Project *compute.Project
167
Instance *compute.Instance
168
Instances []*compute.Instance
169
Firewall *compute.Firewall
170
Zones []*compute.Zone
173
Disks []*compute.Disk
175
AttachedDisks []*compute.AttachedDisk
178
func (rc *fakeConn) GetProject(projectID string) (*compute.Project, error) {
180
FuncName: "GetProject",
181
ProjectID: projectID,
183
rc.Calls = append(rc.Calls, call)
186
if len(rc.Calls) != rc.FailOnCall+1 {
189
return rc.Project, err
192
func (rc *fakeConn) GetInstance(projectID, zone, id string) (*compute.Instance, error) {
194
FuncName: "GetInstance",
195
ProjectID: projectID,
199
rc.Calls = append(rc.Calls, call)
202
if len(rc.Calls) != rc.FailOnCall+1 {
205
return rc.Instance, err
208
func (rc *fakeConn) ListInstances(projectID, prefix string, statuses ...string) ([]*compute.Instance, error) {
210
FuncName: "ListInstances",
211
ProjectID: projectID,
215
rc.Calls = append(rc.Calls, call)
218
if len(rc.Calls) != rc.FailOnCall+1 {
221
return rc.Instances, err
224
func (rc *fakeConn) AddInstance(projectID, zoneName string, spec *compute.Instance) error {
226
FuncName: "AddInstance",
227
ProjectID: projectID,
232
rc.Calls = append(rc.Calls, call)
235
if len(rc.Calls) != rc.FailOnCall+1 {
241
func (rc *fakeConn) RemoveInstance(projectID, zone, id string) error {
243
FuncName: "RemoveInstance",
244
ProjectID: projectID,
248
rc.Calls = append(rc.Calls, call)
251
if len(rc.Calls) != rc.FailOnCall+1 {
257
func (rc *fakeConn) GetFirewall(projectID, name string) (*compute.Firewall, error) {
259
FuncName: "GetFirewall",
260
ProjectID: projectID,
263
rc.Calls = append(rc.Calls, call)
266
if len(rc.Calls) != rc.FailOnCall+1 {
269
return rc.Firewall, err
272
func (rc *fakeConn) AddFirewall(projectID string, firewall *compute.Firewall) error {
274
FuncName: "AddFirewall",
275
ProjectID: projectID,
278
rc.Calls = append(rc.Calls, call)
281
if len(rc.Calls) != rc.FailOnCall+1 {
287
func (rc *fakeConn) UpdateFirewall(projectID, name string, firewall *compute.Firewall) error {
289
FuncName: "UpdateFirewall",
290
ProjectID: projectID,
294
rc.Calls = append(rc.Calls, call)
297
if len(rc.Calls) != rc.FailOnCall+1 {
303
func (rc *fakeConn) RemoveFirewall(projectID, name string) error {
305
FuncName: "RemoveFirewall",
306
ProjectID: projectID,
309
rc.Calls = append(rc.Calls, call)
312
if len(rc.Calls) != rc.FailOnCall+1 {
318
func (rc *fakeConn) ListAvailabilityZones(projectID, region string) ([]*compute.Zone, error) {
320
FuncName: "ListAvailabilityZones",
321
ProjectID: projectID,
324
rc.Calls = append(rc.Calls, call)
327
if len(rc.Calls) != rc.FailOnCall+1 {
333
func (rc *fakeConn) CreateDisk(project, zone string, spec *compute.Disk) error {
335
FuncName: "CreateDisk",
340
rc.Calls = append(rc.Calls, call)
343
if len(rc.Calls) != rc.FailOnCall+1 {
349
func (rc *fakeConn) ListDisks(project, zone string) ([]*compute.Disk, error) {
351
FuncName: "ListDisks",
355
rc.Calls = append(rc.Calls, call)
358
if len(rc.Calls) != rc.FailOnCall+1 {
364
func (rc *fakeConn) RemoveDisk(project, zone, id string) error {
366
FuncName: "RemoveDisk",
371
rc.Calls = append(rc.Calls, call)
374
if len(rc.Calls) != rc.FailOnCall+1 {
380
func (rc *fakeConn) GetDisk(project, zone, id string) (*compute.Disk, error) {
387
rc.Calls = append(rc.Calls, call)
390
if len(rc.Calls) != rc.FailOnCall+1 {
396
func (rc *fakeConn) AttachDisk(project, zone, instanceId string, attachedDisk *compute.AttachedDisk) error {
398
FuncName: "AttachDisk",
401
InstanceId: instanceId,
402
AttachedDisk: attachedDisk,
404
rc.Calls = append(rc.Calls, call)
407
if len(rc.Calls) != rc.FailOnCall+1 {
413
func (rc *fakeConn) DetachDisk(project, zone, instanceId, diskDeviceName string) error {
415
FuncName: "DetachDisk",
418
InstanceId: instanceId,
419
DeviceName: diskDeviceName,
421
rc.Calls = append(rc.Calls, call)
424
if len(rc.Calls) != rc.FailOnCall+1 {
430
func (rc *fakeConn) InstanceDisks(project, zone, instanceId string) ([]*compute.AttachedDisk, error) {
432
FuncName: "InstanceDisks",
435
InstanceId: instanceId,
437
rc.Calls = append(rc.Calls, call)
440
if len(rc.Calls) != rc.FailOnCall+1 {
443
return rc.AttachedDisks, err