Skip to content

Commit 75fa887

Browse files
relearnshuffleGabrielNagy
authored andcommitted
(MODULES-11113) Allow present and latest as package version
Treat latest and present as valid package versions. Add tests for the puppet_agent_end_run provider and switch to rspec style mocks.
1 parent 3538bae commit 75fa887

File tree

9 files changed

+197
-25
lines changed

9 files changed

+197
-25
lines changed

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

spec/classes/puppet_agent_spec.rb

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def global_facts(facts, os)
6262

6363
context 'package version' do
6464
context 'valid' do
65-
['5.5.15-1.el7', '5.5.15.el7', '6.0.9.3.g886c5ab'].each do |version|
65+
['5.5.15-1.el7', '5.5.15.el7', '6.0.9.3.g886c5ab', 'present', 'latest'].each do |version|
6666

6767
redhat_familly_supported_os.each do |os, facts|
6868
let(:facts) { global_facts(facts, os) }
@@ -92,6 +92,32 @@ def global_facts(facts, os)
9292
end
9393
end
9494
end
95+
96+
context 'latest' do
97+
context 'on unsupported platform' do
98+
on_supported_os.select { |platform, _| platform =~ /solaris|aix|windows|osx/ }.each do |os, facts|
99+
let(:facts) { global_facts(facts, os) }
100+
let(:params) { { package_version: 'latest' } }
101+
102+
context os do
103+
it { is_expected.not_to compile }
104+
it { expect { catalogue }.to raise_error(Puppet::Error, /Setting package_version to 'latest' is not supported/) }
105+
end
106+
end
107+
end
108+
109+
context 'on supported platform' do
110+
on_supported_os.reject { |platform, _| platform =~ /solaris|aix|windows|osx/ }.each do |os, facts|
111+
let(:facts) { global_facts(facts, os) }
112+
let(:params) { { package_version: 'latest' } }
113+
114+
context os do
115+
it { is_expected.to compile.with_all_deps }
116+
it { expect { catalogue }.not_to raise_error }
117+
end
118+
end
119+
end
120+
end
95121
end
96122

97123
context 'supported_operating systems' do

spec/spec_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
end
1111

1212
RSpec.configure do |c|
13+
c.mock_with :rspec
1314
c.before :each do
1415
Puppet::Parser::Functions.newfunction(:pe_build_version, type: :rvalue, doc: '') do |args|
1516
'2018.1.0'
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
require 'spec_helper'
2+
3+
describe Puppet::Type.type(:puppet_agent_end_run).provider(:puppet_agent_end_run) do
4+
let(:catalog) { Puppet::Resource::Catalog.new }
5+
6+
before do
7+
allow(Facter).to receive(:value)
8+
end
9+
10+
context 'when package_version is latest' do
11+
let(:resource) do
12+
Puppet::Type.type(:puppet_agent_end_run).new(:name => 'latest', :provider => :puppet_agent_end_run)
13+
end
14+
15+
let(:agent_latest_package) do
16+
Puppet::Type.type(:package).new(:name => 'puppet-agent', :ensure => 'latest', :provider => :yum)
17+
end
18+
19+
before do
20+
catalog.add_resource(agent_latest_package)
21+
resource.catalog = catalog
22+
end
23+
24+
context 'with dev versions' do
25+
it 'does not stop the run if package is already latest' do
26+
catalog.resource('package', 'puppet-agent').parameters[:ensure].latest = '0:7.8.0.64.g6670bf40b-1.el8'
27+
allow(Facter).to receive(:value).with('aio_agent_version').and_return('7.8.0.64')
28+
expect(Puppet::Application).not_to receive(:stop!)
29+
30+
resource.provider.stop
31+
end
32+
33+
it 'stops the run if the current and desired versions differ' do
34+
catalog.resource('package', 'puppet-agent').parameters[:ensure].latest = '0:7.8.0.64.g6670bf40b-1.el8'
35+
allow(Facter).to receive(:value).with('aio_agent_version').and_return('7.8.0.32')
36+
expect(Puppet::Application).to receive(:stop!)
37+
38+
resource.provider.stop
39+
end
40+
end
41+
42+
context 'with released versions' do
43+
it 'does not stop the run if package is already latest' do
44+
catalog.resource('package', 'puppet-agent').parameters[:ensure].latest = '7.8.0-1.el8'
45+
allow(Facter).to receive(:value).with('aio_agent_version').and_return('7.8.0')
46+
expect(Puppet::Application).not_to receive(:stop!)
47+
48+
resource.provider.stop
49+
end
50+
51+
52+
it 'stops the run if the current and desired versions differ' do
53+
catalog.resource('package', 'puppet-agent').parameters[:ensure].latest = '7.9.0-1.el8'
54+
allow(Facter).to receive(:value).with('aio_agent_version').and_return('7.8.0')
55+
expect(Puppet::Application).to receive(:stop!)
56+
57+
resource.provider.stop
58+
end
59+
end
60+
end
61+
62+
context 'when package_version is present' do
63+
let(:resource) do
64+
Puppet::Type.type(:puppet_agent_end_run).new(:name => 'present', :provider => :puppet_agent_end_run)
65+
end
66+
67+
it 'never stops the run' do
68+
expect(Puppet::Application).not_to receive(:stop!)
69+
resource.provider.stop
70+
end
71+
end
72+
73+
context 'when package_version is a released version' do
74+
let(:resource) do
75+
Puppet::Type.type(:puppet_agent_end_run).new(:name => '7.8.0', :provider => :puppet_agent_end_run)
76+
end
77+
78+
it 'does not stop the run if current and desired versions match' do
79+
allow(Facter).to receive(:value).with('aio_agent_version').and_return('7.8.0')
80+
expect(Puppet::Application).not_to receive(:stop!)
81+
82+
resource.provider.stop
83+
end
84+
85+
it 'stops the run if current and desired versions do not match' do
86+
allow(Facter).to receive(:value).with('aio_agent_version').and_return('7.7.0')
87+
expect(Puppet::Application).to receive(:stop!)
88+
89+
resource.provider.stop
90+
end
91+
end
92+
93+
context 'when package_version is a nightly version' do
94+
let(:resource) do
95+
Puppet::Type.type(:puppet_agent_end_run).new(:name => '7.8.0.32', :provider => :puppet_agent_end_run)
96+
end
97+
98+
it 'does not stop the run if current and desired versions match' do
99+
allow(Facter).to receive(:value).with('aio_agent_version').and_return('7.8.0.32')
100+
expect(Puppet::Application).not_to receive(:stop!)
101+
102+
resource.provider.stop
103+
end
104+
105+
it 'stops the run if current and desired versions do not match' do
106+
allow(Facter).to receive(:value).with('aio_agent_version').and_return('7.8.0')
107+
expect(Puppet::Application).to receive(:stop!)
108+
109+
resource.provider.stop
110+
end
111+
end
112+
end

0 commit comments

Comments
 (0)