cem_acpt 0.1.0 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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