puppet_metadata 0.4.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 87b930530ef333350feba4aff3093f9629293280fc03f007b0cc5d1236f4b4e9
4
- data.tar.gz: 4937ff7c9ae29363e548ae246578a6400bbf69690a4a9eb34dcb73d55ce41002
3
+ metadata.gz: a51387ced797e16745c927b7a839fc3192ff47fc7269a0729ccf5ebebfe85bb6
4
+ data.tar.gz: 9d0187e002a2cbc5d90c080405370efb979bdd2a3eec1be295c9567ab20639cb
5
5
  SHA512:
6
- metadata.gz: 5eebec460da1fef928f71f4c3e2c94e55a138ad060c819046df8ee7b0bdce0d916c2b406f7e1e9e431f7c41e93a91b2950cabd06ddaca4f2896c60a2f3152f05
7
- data.tar.gz: 835e8778b6d21ad36a74953c78e66ab93d2c828ce9b7b5088a7d795ee323749834f22245ea1e41873046b7b74c53f3b04b63d8d33d2415113e7deb46aff9b315
6
+ metadata.gz: 73b3e503a1331f92f98a4b0ebcf9c6fa5c69474edee3cdecafd2899647728d40b8494802042c02422cfdbdee33a7573cd1d1c0dba7443ccae14ecf0031d43433
7
+ data.tar.gz: 3201c83529d017649552d63833e774971692cb59d0eca654e59bd08265f0287a08da5f3b994f1e9ad72e14e1b50cfd9a3959950cee3056c433ccc0988400e441
@@ -0,0 +1,68 @@
1
+ module PuppetMetadata
2
+ class AIO
3
+ COMPATIBLE = {
4
+ 'AlmaLinux' => 'RedHat',
5
+ 'Amazon' => 'RedHat',
6
+ 'CentOS' => 'RedHat',
7
+ 'OracleLinux' => 'RedHat',
8
+ 'Rocky' => 'RedHat',
9
+ 'Scientific' => 'RedHat',
10
+ }.freeze
11
+
12
+ BUILDS = {
13
+ # RPM-based
14
+ 'RedHat' => {
15
+ '5' => 5..7,
16
+ '6' => 5..7,
17
+ '7' => 5..7,
18
+ '8' => 5..7,
19
+ },
20
+ 'Fedora' => {
21
+ '26' => [5],
22
+ '27' => 5..6,
23
+ '28' => 5..6,
24
+ '29' => 5..6,
25
+ '30' => 5..7,
26
+ '31' => 5..7,
27
+ '32' => 6..7,
28
+ '34' => 6..7,
29
+ },
30
+ 'SLES' => {
31
+ '11' => [7],
32
+ '12' => [7],
33
+ '15' => [7],
34
+ },
35
+ # deb-based
36
+ 'Debian' => {
37
+ '7' => [5],
38
+ '8' => 5..6,
39
+ '9' => 5..7,
40
+ '10' => 5..7,
41
+ '11' => 6..7,
42
+ },
43
+ 'Ubuntu' => {
44
+ '14.04' => 5..6,
45
+ '16.04' => 5..7,
46
+ '18.04' => 5..7,
47
+ '20.04' => 6..7,
48
+ },
49
+ }.freeze
50
+
51
+ PUPPET_RUBY_VERSIONS = {
52
+ 4 => '2.1',
53
+ 5 => '2.4',
54
+ 6 => '2.5',
55
+ 7 => '2.7',
56
+ }.freeze
57
+
58
+ class << self
59
+ def find_base_os(os)
60
+ COMPATIBLE.fetch(os, os)
61
+ end
62
+
63
+ def has_aio_build?(os, release, puppet_version)
64
+ BUILDS.dig(find_base_os(os), release)&.include?(puppet_version)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -4,62 +4,79 @@ module PuppetMetadata
4
4
  # @see https://rubygems.org/gems/beaker
5
5
  # @see https://rubygems.org/gems/beaker-hostgenerator
6
6
  class Beaker
7
- # Convert an Operating System name with a release to a Beaker setfile
8
- #
9
- # @param [String] os
10
- # The Operating System string as metadata.json knows it, which in turn is
11
- # based on Facter's operatingsystem fact.
12
- # @param [String] release The OS release
13
- # @param [Boolean] use_fqdn
14
- # Whether or not to use a FQDN, ensuring a domain
15
- # @param [Boolean, Array[String]] pidfile_workaround
16
- # Whether or not to apply the systemd PIDFile workaround. This is only
17
- # needed when the daemon uses PIDFile in its service file and using
18
- # Docker as a Beaker hypervisor. This is to work around Docker's
19
- # limitations.
20
- # When a boolean, it's applied on applicable operating systems. On arrays
21
- # it's applied only when os is included in the provided array.
22
- #
23
- # @return [nil] If no setfile is available
24
- # @return [Array<(String, String)>] The beaker setfile description with a readable name
25
- def self.os_release_to_setfile(os, release, use_fqdn: false, pidfile_workaround: false)
26
- return unless os_supported?(os)
7
+ # These images have an older systemd, which they work with
8
+ # PIDFile parameter
9
+ PIDFILE_COMPATIBLE_IMAGES = {
10
+ 'CentOS' => {
11
+ '7' => 'centos:7.6.1810',
12
+ },
13
+ 'Ubuntu' => {
14
+ '16.04' => 'ubuntu:xenial-20191212',
15
+ },
16
+ }.freeze
27
17
 
28
- name = "#{os.downcase}#{release.tr('.', '')}-64"
18
+ # There is no CentOS 8 image that works with PIDFile in systemd
19
+ # unit files
20
+ PIDFILE_INCOMPATIBLE = {
21
+ 'CentOS' => ['8'],
22
+ }.freeze
23
+ class << self
24
+ # Convert an Operating System name with a release to a Beaker setfile
25
+ #
26
+ # @param [String] os
27
+ # The Operating System string as metadata.json knows it, which in turn is
28
+ # based on Facter's operatingsystem fact.
29
+ # @param [String] release The OS release
30
+ # @param [Boolean] use_fqdn
31
+ # Whether or not to use a FQDN, ensuring a domain
32
+ # @param [Boolean, Array[String]] pidfile_workaround
33
+ # Whether or not to apply the systemd PIDFile workaround. This is only
34
+ # needed when the daemon uses PIDFile in its service file and using
35
+ # Docker as a Beaker hypervisor. This is to work around Docker's
36
+ # limitations.
37
+ # When a boolean, it's applied on applicable operating systems. On arrays
38
+ # it's applied only when os is included in the provided array.
39
+ #
40
+ # @return [nil] If no setfile is available
41
+ # @return [Array<(String, String)>] The beaker setfile description with a readable name
42
+ def os_release_to_setfile(os, release, use_fqdn: false, pidfile_workaround: false)
43
+ return unless os_supported?(os)
29
44
 
30
- options = {}
31
- options[:hostname] = "#{name}.example.com" if use_fqdn
45
+ name = "#{os.downcase}#{release.tr('.', '')}-64"
32
46
 
33
- # Docker messes up cgroups and modern systemd can't deal with that when
34
- # PIDFile is used.
35
- if pidfile_workaround && (!pidfile_workaround.is_a?(Array) || pidfile_workaround.include?(os))
36
- case os
37
- when 'CentOS'
38
- case release
39
- when '7'
40
- options[:image] = 'centos:7.6.1810'
41
- when '8'
42
- # There is no CentOS 8 image that works with PIDFile in systemd
43
- # unit files
44
- return
47
+ options = {}
48
+ options[:hostname] = "#{name}.example.com" if use_fqdn
49
+
50
+ # Docker messes up cgroups and modern systemd can't deal with that when
51
+ # PIDFile is used.
52
+ if pidfile_workaround?(pidfile_workaround, os)
53
+ return if PIDFILE_INCOMPATIBLE[os]&.include?(release)
54
+
55
+ if (image = PIDFILE_COMPATIBLE_IMAGES.dig(os, release))
56
+ options[:image] = image
45
57
  end
46
- when 'Ubuntu'
47
- options[:image] = 'ubuntu:xenial-20191212' if release == '16.04'
48
58
  end
59
+
60
+ human_name = "#{os} #{release}"
61
+
62
+ [build_setfile(name, options), human_name]
49
63
  end
50
64
 
51
- setfile = name
52
- setfile += "{#{options.map { |key, value| "#{key}=#{value}" }.join(',')}}" if options.any?
65
+ # Return whether a Beaker setfile can be generated for the given OS
66
+ # @param [String] os The operating system
67
+ def os_supported?(os)
68
+ ['CentOS', 'Fedora', 'Debian', 'Ubuntu'].include?(os)
69
+ end
53
70
 
54
- human_name = "#{os} #{release}"
71
+ private
55
72
 
56
- [setfile, human_name]
57
- end
73
+ def pidfile_workaround?(pidfile_workaround, os)
74
+ pidfile_workaround && (!pidfile_workaround.is_a?(Array) || pidfile_workaround.include?(os))
75
+ end
58
76
 
59
- # Return whether a Beaker setfile can be generated for the given OS
60
- # @param [String] os The operating system
61
- def self.os_supported?(os)
62
- ['CentOS', 'Fedora', 'Debian', 'Ubuntu'].include?(os)
77
+ def build_setfile(name, options)
78
+ "#{name}#{options.any? ? "{#{options.map { |key, value| "#{key}=#{value}" }.join(',')}}" : ''}"
79
+ end
63
80
  end
64
81
  end
65
82
  end
@@ -13,6 +13,7 @@ module PuppetMetadata
13
13
  beaker_setfiles: beaker_setfiles(beaker_use_fqdn, beaker_pidfile_workaround),
14
14
  puppet_major_versions: puppet_major_versions,
15
15
  puppet_unit_test_matrix: puppet_unit_test_matrix,
16
+ github_action_test_matrix: github_action_test_matrix(use_fqdn: beaker_use_fqdn, pidfile_workaround: beaker_pidfile_workaround),
16
17
  }
17
18
  end
18
19
 
@@ -41,7 +42,7 @@ module PuppetMetadata
41
42
 
42
43
  def puppet_unit_test_matrix
43
44
  metadata.puppet_major_versions.sort.reverse.map do |puppet|
44
- ruby = puppet_ruby_version(puppet)
45
+ ruby = PuppetMetadata::AIO::PUPPET_RUBY_VERSIONS[puppet]
45
46
  next unless ruby
46
47
 
47
48
  {
@@ -51,16 +52,24 @@ module PuppetMetadata
51
52
  end.compact
52
53
  end
53
54
 
54
- def puppet_ruby_version(puppet_version)
55
- case puppet_version
56
- when 4
57
- '2.1'
58
- when 5
59
- '2.4'
60
- when 6
61
- '2.5'
62
- when 7
63
- '2.7'
55
+ def github_action_test_matrix(use_fqdn: false, pidfile_workaround: false)
56
+ metadata.operatingsystems.each_with_object([]) do |(os, releases), matrix_include|
57
+ releases&.each do |release|
58
+ puppet_major_versions.each do |puppet_version|
59
+ next unless AIO.has_aio_build?(os, release, puppet_version[:value])
60
+
61
+ setfile = PuppetMetadata::Beaker.os_release_to_setfile(os, release, use_fqdn: use_fqdn, pidfile_workaround: pidfile_workaround)
62
+ next unless setfile
63
+
64
+ matrix_include << {
65
+ setfile: {
66
+ name: setfile[1],
67
+ value: setfile[0],
68
+ },
69
+ puppet: puppet_version
70
+ }
71
+ end
72
+ end
64
73
  end
65
74
  end
66
75
  end
@@ -22,9 +22,10 @@ module PuppetMetadata
22
22
  # https://wiki.debian.org/DebianReleases
23
23
  'Debian' => {
24
24
  # TODO: EOL is standard support, not the extended life cycle
25
+ '11' => nil, # '~2024',
25
26
  '10' => nil, # '~2022',
26
- '9' => nil, # '~2020',
27
- '8' => '2018-06-06',
27
+ '9' => '2020-07-06',
28
+ '8' => '2018-06-17',
28
29
  '7' => '2016-04-26',
29
30
  '6' => '2015-05-31',
30
31
  '5' => '2012-02-06',
@@ -113,47 +114,49 @@ module PuppetMetadata
113
114
  '5.04' => '2006-10-31',
114
115
  '4.10' => '2006-04-30',
115
116
  },
116
- }
117
+ }.freeze
117
118
 
118
- # Return the EOL date for the given operating system release
119
- # @param [String] operatingsystem
120
- # The operating system
121
- # @param [String] release
122
- # The major version of the operating system
123
- # @return [optional, Date]
124
- # The EOL date for the given operating system release. Nil is returned
125
- # when the either when the OS, the release or the EOL date is unknown
126
- def self.eol_date(operatingsystem, release)
127
- releases = EOL_DATES[operatingsystem]
128
- return unless releases
129
- date = releases[release]
130
- return unless date
131
- Date.parse(date)
132
- end
119
+ class << self
120
+ # Return the EOL date for the given operating system release
121
+ # @param [String] operatingsystem
122
+ # The operating system
123
+ # @param [String] release
124
+ # The major version of the operating system
125
+ # @return [optional, Date]
126
+ # The EOL date for the given operating system release. Nil is returned
127
+ # when the either when the OS, the release or the EOL date is unknown
128
+ def eol_date(operatingsystem, release)
129
+ releases = EOL_DATES[operatingsystem]
130
+ return unless releases
131
+ date = releases[release]
132
+ return unless date
133
+ Date.parse(date)
134
+ end
133
135
 
134
- # Return whether the given operating system release is EOL at the given
135
- # date
136
- #
137
- # @param [String] operatingsystem
138
- # The operating system
139
- # @param [String] release
140
- # The major version of the operating system
141
- # @return [Boolean]
142
- # The EOL date for the given operating system release. Nil is returned
143
- # when the either when the OS, the release or the EOL date is unknown
144
- def self.eol?(operatingsystem, release, at = nil)
145
- date = eol_date(operatingsystem, release)
146
- date && date < (at || Date.today)
147
- end
136
+ # Return whether the given operating system release is EOL at the given
137
+ # date
138
+ #
139
+ # @param [String] operatingsystem
140
+ # The operating system
141
+ # @param [String] release
142
+ # The major version of the operating system
143
+ # @return [Boolean]
144
+ # The EOL date for the given operating system release. Nil is returned
145
+ # when the either when the OS, the release or the EOL date is unknown
146
+ def eol?(operatingsystem, release, at = nil)
147
+ date = eol_date(operatingsystem, release)
148
+ date && date < (at || Date.today)
149
+ end
148
150
 
149
- # Return the latest known release for a given operating system
150
- # @param [String] operatingsystem The operating system
151
- # @return [optional, String]
152
- # The latest major release for the given operating system, if any is
153
- # known
154
- def self.latest_release(operatingsystem)
155
- releases = EOL_DATES[operatingsystem]
156
- releases&.keys&.max_by { |release| Gem::Version.new(release) }
151
+ # Return the latest known release for a given operating system
152
+ # @param [String] operatingsystem The operating system
153
+ # @return [optional, String]
154
+ # The latest major release for the given operating system, if any is
155
+ # known
156
+ def latest_release(operatingsystem)
157
+ releases = EOL_DATES[operatingsystem]
158
+ releases&.keys&.max_by { |release| Gem::Version.new(release) }
159
+ end
157
160
  end
158
161
  end
159
162
  end
@@ -1,5 +1,6 @@
1
1
  # A module that provides abstractions around Puppet's metadata format.
2
2
  module PuppetMetadata
3
+ autoload :AIO, 'puppet_metadata/aio'
3
4
  autoload :Beaker, 'puppet_metadata/beaker'
4
5
  autoload :GithubActions, 'puppet_metadata/github_actions'
5
6
  autoload :Metadata, 'puppet_metadata/metadata'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet_metadata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vox Pupuli
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-08-06 00:00:00.000000000 Z
12
+ date: 2021-10-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: metadata-json-lint
@@ -127,6 +127,7 @@ files:
127
127
  - README.md
128
128
  - bin/metadata2gha
129
129
  - lib/puppet_metadata.rb
130
+ - lib/puppet_metadata/aio.rb
130
131
  - lib/puppet_metadata/beaker.rb
131
132
  - lib/puppet_metadata/github_actions.rb
132
133
  - lib/puppet_metadata/metadata.rb