simp-beaker-helpers 1.20.0 → 1.22.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -18,6 +18,95 @@ module Simp::BeakerHelpers
18
18
  "simp-beaker-helpers-#{t}-#{$$}-#{rand(0x100000000).to_s(36)}.tmp"
19
19
  end
20
20
 
21
+ # Sets a single YUM option in the form that yum-config-manager/dnf
22
+ # config-manager would expect.
23
+ #
24
+ # If not prefaced with a repository, the option will be applied globally.
25
+ #
26
+ # Has no effect if yum or dnf is not present.
27
+ def set_yum_opt_on(suts, key, value)
28
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
29
+ block_on(suts, :run_in_parallel => parallel) do |sut|
30
+ repo,target = key.split('.')
31
+
32
+ unless target
33
+ key = "\\*.#{repo}"
34
+ end
35
+
36
+ command = nil
37
+ if !sut.which('dnf').empty?
38
+ install_package_unless_present_on(sut, 'dnf-plugins-core', :accept_all_exit_codes => true)
39
+ command = 'dnf config-manager'
40
+ elsif !sut.which('yum').empty?
41
+ command = 'yum-config-manager'
42
+ end
43
+
44
+ on(sut, %{#{command} --save --setopt=#{key}=#{value}}, :silent => true) if command
45
+ end
46
+ end
47
+
48
+ # Takes a hash of YUM options to set in the form that yum-config-manager/dnf
49
+ # config-manager would expect.
50
+ #
51
+ # If not prefaced with a repository, the option will be applied globally.
52
+ #
53
+ # Example:
54
+ # {
55
+ # 'skip_if_unavailable' => '1', # Applies globally
56
+ # 'foo.installonly_limit' => '5' # Applies only to the 'foo' repo
57
+ # }
58
+ def set_yum_opts_on(suts, yum_opts={})
59
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
60
+ block_on(suts, :run_in_parallel => parallel) do |sut|
61
+ yum_opts.each_pair do |k,v|
62
+ set_yum_opt_on(sut, k, v)
63
+ end
64
+ end
65
+ end
66
+
67
+ def install_package_unless_present_on(suts, package_name, package_source=nil, opts={})
68
+ default_opts = {
69
+ max_retries: 3,
70
+ retry_interval: 10
71
+ }
72
+
73
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
74
+ block_on(suts, :run_in_parallel => parallel) do |sut|
75
+ package_source = package_name unless package_source
76
+
77
+ unless sut.check_for_package(package_name)
78
+ sut.install_package(
79
+ package_source,
80
+ '',
81
+ nil,
82
+ default_opts.merge(opts)
83
+ )
84
+ end
85
+ end
86
+ end
87
+
88
+ def install_latest_package_on(suts, package_name, package_source=nil, opts={})
89
+ default_opts = {
90
+ max_retries: 3,
91
+ retry_interval: 10
92
+ }
93
+
94
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
95
+ block_on(suts, :run_in_parallel => parallel) do |sut|
96
+ package_source = package_name unless package_source
97
+
98
+ if sut.check_for_package(package_name)
99
+ sut.upgrade_package(
100
+ package_source,
101
+ '',
102
+ default_opts.merge(opts)
103
+ )
104
+ else
105
+ install_package_unless_present_on(sut, package_name, package_source, opts)
106
+ end
107
+ end
108
+ end
109
+
21
110
  def is_windows?(sut)
22
111
  sut[:platform] =~ /windows/i
23
112
  end
@@ -80,7 +169,30 @@ module Simp::BeakerHelpers
80
169
  else
81
170
  container_id = sut.host_hash[:docker_container_id]
82
171
  end
83
- %x(tar #{exclude_list.join(' ')} -hcf - -C "#{File.dirname(src)}" "#{File.basename(src)}" | docker exec -i "#{container_id}" tar -C "#{dest}" -xf -)
172
+
173
+ if ENV['BEAKER_docker_cmd']
174
+ docker_cmd = ENV['BEAKER_docker_cmd']
175
+ else
176
+ docker_cmd = 'docker'
177
+
178
+ if ::Docker.version['Components'].any?{|x| x['Name'] =~ /podman/i}
179
+ docker_cmd = 'podman'
180
+
181
+ if ENV['CONTAINER_HOST']
182
+ docker_cmd = 'podman --remote'
183
+ elsif ENV['DOCKER_HOST']
184
+ docker_cmd = "podman --remote --url=#{ENV['DOCKER_HOST']}"
185
+ end
186
+ end
187
+ end
188
+
189
+ unless directory_exists_on(sut, dest)
190
+ dest = File.dirname(dest)
191
+ sut.mkdir_p(dest)
192
+ end
193
+
194
+ %x(tar #{exclude_list.join(' ')} -hcf - -C "#{File.dirname(src)}" "#{File.basename(src)}" | #{docker_cmd} exec -i "#{container_id}" tar -C "#{dest}" -xf -)
195
+
84
196
  elsif rsync_functional_on?(sut)
85
197
  # This makes rsync_to work like beaker and scp usually do
86
198
  exclude_hack = %(__-__' -L --exclude '__-__)
@@ -116,34 +228,34 @@ module Simp::BeakerHelpers
116
228
 
117
229
  # use the `puppet fact` face to look up facts on an SUT
118
230
  def pfact_on(sut, fact_name)
119
- require 'ostruct'
120
-
231
+ found_fact = nil
121
232
  # If puppet is not installed, there are no puppet facts to fetch
122
233
  if sut.which('puppet').empty?
123
- fact_on(sut, fact_name, :silent => true)
234
+ found_fact = fact_on(sut, fact_name)
124
235
  else
125
236
  facts_json = nil
126
237
  begin
127
238
  cmd_output = on(sut, 'facter -p --json', :silent => true)
128
-
129
239
  # Facter 4+
130
240
  raise('skip facter -p') if (cmd_output.stderr =~ /no longer supported/)
131
241
 
132
- facts = JSON.parse(cmd_output.stdout, object_class: OpenStruct)
242
+ facts = JSON.parse(cmd_output.stdout)
133
243
  rescue StandardError
134
244
  # If *anything* fails, we need to fall back to `puppet facts`
135
245
 
136
246
  facts_json = on(sut, 'puppet facts find garbage_xxx', :silent => true).stdout
137
- facts = JSON.parse(facts_json, object_class: OpenStruct).values
247
+ facts = JSON.parse(facts_json)['values']
138
248
  end
139
249
 
140
250
  found_fact = facts.dig(*(fact_name.split('.')))
141
251
 
142
- # Fall back to the behavior in fact_on
143
- found_fact = '' if found_fact.nil?
144
-
145
- return found_fact
252
+ # If we did not find a fact, we should use the upstream function since
253
+ # puppet may be installed via a gem or through some other means.
254
+ found_fact = fact_on(sut, fact_name) if found_fact.nil?
146
255
  end
256
+
257
+ # Ensure that Hashes return as Hash objects
258
+ found_fact.is_a?(OpenStruct) ? found_fact.marshal_dump : found_fact
147
259
  end
148
260
 
149
261
  # Returns the modulepath on the SUT, as an Array
@@ -325,13 +437,16 @@ module Simp::BeakerHelpers
325
437
  file_exists_on(sut, '/etc/crypto-policies/config')
326
438
  end
327
439
 
328
- def munge_ssh_crypto_policies(sut, key_types=['ssh-rsa'])
329
- if has_crypto_policies(sut)
330
- on(sut, "yum update -y crypto-policies", :accept_all_exit_codes => true)
440
+ def munge_ssh_crypto_policies(suts, key_types=['ssh-rsa'])
441
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
442
+ block_on(suts, :run_in_parallel => parallel) do |sut|
443
+ if has_crypto_policies(sut)
444
+ install_latest_package_on(sut, 'crypto-policies', nil, :accept_all_exit_codes => true)
331
445
 
332
- # Since we may be doing this prior to having a box flip into FIPS mode, we
333
- # need to find and modify *all* of the affected policies
334
- on( sut, %{sed --follow-symlinks -i 's/PubkeyAcceptedKeyTypes\\(.\\)/PubkeyAcceptedKeyTypes\\1#{key_types.join(',')},/' $( grep -L ssh-rsa $( find /etc/crypto-policies /usr/share/crypto-policies -type f -a \\( -name '*.txt' -o -name '*.config' \\) -exec grep -l PubkeyAcceptedKeyTypes {} \\; ) ) })
446
+ # Since we may be doing this prior to having a box flip into FIPS mode, we
447
+ # need to find and modify *all* of the affected policies
448
+ on( sut, %{sed --follow-symlinks -i 's/\\(HostKeyAlgorithms\\|PubkeyAcceptedKeyTypes\\)\\(.\\)/\\1\\2#{key_types.join(',')},/g' $( grep -L ssh-rsa $( find /etc/crypto-policies /usr/share/crypto-policies -type f -a \\( -name '*.txt' -o -name '*.config' \\) -exec grep -l PubkeyAcceptedKeyTypes {} \\; ) ) })
449
+ end
335
450
  end
336
451
  end
337
452
 
@@ -341,7 +456,10 @@ module Simp::BeakerHelpers
341
456
  puts ' -- (use BEAKER_fips=no to disable)'
342
457
  parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
343
458
 
459
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
344
460
  block_on(suts, :run_in_parallel => parallel) do |sut|
461
+ next if sut[:hypervisor] == 'docker'
462
+
345
463
  if is_windows?(sut)
346
464
  puts " -- SKIPPING #{sut} because it is windows"
347
465
  next
@@ -378,13 +496,16 @@ module Simp::BeakerHelpers
378
496
 
379
497
  fips_enable_modulepath = '--modulepath=/root/.beaker_fips/modules'
380
498
 
381
- module_install_cmd = 'puppet module install simp-fips --target-dir=/root/.beaker_fips/modules'
499
+ modules_to_install = {
500
+ 'simp-fips' => ENV['BEAKER_fips_module_version'],
501
+ 'simp-crypto_policy' => nil
502
+ }
382
503
 
383
- if ENV['BEAKER_fips_module_version']
384
- module_install_cmd += " --version #{ENV['BEAKER_fips_module_version']}"
504
+ modules_to_install.each_pair do |to_install, version|
505
+ module_install_cmd = "puppet module install #{to_install} --target-dir=/root/.beaker_fips/modules"
506
+ module_install_cmd += " --version #{version}" if version
507
+ on(sut, module_install_cmd)
385
508
  end
386
-
387
- on(sut, module_install_cmd)
388
509
  end
389
510
 
390
511
  # Work around Vagrant and cipher restrictions in EL8+
@@ -490,139 +611,173 @@ module Simp::BeakerHelpers
490
611
  # Enable EPEL if appropriate to do so and the system is online
491
612
  #
492
613
  # Can be disabled by setting BEAKER_enable_epel=no
493
- def enable_epel_on(sut)
494
- if ONLINE && (ENV['BEAKER_stringify_facts'] != 'no')
495
- os_info = fact_on(sut, 'os')
496
- os_maj_rel = os_info['release']['major']
497
-
498
- # This is based on the official EPEL docs https://fedoraproject.org/wiki/EPEL
499
- if ['RedHat', 'CentOS'].include?(os_info['name'])
500
- on(
501
- sut,
502
- %{yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-#{os_maj_rel}.noarch.rpm},
503
- :max_retries => 3,
504
- :retry_interval => 10
505
- )
614
+ def enable_epel_on(suts)
615
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
616
+ block_on(suts, :run_in_parallel => parallel) do |sut|
617
+ if ONLINE
618
+ os_info = fact_on(sut, 'os')
619
+ os_maj_rel = os_info['release']['major']
620
+
621
+ # This is based on the official EPEL docs https://fedoraproject.org/wiki/EPEL
622
+ case os_info['name']
623
+ when 'RedHat','CentOS'
624
+ install_latest_package_on(
625
+ sut,
626
+ 'epel-release',
627
+ "https://dl.fedoraproject.org/pub/epel/epel-release-latest-#{os_maj_rel}.noarch.rpm",
628
+ )
629
+
630
+ if os_info['name'] == 'RedHat'
631
+ if os_maj_rel == '7'
632
+ on sut, %{subscription-manager repos --enable "rhel-*-optional-rpms"}
633
+ on sut, %{subscription-manager repos --enable "rhel-*-extras-rpms"}
634
+ on sut, %{subscription-manager repos --enable "rhel-ha-for-rhel-*-server-rpms"}
635
+ end
506
636
 
507
- if os_info['name'] == 'RedHat'
508
- if os_maj_rel == '7'
509
- on sut, %{subscription-manager repos --enable "rhel-*-optional-rpms"}
510
- on sut, %{subscription-manager repos --enable "rhel-*-extras-rpms"}
511
- on sut, %{subscription-manager repos --enable "rhel-ha-for-rhel-*-server-rpms"}
637
+ if os_maj_rel == '8'
638
+ on sut, %{subscription-manager repos --enable "codeready-builder-for-rhel-8-#{os_info['architecture']}-rpms"}
639
+ end
512
640
  end
513
641
 
514
- if os_maj_rel == '8'
515
- on sut, %{subscription-manager repos --enable "codeready-builder-for-rhel-8-#{os_info['architecture']}-rpms"}
642
+ if os_info['name'] == 'CentOS'
643
+ if os_maj_rel == '8'
644
+ # 8.0 fallback
645
+ install_latest_package_on(sut, 'dnf-plugins-core')
646
+ on sut, %{dnf config-manager --set-enabled powertools || dnf config-manager --set-enabled PowerTools}
647
+ end
516
648
  end
649
+ when 'OracleLinux'
650
+ package_name = "oracle-epel-release-el#{os_maj_rel}"
651
+ install_latest_package_on(sut,package_name)
517
652
  end
518
653
 
519
- if os_info['name'] == 'CentOS'
520
- if os_maj_rel == '8'
521
- # 8.0 fallback
522
- on sut, %{dnf config-manager --set-enabled powertools || dnf config-manager --set-enabled PowerTools}
523
- end
524
- end
525
654
  end
526
655
  end
527
656
  end
528
657
 
529
- def linux_errata( sut )
530
- # We need to be able to flip between server and client without issue
531
- on sut, 'puppet resource group puppet gid=52'
532
- on sut, 'puppet resource user puppet comment="Puppet" gid="52" uid="52" home="/var/lib/puppet" managehome=true'
658
+ def update_package_from_centos_stream(suts, package_name)
659
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
660
+ block_on(suts, :run_in_parallel => parallel) do |sut|
661
+ sut.install_package('centos-release-stream') unless sut.check_for_package('centos-release-stream')
662
+ install_latest_package_on(sut, package_name)
663
+ sut.uninstall_package('centos-release-stream')
664
+ end
665
+ end
533
666
 
534
- # Make sure we have a domain on our host
535
- current_domain = fact_on(sut, 'domain').strip
536
- hostname = fact_on(sut, 'hostname').strip
667
+ def linux_errata( suts )
668
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
669
+ block_on(suts, :run_in_parallel => parallel) do |sut|
670
+ # We need to be able to flip between server and client without issue
671
+ on sut, 'puppet resource group puppet gid=52'
672
+ on sut, 'puppet resource user puppet comment="Puppet" gid="52" uid="52" home="/var/lib/puppet" managehome=true'
537
673
 
538
- if current_domain.empty?
539
- new_fqdn = hostname + '.beaker.test'
674
+ os_info = fact_on(sut, 'os')
540
675
 
541
- on(sut, "sed -i 's/#{hostname}.*/#{new_fqdn} #{hostname}/' /etc/hosts")
542
- on(sut, "echo '#{new_fqdn}' > /etc/hostname", :accept_all_exit_codes => true)
543
- on(sut, "hostname #{new_fqdn}", :accept_all_exit_codes => true)
676
+ # Make sure we have a domain on our host
677
+ current_domain = fact_on(sut, 'domain').strip
678
+ hostname = fact_on(sut, 'hostname').strip
544
679
 
545
- if sut.file_exist?('/etc/sysconfig/network')
546
- on(sut, "sed -s '/HOSTNAME=/d' /etc/sysconfig/network")
547
- on(sut, "echo 'HOSTNAME=#{new_fqdn}' >> /etc/sysconfig/network")
548
- end
549
- end
680
+ if current_domain.empty?
681
+ new_fqdn = hostname + '.beaker.test'
550
682
 
551
- if fact_on(sut, 'domain').strip.empty?
552
- fail("Error: hosts must have an FQDN, got domain='#{current_domain}'")
553
- end
683
+ on(sut, "sed -i 's/#{hostname}.*/#{new_fqdn} #{hostname}/' /etc/hosts")
684
+ on(sut, "echo '#{new_fqdn}' > /etc/hostname", :accept_all_exit_codes => true)
685
+ on(sut, "hostname #{new_fqdn}", :accept_all_exit_codes => true)
554
686
 
555
- # This may not exist in docker so just skip the whole thing
556
- if sut.file_exist?('/etc/ssh')
557
- # SIMP uses a central ssh key location so we prep that spot in case we
558
- # flip to the SIMP SSH module.
559
- on(sut, 'mkdir -p /etc/ssh/local_keys')
560
- on(sut, 'chown -R root:root /etc/ssh/local_keys')
561
- on(sut, 'chmod 755 /etc/ssh/local_keys')
562
-
563
- user_info = on(sut, 'getent passwd').stdout.lines
564
-
565
- # Hash of user => home_dir
566
- # Exclude silly directories
567
- # * /
568
- # * /dev/*
569
- # * /s?bin
570
- # * /proc
571
- user_info = Hash[
572
- user_info.map do |u|
573
- u.strip!
574
- u = u.split(':')
575
- u[5] =~ %r{^(/|/dev/.*|/s?bin/?.*|/proc/?.*)$} ? [nil] : [u[0], u[5]]
687
+ if sut.file_exist?('/etc/sysconfig/network')
688
+ on(sut, "sed -s '/HOSTNAME=/d' /etc/sysconfig/network")
689
+ on(sut, "echo 'HOSTNAME=#{new_fqdn}' >> /etc/sysconfig/network")
576
690
  end
577
- ]
691
+ end
692
+
693
+ if fact_on(sut, 'domain').strip.empty?
694
+ fail("Error: hosts must have an FQDN, got domain='#{current_domain}'")
695
+ end
578
696
 
579
- user_info.keys.each do |user|
580
- src_file = "#{user_info[user]}/.ssh/authorized_keys"
581
- tgt_file = "/etc/ssh/local_keys/#{user}"
697
+ # This may not exist in docker so just skip the whole thing
698
+ if sut.file_exist?('/etc/ssh')
699
+ # SIMP uses a central ssh key location so we prep that spot in case we
700
+ # flip to the SIMP SSH module.
701
+ on(sut, 'mkdir -p /etc/ssh/local_keys')
702
+ on(sut, 'chown -R root:root /etc/ssh/local_keys')
703
+ on(sut, 'chmod 755 /etc/ssh/local_keys')
704
+
705
+ user_info = on(sut, 'getent passwd').stdout.lines
706
+
707
+ # Hash of user => home_dir
708
+ # Exclude silly directories
709
+ # * /
710
+ # * /dev/*
711
+ # * /s?bin
712
+ # * /proc
713
+ user_info = Hash[
714
+ user_info.map do |u|
715
+ u.strip!
716
+ u = u.split(':')
717
+ u[5] =~ %r{^(/|/dev/.*|/s?bin/?.*|/proc/?.*)$} ? [nil] : [u[0], u[5]]
718
+ end
719
+ ]
582
720
 
583
- on(sut, %{if [ -f "#{src_file}" ]; then cp -a -f "#{src_file}" "#{tgt_file}" && chmod 644 "#{tgt_file}"; fi}, :silent => true)
721
+ user_info.keys.each do |user|
722
+ src_file = "#{user_info[user]}/.ssh/authorized_keys"
723
+ tgt_file = "/etc/ssh/local_keys/#{user}"
724
+
725
+ on(sut, %{if [ -f "#{src_file}" ]; then cp -a -f "#{src_file}" "#{tgt_file}" && chmod 644 "#{tgt_file}"; fi}, :silent => true)
726
+ end
584
727
  end
585
- end
586
728
 
587
- # SIMP uses structured facts, therefore stringify_facts must be disabled
588
- unless ENV['BEAKER_stringify_facts'] == 'yes'
589
- on sut, 'puppet config set stringify_facts false'
590
- end
729
+ # SIMP uses structured facts, therefore stringify_facts must be disabled
730
+ unless ENV['BEAKER_stringify_facts'] == 'yes'
731
+ on sut, 'puppet config set stringify_facts false'
732
+ end
591
733
 
592
- # Occasionally we run across something similar to BKR-561, so to ensure we
593
- # at least have the host defaults:
594
- #
595
- # :hieradatadir is used as a canary here; it isn't the only missing key
596
- unless sut.host_hash.key? :hieradatadir
597
- configure_type_defaults_on(sut)
598
- end
734
+ # Occasionally we run across something similar to BKR-561, so to ensure we
735
+ # at least have the host defaults:
736
+ #
737
+ # :hieradatadir is used as a canary here; it isn't the only missing key
738
+ unless sut.host_hash.key? :hieradatadir
739
+ configure_type_defaults_on(sut)
740
+ end
599
741
 
600
- if fact_on(sut, 'osfamily') == 'RedHat'
601
- if fact_on(sut, 'operatingsystem') == 'RedHat'
602
- RSpec.configure do |c|
603
- c.before(:all) do
604
- rhel_rhsm_subscribe(sut)
605
- end
742
+ if os_info['family'] == 'RedHat'
743
+ # OS-specific items
744
+ if os_info['name'] == 'RedHat'
745
+ RSpec.configure do |c|
746
+ c.before(:all) do
747
+ rhel_rhsm_subscribe(sut)
748
+ end
606
749
 
607
- c.after(:all) do
608
- rhel_rhsm_unsubscribe(sut)
750
+ c.after(:all) do
751
+ rhel_rhsm_unsubscribe(sut)
752
+ end
609
753
  end
610
754
  end
611
- end
612
755
 
613
- enable_yum_repos_on(sut)
614
- enable_epel_on(sut)
756
+ if ['CentOS','RedHat','OracleLinux'].include?(os_info['name'])
757
+ enable_yum_repos_on(sut)
758
+ enable_epel_on(sut)
615
759
 
616
- # net-tools required for netstat utility being used by be_listening
617
- if fact_on(sut, 'operatingsystemmajrelease') == '7'
618
- pp = <<-EOS
619
- package { 'net-tools': ensure => installed }
620
- EOS
621
- apply_manifest_on(sut, pp, :catch_failures => false)
622
- end
760
+ # net-tools required for netstat utility being used by be_listening
761
+ if os_info['release']['major'].to_i >= 7
762
+ pp = <<-EOS
763
+ package { 'net-tools': ensure => installed }
764
+ EOS
765
+ apply_manifest_on(sut, pp, :catch_failures => false)
766
+ end
767
+
768
+ unless sut[:hypervisor] == 'docker'
769
+ if (os_info['name'] == 'CentOS') && (os_info['release']['major'].to_i >= 8)
770
+ if os_info['release']['minor'].to_i == 3
771
+ update_package_from_centos_stream(sut, 'kernel')
772
+ sut.reboot
773
+ end
774
+ end
775
+ end
623
776
 
624
- # Clean up YUM prior to starting our test runs.
625
- on(sut, 'yum clean all')
777
+ # Clean up YUM prior to starting our test runs.
778
+ on(sut, 'yum clean all')
779
+ end
780
+ end
626
781
  end
627
782
  end
628
783
 
@@ -630,85 +785,100 @@ module Simp::BeakerHelpers
630
785
  #
631
786
  # Must set BEAKER_RHSM_USER and BEAKER_RHSM_PASS environment variables or pass them in as
632
787
  # parameters
633
- def rhel_rhsm_subscribe(sut, *opts)
788
+ def rhel_rhsm_subscribe(suts, *opts)
634
789
  require 'securerandom'
635
790
 
636
- rhsm_opts = {
637
- :username => ENV['BEAKER_RHSM_USER'],
638
- :password => ENV['BEAKER_RHSM_PASS'],
639
- :system_name => "#{sut}_beaker_#{Time.now.to_i}_#{SecureRandom.uuid}",
640
- :repo_list => {
641
- '7' => [
642
- 'rhel-7-server-extras-rpms',
643
- 'rhel-7-server-optional-rpms',
644
- 'rhel-7-server-rh-common-rpms',
645
- 'rhel-7-server-rpms',
646
- 'rhel-7-server-supplementary-rpms'
647
- ],
648
- '8' => [
649
- 'rhel-8-for-x86_64-baseos-rpms',
650
- 'rhel-8-for-x86_64-supplementary-rpms'
651
- ]
791
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
792
+ block_on(suts, :run_in_parallel => parallel) do |sut|
793
+ rhsm_opts = {
794
+ :username => ENV['BEAKER_RHSM_USER'],
795
+ :password => ENV['BEAKER_RHSM_PASS'],
796
+ :system_name => "#{sut}_beaker_#{Time.now.to_i}_#{SecureRandom.uuid}",
797
+ :repo_list => {
798
+ '7' => [
799
+ 'rhel-7-server-extras-rpms',
800
+ 'rhel-7-server-optional-rpms',
801
+ 'rhel-7-server-rh-common-rpms',
802
+ 'rhel-7-server-rpms',
803
+ 'rhel-7-server-supplementary-rpms'
804
+ ],
805
+ '8' => [
806
+ 'rhel-8-for-x86_64-baseos-rpms',
807
+ 'rhel-8-for-x86_64-supplementary-rpms'
808
+ ]
809
+ }
652
810
  }
653
- }
654
811
 
655
- if opts && opts.is_a?(Hash)
656
- rhsm_opts.merge!(opts)
657
- end
812
+ if opts && opts.is_a?(Hash)
813
+ rhsm_opts.merge!(opts)
814
+ end
658
815
 
659
- os = fact_on(sut, 'operatingsystem').strip
660
- os_release = fact_on(sut, 'operatingsystemmajrelease').strip
816
+ os = fact_on(sut, 'operatingsystem').strip
817
+ os_release = fact_on(sut, 'operatingsystemmajrelease').strip
661
818
 
662
- if os == 'RedHat'
663
- unless rhsm_opts[:username] && rhsm_opts[:password]
664
- fail("You must set BEAKER_RHSM_USER and BEAKER_RHSM_PASS environment variables to register RHEL systems")
665
- end
819
+ if os == 'RedHat'
820
+ unless rhsm_opts[:username] && rhsm_opts[:password]
821
+ fail("You must set BEAKER_RHSM_USER and BEAKER_RHSM_PASS environment variables to register RHEL systems")
822
+ end
666
823
 
667
- sub_status = on(sut, 'subscription-manager status', :accept_all_exit_codes => true)
668
- unless sub_status.exit_code == 0
669
- logger.info("Registering #{sut} via subscription-manager")
670
- on(sut, %{subscription-manager register --auto-attach --name='#{rhsm_opts[:system_name]}' --username='#{rhsm_opts[:username]}' --password='#{rhsm_opts[:password]}'}, :silent => true)
671
- end
824
+ sub_status = on(sut, 'subscription-manager status', :accept_all_exit_codes => true)
825
+ unless sub_status.exit_code == 0
826
+ logger.info("Registering #{sut} via subscription-manager")
827
+ on(sut, %{subscription-manager register --auto-attach --name='#{rhsm_opts[:system_name]}' --username='#{rhsm_opts[:username]}' --password='#{rhsm_opts[:password]}'}, :silent => true)
828
+ end
672
829
 
673
- if rhsm_opts[:repo_list][os_release]
674
- rhel_repo_enable(sut, rhsm_opts[:repo_list][os_release])
675
- else
676
- logger.warn("simp-beaker-helpers:#{__method__} => Default repos for RHEL '#{os_release}' not found")
677
- end
830
+ if rhsm_opts[:repo_list][os_release]
831
+ rhel_repo_enable(sut, rhsm_opts[:repo_list][os_release])
832
+ else
833
+ logger.warn("simp-beaker-helpers:#{__method__} => Default repos for RHEL '#{os_release}' not found")
834
+ end
678
835
 
679
- # Ensure that all users can access the entitlements since we don't know
680
- # who we'll be running jobs as (often not root)
681
- on(sut, 'chmod -R ugo+rX /etc/pki/entitlement', :accept_all_exit_codes => true)
836
+ # Ensure that all users can access the entitlements since we don't know
837
+ # who we'll be running jobs as (often not root)
838
+ on(sut, 'chmod -R ugo+rX /etc/pki/entitlement', :accept_all_exit_codes => true)
839
+ end
682
840
  end
683
841
  end
684
842
 
685
- def sosreport(sut, dest='sosreports')
686
- on(sut, 'puppet resource package sos ensure=latest')
687
- on(sut, 'sosreport --batch')
843
+ def sosreport(suts, dest='sosreports')
844
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
845
+ block_on(suts, :run_in_parallel => parallel) do |sut|
846
+ install_latest_package_on(sut, 'sos')
847
+ on(sut, 'sosreport --batch')
688
848
 
689
- files = on(sut, 'ls /var/tmp/sosreport* /tmp/sosreport* 2>/dev/null', :accept_all_exit_codes => true).output.lines.map(&:strip)
849
+ files = on(sut, 'ls /var/tmp/sosreport* /tmp/sosreport* 2>/dev/null', :accept_all_exit_codes => true).output.lines.map(&:strip)
690
850
 
691
- FileUtils.mkdir_p(dest)
851
+ FileUtils.mkdir_p(dest)
692
852
 
693
- files.each do |file|
694
- scp_from(sut, file, File.absolute_path(dest))
853
+ files.each do |file|
854
+ scp_from(sut, file, File.absolute_path(dest))
855
+ end
695
856
  end
696
857
  end
697
858
 
698
- def rhel_repo_enable(sut, repos)
699
- Array(repos).each do |repo|
700
- on(sut, %{subscription-manager repos --enable #{repo}})
859
+ def rhel_repo_enable(suts, repos)
860
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
861
+ block_on(suts, :run_in_parallel => parallel) do |sut|
862
+ Array(repos).each do |repo|
863
+ on(sut, %{subscription-manager repos --enable #{repo}})
864
+ end
701
865
  end
702
866
  end
703
867
 
704
- def rhel_repo_disable(sut, repos)
705
- Array(repos).each do |repo|
706
- on(sut, %{subscription-manager repos --disable #{repo}}, :accept_all_exit_codes => true)
868
+ def rhel_repo_disable(suts, repos)
869
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
870
+ block_on(suts, :run_in_parallel => parallel) do |sut|
871
+ Array(repos).each do |repo|
872
+ on(sut, %{subscription-manager repos --disable #{repo}}, :accept_all_exit_codes => true)
873
+ end
707
874
  end
708
875
  end
709
876
 
710
- def rhel_rhsm_unsubscribe(sut)
711
- on(sut, %{subscription-manager unregister}, :accept_all_exit_codes => true)
877
+ def rhel_rhsm_unsubscribe(suts)
878
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
879
+ block_on(suts, :run_in_parallel => parallel) do |sut|
880
+ on(sut, %{subscription-manager unregister}, :accept_all_exit_codes => true)
881
+ end
712
882
  end
713
883
 
714
884
  # Apply known OS fixes we need to run Beaker on each SUT
@@ -782,6 +952,9 @@ module Simp::BeakerHelpers
782
952
 
783
953
  host_entry = { fqdn => [] }
784
954
 
955
+ # Add the short name because containers can't change the hostname
956
+ host_entry[fqdn] << host.name if (host[:hypervisor] == 'docker')
957
+
785
958
  # Ensure that all interfaces are active prior to collecting data
786
959
  activate_interfaces(host) unless ENV['BEAKER_no_fix_interfaces']
787
960
 
@@ -795,7 +968,7 @@ module Simp::BeakerHelpers
795
968
  host_entry[fqdn] << ipaddress.strip
796
969
 
797
970
  unless host_entry[fqdn].empty?
798
- suts_network_info[fqdn] = host_entry[fqdn]
971
+ suts_network_info[fqdn] = host_entry[fqdn].sort.uniq
799
972
  end
800
973
  end
801
974
  end
@@ -824,6 +997,7 @@ module Simp::BeakerHelpers
824
997
  end
825
998
 
826
999
  copy_to(ca_sut, pki_hosts_file, host_dir)
1000
+
827
1001
  # generate certs
828
1002
  on(ca_sut, "cd #{host_dir}; cat #{host_dir}/pki.hosts | xargs bash make.sh")
829
1003
  end
@@ -858,8 +1032,8 @@ module Simp::BeakerHelpers
858
1032
  sut.mkdir_p("#{sut_pki_dir}/public")
859
1033
  sut.mkdir_p("#{sut_pki_dir}/private")
860
1034
  sut.mkdir_p("#{sut_pki_dir}/cacerts")
861
- copy_to(sut, "#{local_host_pki_tree}/#{fqdn}.pem", "#{sut_pki_dir}/private/")
862
- copy_to(sut, "#{local_host_pki_tree}/#{fqdn}.pub", "#{sut_pki_dir}/public/")
1035
+ copy_to(sut, "#{local_host_pki_tree}/#{fqdn}.pem", "#{sut_pki_dir}/private/")
1036
+ copy_to(sut, "#{local_host_pki_tree}/#{fqdn}.pub", "#{sut_pki_dir}/public/")
863
1037
 
864
1038
  copy_to(sut, local_cacert, "#{sut_pki_dir}/cacerts/simp_auto_ca.pem")
865
1039
 
@@ -869,18 +1043,19 @@ module Simp::BeakerHelpers
869
1043
  # Need to hash all of the CA certificates so that apps can use them
870
1044
  # properly! This must happen on the host itself since it needs to match
871
1045
  # the native hashing algorithms.
872
- hash_cmd = <<-EOM.strip
873
- cd #{sut_pki_dir}/cacerts; \
874
- for x in *; do \
875
- if [ ! -h "$x" ]; then \
876
- `openssl x509 -in $x >/dev/null 2>&1`; \
877
- if [ $? -eq 0 ]; then \
878
- hash=`openssl x509 -in $x -hash | head -1`; \
879
- ln -sf $x $hash.0; \
880
- fi; \
881
- fi; \
882
- done
883
- EOM
1046
+ hash_cmd = <<~EOM.strip
1047
+ PATH=/opt/puppetlabs/puppet/bin:$PATH; \
1048
+ cd #{sut_pki_dir}/cacerts; \
1049
+ for x in *; do \
1050
+ if [ ! -h "$x" ]; then \
1051
+ `openssl x509 -in $x >/dev/null 2>&1`; \
1052
+ if [ $? -eq 0 ]; then \
1053
+ hash=`openssl x509 -in $x -hash | head -1`; \
1054
+ ln -sf $x $hash.0; \
1055
+ fi; \
1056
+ fi; \
1057
+ done
1058
+ EOM
884
1059
 
885
1060
  on(sut, hash_cmd)
886
1061
  end
@@ -1292,60 +1467,79 @@ done
1292
1467
  # * 'simp-community-postgres'
1293
1468
  # * 'simp-community-puppet'
1294
1469
  #
1295
- def install_simp_repos(sut, disable = [])
1470
+ #
1471
+ # Environment Variables:
1472
+ # * BEAKER_SIMP_install_repos
1473
+ # * 'no' => disable the capability
1474
+ # * BEAKER_SIMP_disable_repos
1475
+ # * Comma delimited list of active yum repo names to disable
1476
+ def install_simp_repos(suts, disable = [])
1296
1477
  # NOTE: Do *NOT* use puppet in this method since it may not be available yet
1297
1478
 
1298
- if on(sut, 'rpm -q yum-utils', :accept_all_exit_codes => true).exit_code != 0
1299
- on(
1300
- sut,
1301
- 'yum -y install yum-utils',
1302
- :max_retries => 3,
1303
- :retry_interval => 10
1304
- )
1305
- end
1479
+ return if (ENV.fetch('SIMP_install_repos', 'yes') == 'no')
1306
1480
 
1307
- if on(sut, 'rpm -q simp-release-community', :accept_all_exit_codes => true).exit_code != 0
1308
- on(
1481
+ parallel = (ENV['BEAKER_SIMP_parallel'] == 'yes')
1482
+ block_on(suts, :run_in_parallel => parallel) do |sut|
1483
+ install_package_unless_present_on(sut, 'yum-utils')
1484
+
1485
+ install_package_unless_present_on(
1309
1486
  sut,
1310
- 'yum -y install "https://download.simp-project.com/simp-release-community.rpm"',
1311
- :max_retries => 3,
1312
- :retry_interval => 10
1487
+ 'simp-release-community',
1488
+ "https://download.simp-project.com/simp-release-community.rpm",
1313
1489
  )
1314
- end
1315
1490
 
1316
- to_disable = disable.dup
1491
+ to_disable = disable.dup
1492
+ to_disable += ENV.fetch('BEAKER_SIMP_disable_repos', '').split(',').map(&:strip)
1317
1493
 
1318
- unless to_disable.empty?
1319
- if to_disable.include?('simp')
1320
- to_disable.delete('simp')
1321
- to_disable << 'simp-community-simp'
1322
- end
1494
+ unless to_disable.empty?
1495
+ if to_disable.include?('simp')
1496
+ to_disable.delete('simp')
1497
+ to_disable << 'simp-community-simp'
1498
+ end
1323
1499
 
1324
- if to_disable.include?('simp_deps')
1325
- to_disable.delete('simp_deps')
1326
- to_disable << 'simp-community-epel'
1327
- to_disable << 'simp-community-postgres'
1328
- to_disable << 'simp-community-puppet'
1329
- end
1500
+ if to_disable.include?('simp_deps')
1501
+ to_disable.delete('simp_deps')
1502
+ to_disable << 'simp-community-epel'
1503
+ to_disable << 'simp-community-postgres'
1504
+ to_disable << 'simp-community-puppet'
1505
+ end
1330
1506
 
1331
- # NOTE: This --enablerepo enables the repos for listing and is inherited
1332
- # from YUM. This does not actually "enable" the repos, that would require
1333
- # the "--enable" option (from yum-config-manager) :-D.
1334
- #
1335
- # Note: Certain versions of EL8 do not dump by default and EL7 does not
1336
- # have the '--dump' option.
1337
- available_repos = on(sut, %{yum-config-manager --enablerepo="*" || yum-config-manager --enablerepo="*" --dump}).stdout.lines.grep(/\A\[(.+)\]\Z/){|x| $1}
1507
+ # NOTE: This --enablerepo enables the repos for listing and is inherited
1508
+ # from YUM. This does not actually "enable" the repos, that would require
1509
+ # the "--enable" option (from yum-config-manager) :-D.
1510
+ #
1511
+ # Note: Certain versions of EL8 do not dump by default and EL7 does not
1512
+ # have the '--dump' option.
1513
+ available_repos = on(sut, %{yum-config-manager --enablerepo="*" || yum-config-manager --enablerepo="*" --dump}).stdout.lines.grep(/\A\[(.+)\]\Z/){|x| $1}
1338
1514
 
1339
- invalid_repos = (to_disable - available_repos)
1515
+ invalid_repos = (to_disable - available_repos)
1340
1516
 
1341
- # Verify that the repos passed to disable are in the list of valid repos
1342
- unless invalid_repos.empty?
1343
- logger.warn(%{WARN: install_simp_repo - requested repos to disable do not exist on the target system '#{invalid_repos.join("', '")}'.})
1344
- end
1517
+ # Verify that the repos passed to disable are in the list of valid repos
1518
+ unless invalid_repos.empty?
1519
+ logger.warn(%{WARN: install_simp_repo - requested repos to disable do not exist on the target system '#{invalid_repos.join("', '")}'.})
1520
+ end
1345
1521
 
1346
- (to_disable - invalid_repos).each do |repo|
1347
- on(sut, %{yum-config-manager --disable "#{repo}"})
1522
+ (to_disable - invalid_repos).each do |repo|
1523
+ on(sut, %{yum-config-manager --disable "#{repo}"})
1524
+ end
1348
1525
  end
1349
1526
  end
1527
+
1528
+ set_yum_opts_on(suts, {'simp*.skip_if_unavailable' => '1' })
1529
+ end
1530
+
1531
+ # Set the release and release type of the SIMP yum repos
1532
+ #
1533
+ # Environment variables may be used to set either one
1534
+ # * BEAKER_SIMP_repo_release => The actual release (version number)
1535
+ # * BEAKER_SIMP_repo_release_type => The type of release (stable, unstable, rolling, etc...)
1536
+ def set_simp_repo_release(sut, simp_release_type='stable', simp_release='6')
1537
+ simp_release = ENV.fetch('BEAKER_SIMP_repo_release', simp_release)
1538
+ simp_release_type = ENV.fetch('BEAKER_SIMP_repo_release_type', simp_release_type)
1539
+
1540
+ simp_release_type = 'releases' if (simp_release_type == 'stable')
1541
+
1542
+ create_remote_file(sut, '/etc/yum/vars/simprelease', simp_release)
1543
+ create_remote_file(sut, '/etc/yum/vars/simpreleasetype', simp_release_type)
1350
1544
  end
1351
1545
  end