beaker-google 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +23 -13
- data/.github/workflows/release.yml +1 -1
- data/.gitignore +1 -0
- data/.rubocop.yml +2 -518
- data/.simplecov +2 -0
- data/CHANGELOG.md +18 -1
- data/Gemfile +5 -2
- data/Rakefile +16 -6
- data/beaker-google.gemspec +20 -19
- data/bin/beaker-google +1 -0
- data/lib/beaker/hypervisor/google.rb +5 -1
- data/lib/beaker/hypervisor/google_compute.rb +51 -21
- data/lib/beaker/hypervisor/google_compute_helper.rb +589 -581
- data/lib/beaker-google/version.rb +3 -1
- metadata +53 -33
data/Rakefile
CHANGED
@@ -1,5 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rspec/core/rake_task'
|
2
4
|
|
5
|
+
begin
|
6
|
+
require 'voxpupuli/rubocop/rake'
|
7
|
+
rescue LoadError
|
8
|
+
# the voxpupuli-rubocop gem is optional
|
9
|
+
end
|
10
|
+
|
3
11
|
###########################################################
|
4
12
|
#
|
5
13
|
# Documentation Tasks
|
@@ -13,12 +21,12 @@ def running?(cmdline)
|
|
13
21
|
found = ps.lines.grep(/#{Regexp.quote(cmdline)}/)
|
14
22
|
raise StandardError, "Found multiple YARD Servers. Don't know what to do." if found.length > 1
|
15
23
|
|
16
|
-
yes = found.empty?
|
24
|
+
yes = !found.empty?
|
17
25
|
[yes, found.first]
|
18
26
|
end
|
19
27
|
|
20
28
|
def pid_from(output)
|
21
|
-
output.squeeze(' ').strip.split
|
29
|
+
output.squeeze(' ').strip.split[1]
|
22
30
|
end
|
23
31
|
|
24
32
|
desc 'Start the documentation server in the foreground'
|
@@ -44,7 +52,7 @@ namespace :docs do
|
|
44
52
|
Dir.chdir(__dir__)
|
45
53
|
output = `bundle exec yard doc`
|
46
54
|
puts output
|
47
|
-
raise 'Errors/Warnings during yard documentation generation' if
|
55
|
+
raise 'Errors/Warnings during yard documentation generation' if /\[warn\]|\[error\]/.match?(output)
|
48
56
|
|
49
57
|
Dir.chdir(original_dir)
|
50
58
|
end
|
@@ -63,6 +71,7 @@ namespace :docs do
|
|
63
71
|
end
|
64
72
|
end
|
65
73
|
|
74
|
+
desc 'Alias for `background`'
|
66
75
|
task(:bg) { Rake::Task['docs:background'].invoke }
|
67
76
|
|
68
77
|
desc 'Check the status of the documentation server'
|
@@ -84,10 +93,10 @@ namespace :docs do
|
|
84
93
|
puts "Found a YARD Server running with pid #{pid}"
|
85
94
|
`kill #{pid}`
|
86
95
|
puts 'Stopping...'
|
87
|
-
yes,
|
96
|
+
yes, = running?(DOCS_DAEMON)
|
88
97
|
if yes
|
89
98
|
`kill -9 #{pid}`
|
90
|
-
yes,
|
99
|
+
yes, = running?(DOCS_DAEMON)
|
91
100
|
if yes
|
92
101
|
puts 'Could not Stop Server!'
|
93
102
|
else
|
@@ -106,9 +115,10 @@ begin
|
|
106
115
|
require 'rubygems'
|
107
116
|
require 'github_changelog_generator/task'
|
108
117
|
rescue LoadError
|
118
|
+
# the github_changelog_generator gem is optional
|
109
119
|
else
|
110
120
|
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
|
111
|
-
config.exclude_labels = %w
|
121
|
+
config.exclude_labels = %w[duplicate question invalid wontfix wont-fix skip-changelog]
|
112
122
|
config.user = 'voxpupuli'
|
113
123
|
config.project = 'beaker-google'
|
114
124
|
gem_version = Gem::Specification.load("#{config.project}.gemspec").version
|
data/beaker-google.gemspec
CHANGED
@@ -1,35 +1,36 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('lib', __dir__)
|
3
4
|
require 'beaker-google/version'
|
4
5
|
|
5
6
|
Gem::Specification.new do |s|
|
6
|
-
s.name =
|
7
|
+
s.name = 'beaker-google'
|
7
8
|
s.version = BeakerGoogle::VERSION
|
8
|
-
s.authors = [
|
9
|
-
s.email = [
|
10
|
-
s.homepage =
|
11
|
-
s.summary =
|
12
|
-
s.description =
|
13
|
-
s.license = '
|
9
|
+
s.authors = %w[Puppet Voxpupuli]
|
10
|
+
s.email = ['voxpupuli@groups.io']
|
11
|
+
s.homepage = 'https://github.com/voxpupuli/beaker-google'
|
12
|
+
s.summary = 'Beaker DSL Extension Helpers!'
|
13
|
+
s.description = 'Google Compute Engine support for the Beaker acceptance testing tool.'
|
14
|
+
s.license = 'Apache-2.0'
|
14
15
|
|
15
16
|
s.files = `git ls-files`.split("\n")
|
16
|
-
s.
|
17
|
-
s.
|
18
|
-
s.require_paths = ["lib"]
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
18
|
+
s.require_paths = ['lib']
|
19
19
|
|
20
|
-
s.required_ruby_version = Gem::Requirement.new('>= 2.
|
20
|
+
s.required_ruby_version = Gem::Requirement.new('>= 2.7')
|
21
21
|
|
22
22
|
# Testing dependencies
|
23
|
-
s.add_development_dependency 'rspec', '~> 3.0'
|
24
|
-
s.add_development_dependency 'rspec-its'
|
25
23
|
s.add_development_dependency 'fakefs', '~> 2.4'
|
26
|
-
s.add_development_dependency 'rake', '~> 13.0'
|
27
|
-
s.add_development_dependency 'simplecov'
|
28
24
|
s.add_development_dependency 'pry', '~> 0.10'
|
25
|
+
s.add_development_dependency 'rake', '~> 13.0'
|
26
|
+
s.add_development_dependency 'rspec', '~> 3.0'
|
27
|
+
s.add_development_dependency 'rspec-its', '~> 1.3'
|
28
|
+
s.add_development_dependency 'simplecov', '~> 0.22.0'
|
29
|
+
s.add_development_dependency 'voxpupuli-rubocop', '~> 2.7.0'
|
29
30
|
|
30
31
|
# Documentation dependencies
|
31
|
-
s.add_development_dependency '
|
32
|
-
s.add_development_dependency '
|
32
|
+
s.add_development_dependency 'thin', '~> 1.8', '>= 1.8.2'
|
33
|
+
s.add_development_dependency 'yard', '~> 0.9.36'
|
33
34
|
|
34
35
|
# Run time dependencies
|
35
36
|
s.add_runtime_dependency 'stringify-hash', '~> 0.0.0'
|
data/bin/beaker-google
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'securerandom'
|
2
4
|
|
3
5
|
module Beaker
|
@@ -5,6 +7,8 @@ module Beaker
|
|
5
7
|
class GoogleCompute < Beaker::Hypervisor
|
6
8
|
SLEEPWAIT = 5
|
7
9
|
|
10
|
+
WINDOWS_IMAGE_PROJECT = %w[windows-cloud windows-sql-cloud].freeze
|
11
|
+
|
8
12
|
# Do some reasonable sleuthing on the SSH public key for GCE
|
9
13
|
|
10
14
|
##
|
@@ -15,9 +19,12 @@ module Beaker
|
|
15
19
|
# @raise [Error] if the private key can not be found
|
16
20
|
def find_google_ssh_private_key
|
17
21
|
private_keyfile = ENV.fetch('BEAKER_gce_ssh_public_key',
|
18
|
-
|
19
|
-
|
22
|
+
File.join(Dir.home, '.ssh', 'google_compute_engine'))
|
23
|
+
if @options[:gce_ssh_private_key] && !File.exist?(private_keyfile)
|
24
|
+
private_keyfile = @options[:gce_ssh_private_key]
|
25
|
+
end
|
20
26
|
raise("Could not find GCE Private SSH key at '#{keyfile}'") unless File.exist?(private_keyfile)
|
27
|
+
|
21
28
|
@options[:gce_ssh_private_key] = private_keyfile
|
22
29
|
private_keyfile
|
23
30
|
end
|
@@ -33,6 +40,7 @@ module Beaker
|
|
33
40
|
public_keyfile = private_keyfile << '.pub'
|
34
41
|
public_keyfile = @options[:gce_ssh_public_key] if @options[:gce_ssh_public_key] && !File.exist?(public_keyfile)
|
35
42
|
raise("Could not find GCE Public SSH key at '#{keyfile}'") unless File.exist?(public_keyfile)
|
43
|
+
|
36
44
|
@options[:gce_ssh_public_key] = public_keyfile
|
37
45
|
public_keyfile
|
38
46
|
end
|
@@ -89,25 +97,40 @@ module Beaker
|
|
89
97
|
# set firewall to open pe ports
|
90
98
|
network = @gce_helper.get_network
|
91
99
|
|
92
|
-
@external_firewall_name = test_group_identifier
|
100
|
+
@external_firewall_name = "#{test_group_identifier}-external"
|
93
101
|
|
94
102
|
# Always allow ssh from anywhere as it's needed for Beaker to run
|
95
|
-
@gce_helper.create_firewall(
|
103
|
+
@gce_helper.create_firewall(
|
104
|
+
@external_firewall_name,
|
105
|
+
network,
|
106
|
+
allow: @options[:gce_ports] + ['22/tcp'],
|
107
|
+
source_ranges: ['0.0.0.0/0'],
|
108
|
+
target_tags: [test_group_identifier],
|
109
|
+
)
|
96
110
|
|
97
111
|
@logger.debug("Created External Google Compute firewall #{@external_firewall_name}")
|
98
112
|
|
99
113
|
# Create a firewall that opens everything between all the hosts in this test group
|
100
|
-
@internal_firewall_name = test_group_identifier
|
114
|
+
@internal_firewall_name = "#{test_group_identifier}-internal"
|
101
115
|
internal_ports = ['1-65535/tcp', '1-65535/udp', '-1/icmp']
|
102
|
-
@gce_helper.create_firewall(
|
116
|
+
@gce_helper.create_firewall(
|
117
|
+
@internal_firewall_name,
|
118
|
+
network,
|
119
|
+
allow: internal_ports,
|
120
|
+
source_tags: [test_group_identifier],
|
121
|
+
target_tags: [test_group_identifier],
|
122
|
+
)
|
103
123
|
@logger.debug("Created test group Google Compute firewall #{@internal_firewall_name}")
|
104
124
|
|
105
125
|
@hosts.each do |host|
|
106
126
|
machine_type_name = ENV.fetch('BEAKER_gce_machine_type', host['gce_machine_type'])
|
107
127
|
raise "Must provide a machine type name in 'gce_machine_type'." if machine_type_name.nil?
|
128
|
+
|
108
129
|
# Get the GCE machine type object for this host
|
109
130
|
machine_type = @gce_helper.get_machine_type(machine_type_name)
|
110
|
-
|
131
|
+
if machine_type.nil?
|
132
|
+
raise "Unable to find machine type named #{machine_type_name} in region #{@compute.default_zone}"
|
133
|
+
end
|
111
134
|
|
112
135
|
# Find the image to use to create the new VM.
|
113
136
|
# Either `image` or `family` must be set in the configuration. Accepted formats
|
@@ -122,7 +145,7 @@ module Beaker
|
|
122
145
|
if host[:image]
|
123
146
|
image_selector = host[:image]
|
124
147
|
# Do we have a project name?
|
125
|
-
if
|
148
|
+
if image_selector.include?('/')
|
126
149
|
image_project, image_name = image_selector.split('/')[0..1]
|
127
150
|
else
|
128
151
|
image_project = @gce_helper.options[:gce_project]
|
@@ -133,7 +156,7 @@ module Beaker
|
|
133
156
|
elsif host[:family]
|
134
157
|
image_selector = host[:family]
|
135
158
|
# Do we have a project name?
|
136
|
-
if
|
159
|
+
if image_selector.include?('/')
|
137
160
|
image_project, family_name = image_selector.split('/')
|
138
161
|
else
|
139
162
|
image_project = @gce_helper.options[:gce_project]
|
@@ -145,7 +168,7 @@ module Beaker
|
|
145
168
|
raise('You must specify either :image or :family')
|
146
169
|
end
|
147
170
|
|
148
|
-
unique_host_id = test_group_identifier
|
171
|
+
unique_host_id = "#{test_group_identifier}-#{generate_host_name}"
|
149
172
|
|
150
173
|
boot_size = host['volume_size'] || img.disk_size_gb
|
151
174
|
|
@@ -160,8 +183,15 @@ module Beaker
|
|
160
183
|
# add a new instance of the image
|
161
184
|
operation = @gce_helper.create_instance(host['vmhostname'], img, machine_type, boot_size, host.name)
|
162
185
|
unless operation.error.nil?
|
163
|
-
raise "Unable to create Google Compute Instance #{
|
186
|
+
raise "Unable to create Google Compute Instance #{
|
187
|
+
host.name
|
188
|
+
}: [#{
|
189
|
+
operation.error.errors[0].code
|
190
|
+
}] #{
|
191
|
+
operation.error.errors[0].message
|
192
|
+
}"
|
164
193
|
end
|
194
|
+
|
165
195
|
@logger.debug("Created Google Compute instance for #{host.name}: #{host['vmhostname']}")
|
166
196
|
instance = @gce_helper.get_instance(host['vmhostname'])
|
167
197
|
|
@@ -169,11 +199,11 @@ module Beaker
|
|
169
199
|
@logger.debug("Added network tag #{test_group_identifier} to instance")
|
170
200
|
|
171
201
|
# Make sure we have a non root/Adminsitor user to log in as
|
172
|
-
if host['user'] ==
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
202
|
+
initial_user = if host['user'] == 'root' || host['user'] == 'Administrator' || host['user'].empty?
|
203
|
+
'google_compute'
|
204
|
+
else
|
205
|
+
host['user']
|
206
|
+
end
|
177
207
|
|
178
208
|
# add metadata to instance, if there is any to set
|
179
209
|
# mdata = format_metadata
|
@@ -181,18 +211,18 @@ module Beaker
|
|
181
211
|
mdata = [
|
182
212
|
{
|
183
213
|
key: 'ssh-keys',
|
184
|
-
value: "#{initial_user}:#{File.read(find_google_ssh_public_key).strip}"
|
214
|
+
value: "#{initial_user}:#{File.read(find_google_ssh_public_key).strip}",
|
185
215
|
},
|
186
216
|
# For now oslogin needs to be disabled as there's no way to log in as root and it would
|
187
217
|
# take too much work on beaker to add sudo support to everything
|
188
218
|
{
|
189
219
|
key: 'enable-oslogin',
|
190
|
-
value: 'FALSE'
|
220
|
+
value: 'FALSE',
|
191
221
|
},
|
192
222
|
]
|
193
223
|
|
194
224
|
# Check for google's default windows images and turn on ssh if found
|
195
|
-
if image_project
|
225
|
+
if WINDOWS_IMAGE_PROJECT.include?(image_project)
|
196
226
|
# Turn on SSH on GCP's default windows images
|
197
227
|
mdata << {
|
198
228
|
key: 'enable-windows-ssh',
|
@@ -200,12 +230,12 @@ module Beaker
|
|
200
230
|
}
|
201
231
|
mdata << {
|
202
232
|
key: 'sysprep-specialize-script-cmd',
|
203
|
-
value: 'start /wait googet -noconfirm=true update && start /wait googet -noconfirm=true install google-compute-engine-ssh',
|
233
|
+
value: 'start /wait googet -noconfirm=true update && start /wait googet -noconfirm=true install google-compute-engine-ssh', # rubocop:disable Layout/LineLength
|
204
234
|
}
|
205
235
|
# Some versions of windows don't seem to add the OpenSSH directory to the path which prevents scp from working
|
206
236
|
mdata << {
|
207
237
|
key: 'sysprep-specialize-script-ps1',
|
208
|
-
value: '[Environment]::SetEnvironmentVariable( "PATH", "$ENV:PATH;C:\Program Files\OpenSSH", [EnvironmentVariableTarget]::Machine )',
|
238
|
+
value: '[Environment]::SetEnvironmentVariable( "PATH", "$ENV:PATH;C:\Program Files\OpenSSH", [EnvironmentVariableTarget]::Machine )', # rubocop:disable Layout/LineLength
|
209
239
|
}
|
210
240
|
end
|
211
241
|
unless mdata.empty?
|