cem_acpt 0.3.6-universal-java-17 → 0.4.0-universal-java-17
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 +4 -4
- data/Gemfile.lock +2 -2
- data/lib/cem_acpt/context.rb +3 -0
- data/lib/cem_acpt/logging/formatter.rb +6 -10
- data/lib/cem_acpt/logging.rb +60 -8
- data/lib/cem_acpt/platform/gcp/cmd.rb +31 -8
- data/lib/cem_acpt/platform/gcp/compute.rb +7 -4
- data/lib/cem_acpt/platform/utils/linux.rb +34 -0
- data/lib/cem_acpt/test_runner/run_handler.rb +12 -1
- data/lib/cem_acpt/utils.rb +4 -0
- data/lib/cem_acpt/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd740df7227095812b1fa29a9267fdb3d9470567d5990a56799de780cf45d220
|
4
|
+
data.tar.gz: 1b53e57a9c26200cdabde23784bbfc0a06cacfd0141636682c9c590669fd697f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7932858ea4758458609cced16b9049d8ebec80304a0cb13a8aa00ff4787435686129d21c5ef60a13fabc52a4e9e945cf6b1a756a822bd70792e2b34f2df493e
|
7
|
+
data.tar.gz: 0dac3c3ce8acee13005e767fcaaaae93b07507f9e969c9faa87d629fc95c242f979ebff79e1249465ad37bd75eb5015b1c722c6bbf68c775738791003767af6c
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cem_acpt (0.
|
4
|
+
cem_acpt (0.4.0-universal-java-17)
|
5
5
|
concurrent-ruby (>= 1.1, < 2.0)
|
6
6
|
deep_merge (>= 1.2, < 2.0)
|
7
7
|
ed25519 (>= 1.2, < 2.0)
|
@@ -97,4 +97,4 @@ DEPENDENCIES
|
|
97
97
|
rubocop
|
98
98
|
|
99
99
|
BUNDLED WITH
|
100
|
-
2.3.
|
100
|
+
2.3.15
|
data/lib/cem_acpt/context.rb
CHANGED
@@ -37,6 +37,9 @@ module CemAcpt
|
|
37
37
|
def new_test_ssh_key
|
38
38
|
log('Creating ephemeral SSH key and known hosts file for acceptance test suites...')
|
39
39
|
@ssh_priv_key, @ssh_pub_key, @ssh_known_hosts = CemAcpt::Utils::SSH::Ephemeral.create
|
40
|
+
unless @ssh_priv_key && @ssh_pub_key && @ssh_known_hosts
|
41
|
+
log('Did not create ephemeral SSH key and known hosts file for acceptance test suites. Environment variable CEM_ACPT_TEST_SSH_KEY is set.', :warn)
|
42
|
+
end
|
40
43
|
log('Successfully created SSH files.')
|
41
44
|
log("SSH private key: #{@ssh_priv_key}", :debug)
|
42
45
|
log("SSH public key: #{@ssh_pub_key}", :debug)
|
@@ -69,11 +69,11 @@ module CemAcpt
|
|
69
69
|
|
70
70
|
class GithubActionFormatter < FileFormatter
|
71
71
|
SEV_MAP = {
|
72
|
-
'DEBUG' => '::debug',
|
73
|
-
'INFO' => '::notice',
|
74
|
-
'WARN' => '::warning',
|
75
|
-
'ERROR' => '::error',
|
76
|
-
'FATAL' => '::error',
|
72
|
+
'DEBUG' => '::debug::',
|
73
|
+
'INFO' => '::notice::',
|
74
|
+
'WARN' => '::warning::',
|
75
|
+
'ERROR' => '::error::',
|
76
|
+
'FATAL' => '::error::',
|
77
77
|
}.freeze
|
78
78
|
|
79
79
|
def initialize
|
@@ -84,11 +84,7 @@ module CemAcpt
|
|
84
84
|
private
|
85
85
|
|
86
86
|
def format(severity, _datetime, _progname, msg)
|
87
|
-
|
88
|
-
"#{SEV_MAP[severity]}::{#{msg}}\n"
|
89
|
-
else
|
90
|
-
"#{SEV_MAP[severity]} #{msg}\n"
|
91
|
-
end
|
87
|
+
"#{SEV_MAP[severity]}#{msg}\n"
|
92
88
|
end
|
93
89
|
end
|
94
90
|
end
|
data/lib/cem_acpt/logging.rb
CHANGED
@@ -7,17 +7,17 @@ module CemAcpt
|
|
7
7
|
# Logging for CemAcpt
|
8
8
|
module Logging
|
9
9
|
LEVEL_MAP = {
|
10
|
-
'debug' => Logger::DEBUG,
|
11
|
-
'info' => Logger::INFO,
|
12
|
-
'warn' => Logger::WARN,
|
13
|
-
'error' => Logger::ERROR,
|
14
|
-
'fatal' => Logger::FATAL,
|
15
|
-
'unknown' => Logger::UNKNOWN,
|
10
|
+
'debug' => ::Logger::DEBUG,
|
11
|
+
'info' => ::Logger::INFO,
|
12
|
+
'warn' => ::Logger::WARN,
|
13
|
+
'error' => ::Logger::ERROR,
|
14
|
+
'fatal' => ::Logger::FATAL,
|
15
|
+
'unknown' => ::Logger::UNKNOWN,
|
16
16
|
}
|
17
17
|
|
18
18
|
# Delegator class for when you want to log to multiple devices
|
19
19
|
# at the same time, such as STDOUT and a file.
|
20
|
-
# @param loggers [
|
20
|
+
# @param loggers [Logger] one or more instances of CemAcpt::Logging::Logger
|
21
21
|
class MultiLogger
|
22
22
|
def initialize(*loggers)
|
23
23
|
@loggers = loggers
|
@@ -36,6 +36,58 @@ module CemAcpt
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
# Delagator class for the standard Ruby Logger class.
|
40
|
+
# This class is used to ensure the Github Actions formatter
|
41
|
+
# correctly formats the log output when using the standard
|
42
|
+
# Ruby Logger class methods such as #info, #debug, etc.
|
43
|
+
class Logger < ::Logger
|
44
|
+
def initialize(logdev, shift_age = 0, shift_size = 1_048_576, **kwargs)
|
45
|
+
super(logdev, shift_age, shift_size, **kwargs)
|
46
|
+
if kwargs[:formatter].is_a?(Formatter::GithubActionFormatter) || ENV['GITHUB_ACTIONS'] || ENV['CI']
|
47
|
+
@ci_mode = true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def debug(progname = nil, &block)
|
52
|
+
unless log_ci_mode('debug', progname, &block)
|
53
|
+
super
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def info(progname = nil, &block)
|
58
|
+
unless log_ci_mode('info', progname, &block)
|
59
|
+
super
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def warn(progname = nil, &block)
|
64
|
+
unless log_ci_mode('warn', progname, &block)
|
65
|
+
super
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def error(progname = nil, &block)
|
70
|
+
unless log_ci_mode('error', progname, &block)
|
71
|
+
super
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def fatal(progname = nil, &block)
|
76
|
+
unless log_ci_mode('fatal', progname, &block)
|
77
|
+
super
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def log_ci_mode(severity, progname = nil, &block)
|
84
|
+
return false unless @ci_mode
|
85
|
+
|
86
|
+
self.<<("::#{severity}::#{progname || (block && block.call) || ''}")
|
87
|
+
true
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
39
91
|
class << self
|
40
92
|
def new_logger(*logdevs, **configs)
|
41
93
|
new_configs = current_log_config.merge(configs.reject { |_, v| v.nil? })
|
@@ -106,7 +158,7 @@ module CemAcpt
|
|
106
158
|
logdev: $stdout,
|
107
159
|
shift_age: 'o',
|
108
160
|
shift_size: 1_048_576,
|
109
|
-
level: Logger::INFO,
|
161
|
+
level: ::Logger::INFO,
|
110
162
|
progname: 'CemAcpt',
|
111
163
|
datetime_format: '%Y%m%dT%H%M%S%z',
|
112
164
|
formatter: formatter,
|
@@ -67,7 +67,9 @@ module CemAcpt::Platform::Gcp
|
|
67
67
|
def ssh_key
|
68
68
|
return @ssh_key unless @ssh_key.nil?
|
69
69
|
|
70
|
-
if
|
70
|
+
if CemAcpt::Platform::Utils::Linux::SSHelper.env_ssh_pri_key?
|
71
|
+
@ssh_key = CemAcpt::Platform::Utils::Linux::SSHelper.env_ssh_pri_key
|
72
|
+
elsif File.exist?(File.join([ENV['HOME'], '.ssh', 'acpt_test_key']))
|
71
73
|
@ssh_key = File.join([ENV['HOME'], '.ssh', 'acpt_test_key'])
|
72
74
|
else
|
73
75
|
logger.debug("Test SSH key not found at #{File.join([ENV['HOME'], '.ssh', 'acpt_test_key'])}, using default")
|
@@ -117,13 +119,14 @@ module CemAcpt::Platform::Gcp
|
|
117
119
|
CemAcpt::Platform::Utils::Linux::SSHelper.remove_known_host(vm_alias(instance_name), kh_file)
|
118
120
|
end
|
119
121
|
local_exec("compute instances delete #{instance_name} --quiet")
|
120
|
-
rescue StandardError
|
121
|
-
#
|
122
|
+
rescue StandardError => e
|
123
|
+
# Just debug logging, otherwise ignore
|
124
|
+
logger.debug("Failed to delete known host for #{instance_name}, alias #{vm_alias(instance_name)}: #{e.message}")
|
122
125
|
end
|
123
126
|
|
124
127
|
# Returns a Hash describing a GCP VM instance.
|
125
128
|
def vm_describe(instance_name, out_format: 'json', out_filter: nil)
|
126
|
-
local_exec("compute instances describe #{instance_name}", out_format: out_format, out_filter: out_filter)
|
129
|
+
@vm_describe ||= local_exec("compute instances describe #{instance_name}", out_format: out_format, out_filter: out_filter)
|
127
130
|
end
|
128
131
|
|
129
132
|
# This function runs the specified command as the currently authenticated user
|
@@ -312,7 +315,17 @@ module CemAcpt::Platform::Gcp
|
|
312
315
|
end
|
313
316
|
|
314
317
|
def gcloud_ssh(instance_name, command, ignore_command_errors: false)
|
315
|
-
|
318
|
+
cmd = [
|
319
|
+
'compute',
|
320
|
+
'ssh',
|
321
|
+
'--ssh-key-file',
|
322
|
+
ssh_key,
|
323
|
+
'--tunnel-through-iap',
|
324
|
+
"--ssh-flag='-o UserKnownHostsFile=#{ssh_opts[:user_known_hosts_file]}'",
|
325
|
+
instance_name,
|
326
|
+
"--command='#{command}'",
|
327
|
+
].join(' ')
|
328
|
+
local_exec(cmd)
|
316
329
|
rescue StandardError => e
|
317
330
|
raise e unless ignore_command_errors
|
318
331
|
end
|
@@ -322,16 +335,21 @@ module CemAcpt::Platform::Gcp
|
|
322
335
|
end
|
323
336
|
|
324
337
|
def ssh_all_known_hosts
|
325
|
-
[
|
338
|
+
kh = [
|
326
339
|
File.join(ENV['HOME'], '.ssh', 'acpt_test_known_hosts'),
|
327
340
|
File.join(ENV['HOME'], '.ssh', 'known_hosts'),
|
328
341
|
File.join(ENV['HOME'], '.ssh', 'google_compute_known_hosts'),
|
329
342
|
]
|
343
|
+
if CemAcpt::Platform::Utils::Linux::SSHelper.env_ssh_known_hosts?
|
344
|
+
# Env var takes precedence
|
345
|
+
kh.unshift(CemAcpt::Platform::Utils::Linux::SSHelper.env_ssh_known_hosts)
|
346
|
+
end
|
347
|
+
kh
|
330
348
|
end
|
331
349
|
|
332
350
|
# Default options for Net::SSH
|
333
351
|
def default_ssh_opts
|
334
|
-
{
|
352
|
+
dopts = {
|
335
353
|
auth_methods: ['publickey'],
|
336
354
|
check_host_ip: false,
|
337
355
|
compression: true,
|
@@ -342,9 +360,14 @@ module CemAcpt::Platform::Gcp
|
|
342
360
|
non_interactive: true,
|
343
361
|
port: 22,
|
344
362
|
user: user_name,
|
345
|
-
user_known_hosts_file: File.join(ENV['HOME'], '.ssh', 'acpt_test_known_hosts'),
|
346
363
|
verify_host_key: :never,
|
347
364
|
}
|
365
|
+
if CemAcpt::Platform::Utils::Linux::SSHelper.env_ssh_known_hosts?
|
366
|
+
dopts[:user_known_hosts_file] = CemAcpt::Platform::Utils::Linux::SSHelper.env_ssh_known_hosts
|
367
|
+
else
|
368
|
+
dopts[:user_known_hosts_file] = ssh_all_known_hosts.find { |f| File.exist?(File.expand_path(f)) unless f.nil? }
|
369
|
+
end
|
370
|
+
dopts
|
348
371
|
end
|
349
372
|
|
350
373
|
# Returns a Proxy::Command object to use for the SSH option ProxyCommand.
|
@@ -241,12 +241,15 @@ module CemAcpt::Platform::Gcp
|
|
241
241
|
end
|
242
242
|
|
243
243
|
def create
|
244
|
-
|
245
|
-
|
246
|
-
|
244
|
+
unless @cmd.ssh_key.include?('google_compute_engine')
|
245
|
+
# Add the test ssh key to os-login
|
246
|
+
logger.debug("Adding test SSH key to os-login for #{name}")
|
247
|
+
@cmd.local_exec("compute os-login ssh-keys add --key-file #{@cmd.ssh_key}.pub --project #{project.name} --ttl 1h")
|
248
|
+
end
|
247
249
|
@cmd.local_exec(create_cmd)
|
248
250
|
rescue StandardError => e
|
249
|
-
|
251
|
+
logger.error("Failed to create VM #{name} with command #{create_cmd}: #{e}")
|
252
|
+
raise e
|
250
253
|
end
|
251
254
|
|
252
255
|
def ready?
|
@@ -6,6 +6,40 @@ module CemAcpt
|
|
6
6
|
module Linux
|
7
7
|
# Module provides SSH helper methods for Linux platforms
|
8
8
|
class SSHelper
|
9
|
+
def self.env_ssh_pri_key
|
10
|
+
return unless ENV['CEM_ACPT_SSH_PRI_KEY']
|
11
|
+
|
12
|
+
File.expand_path(ENV['CEM_ACPT_SSH_PRI_KEY'])
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.env_ssh_pri_key?
|
16
|
+
return false unless env_ssh_pri_key
|
17
|
+
|
18
|
+
File.exist?(env_ssh_pri_key)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.env_ssh_pub_key
|
22
|
+
"#{env_ssh_pri_key}.pub" if env_ssh_pri_key
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.env_ssh_pub_key?
|
26
|
+
return false unless env_ssh_pub_key
|
27
|
+
|
28
|
+
File.exist?(env_ssh_pub_key)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.env_ssh_known_hosts
|
32
|
+
return unless ENV['CEM_ACPT_SSH_KNOWN_HOSTS']
|
33
|
+
|
34
|
+
File.expand_path(ENV['CEM_ACPT_SSH_KNOWN_HOSTS'])
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.env_ssh_known_hosts?
|
38
|
+
return false unless env_ssh_known_hosts
|
39
|
+
|
40
|
+
File.exist?(env_ssh_known_hosts)
|
41
|
+
end
|
42
|
+
|
9
43
|
def self.ssh_keygen?
|
10
44
|
system('command -v ssh-keygen 2>&1 > /dev/null')
|
11
45
|
end
|
@@ -133,7 +133,18 @@ module CemAcpt
|
|
133
133
|
def handle_runner_error_results(runner)
|
134
134
|
@logger.error("SUMMARY: Encountered an error with test #{runner.node.test_data[:test_name]} on node #{runner.node.node_name}", no_prefix: true)
|
135
135
|
runner.run_result.to_h.each do |k, v|
|
136
|
-
|
136
|
+
if k == 'standard_error'
|
137
|
+
msg = v['message']
|
138
|
+
backtrace = v['backtrace']
|
139
|
+
@logger.error("#{k.upcase}: #{msg}", no_prefix: true) unless msg.nil?
|
140
|
+
@logger.error("BACKTRACE:\n#{backtrace.join("\n")}", no_prefix: true) unless backtrace.nil?
|
141
|
+
elsif v.is_a?(Hash)
|
142
|
+
v.each do |k2, v2|
|
143
|
+
@logger.error("#{k.upcase}: #{k2.upcase}: #{v2}", no_prefix: true)
|
144
|
+
end
|
145
|
+
else
|
146
|
+
@logger.error("#{k.upcase}: #{v}", no_prefix: true)
|
147
|
+
end
|
137
148
|
end
|
138
149
|
end
|
139
150
|
|
data/lib/cem_acpt/utils.rb
CHANGED
@@ -97,12 +97,16 @@ module CemAcpt
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def self.create(keydir: CemAcpt::Utils::SSH.default_keydir)
|
100
|
+
return [false, false, false] if ENV['CEM_ACPT_TEST_SSH_KEY'] # Don't create ephemeral keys if this is set
|
101
|
+
|
100
102
|
self.ephemeral_keydir = keydir
|
101
103
|
@priv_key, @pub_key, @known_hosts = CemAcpt::Utils::SSH.create(PRIV_KEY, keydir: ephemeral_keydir, **CREATE_OPTS)
|
102
104
|
[@priv_key, @pub_key, @known_hosts]
|
103
105
|
end
|
104
106
|
|
105
107
|
def self.clean
|
108
|
+
return if ENV['CEM_ACPT_TEST_SSH_KEY']
|
109
|
+
|
106
110
|
[@priv_key, @pub_key, @known_hosts].each_with_object([]) do |f, arr|
|
107
111
|
next unless f
|
108
112
|
|
data/lib/cem_acpt/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cem_acpt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: universal-java-17
|
6
6
|
authors:
|
7
7
|
- puppetlabs
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-03-
|
11
|
+
date: 2023-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|