Skip to content

Commit e4fef41

Browse files
authored
Merge pull request #506 from puppetlabs/feat-override_default_provisioner
(FEAT) - Add ability to supply a custom matrix and override default provisioner
2 parents a2dab8f + 4aec93a commit e4fef41

File tree

3 files changed

+78
-29
lines changed

3 files changed

+78
-29
lines changed

exe/matrix_from_metadata_v2

Lines changed: 71 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -94,29 +94,79 @@ else
9494
exclude_list = []
9595
end
9696

97+
# Force the use of the provision_service provisioner, if the --provision-service argument is present
98+
if ARGV.include?('--provision-service')
99+
provision_service_occurrences = ARGV.count { |arg| arg == '--provision-service' }
100+
raise 'the --provision-service argument should be present just one time in the command' unless provision_service_occurrences <= 1
101+
102+
# NOTE: that the below are the only available images for the provision service
103+
updated_platforms = {
104+
'AlmaLinux-8' => 'almalinux-cloud/almalinux-8',
105+
'CentOS-7' => 'centos-7',
106+
'CentOS-8' => 'centos-stream-8',
107+
'Rocky-8' => 'rocky-linux-cloud/rocky-linux-8',
108+
'Debian-10' => 'debian-10',
109+
'Debian-11' => 'debian-11',
110+
'Ubuntu-20.04' => 'ubuntu-2004-lts',
111+
'Ubuntu-22.04' => 'ubuntu-2204-lts'
112+
}
113+
114+
updated_list = IMAGE_TABLE.dup.clone
115+
updated_list.merge!(updated_platforms)
116+
117+
IMAGE_TABLE = updated_list.freeze
118+
DOCKER_PLATFORMS = {}.freeze
119+
end
120+
97121
metadata_path = ENV['TEST_MATRIX_FROM_METADATA'] || 'metadata.json'
98122
metadata = JSON.parse(File.read(metadata_path))
99-
# Set platforms based on declared operating system support
100-
metadata['operatingsystem_support'].sort_by { |a| a['operatingsystem'] }.each do |sup|
101-
os = sup['operatingsystem']
102-
sup['operatingsystemrelease'].sort_by(&:to_i).each do |ver|
103-
image_key = "#{os}-#{ver}"
104-
105-
if IMAGE_TABLE.key?(image_key) && !exclude_list.include?(image_key.downcase)
106-
matrix[:platforms] << {
107-
label: image_key,
108-
provider: 'provision::provision_service',
109-
image: IMAGE_TABLE[image_key]
110-
}
111-
elsif DOCKER_PLATFORMS.key?(image_key) && !exclude_list.include?(image_key.downcase)
112-
matrix[:platforms] << {
113-
label: image_key,
114-
provider: 'provision::docker',
115-
image: DOCKER_PLATFORMS[image_key]
116-
}
123+
124+
# Allow the user to pass a file containing a custom matrix
125+
if ARGV.include?('--custom-matrix')
126+
custom_matrix_occurrences = ARGV.count { |arg| arg == '--custom-matrix' }
127+
raise '--custom-matrix argument should be present just one time in the command' unless custom_matrix_occurrences <= 1
128+
129+
file_path = ARGV[ARGV.find_index('--custom-matrix') + 1]
130+
raise 'no file path specified' if file_path.nil?
131+
132+
begin
133+
custom_matrix = JSON.parse(File.read(file_path))
134+
rescue StandardError => e
135+
case e
136+
when JSON::ParserError
137+
raise 'the matrix must be an array of valid JSON objects'
138+
when Errno::ENOENT
139+
raise "File not found: #{e.message}"
117140
else
118-
puts "::warning::#{image_key} was excluded from testing" if exclude_list.include?(image_key.downcase)
119-
puts "::warning::Cannot find image for #{image_key}" unless exclude_list.include?(image_key.downcase)
141+
raise "An unknown exception occurred: #{e.message}"
142+
end
143+
end
144+
custom_matrix.each do |platform|
145+
matrix[:platforms] << platform
146+
end
147+
else
148+
# Set platforms based on declared operating system support
149+
metadata['operatingsystem_support'].sort_by { |a| a['operatingsystem'] }.each do |sup|
150+
os = sup['operatingsystem']
151+
sup['operatingsystemrelease'].sort_by(&:to_i).each do |ver|
152+
image_key = "#{os}-#{ver}"
153+
154+
if IMAGE_TABLE.key?(image_key) && !exclude_list.include?(image_key.downcase)
155+
matrix[:platforms] << {
156+
label: image_key,
157+
provider: 'provision_service',
158+
image: IMAGE_TABLE[image_key]
159+
}
160+
elsif DOCKER_PLATFORMS.key?(image_key) && !exclude_list.include?(image_key.downcase)
161+
matrix[:platforms] << {
162+
label: image_key,
163+
provider: 'docker',
164+
image: DOCKER_PLATFORMS[image_key]
165+
}
166+
else
167+
puts "::warning::#{image_key} was excluded from testing" if exclude_list.include?(image_key.downcase)
168+
puts "::warning::Cannot find image for #{image_key}" unless exclude_list.include?(image_key.downcase)
169+
end
120170
end
121171
end
122172
end
@@ -155,9 +205,8 @@ end
155205

156206
# Set to defaults (all collections) if no matches are found
157207
matrix[:collection] = COLLECTION_TABLE.map { |collection| "puppet#{collection[:puppet_maj_version]}-nightly" } if matrix[:collection].empty?
158-
159208
# Just to make sure there aren't any duplicates
160-
matrix[:platforms] = matrix[:platforms].uniq.sort_by { |a| a[:label] }
209+
matrix[:platforms] = matrix[:platforms].uniq.sort_by { |a| a[:label] } unless ARGV.include?('--custom-matrix')
161210
matrix[:collection] = matrix[:collection].uniq.sort
162211

163212
set_output('matrix', JSON.generate(matrix))

lib/puppet_litmus/rake_helper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ def provisioner_task(provisioner)
287287
if SUPPORTED_PROVISIONERS.include?(provisioner)
288288
"provision::#{provisioner}"
289289
else
290-
warn "WARNING: Unsuported provisioner '#{provisioner}', try #{SUPPORTED_PROVISIONERS.join('/')}"
290+
warn "WARNING: Unsupported provisioner '#{provisioner}', try #{SUPPORTED_PROVISIONERS.join('/')}"
291291
provisioner.to_s
292292
end
293293
end

spec/exe/matrix_from_metadata_v2_spec.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
[
2323
'matrix={',
2424
'"platforms":[',
25-
'{"label":"CentOS-6","provider":"provision::docker","image":"litmusimage/centos:6"},',
26-
'{"label":"RedHat-8","provider":"provision::provision_service","image":"rhel-8"},',
27-
'{"label":"Ubuntu-18.04","provider":"provision::docker","image":"litmusimage/ubuntu:18.04"}',
25+
'{"label":"CentOS-6","provider":"docker","image":"litmusimage/centos:6"},',
26+
'{"label":"RedHat-8","provider":"provision_service","image":"rhel-8"},',
27+
'{"label":"Ubuntu-18.04","provider":"docker","image":"litmusimage/ubuntu:18.04"}',
2828
'],',
2929
'"collection":[',
3030
'"puppet7-nightly","puppet8-nightly"',
@@ -59,8 +59,8 @@
5959
[
6060
'matrix={',
6161
'"platforms":[',
62-
'{"label":"CentOS-6","provider":"provision::docker","image":"litmusimage/centos:6"},',
63-
'{"label":"RedHat-8","provider":"provision::provision_service","image":"rhel-8"}',
62+
'{"label":"CentOS-6","provider":"docker","image":"litmusimage/centos:6"},',
63+
'{"label":"RedHat-8","provider":"provision_service","image":"rhel-8"}',
6464
'],',
6565
'"collection":[',
6666
'"puppet7-nightly","puppet8-nightly"',
@@ -96,7 +96,7 @@
9696
[
9797
'matrix={',
9898
'"platforms":[',
99-
'{"label":"CentOS-6","provider":"provision::docker","image":"litmusimage/centos:6"}',
99+
'{"label":"CentOS-6","provider":"docker","image":"litmusimage/centos:6"}',
100100
'],',
101101
'"collection":[',
102102
'"puppet7-nightly","puppet8-nightly"',

0 commit comments

Comments
 (0)