beaker-google 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -13
- data/.github/dependabot.yml +8 -0
- data/.github/workflows/snyk_scan.yaml +23 -0
- data/CODEOWNERS +2 -0
- data/Gemfile +1 -1
- data/README.md +27 -9
- data/beaker-google.gemspec +7 -3
- data/docs/manual.md +122 -0
- data/lib/beaker/hypervisor/google.rb +1 -1
- data/lib/beaker/hypervisor/google_compute.rb +87 -43
- data/lib/beaker/hypervisor/google_compute_helper.rb +411 -191
- data/lib/beaker-google/version.rb +1 -1
- metadata +33 -45
- data/google_compute_engine.md +0 -41
@@ -17,18 +17,34 @@ module Beaker
|
|
17
17
|
BASE_URL = "https://www.googleapis.com/compute/#{API_VERSION}/projects/"
|
18
18
|
CENTOS_PROJECT = 'centos-cloud'
|
19
19
|
DEBIAN_PROJECT = 'debian-cloud'
|
20
|
+
RHEL_PROJECT = 'rhel-cloud'
|
21
|
+
SLES_PROJECT = 'sles-cloud'
|
20
22
|
DEFAULT_ZONE_NAME = 'us-central1-a'
|
21
23
|
DEFAULT_MACHINE_TYPE = 'n1-highmem-2'
|
22
24
|
DEFAULT_DISK_SIZE = 25
|
23
25
|
|
24
|
-
#Create a new instance of the Google Compute Engine helper object
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
# Create a new instance of the Google Compute Engine helper object
|
27
|
+
#
|
28
|
+
# @param [Hash{Symbol=>String}] options The options hash containing
|
29
|
+
# configuration values
|
30
|
+
#
|
31
|
+
# @option options [String] :gce_project The Google Compute Project name to
|
32
|
+
# connect to
|
33
|
+
#
|
34
|
+
# @option options [String] :gce_keyfile The location of the Google Compute
|
35
|
+
# service account keyfile
|
36
|
+
#
|
37
|
+
# @option options [String] :gce_password The password for the Google Compute
|
38
|
+
# service account key
|
39
|
+
#
|
40
|
+
# @option options [String] :gce_email The email address for the Google
|
41
|
+
# Compute service account
|
42
|
+
#
|
43
|
+
# @option options [String] :gce_machine_type A Google Compute machine type
|
44
|
+
# used to create instances, defaults to n1-highmem-2
|
45
|
+
#
|
46
|
+
# @option options [Integer] :timeout The amount of time to attempt execution
|
47
|
+
# before quiting and exiting with failure
|
32
48
|
def initialize(options)
|
33
49
|
@options = options
|
34
50
|
@logger = options[:logger]
|
@@ -39,54 +55,91 @@ module Beaker
|
|
39
55
|
set_client(Beaker::Version::STRING)
|
40
56
|
set_compute_api(API_VERSION, start, attempts)
|
41
57
|
|
58
|
+
@options[:gce_project] = ENV['BEAKER_gce_project'] if ENV['BEAKER_gce_project']
|
59
|
+
@options[:gce_keyfile] = ENV['BEAKER_gce_keyfile'] if ENV['BEAKER_gce_keyfile']
|
60
|
+
|
61
|
+
unless (@options[:gce_keyfile] && File.exist?(@options[:gce_keyfile]))
|
62
|
+
@options[:gce_keyfile] = File.join(ENV['HOME'], '.beaker', 'gce', %(#{@options[:gce_project]}.p12))
|
63
|
+
end
|
64
|
+
|
65
|
+
@options[:gce_password] = ENV['BEAKER_gce_password'] if ENV['BEAKER_gce_password']
|
66
|
+
# This is the GCE default so there's usually not a reason to specify it
|
67
|
+
@options[:gce_password] = 'notasecret' unless @options[:gce_password]
|
68
|
+
|
69
|
+
@options[:gce_email] = ENV['BEAKER_gce_email'] if ENV['BEAKER_gce_email']
|
70
|
+
|
42
71
|
raise 'You must specify a gce_project for Google Compute Engine instances!' unless @options[:gce_project]
|
43
|
-
|
44
|
-
raise
|
72
|
+
|
73
|
+
raise "Could not find gce_keyfile for Google Compute Engine at '#{@options[:gce_keyfile]}'!" unless File.exist?(@options[:gce_keyfile])
|
74
|
+
|
45
75
|
raise 'You must specify a gce_email for Google Compute Engine instances!' unless @options[:gce_email]
|
46
76
|
|
47
77
|
authenticate(@options[:gce_keyfile], @options[:gce_password], @options[:gce_email], start, attempts)
|
48
78
|
end
|
49
79
|
|
50
|
-
#Determines the default Google Compute zone based upon options and
|
51
|
-
|
80
|
+
# Determines the default Google Compute zone based upon options and
|
81
|
+
# defaults
|
82
|
+
#
|
83
|
+
# @return The full URL to the default zone in which Google Compute requests
|
84
|
+
# will be sent
|
52
85
|
def default_zone
|
53
86
|
BASE_URL + @options[:gce_project] + '/global/zones/' + DEFAULT_ZONE_NAME
|
54
87
|
end
|
55
88
|
|
56
|
-
#Determines the default Google Compute network based upon defaults and
|
57
|
-
|
89
|
+
# Determines the default Google Compute network based upon defaults and
|
90
|
+
# options
|
91
|
+
#
|
92
|
+
# @return The full URL to the default network in which Google Compute
|
93
|
+
# instances will operate
|
58
94
|
def default_network
|
59
95
|
BASE_URL + @options[:gce_project] + '/global/networks/default'
|
60
96
|
end
|
61
97
|
|
62
|
-
#Determines the Google Compute project which contains bases instances of
|
63
|
-
|
64
|
-
|
65
|
-
|
98
|
+
# Determines the Google Compute project which contains bases instances of
|
99
|
+
# type name
|
100
|
+
#
|
101
|
+
# @param [String] name The platform type to search for
|
102
|
+
#
|
103
|
+
# @return The Google Compute project name
|
104
|
+
#
|
105
|
+
# @raise [Exception] If the provided platform type name is unsupported
|
66
106
|
def get_platform_project(name)
|
67
107
|
if name =~ /debian/
|
68
108
|
return DEBIAN_PROJECT
|
69
109
|
elsif name =~ /centos/
|
70
110
|
return CENTOS_PROJECT
|
111
|
+
elsif name =~ /rhel/
|
112
|
+
return RHEL_PROJECT
|
113
|
+
elsif name =~ /sles/
|
114
|
+
return SLES_PROJECT
|
71
115
|
else
|
72
116
|
raise "Unsupported platform for Google Compute Engine: #{name}"
|
73
117
|
end
|
74
118
|
end
|
75
119
|
|
76
|
-
#Create the Google APIClient object which will be used for accessing the
|
77
|
-
|
120
|
+
# Create the Google APIClient object which will be used for accessing the
|
121
|
+
# Google Compute API
|
122
|
+
#
|
123
|
+
# @param version The version number of Beaker currently running
|
78
124
|
def set_client(version)
|
79
|
-
@client = Google::APIClient.new({:application_name => "Beaker", :application_version => version})
|
80
|
-
end
|
81
|
-
|
82
|
-
#Discover the currently active Google Compute API
|
83
|
-
|
84
|
-
|
85
|
-
#
|
86
|
-
|
87
|
-
|
125
|
+
@client = ::Google::APIClient.new({:application_name => "Beaker", :application_version => version})
|
126
|
+
end
|
127
|
+
|
128
|
+
# Discover the currently active Google Compute API
|
129
|
+
#
|
130
|
+
# @param [String] version The version of the Google Compute API to discover
|
131
|
+
#
|
132
|
+
# @param [Integer] start The time when we started code execution, it is
|
133
|
+
# compared to Time.now to determine how many further code execution
|
134
|
+
# attempts remain
|
135
|
+
#
|
136
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
137
|
+
# are willing to allow
|
138
|
+
#
|
139
|
+
# @raise [Exception] Raised if we fail to discover the Google Compute API,
|
140
|
+
# either through errors or running out of attempts
|
88
141
|
def set_compute_api version, start, attempts
|
89
|
-
try = (Time.now - start)
|
142
|
+
try = (Time.now - start)/SLEEPWAIT
|
90
143
|
while try <= attempts
|
91
144
|
begin
|
92
145
|
@compute = @client.discovered_api('compute', version)
|
@@ -102,18 +155,31 @@ module Beaker
|
|
102
155
|
end
|
103
156
|
end
|
104
157
|
|
105
|
-
#Creates an authenticated connection to the Google Compute Engine API
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
#
|
111
|
-
|
112
|
-
|
158
|
+
# Creates an authenticated connection to the Google Compute Engine API
|
159
|
+
#
|
160
|
+
# @param [String] keyfile The location of the Google Compute Service
|
161
|
+
# Account keyfile to use for authentication
|
162
|
+
#
|
163
|
+
# @param [String] password The password for the provided Google Compute
|
164
|
+
# Service Account key
|
165
|
+
#
|
166
|
+
# @param [String] email The email address of the Google Compute Service
|
167
|
+
# Account we are using to connect
|
168
|
+
#
|
169
|
+
# @param [Integer] start The time when we started code execution, it is
|
170
|
+
# compared to Time.now to determine how many further code execution
|
171
|
+
# attempts remain
|
172
|
+
#
|
173
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
174
|
+
# are willing to allow
|
175
|
+
#
|
176
|
+
# @raise [Exception] Raised if we fail to create an authenticated
|
177
|
+
# connection to the Google Compute API, either through errors or running
|
178
|
+
# out of attempts
|
113
179
|
def authenticate(keyfile, password, email, start, attempts)
|
114
180
|
# OAuth authentication, using the service account
|
115
|
-
key = Google::APIClient::PKCS12.load_key(keyfile, password)
|
116
|
-
service_account = Google::APIClient::JWTAsserter.new(
|
181
|
+
key = ::Google::APIClient::PKCS12.load_key(keyfile, password)
|
182
|
+
service_account = ::Google::APIClient::JWTAsserter.new(
|
117
183
|
email,
|
118
184
|
AUTH_URL,
|
119
185
|
key)
|
@@ -133,12 +199,19 @@ module Beaker
|
|
133
199
|
end
|
134
200
|
end
|
135
201
|
|
136
|
-
#Executes a provided Google Compute request using a previously configured
|
137
|
-
|
138
|
-
|
139
|
-
#
|
140
|
-
|
141
|
-
|
202
|
+
# Executes a provided Google Compute request using a previously configured
|
203
|
+
# and authenticated Google Compute client connection
|
204
|
+
#
|
205
|
+
# @param [Hash] req A correctly formatted Google Compute request object
|
206
|
+
#
|
207
|
+
# @param [Integer] start The time when we started code execution, it is
|
208
|
+
# compared to Time.now to determine how many further code execution
|
209
|
+
# attempts remain
|
210
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
211
|
+
# are willing to allow
|
212
|
+
#
|
213
|
+
# @raise [Exception] Raised if we fail to execute the request, either
|
214
|
+
# through errors or running out of attempts
|
142
215
|
def execute req, start, attempts
|
143
216
|
last_error = parsed = nil
|
144
217
|
try = (Time.now - start) / SLEEPWAIT
|
@@ -157,32 +230,42 @@ module Beaker
|
|
157
230
|
end
|
158
231
|
end
|
159
232
|
return parsed
|
160
|
-
#retry errors
|
233
|
+
# retry errors
|
161
234
|
rescue Faraday::Error::ConnectionFailed => e
|
162
235
|
@logger.debug "ConnectionFailed attempting Google Compute execute command"
|
163
236
|
try += 1
|
164
237
|
last_error = e
|
165
238
|
end
|
166
239
|
end
|
167
|
-
#we only get down here if we've used up all our tries
|
240
|
+
# we only get down here if we've used up all our tries
|
168
241
|
raise last_error
|
169
242
|
end
|
170
243
|
|
171
|
-
#Determines the latest image available for the provided platform name.
|
172
|
-
|
173
|
-
|
174
|
-
#
|
175
|
-
|
176
|
-
|
177
|
-
|
244
|
+
# Determines the latest image available for the provided platform name.
|
245
|
+
#
|
246
|
+
# Only images of the form (platform)-(version)-(version) are currently supported
|
247
|
+
#
|
248
|
+
# @param [String] platform The platform type to search for an instance of.
|
249
|
+
#
|
250
|
+
# @param [Integer] start The time when we started code execution, it is
|
251
|
+
# compared to Time.now to determine how many further code execution
|
252
|
+
# attempts remain
|
253
|
+
#
|
254
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
255
|
+
# are willing to allow
|
256
|
+
#
|
257
|
+
# @return [Hash] The image hash of the latest, non-deprecated image for the
|
258
|
+
# provided platform
|
259
|
+
#
|
260
|
+
# @raise [Exception] Raised if we fail to execute the request, either
|
261
|
+
# through errors or running out of attempts
|
178
262
|
def get_latest_image(platform, start, attempts)
|
179
|
-
#use the platform version numbers instead of codenames
|
180
|
-
platform = platform.with_version_number
|
181
263
|
#break up my platform for information
|
182
264
|
platform_name, platform_version, platform_extra_info = platform.split('-', 3)
|
183
265
|
#find latest image to use
|
184
266
|
result = execute( image_list_req(get_platform_project(platform_name)), start, attempts )
|
185
267
|
images = result["items"]
|
268
|
+
|
186
269
|
#reject images of the wrong version of the given platform
|
187
270
|
images.delete_if { |image| image['name'] !~ /^#{platform_name}-#{platform_version}/}
|
188
271
|
#reject deprecated images
|
@@ -194,54 +277,89 @@ module Beaker
|
|
194
277
|
images[0]
|
195
278
|
end
|
196
279
|
|
197
|
-
#Determines the Google Compute machineType object based upon the selected
|
198
|
-
|
199
|
-
#
|
200
|
-
|
201
|
-
|
202
|
-
|
280
|
+
# Determines the Google Compute machineType object based upon the selected
|
281
|
+
# gce_machine_type option
|
282
|
+
#
|
283
|
+
# @param [Integer] start The time when we started code execution, it is
|
284
|
+
# compared to Time.now to determine how many further code execution
|
285
|
+
# attempts remain
|
286
|
+
#
|
287
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
288
|
+
# are willing to allow
|
289
|
+
#
|
290
|
+
# @return [Hash] The machineType hash
|
291
|
+
#
|
292
|
+
# @raise [Exception] Raised if we fail get the machineType, either through
|
293
|
+
# errors or running out of attempts
|
203
294
|
def get_machineType(start, attempts)
|
204
295
|
execute( machineType_get_req, start, attempts )
|
205
296
|
end
|
206
297
|
|
207
|
-
#Determines the Google Compute network object in use for the current connection
|
208
|
-
|
209
|
-
#
|
210
|
-
|
211
|
-
|
212
|
-
|
298
|
+
# Determines the Google Compute network object in use for the current connection
|
299
|
+
# @param [Integer] start The time when we started code execution, it is
|
300
|
+
# compared to Time.now to determine how many further code execution
|
301
|
+
# attempts remain
|
302
|
+
#
|
303
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
304
|
+
# are willing to allow
|
305
|
+
#
|
306
|
+
# @return [Hash] The network hash
|
307
|
+
#
|
308
|
+
# @raise [Exception] Raised if we fail get the network, either through
|
309
|
+
# errors or running out of attempts
|
213
310
|
def get_network(start, attempts)
|
214
311
|
execute( network_get_req, start, attempts)
|
215
312
|
end
|
216
313
|
|
217
|
-
#Determines a list of existing Google Compute instances
|
218
|
-
|
219
|
-
#
|
220
|
-
|
221
|
-
|
222
|
-
|
314
|
+
# Determines a list of existing Google Compute instances
|
315
|
+
#
|
316
|
+
# @param [Integer] start The time when we started code execution, it is
|
317
|
+
# compared to Time.now to determine how many further code execution
|
318
|
+
# attempts remain
|
319
|
+
#
|
320
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
321
|
+
# are willing to allow
|
322
|
+
#
|
323
|
+
# @return [Array[Hash]] The instances array of hashes
|
324
|
+
#
|
325
|
+
# @raise [Exception] Raised if we fail determine the list of existing
|
326
|
+
# instances, either through errors or running out of attempts
|
223
327
|
def list_instances(start, attempts)
|
224
328
|
instances = execute( instance_list_req(), start, attempts )
|
225
329
|
instances["items"]
|
226
330
|
end
|
227
331
|
|
228
|
-
#Determines a list of existing Google Compute disks
|
229
|
-
|
230
|
-
#
|
231
|
-
|
232
|
-
|
233
|
-
|
332
|
+
# Determines a list of existing Google Compute disks
|
333
|
+
#
|
334
|
+
# @param [Integer] start The time when we started code execution, it is
|
335
|
+
# compared to Time.now to determine how many further code execution
|
336
|
+
# attempts remain
|
337
|
+
#
|
338
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
339
|
+
# are willing to allow
|
340
|
+
#
|
341
|
+
# @return [Array[Hash]] The disks array of hashes
|
342
|
+
#
|
343
|
+
# @raise [Exception] Raised if we fail determine the list of existing
|
344
|
+
# disks, either through errors or running out of attempts
|
234
345
|
def list_disks(start, attempts)
|
235
346
|
disks = execute( disk_list_req(), start, attempts )
|
236
347
|
disks["items"]
|
237
348
|
end
|
238
349
|
|
239
|
-
#Determines a list of existing Google Compute firewalls
|
240
|
-
|
241
|
-
#
|
242
|
-
|
243
|
-
|
244
|
-
|
350
|
+
# Determines a list of existing Google Compute firewalls
|
351
|
+
#
|
352
|
+
# @param [Integer] start The time when we started code execution, it is
|
353
|
+
# compared to Time.now to determine how many further code execution
|
354
|
+
# attempts remain
|
355
|
+
#
|
356
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
357
|
+
# are willing to allow
|
358
|
+
#
|
359
|
+
# @return [Array[Hash]] The firewalls array of hashes
|
360
|
+
#
|
361
|
+
# @raise [Exception] Raised if we fail determine the list of existing
|
362
|
+
# firewalls, either through errors or running out of attempts
|
245
363
|
def list_firewalls(start, attempts)
|
246
364
|
result = execute( firewall_list_req(), start, attempts )
|
247
365
|
firewalls = result["items"]
|
@@ -249,24 +367,41 @@ module Beaker
|
|
249
367
|
firewalls
|
250
368
|
end
|
251
369
|
|
252
|
-
#Create a Google Compute firewall on the current connection
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
#
|
257
|
-
|
258
|
-
|
370
|
+
# Create a Google Compute firewall on the current connection
|
371
|
+
#
|
372
|
+
# @param [String] name The name of the firewall to create
|
373
|
+
#
|
374
|
+
# @param [Hash] network The Google Compute network hash in which to create
|
375
|
+
# the firewall
|
376
|
+
#
|
377
|
+
# @param [Integer] start The time when we started code execution, it is
|
378
|
+
# compared to Time.now to determine how many further code execution
|
379
|
+
# attempts remain
|
380
|
+
#
|
381
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
382
|
+
# are willing to allow
|
383
|
+
#
|
384
|
+
# @raise [Exception] Raised if we fail create the firewall, either through
|
385
|
+
# errors or running out of attempts
|
259
386
|
def create_firewall(name, network, start, attempts)
|
260
387
|
execute( firewall_insert_req( name, network['selfLink'] ), start, attempts )
|
261
388
|
end
|
262
389
|
|
263
|
-
#Create a Google Compute disk on the current connection
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
#
|
268
|
-
|
269
|
-
|
390
|
+
# Create a Google Compute disk on the current connection
|
391
|
+
#
|
392
|
+
# @param [String] name The name of the disk to create
|
393
|
+
#
|
394
|
+
# @param [Hash] img The Google Compute image to use for instance creation
|
395
|
+
#
|
396
|
+
# @param [Integer] start The time when we started code execution, it is
|
397
|
+
# compared to Time.now to determine how many further code execution
|
398
|
+
# attempts remain
|
399
|
+
#
|
400
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
401
|
+
# are willing to allow
|
402
|
+
#
|
403
|
+
# @raise [Exception] Raised if we fail create the disk, either through
|
404
|
+
# errors or running out of attempts
|
270
405
|
def create_disk(name, img, start, attempts)
|
271
406
|
#create a new boot disk for this instance
|
272
407
|
disk = execute( disk_insert_req( name, img['selfLink'] ), start, attempts )
|
@@ -289,15 +424,26 @@ module Beaker
|
|
289
424
|
disk
|
290
425
|
end
|
291
426
|
|
292
|
-
#Create a Google Compute instance on the current connection
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
#
|
299
|
-
|
300
|
-
|
427
|
+
# Create a Google Compute instance on the current connection
|
428
|
+
#
|
429
|
+
# @param [String] name The name of the instance to create
|
430
|
+
#
|
431
|
+
# @param [Hash] img The Google Compute image to use for instance creation
|
432
|
+
#
|
433
|
+
# @param [Hash] machineType The Google Compute machineType
|
434
|
+
#
|
435
|
+
# @param [Hash] disk The Google Compute disk to attach to the newly created
|
436
|
+
# instance
|
437
|
+
#
|
438
|
+
# @param [Integer] start The time when we started code execution, it is
|
439
|
+
# compared to Time.now to determine how many further code execution
|
440
|
+
# attempts remain
|
441
|
+
#
|
442
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
443
|
+
# are willing to allow
|
444
|
+
#
|
445
|
+
# @raise [Exception] Raised if we fail create the instance, either through
|
446
|
+
# errors or running out of attempts
|
301
447
|
def create_instance(name, img, machineType, disk, start, attempts)
|
302
448
|
#add a new instance of the image
|
303
449
|
instance = execute( instance_insert_req( name, img['selfLink'], machineType['selfLink'], disk['selfLink'] ), start, attempts)
|
@@ -319,14 +465,26 @@ module Beaker
|
|
319
465
|
instance
|
320
466
|
end
|
321
467
|
|
322
|
-
#Add key/value pairs to a Google Compute instance on the current
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
#
|
328
|
-
|
329
|
-
|
468
|
+
# Add key/value pairs to a Google Compute instance on the current
|
469
|
+
# connection
|
470
|
+
#
|
471
|
+
# @param [String] name The name of the instance to add metadata to
|
472
|
+
#
|
473
|
+
# @param [String] fingerprint A hash of the metadata's contents of the
|
474
|
+
# given instance
|
475
|
+
#
|
476
|
+
# @param [Array<Hash>] data An array of hashes. Each hash should have a
|
477
|
+
# key and a value.
|
478
|
+
#
|
479
|
+
# @param [Integer] start The time when we started code execution, it is
|
480
|
+
# compared to Time.now to determine how many further code execution
|
481
|
+
# attempts remain
|
482
|
+
#
|
483
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
484
|
+
# are willing to allow
|
485
|
+
#
|
486
|
+
# @raise [Exception] Raised if we fail to add metadata, either through
|
487
|
+
# errors or running out of attempts
|
330
488
|
def setMetadata_on_instance(name, fingerprint, data, start, attempts)
|
331
489
|
zone_operation = execute( instance_setMetadata_req( name, fingerprint, data), start, attempts )
|
332
490
|
status = ''
|
@@ -347,15 +505,23 @@ module Beaker
|
|
347
505
|
zone_operation
|
348
506
|
end
|
349
507
|
|
350
|
-
#Delete a Google Compute instance on the current connection
|
351
|
-
|
352
|
-
|
353
|
-
#
|
354
|
-
|
355
|
-
|
508
|
+
# Delete a Google Compute instance on the current connection
|
509
|
+
#
|
510
|
+
# @param [String] name The name of the instance to delete
|
511
|
+
#
|
512
|
+
# @param [Integer] start The time when we started code execution, it is
|
513
|
+
# compared to Time.now to determine how many further code execution
|
514
|
+
# attempts remain
|
515
|
+
#
|
516
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
517
|
+
# are willing to allow
|
518
|
+
#
|
519
|
+
# @raise [Exception] Raised if we fail delete the instance, either through
|
520
|
+
# errors or running out of attempts
|
356
521
|
def delete_instance(name, start, attempts)
|
357
522
|
result = execute( instance_delete_req( name ), start, attempts )
|
358
|
-
|
523
|
+
|
524
|
+
# Ensure deletion of instance
|
359
525
|
try = (Time.now - start) / SLEEPWAIT
|
360
526
|
while try <= attempts
|
361
527
|
begin
|
@@ -371,15 +537,23 @@ module Beaker
|
|
371
537
|
@logger.debug("#{name} instance was not removed before timeout, may still exist")
|
372
538
|
end
|
373
539
|
|
374
|
-
#Delete a Google Compute disk on the current connection
|
375
|
-
|
376
|
-
|
377
|
-
#
|
378
|
-
|
379
|
-
|
540
|
+
# Delete a Google Compute disk on the current connection
|
541
|
+
#
|
542
|
+
# @param [String] name The name of the disk to delete
|
543
|
+
#
|
544
|
+
# @param [Integer] start The time when we started code execution, it is
|
545
|
+
# compared to Time.now to determine how many further code execution
|
546
|
+
# attempts remain
|
547
|
+
#
|
548
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
549
|
+
# are willing to allow
|
550
|
+
#
|
551
|
+
# @raise [Exception] Raised if we fail delete the disk, either through
|
552
|
+
# errors or running out of attempts
|
380
553
|
def delete_disk(name, start, attempts)
|
381
554
|
result = execute( disk_delete_req( name ), start, attempts )
|
382
|
-
|
555
|
+
|
556
|
+
# Ensure deletion of disk
|
383
557
|
try = (Time.now - start) / SLEEPWAIT
|
384
558
|
while try <= attempts
|
385
559
|
begin
|
@@ -395,12 +569,19 @@ module Beaker
|
|
395
569
|
@logger.debug("#{name} disk was not removed before timeout, may still exist")
|
396
570
|
end
|
397
571
|
|
398
|
-
#Delete a Google Compute firewall on the current connection
|
399
|
-
|
400
|
-
|
401
|
-
#
|
402
|
-
|
403
|
-
|
572
|
+
# Delete a Google Compute firewall on the current connection
|
573
|
+
#
|
574
|
+
# @param [String] name The name of the firewall to delete
|
575
|
+
#
|
576
|
+
# @param [Integer] start The time when we started code execution, it is
|
577
|
+
# compared to Time.now to determine how many further code execution
|
578
|
+
# attempts remain
|
579
|
+
#
|
580
|
+
# @param [Integer] attempts The total amount of attempts to execute that we
|
581
|
+
# are willing to allow
|
582
|
+
#
|
583
|
+
# @raise [Exception] Raised if we fail delete the firewall, either through
|
584
|
+
# errors or running out of attempts
|
404
585
|
def delete_firewall(name, start, attempts)
|
405
586
|
result = execute( firewall_delete_req( name ), start, attempts )
|
406
587
|
#ensure deletion of disk
|
@@ -419,60 +600,78 @@ module Beaker
|
|
419
600
|
@logger.debug("#{name} firewall was not removed before timeout, may still exist")
|
420
601
|
end
|
421
602
|
|
422
|
-
|
423
|
-
#
|
424
|
-
|
425
|
-
|
603
|
+
# Create a Google Compute list all images request
|
604
|
+
#
|
605
|
+
# @param [String] name The Google Compute project name to query
|
606
|
+
#
|
607
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
426
608
|
def image_list_req(name)
|
427
609
|
{ :api_method => @compute.images.list,
|
428
610
|
:parameters => { 'project' => name } }
|
429
611
|
end
|
430
612
|
|
431
|
-
#Create a Google Compute list all disks request
|
432
|
-
|
613
|
+
# Create a Google Compute list all disks request
|
614
|
+
#
|
615
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
433
616
|
def disk_list_req
|
434
617
|
{ :api_method => @compute.disks.list,
|
435
618
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME } }
|
436
619
|
end
|
437
620
|
|
438
|
-
#Create a Google Compute get disk request
|
439
|
-
|
440
|
-
|
621
|
+
# Create a Google Compute get disk request
|
622
|
+
#
|
623
|
+
# @param [String] name The name of the disk to query for
|
624
|
+
#
|
625
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
441
626
|
def disk_get_req(name)
|
442
627
|
{ :api_method => @compute.disks.get,
|
443
628
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME, 'disk' => name } }
|
444
629
|
end
|
445
630
|
|
446
|
-
#Create a Google Compute disk delete request
|
447
|
-
|
448
|
-
|
631
|
+
# Create a Google Compute disk delete request
|
632
|
+
#
|
633
|
+
# @param [String] name The name of the disk delete
|
634
|
+
#
|
635
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
449
636
|
def disk_delete_req(name)
|
450
637
|
{ :api_method => @compute.disks.delete,
|
451
638
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME, 'disk' => name } }
|
452
639
|
end
|
453
640
|
|
454
|
-
#Create a Google Compute disk create request
|
455
|
-
|
456
|
-
|
457
|
-
|
641
|
+
# Create a Google Compute disk create request
|
642
|
+
#
|
643
|
+
# @param [String] name The name of the disk to create
|
644
|
+
#
|
645
|
+
# @param [String] source The link to a Google Compute image to base the
|
646
|
+
# disk creation on
|
647
|
+
#
|
648
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
649
|
+
#
|
458
650
|
def disk_insert_req(name, source)
|
459
651
|
{ :api_method => @compute.disks.insert,
|
460
652
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME, 'sourceImage' => source },
|
461
653
|
:body_object => { 'name' => name, 'sizeGb' => DEFAULT_DISK_SIZE } }
|
462
654
|
end
|
463
655
|
|
464
|
-
#Create a Google Compute get firewall request
|
465
|
-
|
466
|
-
|
656
|
+
# Create a Google Compute get firewall request
|
657
|
+
#
|
658
|
+
# @param [String] name The name of the firewall to query for
|
659
|
+
#
|
660
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
467
661
|
def firewall_get_req(name)
|
468
662
|
{ :api_method => @compute.firewalls.get,
|
469
663
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME, 'firewall' => name } }
|
470
664
|
end
|
471
665
|
|
472
|
-
#Create a Google Compute insert firewall request, open ports 443, 8140 and
|
473
|
-
|
474
|
-
|
475
|
-
|
666
|
+
# Create a Google Compute insert firewall request, open ports 443, 8140 and
|
667
|
+
# 61613
|
668
|
+
#
|
669
|
+
# @param [String] name The name of the firewall to create
|
670
|
+
#
|
671
|
+
# @param [String] network The link to the Google Compute network to attach
|
672
|
+
# this firewall to
|
673
|
+
#
|
674
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
476
675
|
def firewall_insert_req(name, network)
|
477
676
|
{ :api_method => @compute.firewalls.insert,
|
478
677
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME },
|
@@ -482,39 +681,48 @@ module Beaker
|
|
482
681
|
'sourceRanges' => [ "0.0.0.0/0" ] } }
|
483
682
|
end
|
484
683
|
|
485
|
-
#Create a Google Compute delete firewall request
|
486
|
-
|
487
|
-
|
684
|
+
# Create a Google Compute delete firewall request
|
685
|
+
#
|
686
|
+
# @param [String] name The name of the firewall to delete
|
687
|
+
#
|
688
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
488
689
|
def firewall_delete_req(name)
|
489
690
|
{ :api_method => @compute.firewalls.delete,
|
490
691
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME, 'firewall' => name } }
|
491
692
|
end
|
492
693
|
|
493
|
-
#Create a Google Compute list firewall request
|
494
|
-
|
694
|
+
# Create a Google Compute list firewall request
|
695
|
+
#
|
696
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
495
697
|
def firewall_list_req()
|
496
698
|
{ :api_method => @compute.firewalls.list,
|
497
699
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME } }
|
498
700
|
end
|
499
701
|
|
500
|
-
#Create a Google Compute get network request
|
501
|
-
|
502
|
-
|
702
|
+
# Create a Google Compute get network request
|
703
|
+
#
|
704
|
+
# @param [String] name (default) The name of the network to access
|
705
|
+
# information about
|
706
|
+
#
|
707
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
503
708
|
def network_get_req(name = 'default')
|
504
709
|
{ :api_method => @compute.networks.get,
|
505
710
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME, 'network' => name } }
|
506
711
|
end
|
507
712
|
|
508
|
-
#Create a Google Compute zone operation request
|
509
|
-
|
713
|
+
# Create a Google Compute zone operation request
|
714
|
+
#
|
715
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
510
716
|
def operation_get_req(name)
|
511
717
|
{ :api_method => @compute.zone_operations.get,
|
512
718
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME, 'operation' => name } }
|
513
719
|
end
|
514
720
|
|
515
|
-
#Set tags on a Google Compute instance
|
516
|
-
|
517
|
-
|
721
|
+
# Set tags on a Google Compute instance
|
722
|
+
#
|
723
|
+
# @param [Array<String>] data An array of tags to be added to an instance
|
724
|
+
#
|
725
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
518
726
|
def instance_setMetadata_req(name, fingerprint, data)
|
519
727
|
{ :api_method => @compute.instances.set_metadata,
|
520
728
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME, 'instance' => name },
|
@@ -524,35 +732,47 @@ module Beaker
|
|
524
732
|
}
|
525
733
|
end
|
526
734
|
|
527
|
-
#Create a Google Compute list instance request
|
528
|
-
|
735
|
+
# Create a Google Compute list instance request
|
736
|
+
#
|
737
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
529
738
|
def instance_list_req
|
530
739
|
{ :api_method => @compute.instances.list,
|
531
740
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME } }
|
532
741
|
end
|
533
742
|
|
534
|
-
#Create a Google Compute get instance request
|
535
|
-
|
536
|
-
|
743
|
+
# Create a Google Compute get instance request
|
744
|
+
#
|
745
|
+
# @param [String] name The name of the instance to query for
|
746
|
+
#
|
747
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
537
748
|
def instance_get_req(name)
|
538
749
|
{ :api_method => @compute.instances.get,
|
539
750
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME, 'instance' => name } }
|
540
751
|
end
|
541
752
|
|
542
|
-
#Create a Google Compute instance delete request
|
543
|
-
|
544
|
-
|
753
|
+
# Create a Google Compute instance delete request
|
754
|
+
#
|
755
|
+
# @param [String] name The name of the instance to delete
|
756
|
+
#
|
757
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
545
758
|
def instance_delete_req(name)
|
546
759
|
{ :api_method => @compute.instances.delete,
|
547
760
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME, 'instance' => name } }
|
548
761
|
end
|
549
762
|
|
550
|
-
#Create a Google Compute instance create request
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
763
|
+
# Create a Google Compute instance create request
|
764
|
+
#
|
765
|
+
# @param [String] name The name of the instance to create
|
766
|
+
#
|
767
|
+
# @param [String] image The link to the image to use for instance create
|
768
|
+
#
|
769
|
+
# @param [String] machineType The link to the type of Google Compute
|
770
|
+
# instance to create (indicates cpus and memory size)
|
771
|
+
#
|
772
|
+
# @param [String] disk The link to the disk to be used by the newly created
|
773
|
+
# instance
|
774
|
+
#
|
775
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
556
776
|
def instance_insert_req(name, image, machineType, disk)
|
557
777
|
{ :api_method => @compute.instances.insert,
|
558
778
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME },
|
@@ -566,12 +786,12 @@ module Beaker
|
|
566
786
|
'network' => default_network } ] } }
|
567
787
|
end
|
568
788
|
|
569
|
-
#Create a Google Compute machineType get request
|
570
|
-
|
789
|
+
# Create a Google Compute machineType get request
|
790
|
+
#
|
791
|
+
# @return [Hash] A correctly formatted Google Compute request hash
|
571
792
|
def machineType_get_req()
|
572
793
|
{ :api_method => @compute.machine_types.get,
|
573
794
|
:parameters => { 'project' => @options[:gce_project], 'zone' => DEFAULT_ZONE_NAME, 'machineType' => @options[:gce_machine_type] || DEFAULT_MACHINE_TYPE } }
|
574
795
|
end
|
575
|
-
|
576
796
|
end
|
577
797
|
end
|