cem_acpt 0.1.0 → 0.2.2
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/.gitignore +7 -0
- data/Gemfile.lock +36 -15
- data/README.md +8 -4
- data/cem_acpt.gemspec +13 -13
- data/exe/cem_acpt +29 -3
- data/lib/cem_acpt/context.rb +132 -39
- data/lib/cem_acpt/core_extensions.rb +9 -12
- data/lib/cem_acpt/logging.rb +177 -19
- data/lib/cem_acpt/platform/base/cmd.rb +8 -2
- data/lib/cem_acpt/platform/gcp/cmd.rb +121 -81
- data/lib/cem_acpt/platform/gcp/compute.rb +6 -1
- data/lib/cem_acpt/platform/gcp.rb +3 -3
- data/lib/cem_acpt/puppet_helpers.rb +1 -0
- data/lib/cem_acpt/rspec_utils.rb +242 -0
- data/lib/cem_acpt/shared_objects.rb +147 -26
- data/lib/cem_acpt/spec_helper_acceptance.rb +21 -13
- data/lib/cem_acpt/test_data.rb +3 -14
- data/lib/cem_acpt/test_runner/run_handler.rb +187 -0
- data/lib/cem_acpt/test_runner/runner.rb +210 -0
- data/lib/cem_acpt/test_runner/runner_result.rb +103 -0
- data/lib/cem_acpt/test_runner.rb +10 -0
- data/lib/cem_acpt/utils.rb +91 -19
- data/lib/cem_acpt/version.rb +1 -1
- data/lib/cem_acpt.rb +18 -11
- metadata +50 -47
- data/.travis.yml +0 -6
- data/lib/cem_acpt/runner.rb +0 -304
data/lib/cem_acpt/utils.rb
CHANGED
@@ -15,15 +15,24 @@ module CemAcpt
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
|
18
|
+
# File-related utilities
|
19
|
+
module File
|
20
|
+
def self.set_permissions(permission, *file_paths)
|
21
|
+
file_paths.map { |p| ::File.chmod(permission, p) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Puppet-related utilities
|
26
|
+
module Puppet
|
19
27
|
DEFAULT_PUPPET_PATH = {
|
20
28
|
nix: '/opt/puppetlabs/bin/puppet',
|
21
29
|
windows: 'C:/Program Files/Puppet Labs/Puppet/bin/puppet.bat',
|
22
30
|
}.freeze
|
23
31
|
|
32
|
+
# Finds and returns the Puppet executable
|
24
33
|
def self.puppet_executable
|
25
34
|
this_os = CemAcpt::Utils.os
|
26
|
-
if File.file?(DEFAULT_PUPPET_PATH[this_os]) && File.executable?(DEFAULT_PUPPET_PATH[this_os])
|
35
|
+
if ::File.file?(DEFAULT_PUPPET_PATH[this_os]) && ::File.executable?(DEFAULT_PUPPET_PATH[this_os])
|
27
36
|
return DEFAULT_PUPPET_PATH[this_os]
|
28
37
|
end
|
29
38
|
|
@@ -32,39 +41,102 @@ module CemAcpt
|
|
32
41
|
exts = ENV['PATHEXT'] ? ".{#{ENV['PATHEXT'].tr(';', ',').tr('.', '').downcase}}" : '.{exe,com,bat}'
|
33
42
|
file_name = "#{file_name}#{exts}"
|
34
43
|
end
|
35
|
-
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
36
|
-
if File.file?(File.join(path, file_name)) && File.executable?(File.join(path, file_name))
|
37
|
-
return File.join(path, file_name)
|
44
|
+
ENV['PATH'].split(::File::PATH_SEPARATOR).each do |path|
|
45
|
+
if ::File.file?(::File.join(path, file_name)) && ::File.executable?(::File.join(path, file_name))
|
46
|
+
return ::File.join(path, file_name)
|
38
47
|
end
|
39
48
|
end
|
40
49
|
raise 'Could not find Puppet executable! Is Puppet installed?'
|
41
50
|
end
|
51
|
+
|
52
|
+
# Builds a Puppet module package.
|
53
|
+
# @param module_dir [String] Path to the module directory. If target_dir
|
54
|
+
# is specified as a relative path, it will be relative to the module dir.
|
55
|
+
# @param target_dir [String] Path to the target directory where the package
|
56
|
+
# will be built. This defaults to the relative path 'pkg/'.
|
57
|
+
# @param should_log [Boolean] Whether or not to log the build process.
|
58
|
+
# @return [String] Path to the built package.
|
59
|
+
def self.build_module_package(module_dir, target_dir = nil, should_log: false)
|
60
|
+
require 'puppet/modulebuilder'
|
61
|
+
require 'fileutils'
|
62
|
+
|
63
|
+
builder_logger = should_log ? logger : nil
|
64
|
+
builder = ::Puppet::Modulebuilder::Builder.new(::File.expand_path(module_dir), target_dir, builder_logger)
|
65
|
+
|
66
|
+
# Validates module metadata by raising exception if invalid
|
67
|
+
_metadata = builder.metadata
|
68
|
+
|
69
|
+
# Builds the module package
|
70
|
+
builder.build
|
71
|
+
end
|
42
72
|
end
|
43
73
|
|
44
|
-
|
74
|
+
# Node-related utilities
|
75
|
+
module Node
|
45
76
|
def self.random_instance_name(prefix: 'cem-acpt-', length: 24)
|
46
77
|
rand_length = length - prefix.length
|
47
|
-
"#{prefix}#{SecureRandom.hex(rand_length)}"
|
78
|
+
"#{prefix}#{::SecureRandom.hex(rand_length)}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# SSH-related utilities
|
83
|
+
module SSH
|
84
|
+
def self.ssh_keygen
|
85
|
+
bin_path = `command -v ssh-keygen`.chomp
|
86
|
+
raise 'Cannot find ssh-keygen! Install it and verify PATH' unless bin_path
|
87
|
+
|
88
|
+
bin_path
|
48
89
|
end
|
49
90
|
|
50
|
-
def self.
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
]
|
91
|
+
def self.default_keydir
|
92
|
+
ssh_dir = ::File.join(ENV['HOME'], '.ssh')
|
93
|
+
raise "SSH directory at #{ssh_dir} does not exist" unless ::File.directory?(ssh_dir)
|
94
|
+
|
95
|
+
ssh_dir
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.ephemeral_ssh_key(type: 'rsa', bits: '4096', comment: nil, keydir: default_keydir)
|
99
|
+
raise ArgumentError, 'keydir does not exist' unless ::File.directory?(keydir)
|
100
|
+
|
101
|
+
keyfile = ::File.join(keydir, SecureRandom.hex(16))
|
102
|
+
keygen_cmd = [ssh_keygen, "-t #{type}", "-b #{bits}", "-f #{keyfile}", '-N ""']
|
62
103
|
keygen_cmd << "-C \"#{comment}\"" if comment
|
63
104
|
_, stderr, status = Open3.capture3(keygen_cmd.join(' '))
|
64
105
|
raise "Failed to generate ephemeral SSH key: #{stderr}" unless status.success?
|
65
106
|
|
66
107
|
[keyfile, "#{keyfile}.pub"]
|
67
108
|
end
|
109
|
+
|
110
|
+
def self.acpt_known_hosts(keydir: default_keydir, file_name: 'acpt_known_hosts', overwrite: true)
|
111
|
+
kh_file = ::File.join(keydir, file_name)
|
112
|
+
::File.open(kh_file, 'w') { |f| f.write("\n") } unless ::File.exist?(kh_file) && !overwrite
|
113
|
+
kh_file
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.set_ssh_file_permissions(priv_key, pub_key, known_hosts)
|
117
|
+
CemAcpt::Utils::File.set_permissions(0o600, priv_key, pub_key, known_hosts)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Terminal-related utilities
|
122
|
+
module Terminal
|
123
|
+
def self.keep_terminal_alive
|
124
|
+
require 'concurrent-ruby'
|
125
|
+
executor = Concurrent::SingleThreadExecutor.new
|
126
|
+
executor.post do
|
127
|
+
loop do
|
128
|
+
$stdout.print(".\r")
|
129
|
+
sleep(1)
|
130
|
+
$stdout.print("..\r")
|
131
|
+
sleep(1)
|
132
|
+
$stdout.print("...\r")
|
133
|
+
sleep(1)
|
134
|
+
$stdout.print(" \r")
|
135
|
+
sleep(1)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
executor
|
139
|
+
end
|
68
140
|
end
|
69
141
|
end
|
70
142
|
end
|
data/lib/cem_acpt/version.rb
CHANGED
data/lib/cem_acpt.rb
CHANGED
@@ -10,18 +10,25 @@ module CemAcpt
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.run(params)
|
13
|
-
require_relative 'cem_acpt/
|
13
|
+
require_relative 'cem_acpt/context'
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
logger.formatter = new_log_formatter(params[:log_format])
|
15
|
+
log_level = params[:log_level]
|
16
|
+
log_formatter = params[:log_format] ? new_log_formatter(params[:log_format]) : nil
|
17
|
+
logdevs = [$stdout]
|
18
|
+
if params[:log_file] && params[:quiet]
|
19
|
+
logdevs = [params[:log_file]]
|
20
|
+
elsif params[:log_file] && !params[:quiet]
|
21
|
+
logdevs << params[:log_file]
|
23
22
|
end
|
24
|
-
|
25
|
-
|
23
|
+
if (params[:CI] || ENV['CI'] || ENV['GITHUB_ACTION']) && !logdevs.include?($stdout)
|
24
|
+
logdevs << $stdout
|
25
|
+
end
|
26
|
+
new_logger(
|
27
|
+
*logdevs,
|
28
|
+
level: log_level,
|
29
|
+
formatter: log_formatter,
|
30
|
+
)
|
31
|
+
exit_code = CemAcpt::Context.with(params, &:run)
|
32
|
+
exit exit_code
|
26
33
|
end
|
27
34
|
end
|
metadata
CHANGED
@@ -1,130 +1,130 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cem_acpt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- puppetlabs
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: concurrent-ruby
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
16
15
|
requirements:
|
17
16
|
- - "~>"
|
18
17
|
- !ruby/object:Gem::Version
|
19
18
|
version: 1.1.9
|
20
|
-
|
19
|
+
name: concurrent-ruby
|
21
20
|
prerelease: false
|
21
|
+
type: :runtime
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.1.9
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: deep_merge
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
30
29
|
requirements:
|
31
30
|
- - "~>"
|
32
31
|
- !ruby/object:Gem::Version
|
33
32
|
version: 1.2.2
|
34
|
-
|
33
|
+
name: deep_merge
|
35
34
|
prerelease: false
|
35
|
+
type: :runtime
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.2.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name: net-scp
|
43
42
|
requirement: !ruby/object:Gem::Requirement
|
44
43
|
requirements:
|
45
44
|
- - "~>"
|
46
45
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
48
|
-
|
46
|
+
version: 7.0.0.beta1
|
47
|
+
name: net-ssh
|
49
48
|
prerelease: false
|
49
|
+
type: :runtime
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 7.0.0.beta1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name: net-ssh
|
57
56
|
requirement: !ruby/object:Gem::Requirement
|
58
57
|
requirements:
|
59
|
-
- - "
|
58
|
+
- - ">"
|
60
59
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
62
|
-
|
60
|
+
version: 0.0.1
|
61
|
+
name: puppet-modulebuilder
|
63
62
|
prerelease: false
|
63
|
+
type: :runtime
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.0.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name: puppet-modulebuilder
|
71
70
|
requirement: !ruby/object:Gem::Requirement
|
72
71
|
requirements:
|
73
|
-
- - "
|
72
|
+
- - ">="
|
74
73
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0
|
76
|
-
|
74
|
+
version: '0'
|
75
|
+
name: rake
|
77
76
|
prerelease: false
|
77
|
+
type: :runtime
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0
|
82
|
+
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name: rake
|
85
84
|
requirement: !ruby/object:Gem::Requirement
|
86
85
|
requirements:
|
87
|
-
- - "
|
86
|
+
- - ">="
|
88
87
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0
|
90
|
-
|
88
|
+
version: '0'
|
89
|
+
name: rspec
|
91
90
|
prerelease: false
|
91
|
+
type: :runtime
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0
|
96
|
+
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name: rspec
|
99
98
|
requirement: !ruby/object:Gem::Requirement
|
100
99
|
requirements:
|
101
|
-
- - "
|
100
|
+
- - ">="
|
102
101
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0
|
104
|
-
|
102
|
+
version: '0'
|
103
|
+
name: serverspec-cem-acpt
|
105
104
|
prerelease: false
|
105
|
+
type: :runtime
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0
|
110
|
+
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name: serverspec
|
113
112
|
requirement: !ruby/object:Gem::Requirement
|
114
113
|
requirements:
|
115
|
-
- - "
|
114
|
+
- - ">="
|
116
115
|
- !ruby/object:Gem::Version
|
117
|
-
version: '0
|
118
|
-
|
116
|
+
version: '0'
|
117
|
+
name: rubocop
|
119
118
|
prerelease: false
|
119
|
+
type: :development
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - "
|
122
|
+
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '0
|
124
|
+
version: '0'
|
125
125
|
description: Litmus-like library focusing on CEM Acceptance Tests
|
126
126
|
email:
|
127
|
-
-
|
127
|
+
- abide-team@puppet.com
|
128
128
|
executables:
|
129
129
|
- cem_acpt
|
130
130
|
extensions: []
|
@@ -132,7 +132,6 @@ extra_rdoc_files: []
|
|
132
132
|
files:
|
133
133
|
- ".gitignore"
|
134
134
|
- ".rspec"
|
135
|
-
- ".travis.yml"
|
136
135
|
- CODEOWNERS
|
137
136
|
- Gemfile
|
138
137
|
- Gemfile.lock
|
@@ -159,16 +158,20 @@ files:
|
|
159
158
|
- lib/cem_acpt/platform/gcp/compute.rb
|
160
159
|
- lib/cem_acpt/platform/vmpooler.rb
|
161
160
|
- lib/cem_acpt/puppet_helpers.rb
|
162
|
-
- lib/cem_acpt/
|
161
|
+
- lib/cem_acpt/rspec_utils.rb
|
163
162
|
- lib/cem_acpt/shared_objects.rb
|
164
163
|
- lib/cem_acpt/spec_helper_acceptance.rb
|
165
164
|
- lib/cem_acpt/test_data.rb
|
165
|
+
- lib/cem_acpt/test_runner.rb
|
166
|
+
- lib/cem_acpt/test_runner/run_handler.rb
|
167
|
+
- lib/cem_acpt/test_runner/runner.rb
|
168
|
+
- lib/cem_acpt/test_runner/runner_result.rb
|
166
169
|
- lib/cem_acpt/utils.rb
|
167
170
|
- lib/cem_acpt/version.rb
|
168
171
|
- sample_config.yaml
|
169
172
|
homepage: https://github.com/puppetlabs/cem_acpt
|
170
173
|
licenses:
|
171
|
-
-
|
174
|
+
- proprietary
|
172
175
|
metadata:
|
173
176
|
homepage_uri: https://github.com/puppetlabs/cem_acpt
|
174
177
|
source_code_uri: https://github.com/puppetlabs/cem_acpt
|
@@ -181,14 +184,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
181
184
|
requirements:
|
182
185
|
- - ">="
|
183
186
|
- !ruby/object:Gem::Version
|
184
|
-
version: 2.
|
187
|
+
version: 2.6.0
|
185
188
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
186
189
|
requirements:
|
187
190
|
- - ">="
|
188
191
|
- !ruby/object:Gem::Version
|
189
192
|
version: '0'
|
190
193
|
requirements: []
|
191
|
-
rubygems_version: 3.
|
194
|
+
rubygems_version: 3.2.29
|
192
195
|
signing_key:
|
193
196
|
specification_version: 4
|
194
197
|
summary: CEM Acceptance Tests
|