Skip to content

Commit 3854c61

Browse files
authored
Merge pull request #565 from relearnshuffle/allow-present-latest
(MODULES-11113) Allow present and latest as package version
2 parents 3538bae + 728bee1 commit 3854c61

File tree

13 files changed

+222
-30
lines changed

13 files changed

+222
-30
lines changed

Gemfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@ group :development do
4040
gem "rake", '~> 12', require: false
4141
gem "parallel_tests", '>= 2.14.1', '< 2.14.3', require: false
4242
gem "metadata-json-lint", '>= 2.0.2', '< 3.0.0', require: false
43-
gem "rspec-puppet-facts", '~> 1.10.0', require: false
43+
gem "rspec-puppet-facts", '~> 2.0.1', require: false
4444
gem "rspec_junit_formatter", '~> 0.2', require: false
4545
gem "rubocop", '~> 0.49.0', require: false
4646
gem "rubocop-rspec", '~> 1.16.0', require: false
4747
gem "rubocop-i18n", '~> 1.2.0', require: false
4848
gem "puppetlabs_spec_helper", '>= 2.9.0', '< 3.0.0', require: false
4949
gem "puppet-module-posix-default-r#{minor_version}", require: false, platforms: "ruby"
5050
gem "puppet-module-win-default-r#{minor_version}", require: false, platforms: ["mswin", "mingw", "x64_mingw"]
51-
gem "rspec-puppet", require: true, git: "https://github.com/rodjek/rspec-puppet", tag: "v2.7.9"
51+
gem "rspec-puppet", require: true
5252
gem 'rspec-expectations', '~> 3.9.0', require: false
5353
gem "json_pure", '<= 2.0.1', require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.0.0')
5454
gem "fast_gettext", '1.1.0', require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.1.0')

README.markdown

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ Previous releases of this module, now unsupported, upgraded agents from later ve
7272

7373
The puppet_agent module installs the appropriate official Puppet package repository (on systems that support repositories); migrates configuration required by Puppet to new locations used by puppet-agent; and installs the puppet-agent package, removing the previous Puppet installation.
7474

75-
If a package_version parameter is provided, it will ensure that puppet-agent version is installed. The package_version parameter is required to perform upgrades starting from a puppet-agent package, also this parameter can be set to "auto", ensuring that agent version matches the version on the master without having to manually update package_version after upgrading the master(s).
75+
If a package_version parameter is provided, it will ensure that puppet-agent version is installed. The package_version parameter is required to perform upgrades starting from a puppet-agent package, also this parameter can be set to "auto", ensuring that agent version matches the version on the master without having to manually update package_version after upgrading the master(s). On platforms that install packages through repos (EL, Fedora, Debian, Ubuntu, SLES), the parameter can be set to "latest" in order to install the latest available package. To only ensure the presence of the package, the parameter can be set to "present".
7676

7777
If a config parameter is provided, it will manage the defined agent configuration settings.
7878

@@ -191,6 +191,14 @@ or
191191
``` puppet
192192
package_version => 'auto'
193193
```
194+
or
195+
``` puppet
196+
package_version => 'latest'
197+
```
198+
or
199+
``` puppet
200+
package_version => 'present'
201+
```
194202

195203
##### `service_names`
196204

acceptance/tests/test_upgrade_puppet5_to_puppet6.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,14 @@
1313
step "Create new site.pp with upgrade manifest" do
1414
manifest = <<-PP
1515
node default {
16+
if $::osfamily =~ /^(?i:windows|solaris|aix|darwin)$/ {
17+
$_package_version = '#{latest_version}'
18+
} else {
19+
$_package_version = 'latest'
20+
}
21+
1622
class { puppet_agent:
17-
package_version => '#{latest_version}',
23+
package_version => $_package_version,
1824
apt_source => 'http://nightlies.puppet.com/apt',
1925
yum_source => 'http://nightlies.puppet.com/yum',
2026
windows_source => 'http://nightlies.puppet.com/downloads',

acceptance/tests/test_upgrade_puppet6_to_puppet7.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,14 @@
1313
step "Create new site.pp with upgrade manifest" do
1414
manifest = <<-PP
1515
node default {
16+
if $::osfamily =~ /^(?i:windows|solaris|aix|darwin)$/ {
17+
$_package_version = '#{latest_version}'
18+
} else {
19+
$_package_version = 'latest'
20+
}
21+
1622
class { puppet_agent:
17-
package_version => '#{latest_version}',
23+
package_version => $_package_version,
1824
apt_source => 'http://nightlies.puppet.com/apt',
1925
yum_source => 'http://nightlies.puppet.com/yum',
2026
windows_source => 'http://nightlies.puppet.com/downloads',

lib/puppet/provider/puppet_agent_end_run/puppet_agent_end_run.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ def needs_upgrade?
2727
current_version = Facter.value('aio_agent_version')
2828
desired_version = @resource.name
2929

30+
return false if desired_version == 'present'
31+
32+
if desired_version == 'latest'
33+
latest_version = @resource.catalog.resource('package', 'puppet-agent').parameters[:ensure].latest
34+
desired_version = latest_version.match(%r{^(?:[0-9]:)?(\d+\.\d+(\.\d+)?(?:\.\d+))?}).captures.first
35+
end
36+
3037
Puppet::Util::Package.versioncmp(desired_version, current_version) != 0
3138
end
3239
end

manifests/init.pp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@
139139
fail('The puppet_agent module does not support pre-Puppet 4 upgrades.')
140140
}
141141

142+
if $package_version == 'latest' and $::osfamily =~ /^(?i:windows|solaris|aix|darwin)$/ {
143+
fail("Setting package_version to 'latest' is not supported on ${::osfamily.capitalize()}")
144+
}
145+
142146
if $source != undef and $absolute_source != undef {
143147
fail('Only one of $source and $absolute_source can be set')
144148
}
@@ -166,12 +170,11 @@
166170
}
167171

168172
if $::osfamily == 'redhat' {
169-
if $master_or_package_version !~ /^\d+\.\d+\.\d+.*$/ {
173+
if $master_or_package_version !~ /^\d+\.\d+\.\d+.*$|^latest$|^present$/ {
170174
fail("invalid version ${master_or_package_version} requested")
171175
}
172-
}
173-
else {
174-
if $master_or_package_version !~ /^\d+\.\d+\.\d+([.-]?\d*|\.\d+\.g[0-9a-f]+)$/ {
176+
} else {
177+
if $master_or_package_version !~ /^\d+\.\d+\.\d+([.-]?\d*|\.\d+\.g[0-9a-f]+)$|^latest$|^present$/ {
175178
fail("invalid version ${master_or_package_version} requested")
176179
}
177180
}
@@ -180,13 +183,21 @@
180183
if $master_or_package_version =~ /.g/ {
181184
$_expected_package_version = split($master_or_package_version, /[.-]g.*/)[0]
182185
} elsif $::osfamily == 'redhat' {
183-
$_expected_package_version = $master_or_package_version.match(/^\d+\.\d+\.\d+/)[0]
186+
$_expected_package_version = $master_or_package_version.match(/^\d+\.\d+\.\d+|^latest$|^present$/)[0]
184187
} else {
185188
$_expected_package_version = $master_or_package_version
186189
}
187190

188-
$aio_upgrade_required = versioncmp($::aio_agent_version, $_expected_package_version) < 0
189-
$aio_downgrade_required = versioncmp($::aio_agent_version, $_expected_package_version) > 0
191+
if $_expected_package_version == 'latest' {
192+
$aio_upgrade_required = true
193+
$aio_downgrade_required = false
194+
} elsif $_expected_package_version == 'present' {
195+
$aio_upgrade_required = false
196+
$aio_downgrade_required = false
197+
} else {
198+
$aio_upgrade_required = versioncmp($::aio_agent_version, $_expected_package_version) < 0
199+
$aio_downgrade_required = versioncmp($::aio_agent_version, $_expected_package_version) > 0
200+
}
190201

191202
if $aio_upgrade_required {
192203
if any_resources_of_type('filebucket', { path => false }) {

manifests/install.pp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
}
4444
} elsif $::osfamily == 'suse' {
4545
# Prevent re-running the batch install
46-
if ($puppet_agent::aio_upgrade_required) or ($puppet_agent::aio_downgrade_required){
46+
if ($package_version =~ /^latest$|^present$/) or ($puppet_agent::aio_upgrade_required) or ($puppet_agent::aio_downgrade_required){
4747
class { 'puppet_agent::install::suse':
4848
package_version => $package_version,
4949
install_options => $install_options,
@@ -67,7 +67,7 @@
6767
$_source = "${::puppet_agent::params::local_packages_dir}/${::puppet_agent::prepare::package::package_file_name}"
6868
} else {
6969
# any other type of source means we use apt with no 'source' defined in the package resource below
70-
if $package_version == 'present' {
70+
if $package_version =~ /^latest$|^present$/ {
7171
$_package_version = $package_version
7272
} else {
7373
$_package_version = "${package_version}-1${::lsbdistcodename}"
@@ -91,7 +91,7 @@
9191
$_source = undef
9292
}
9393
}
94-
$_aio_package_version = $package_version.match(/^\d+\.\d+\.\d+(\.\d+)?/)[0]
94+
$_aio_package_version = $package_version.match(/^\d+\.\d+\.\d+(\.\d+)?|^latest$|^present$/)[0]
9595
package { $::puppet_agent::package_name:
9696
ensure => $_package_version,
9797
install_options => $_install_options,

manifests/install/suse.pp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
$_source = undef
2727
}
2828

29-
$_aio_package_version = $package_version.match(/^\d+\.\d+\.\d+(\.\d+)?/)[0]
29+
$_aio_package_version = $package_version.match(/^\d+\.\d+\.\d+(\.\d+)?|^latest$|^present$/)[0]
3030
package { $::puppet_agent::package_name:
3131
ensure => $package_version,
3232
install_options => $install_options,

manifests/osfamily/suse.pp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -143,21 +143,36 @@
143143
}
144144

145145
$repo_settings.each |String $setting, String $value| {
146-
ini_setting { "zypper ${repo_name} ${setting}":
147-
ensure => present,
148-
path => $repo_file,
149-
section => $repo_name,
150-
setting => $setting,
151-
value => $value,
152-
before => Exec["refresh-${repo_name}"],
146+
if $_package_version =~ /^present$|^latest$/ {
147+
ini_setting { "zypper ${repo_name} ${setting}":
148+
ensure => present,
149+
path => $repo_file,
150+
section => $repo_name,
151+
setting => $setting,
152+
value => $value,
153+
}
154+
} else {
155+
ini_setting { "zypper ${repo_name} ${setting}":
156+
ensure => present,
157+
path => $repo_file,
158+
section => $repo_name,
159+
setting => $setting,
160+
value => $value,
161+
before => Exec["refresh-${repo_name}"],
162+
}
153163
}
154164
}
155165

156-
exec { "refresh-${repo_name}":
157-
path => '/bin:/usr/bin:/sbin:/usr/sbin',
158-
unless => "zypper search -r ${repo_name} -s | grep puppet-agent | awk '{print \$7}' | grep \"^${_package_version}\"",
159-
command => "zypper refresh ${repo_name}",
160-
logoutput => 'on_failure',
166+
# If the requested package is "latest" we don't know the exact version yet,
167+
# so we can't reliably refresh the repo. If "present", the repo contents don't
168+
# matter at all if a version is already installed.
169+
unless $_package_version =~ /^present$|^latest$/ {
170+
exec { "refresh-${repo_name}":
171+
path => '/bin:/usr/bin:/sbin:/usr/sbin',
172+
unless => "zypper search -r ${repo_name} -s | grep puppet-agent | awk '{print \$7}' | grep \"^${_package_version}\"",
173+
command => "zypper refresh ${repo_name}",
174+
logoutput => 'on_failure',
175+
}
161176
}
162177
}
163178
}

spec/classes/puppet_agent_osfamily_solaris_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def install_script(ver, arch)
111111

112112
# Ensure we get a versionable package provider
113113
pkg = Puppet::Type.type(:package)
114-
pkg.stubs(:defaultprovider).returns(pkg.provider(:pkg))
114+
allow(pkg).to receive(:defaultprovider).and_return(pkg.provider(:pkg))
115115
end
116116

117117
context "when Solaris 11 i386 and a custom source" do

0 commit comments

Comments
 (0)