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.
@@ -15,15 +15,24 @@ module CemAcpt
15
15
  end
16
16
  end
17
17
 
18
- module PuppetUtils
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
- module NodeUtils
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.ephemeral_ssh_key(type: 'ecdsa', bits: '521', comment: nil, keydir: '/tmp')
51
- raise ArgumentError, 'keydir does not exist' unless File.directory?(keydir)
52
-
53
- keyfile = "#{keydir}/#{SecureRandom.hex(16)}"
54
- keygen_cmd = [
55
- 'ssh-keygen',
56
- "-t #{type}",
57
- "-b #{bits}",
58
- "-f #{keyfile}",
59
- '-N ""',
60
- '-q',
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CemAcpt
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.2'
5
5
  end
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/runner'
13
+ require_relative 'cem_acpt/context'
14
14
 
15
- logger.level = params[:log_level] if params[:log_level]
16
-
17
- if params[:log_file]
18
- log_fmt = params[:log_format] ? new_log_formatter(params[:log_format]) : new_log_formatter(:file)
19
- logger.formatter = log_fmt
20
- logger.reopen(params[:log_file])
21
- elsif params[:log_format]
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
- CemAcpt::RunHandler.new(params).run
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.1.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
- - Heston Snodgrass
7
+ - puppetlabs
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-04 00:00:00.000000000 Z
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
- type: :runtime
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
- type: :runtime
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: '3.0'
48
- type: :runtime
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: '3.0'
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: '6.1'
62
- type: :runtime
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: '6.1'
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.0.1
76
- type: :runtime
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.0.1
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.8'
90
- type: :runtime
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.8'
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.1'
104
- type: :runtime
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.1'
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.1'
118
- type: :runtime
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.1'
124
+ version: '0'
125
125
  description: Litmus-like library focusing on CEM Acceptance Tests
126
126
  email:
127
- - hsnodgrass3@gmail.com
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/runner.rb
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
- - MIT
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.5.0
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.1.4
194
+ rubygems_version: 3.2.29
192
195
  signing_key:
193
196
  specification_version: 4
194
197
  summary: CEM Acceptance Tests
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.7.2
6
- before_install: gem install bundler -v 2.1.4