simp-beaker-helpers 1.21.3 → 1.23.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.fips_fixtures +1 -0
  3. data/.fixtures.yml +6 -1
  4. data/.github/workflows.local.json +6 -0
  5. data/.github/workflows/pr_acceptance.yml +55 -0
  6. data/.github/workflows/pr_glci.yml +190 -0
  7. data/.github/workflows/pr_glci_cleanup.yml +105 -0
  8. data/.github/workflows/pr_glci_manual.yml +143 -0
  9. data/.github/workflows/pr_tests.yml +90 -0
  10. data/.github/workflows/tag_deploy_rubygem.yml +192 -0
  11. data/.gitlab-ci.yml +37 -37
  12. data/CHANGELOG.md +56 -0
  13. data/Gemfile +1 -1
  14. data/README.md +63 -5
  15. data/lib/simp/beaker_helpers.rb +164 -61
  16. data/lib/simp/beaker_helpers/inspec.rb +16 -12
  17. data/lib/simp/beaker_helpers/ssg.rb +36 -12
  18. data/lib/simp/beaker_helpers/version.rb +1 -1
  19. data/lib/simp/rake/beaker.rb +14 -2
  20. data/simp-beaker-helpers.gemspec +5 -1
  21. data/spec/acceptance/nodesets/docker.yml +12 -10
  22. data/spec/acceptance/suites/default/enable_fips_spec.rb +6 -4
  23. data/spec/acceptance/suites/default/install_simp_deps_repo_spec.rb +17 -5
  24. data/spec/acceptance/suites/fips_from_fixtures/00_default_spec.rb +11 -3
  25. data/spec/acceptance/suites/inspec/00_default_spec.rb +54 -0
  26. data/spec/acceptance/suites/inspec/metadata.yml +2 -0
  27. data/spec/acceptance/suites/inspec/nodesets +1 -0
  28. data/spec/acceptance/suites/puppet_collections/00_default_spec.rb +1 -1
  29. data/spec/acceptance/suites/ssg/00_default_spec.rb +40 -0
  30. data/spec/acceptance/suites/ssg/metadata.yml +2 -0
  31. data/spec/acceptance/suites/ssg/nodesets +1 -0
  32. data/spec/lib/simp/beaker_helpers_spec.rb +1 -3
  33. metadata +54 -40
  34. data/.travis.yml +0 -42
@@ -10,6 +10,21 @@ module Simp::BeakerHelpers
10
10
  attr_reader :profile_dir
11
11
  attr_reader :deps_root
12
12
 
13
+ def self.enable_repo_on(suts)
14
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
15
+ block_on(suts, :run_in_parallel => parallel) do |sut|
16
+ repo_manifest = create_yum_resource(
17
+ 'chef-current',
18
+ {
19
+ :baseurl => "https://packages.chef.io/repos/yum/current/el/#{fact_on(sut,'os.release.major')}/$basearch",
20
+ :gpgkeys => ['https://packages.chef.io/chef.asc']
21
+ }
22
+ )
23
+
24
+ apply_manifest_on(sut, repo_manifest, :catch_failures => true)
25
+ end
26
+ end
27
+
13
28
  # Create a new Inspec helper for the specified host against the specified profile
14
29
  #
15
30
  # @param sut
@@ -81,18 +96,7 @@ module Simp::BeakerHelpers
81
96
  tmpdir = Dir.mktmpdir
82
97
  begin
83
98
  Dir.chdir(tmpdir) do
84
- if @sut[:hypervisor] == 'docker'
85
- # Work around for breaking changes in beaker-docker
86
- if @sut.host_hash[:docker_container]
87
- container_id = @sut.host_hash[:docker_container].id
88
- else
89
- container_id = @sut.host_hash[:docker_container_id]
90
- end
91
-
92
- %x(docker cp "#{container_id}:#{sut_inspec_results}" .)
93
- else
94
- scp_from(@sut, sut_inspec_results, '.')
95
- end
99
+ scp_from(@sut, sut_inspec_results, '.')
96
100
 
97
101
  local_inspec_results = File.basename(sut_inspec_results)
98
102
 
@@ -12,7 +12,7 @@ module Simp::BeakerHelpers
12
12
  GIT_REPO = 'https://github.com/ComplianceAsCode/content.git'
13
13
  end
14
14
 
15
- # If this is not set, the closest tag to the default branch will be used
15
+ # If this is not set, the highest numeric tag will be used
16
16
  GIT_BRANCH = nil
17
17
 
18
18
  if ENV['BEAKER_ssg_branch']
@@ -25,19 +25,20 @@ module Simp::BeakerHelpers
25
25
  'git',
26
26
  'openscap-python',
27
27
  'openscap-utils',
28
- 'python-lxml',
29
- 'python-jinja2'
28
+ 'python-jinja2',
29
+ 'python-lxml'
30
30
  ]
31
31
 
32
32
  EL8_PACKAGES = [
33
- 'python3',
34
- 'python3-pyyaml',
35
33
  'cmake',
36
34
  'git',
35
+ 'make',
37
36
  'openscap-python3',
38
37
  'openscap-utils',
38
+ 'python3',
39
+ 'python3-jinja2',
39
40
  'python3-lxml',
40
- 'python3-jinja2'
41
+ 'python3-pyyaml'
41
42
  ]
42
43
 
43
44
  OS_INFO = {
@@ -79,7 +80,7 @@ module Simp::BeakerHelpers
79
80
  '7' => {
80
81
  'required_packages' => EL_PACKAGES,
81
82
  'ssg' => {
82
- 'profile_target' => 'rhel7',
83
+ 'profile_target' => 'centos7',
83
84
  'build_target' => 'centos7',
84
85
  'datastream' => 'ssg-centos7-ds.xml'
85
86
  }
@@ -87,7 +88,7 @@ module Simp::BeakerHelpers
87
88
  '8' => {
88
89
  'required_packages' => EL8_PACKAGES,
89
90
  'ssg' => {
90
- 'profile_target' => 'rhel8',
91
+ 'profile_target' => 'centos8',
91
92
  'build_target' => 'centos8',
92
93
  'datastream' => 'ssg-centos8-ds.xml'
93
94
  }
@@ -265,7 +266,7 @@ module Simp::BeakerHelpers
265
266
  "contains(@idref,'#{exl}')"
266
267
  end.join(' or ')
267
268
 
268
- xpath_query << ')' if exclusions.size > 1
269
+ xpath_query << ')' if exclusions.size > 0
269
270
  end
270
271
 
271
272
  xpath_query << ')]'
@@ -299,8 +300,26 @@ module Simp::BeakerHelpers
299
300
  result_id = rule_result.attributes['idref'].value.to_s
300
301
  result_value = [
301
302
  'Title: ' + doc.xpath("//Rule[@id='#{result_id}']/title/text()").first.to_s,
302
- ' ID: ' + result_id
303
- ].join("\n")
303
+ ' ID: ' + result_id,
304
+ ]
305
+
306
+ if result.child.content == 'fail'
307
+ references = {}
308
+
309
+ doc.xpath("//Rule[@id='#{result_id}']/reference").each do |ref|
310
+ references[ref['href']] ||= []
311
+ references[ref['href']] << ref.text
312
+ end
313
+
314
+ result_value << ' References:'
315
+ references.each_pair do |src, items|
316
+ result_value << " * #{src}"
317
+ result_value << " * #{items.join(', ')}"
318
+ end
319
+ result_value << ' Description: ' + doc.xpath("//Rule[@id='#{result_id}']/description").text.gsub("\n","\n ")
320
+ end
321
+
322
+ result_value = result_value.join("\n")
304
323
 
305
324
  if result.child.content == 'fail'
306
325
  stats[:failed] << result_value.red
@@ -365,7 +384,12 @@ module Simp::BeakerHelpers
365
384
  if GIT_BRANCH
366
385
  on(@sut, %(cd scap-content; git checkout #{GIT_BRANCH}))
367
386
  else
368
- on(@sut, %(cd scap-content; git checkout $(git describe --abbrev=0 --tags)))
387
+ tags = on(@sut, %(cd scap-content; git tag -l)).output
388
+ target_tag = tags.lines.map(&:strip)
389
+ .select{|x| x.start_with?(/v\d+\./)}
390
+ .sort.last
391
+
392
+ on(@sut, %(cd scap-content; git checkout #{target_tag}))
369
393
  end
370
394
 
371
395
  # Work around the issue where the profiles now strip out derivative
@@ -1,5 +1,5 @@
1
1
  module Simp; end
2
2
 
3
3
  module Simp::BeakerHelpers
4
- VERSION = '1.21.3'
4
+ VERSION = '1.23.2'
5
5
  end
@@ -196,6 +196,7 @@ module Simp::Rake
196
196
  default_suite = ordered_suites.delete('default')
197
197
  ordered_suites.unshift(default_suite) if default_suite
198
198
 
199
+ suite_start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
199
200
  ordered_suites.each do |ste|
200
201
 
201
202
  next unless (suites[ste]['default_run'] == true)
@@ -225,8 +226,14 @@ module Simp::Rake
225
226
 
226
227
  nodesets.each do |nodeset_yml|
227
228
  unless File.file?(nodeset_yml)
228
- $stdout.puts("=== Suite #{name} Nodeset '#{File.basename(nodeset_yml, '.yml')}' Not Found, Skipping ===")
229
- next
229
+ # Get here if user has specified a non-existent nodeset or the
230
+ # implied `default` nodeset does not exist.
231
+ if suite_config['fail_fast']
232
+ fail("*** Suite #{name} Nodeset '#{File.basename(nodeset_yml, '.yml')}' Not Found ***")
233
+ else
234
+ $stdout.puts("=== Suite #{name} Nodeset '#{File.basename(nodeset_yml, '.yml')}' Not Found, Skipping ===")
235
+ next
236
+ end
230
237
  end
231
238
 
232
239
  ENV['BEAKER_setfile'] = nodeset_yml
@@ -255,6 +262,11 @@ module Simp::Rake
255
262
  $stdout.puts("\n\n=== Suite '#{name}' Complete ===\n\n")
256
263
  end
257
264
  end
265
+ suite_end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
266
+
267
+ suite_run_time = ((suite_end_time - suite_start_time)/60).round(2)
268
+
269
+ $stdout.puts("== Total Runtime: #{suite_run_time} minutes ==\n\n")
258
270
 
259
271
  unless failures.keys.empty?
260
272
  $stdout.puts("The following tests had failures:")
@@ -18,10 +18,14 @@ Gem::Specification.new do |s|
18
18
  s.metadata = {
19
19
  'issue_tracker' => 'https://simp-project.atlassian.net'
20
20
  }
21
+
22
+ s.required_ruby_version = '>= 2.3.0'
23
+
21
24
  s.add_runtime_dependency 'beaker' , ['>= 4.17.0', '< 5.0.0']
22
25
  s.add_runtime_dependency 'beaker-rspec' , '~> 6.2'
23
26
  s.add_runtime_dependency 'beaker-puppet' , ['>= 1.18.14', '< 2.0.0']
24
- s.add_runtime_dependency 'beaker-docker' , '~> 0.3'
27
+ s.add_runtime_dependency 'beaker-docker' , ['>= 0.8.3', '< 2.0.0']
28
+ s.add_runtime_dependency 'docker-api' , ['>= 2.1.0', '< 3.0.0']
25
29
  s.add_runtime_dependency 'beaker-vagrant' , ['>= 0.6.4', '< 2.0.0']
26
30
  s.add_runtime_dependency 'beaker-puppet_install_helper', '~> 0.9'
27
31
  s.add_runtime_dependency 'highline' , '~> 2.0'
@@ -1,29 +1,31 @@
1
1
  HOSTS:
2
- el7:
2
+ el7.test.net:
3
3
  roles:
4
4
  - el7
5
5
  - master
6
- platform: el-7-x86_64
6
+ platform: el-7-x86_64
7
7
  hypervisor: docker
8
- image: simpproject/simp_build_centos7
9
- docker_cmd: '/usr/sbin/sshd -D -E /var/log/sshd.log'
8
+ image: simpproject/simp_beaker_el7
9
+ docker_cmd: '["/sbin/init"]'
10
10
 
11
- el8:
11
+ el8.test.net:
12
12
  roles:
13
13
  - el8
14
- platform: el-8-x86_64
14
+ platform: el-8-x86_64
15
15
  hypervisor: docker
16
- image: simpproject/simp_build_centos8
16
+ image: simpproject/simp_beaker_el8
17
17
  docker_cmd: '["/sbin/init"]'
18
18
 
19
19
  CONFIG:
20
- docker_preserve_image: true
21
20
  log_level: verbose
22
21
  type: aio
23
- <% if ENV['BEAKER_PUPPET_COLLECTION'] -%>
24
- puppet_collection: <%= ENV['BEAKER_PUPPET_COLLECTION'] %>
22
+ <% if ENV['BEAKER_PUPPET_ENVIRONMENT'] -%>
23
+ puppet_environment: <%= ENV['BEAKER_PUPPET_ENVIRONMENT'] %>
25
24
  <% end -%>
26
25
  ssh:
26
+ password: root
27
+ auth_methods:
28
+ - password
27
29
  keepalive: true
28
30
  keepalive_interval: 10
29
31
  host_key:
@@ -9,13 +9,15 @@ hosts.each do |host|
9
9
  end
10
10
 
11
11
  it 'has fips enabled' do
12
- stdout = on(host, 'cat /proc/sys/crypto/fips_enabled').stdout.strip
13
- expect(stdout).to eq('1')
12
+ if host[:hypervisor] == 'docker'
13
+ skip('Not supported on docker')
14
+ else
15
+ expect(fips_enabled(host)).to be true
16
+ end
14
17
  end
15
18
  else
16
19
  it 'has fips disabled' do
17
- stdout = on(host, 'cat /proc/sys/crypto/fips_enabled').stdout.strip
18
- expect(stdout).to eq('0')
20
+ expect(fips_enabled(host)).to be false
19
21
  end
20
22
  end
21
23
  end
@@ -1,12 +1,12 @@
1
1
  require 'spec_helper_acceptance'
2
2
 
3
3
  hosts.each do |host|
4
- describe '#write_hieradata_to' do
5
- expect_failures = false
6
- if hosts_with_role(hosts, 'el8').include?(host)
7
- expect_failures = true
8
- end
4
+ expect_failures = false
5
+ if hosts_with_role(hosts, 'el8').include?(host)
6
+ expect_failures = true
7
+ end
9
8
 
9
+ describe '#install_simp_repos' do
10
10
  it 'should install yum utils' do
11
11
  host.install_package('yum-utils')
12
12
  end
@@ -21,6 +21,18 @@ hosts.each do |host|
21
21
  end
22
22
  end
23
23
 
24
+ context 'when targeting a release type' do
25
+ it 'adjusts the SIMP release target' do
26
+ set_simp_repo_release(host, 'rolling')
27
+ expect(file_content_on(host, '/etc/yum/vars/simpreleasetype').strip).to eq('rolling')
28
+ end
29
+
30
+ it 'lists the simp rpm' do
31
+ skip "#{host} is not supported yet" if expect_failures
32
+ on(host, 'yum list simp')
33
+ end
34
+ end
35
+
24
36
  context 'when passed a disabled list ' do
25
37
  before(:all) { install_simp_repos(host, ['simp-community-simp'] ) }
26
38
 
@@ -18,6 +18,7 @@ new_fixtures = {
18
18
  }
19
19
  }
20
20
 
21
+ new_fixtures['fixtures']['repositories']['crypto_policy'] = 'https://github.com/simp/pupmod-simp-crypto_policy'
21
22
  new_fixtures['fixtures']['repositories']['fips'] = 'https://github.com/simp/pupmod-simp-fips'
22
23
  new_fixtures['fixtures']['repositories']['augeasproviders_core'] = 'https://github.com/simp/augeasproviders_core'
23
24
  new_fixtures['fixtures']['repositories']['augeasproviders_grub'] = 'https://github.com/simp/augeasproviders_grub'
@@ -54,12 +55,19 @@ describe 'FIPS pre-installed' do
54
55
  hosts.each do |host|
55
56
  context "on #{host}" do
56
57
  it 'does not create an alternate apply directory' do
57
- on(host, 'test ! -d /root/.beaker_fips/modules')
58
+ if host[:hypervisor] == 'docker'
59
+ skip('Not supported on docker')
60
+ else
61
+ on(host, 'test ! -d /root/.beaker_fips/modules')
62
+ end
58
63
  end
59
64
 
60
65
  it 'has fips enabled' do
61
- stdout = on(host, 'cat /proc/sys/crypto/fips_enabled').stdout.strip
62
- expect(stdout).to eq('1')
66
+ if host[:hypervisor] == 'docker'
67
+ skip('Not supported on docker')
68
+ else
69
+ expect(fips_enabled(host)).to be true
70
+ end
63
71
  end
64
72
  end
65
73
  end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper_acceptance'
2
+ require 'json'
3
+
4
+ test_name 'Inspec STIG Profile'
5
+
6
+ describe 'Inspec STIG Profile' do
7
+
8
+ profiles_to_validate = ['disa_stig']
9
+
10
+ hosts.each do |host|
11
+ profiles_to_validate.each do |profile|
12
+ context "for profile #{profile}" do
13
+ context "on #{host}" do
14
+ profile_path = File.join(
15
+ fixtures_path,
16
+ 'inspec_profiles',
17
+ "#{fact_on(host, 'operatingsystem')}-#{fact_on(host, 'operatingsystemmajrelease')}-#{profile}"
18
+ )
19
+
20
+ unless File.exist?(profile_path)
21
+ it 'should run inspec' do
22
+ skip("No matching profile available at #{profile_path}")
23
+ end
24
+ else
25
+ before(:all) do
26
+ Simp::BeakerHelpers::Inspec.enable_repo_on(hosts)
27
+ @inspec = Simp::BeakerHelpers::Inspec.new(host, profile)
28
+
29
+ # If we don't do this, the variable gets reset
30
+ @inspec_report = { :data => nil }
31
+ end
32
+
33
+ it 'should run inspec' do
34
+ @inspec.run
35
+ end
36
+
37
+ it 'should have an inspec report' do
38
+ @inspec_report[:data] = @inspec.process_inspec_results
39
+
40
+ expect(@inspec_report[:data]).to_not be_nil
41
+
42
+ @inspec.write_report(@inspec_report[:data])
43
+ end
44
+
45
+ it 'should have a report' do
46
+ expect(@inspec_report[:data][:report]).to_not be_nil
47
+ puts @inspec_report[:data][:report]
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,2 @@
1
+ ---
2
+ 'default_run': true
@@ -0,0 +1 @@
1
+ spec/acceptance/suites/inspec/../../nodesets
@@ -13,7 +13,7 @@ end
13
13
  hosts.each do |host|
14
14
  describe 'make sure puppet version is valid' do
15
15
  context "on #{host}" do
16
- client_puppet_version = on(host, 'puppet --version').output.strip
16
+ client_puppet_version = on(host, 'puppet --version').output.lines.last.strip
17
17
 
18
18
  it "should be running puppet version #{target_version}" do
19
19
  expect(Gem::Version.new(client_puppet_version)).to be >= Gem::Version.new(target_version)
@@ -0,0 +1,40 @@
1
+ require 'spec_helper_acceptance'
2
+
3
+ test_name 'SSG STIG Validation'
4
+
5
+ describe 'run the SSG against the STIG profile' do
6
+
7
+ hosts.each do |host|
8
+ context "on #{host}" do
9
+ before(:all) do
10
+ @ssg = Simp::BeakerHelpers::SSG.new(host)
11
+
12
+ # If we don't do this, the variable gets reset
13
+ @ssg_report = { :data => nil }
14
+ end
15
+
16
+ it 'should run the SSG' do
17
+ profile = 'xccdf_org.ssgproject.content_profile_stig'
18
+
19
+ @ssg.evaluate(profile)
20
+ end
21
+
22
+ it 'should have an SSG report' do
23
+ # Validate that the filter works
24
+ filter = '_rule_audit'
25
+ host_exclusions = ['ssh_']
26
+
27
+ @ssg_report[:data] = @ssg.process_ssg_results(filter, host_exclusions)
28
+
29
+ expect(@ssg_report[:data]).to_not be_nil
30
+
31
+ @ssg.write_report(@ssg_report[:data])
32
+ end
33
+
34
+ it 'should have a report' do
35
+ expect(@ssg_report[:data][:report]).to_not be_nil
36
+ puts @ssg_report[:data][:report]
37
+ end
38
+ end
39
+ end
40
+ end