puppet 6.14.0-universal-darwin → 6.15.0-universal-darwin
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile.lock +15 -15
- data/ext/windows/service/daemon.rb +3 -3
- data/lib/puppet.rb +1 -1
- data/lib/puppet/agent.rb +2 -10
- data/lib/puppet/application/agent.rb +2 -1
- data/lib/puppet/application/filebucket.rb +5 -14
- data/lib/puppet/application/ssl.rb +2 -2
- data/lib/puppet/configurer.rb +7 -3
- data/lib/puppet/configurer/plugin_handler.rb +1 -1
- data/lib/puppet/defaults.rb +22 -2
- data/lib/puppet/environments.rb +4 -5
- data/lib/puppet/face/plugin.rb +1 -1
- data/lib/puppet/file_system/file_impl.rb +13 -9
- data/lib/puppet/forge/repository.rb +1 -1
- data/lib/puppet/functions/call.rb +1 -1
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/http.rb +2 -0
- data/lib/puppet/http/client.rb +191 -52
- data/lib/puppet/http/external_client.rb +96 -0
- data/lib/puppet/http/redirector.rb +34 -0
- data/lib/puppet/http/resolver.rb +46 -3
- data/lib/puppet/http/resolver/server_list.rb +75 -15
- data/lib/puppet/http/resolver/settings.rb +22 -2
- data/lib/puppet/http/resolver/srv.rb +28 -2
- data/lib/puppet/http/response.rb +63 -1
- data/lib/puppet/http/retry_after_handler.rb +39 -0
- data/lib/puppet/http/service.rb +67 -1
- data/lib/puppet/http/service/ca.rb +71 -9
- data/lib/puppet/http/service/compiler.rb +213 -11
- data/lib/puppet/http/service/file_server.rb +105 -4
- data/lib/puppet/http/service/report.rb +36 -3
- data/lib/puppet/http/session.rb +59 -8
- data/lib/puppet/indirector/catalog/rest.rb +2 -1
- data/lib/puppet/indirector/facts/rest.rb +2 -1
- data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
- data/lib/puppet/indirector/file_metadata/rest.rb +4 -2
- data/lib/puppet/indirector/node/rest.rb +2 -1
- data/lib/puppet/indirector/report/yaml.rb +23 -0
- data/lib/puppet/indirector/status/rest.rb +2 -1
- data/lib/puppet/metatype/manager.rb +80 -80
- data/lib/puppet/network/http/base_pool.rb +6 -1
- data/lib/puppet/network/http/pool.rb +2 -4
- data/lib/puppet/network/http_pool.rb +1 -0
- data/lib/puppet/node/environment.rb +11 -1
- data/lib/puppet/pal/pal_impl.rb +1 -29
- data/lib/puppet/parser/compiler.rb +14 -7
- data/lib/puppet/parser/functions.rb +18 -13
- data/lib/puppet/pops/loaders.rb +7 -5
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/package/apt.rb +61 -1
- data/lib/puppet/provider/package/dnfmodule.rb +39 -12
- data/lib/puppet/provider/package/gem.rb +41 -7
- data/lib/puppet/provider/package/pacman.rb +2 -5
- data/lib/puppet/provider/package/pip.rb +105 -33
- data/lib/puppet/provider/package/pip3.rb +0 -2
- data/lib/puppet/provider/package/pkgdmg.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +16 -4
- data/lib/puppet/provider/package/puppet_gem.rb +6 -2
- data/lib/puppet/provider/package/rpm.rb +6 -213
- data/lib/puppet/provider/package/yum.rb +92 -19
- data/lib/puppet/provider/service/systemd.rb +2 -1
- data/lib/puppet/reports/http.rb +13 -11
- data/lib/puppet/resource/type_collection.rb +20 -16
- data/lib/puppet/ssl.rb +1 -0
- data/lib/puppet/ssl/host.rb +4 -4
- data/lib/puppet/ssl/oids.rb +1 -0
- data/lib/puppet/ssl/state_machine.rb +50 -33
- data/lib/puppet/transaction/report.rb +2 -2
- data/lib/puppet/type.rb +6 -1
- data/lib/puppet/type/file/source.rb +4 -2
- data/lib/puppet/type/package.rb +25 -2
- data/lib/puppet/type/user.rb +0 -19
- data/lib/puppet/util/at_fork.rb +1 -1
- data/lib/puppet/util/autoload.rb +3 -0
- data/lib/puppet/util/instance_loader.rb +14 -10
- data/lib/puppet/util/package/version/debian.rb +175 -0
- data/lib/puppet/util/package/version/gem.rb +15 -0
- data/lib/puppet/util/package/version/pip.rb +167 -0
- data/lib/puppet/util/package/version/range.rb +50 -0
- data/lib/puppet/util/package/version/range/gt.rb +14 -0
- data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/lt.rb +14 -0
- data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/min_max.rb +21 -0
- data/lib/puppet/util/package/version/range/simple.rb +11 -0
- data/lib/puppet/util/package/version/rpm.rb +73 -0
- data/lib/puppet/util/pidlock.rb +13 -7
- data/lib/puppet/util/platform.rb +5 -0
- data/lib/puppet/util/rpm_compare.rb +193 -0
- data/lib/puppet/util/windows/adsi.rb +2 -2
- data/lib/puppet/util/windows/process.rb +15 -14
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +207 -201
- data/man/man5/puppet.conf.5 +11 -3
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
- data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-ca.pem +59 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list-enabled.txt} +2 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
- data/spec/integration/application/agent_spec.rb +329 -0
- data/spec/integration/application/apply_spec.rb +132 -3
- data/spec/integration/application/filebucket_spec.rb +190 -0
- data/spec/integration/application/plugin_spec.rb +50 -0
- data/spec/integration/http/client_spec.rb +34 -40
- data/spec/integration/indirector/report/yaml.rb +83 -0
- data/spec/integration/module_tool/forge_spec.rb +2 -15
- data/spec/integration/network/http_pool_spec.rb +11 -19
- data/spec/integration/node/environment_spec.rb +15 -0
- data/spec/integration/util/windows/adsi_spec.rb +1 -1
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/https.rb +10 -7
- data/spec/lib/puppet_spec/puppetserver.rb +119 -0
- data/spec/shared_contexts/https.rb +29 -0
- data/spec/unit/agent_spec.rb +33 -25
- data/spec/unit/application/agent_spec.rb +5 -1
- data/spec/unit/application/device_spec.rb +2 -2
- data/spec/unit/application/filebucket_spec.rb +22 -2
- data/spec/unit/configurer_spec.rb +1 -1
- data/spec/unit/defaults_spec.rb +24 -1
- data/spec/unit/environments_spec.rb +8 -0
- data/spec/unit/file_system_spec.rb +10 -0
- data/spec/unit/http/client_spec.rb +105 -46
- data/spec/unit/http/external_client_spec.rb +201 -0
- data/spec/unit/http/resolver_spec.rb +20 -0
- data/spec/unit/http/service/ca_spec.rb +25 -2
- data/spec/unit/http/service/compiler_spec.rb +184 -6
- data/spec/unit/http/service/file_server_spec.rb +35 -3
- data/spec/unit/http/service/report_spec.rb +3 -1
- data/spec/unit/http/service_spec.rb +3 -3
- data/spec/unit/http/session_spec.rb +56 -7
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
- data/spec/unit/network/http/pool_spec.rb +3 -3
- data/spec/unit/node/environment_spec.rb +16 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
- data/spec/unit/provider/package/apt_spec.rb +30 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +33 -14
- data/spec/unit/provider/package/gem_spec.rb +40 -0
- data/spec/unit/provider/package/pacman_spec.rb +6 -21
- data/spec/unit/provider/package/pip_spec.rb +26 -3
- data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
- data/spec/unit/provider/package/pkgng_spec.rb +38 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
- data/spec/unit/provider/package/rpm_spec.rb +0 -212
- data/spec/unit/provider/package/yum_spec.rb +235 -1
- data/spec/unit/provider/service/systemd_spec.rb +10 -1
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +0 -29
- data/spec/unit/reports/http_spec.rb +70 -52
- data/spec/unit/ssl/host_spec.rb +4 -2
- data/spec/unit/ssl/oids_spec.rb +1 -0
- data/spec/unit/ssl/state_machine_spec.rb +38 -6
- data/spec/unit/transaction/report_spec.rb +4 -0
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/package/version/debian_spec.rb +83 -0
- data/spec/unit/util/package/version/pip_spec.rb +464 -0
- data/spec/unit/util/package/version/range_spec.rb +154 -0
- data/spec/unit/util/package/version/rpm_spec.rb +121 -0
- data/spec/unit/util/pidlock_spec.rb +83 -47
- data/spec/unit/util/rpm_compare_spec.rb +196 -0
- data/spec/unit/util/windows/adsi_spec.rb +4 -4
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/tasks/generate_cert_fixtures.rake +15 -1
- metadata +51 -6
- data/spec/integration/faces/plugin_spec.rb +0 -63
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'puppet/util/package/version/range'
|
3
|
+
|
4
|
+
class IntegerVersion
|
5
|
+
class ValidationFailure < ArgumentError; end
|
6
|
+
include Comparable
|
7
|
+
REGEX_FULL = '(\d+)'.freeze
|
8
|
+
REGEX_FULL_RX = /\A#{REGEX_FULL}\Z/.freeze
|
9
|
+
|
10
|
+
def self.parse(ver)
|
11
|
+
match, version = *ver.match(REGEX_FULL_RX)
|
12
|
+
raise ValidationFailure, "Unable to parse '#{ver}' as a version identifier" unless match
|
13
|
+
|
14
|
+
new(version).freeze
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :version
|
18
|
+
|
19
|
+
def initialize(version)
|
20
|
+
@version = version.to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
def <=>(other)
|
24
|
+
@version <=> other.version
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe Puppet::Util::Package::Version::Range do
|
29
|
+
context 'when creating new version range' do
|
30
|
+
it 'should raise unless String is passed' do
|
31
|
+
expect { Puppet::Util::Package::Version::Range.parse(:abc, IntegerVersion) }.to raise_error(Puppet::Util::Package::Version::Range::ValidationFailure)
|
32
|
+
end
|
33
|
+
it 'should raise if operator is not implemented' do
|
34
|
+
expect { Puppet::Util::Package::Version::Range.parse('=a', IntegerVersion) }.to raise_error(Puppet::Util::Package::Version::Range::ValidationFailure)
|
35
|
+
end
|
36
|
+
it 'should raise if operator cannot be parsed' do
|
37
|
+
expect { Puppet::Util::Package::Version::Range.parse('~=a', IntegerVersion) }.to raise_error(Puppet::Util::Package::Version::Range::ValidationFailure)
|
38
|
+
end
|
39
|
+
it 'should raise if version cannot be parsed' do
|
40
|
+
expect { Puppet::Util::Package::Version::Range.parse('>=a', IntegerVersion) }.to raise_error(IntegerVersion::ValidationFailure)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
context 'when creating new version range with greater or equal operator' do
|
44
|
+
it 'it includes greater version' do
|
45
|
+
vr = Puppet::Util::Package::Version::Range.parse('>=3', IntegerVersion)
|
46
|
+
v = IntegerVersion.parse('4')
|
47
|
+
expect(vr.include?(v)).to eql(true)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'it includes specified version' do
|
51
|
+
vr = Puppet::Util::Package::Version::Range.parse('>=3', IntegerVersion)
|
52
|
+
v = IntegerVersion.parse('3')
|
53
|
+
expect(vr.include?(v)).to eql(true)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'it does not include lower version' do
|
57
|
+
vr = Puppet::Util::Package::Version::Range.parse('>=3', IntegerVersion)
|
58
|
+
v = IntegerVersion.parse('2')
|
59
|
+
expect(vr.include?(v)).to eql(false)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'when creating new version range with greater operator' do
|
64
|
+
it 'it includes greater version' do
|
65
|
+
vr = Puppet::Util::Package::Version::Range.parse('>3', IntegerVersion)
|
66
|
+
v = IntegerVersion.parse('10')
|
67
|
+
expect(vr.include?(v)).to eql(true)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'it does not include specified version' do
|
71
|
+
vr = Puppet::Util::Package::Version::Range.parse('>3', IntegerVersion)
|
72
|
+
v = IntegerVersion.parse('3')
|
73
|
+
expect(vr.include?(v)).to eql(false)
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'it does not include lower version' do
|
77
|
+
vr = Puppet::Util::Package::Version::Range.parse('>3', IntegerVersion)
|
78
|
+
v = IntegerVersion.parse('1')
|
79
|
+
expect(vr.include?(v)).to eql(false)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'when creating new version range with lower or equal operator' do
|
84
|
+
it 'it does not include greater version' do
|
85
|
+
vr = Puppet::Util::Package::Version::Range.parse('<=3', IntegerVersion)
|
86
|
+
v = IntegerVersion.parse('5')
|
87
|
+
expect(vr.include?(v)).to eql(false)
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'it includes specified version' do
|
91
|
+
vr = Puppet::Util::Package::Version::Range.parse('<=3', IntegerVersion)
|
92
|
+
v = IntegerVersion.parse('3')
|
93
|
+
expect(vr.include?(v)).to eql(true)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'it includes lower version' do
|
97
|
+
vr = Puppet::Util::Package::Version::Range.parse('<=3', IntegerVersion)
|
98
|
+
v = IntegerVersion.parse('1')
|
99
|
+
expect(vr.include?(v)).to eql(true)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'when creating new version range with lower operator' do
|
104
|
+
it 'it does not include greater version' do
|
105
|
+
vr = Puppet::Util::Package::Version::Range.parse('<3', IntegerVersion)
|
106
|
+
v = IntegerVersion.parse('8')
|
107
|
+
expect(vr.include?(v)).to eql(false)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'it does not include specified version' do
|
111
|
+
vr = Puppet::Util::Package::Version::Range.parse('<3', IntegerVersion)
|
112
|
+
v = IntegerVersion.parse('3')
|
113
|
+
expect(vr.include?(v)).to eql(false)
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'it includes lower version' do
|
117
|
+
vr = Puppet::Util::Package::Version::Range.parse('<3', IntegerVersion)
|
118
|
+
v = IntegerVersion.parse('2')
|
119
|
+
expect(vr.include?(v)).to eql(true)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'when creating new version range with interval' do
|
124
|
+
it 'it does not include greater version' do
|
125
|
+
vr = Puppet::Util::Package::Version::Range.parse('>3 <=5', IntegerVersion)
|
126
|
+
v = IntegerVersion.parse('7')
|
127
|
+
expect(vr.include?(v)).to eql(false)
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'it includes specified max interval value' do
|
131
|
+
vr = Puppet::Util::Package::Version::Range.parse('>3 <=5', IntegerVersion)
|
132
|
+
v = IntegerVersion.parse('5')
|
133
|
+
expect(vr.include?(v)).to eql(true)
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'it includes in interval version' do
|
137
|
+
vr = Puppet::Util::Package::Version::Range.parse('>3 <=5', IntegerVersion)
|
138
|
+
v = IntegerVersion.parse('4')
|
139
|
+
expect(vr.include?(v)).to eql(true)
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'it does not include min interval value ' do
|
143
|
+
vr = Puppet::Util::Package::Version::Range.parse('>3 <=5', IntegerVersion)
|
144
|
+
v = IntegerVersion.parse('3')
|
145
|
+
expect(vr.include?(v)).to eql(false)
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'it does not include lower value ' do
|
149
|
+
vr = Puppet::Util::Package::Version::Range.parse('>3 <=5', IntegerVersion)
|
150
|
+
v = IntegerVersion.parse('2')
|
151
|
+
expect(vr.include?(v)).to eql(false)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'puppet/util/package/version/rpm'
|
3
|
+
|
4
|
+
describe Puppet::Util::Package::Version::Rpm do
|
5
|
+
|
6
|
+
context "when parsing an invalid version" do
|
7
|
+
it "raises ArgumentError" do
|
8
|
+
expect { described_class.parse(:absent)}.to raise_error(ArgumentError)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "when creating new version" do
|
13
|
+
it "is parsing basic version" do
|
14
|
+
v = described_class.parse('1:2.8.8-1.el6')
|
15
|
+
expect([v.epoch, v.version, v.release, v.arch ]).to eq(['1', '2.8.8', '1.el6' , nil])
|
16
|
+
end
|
17
|
+
|
18
|
+
it "is parsing no epoch basic version" do
|
19
|
+
v = described_class.parse('2.8.8-1.el6')
|
20
|
+
expect([v.epoch, v.version, v.release, v.arch ]).to eq([nil, '2.8.8', '1.el6', nil])
|
21
|
+
end
|
22
|
+
|
23
|
+
it "is parsing no epoch basic short version" do
|
24
|
+
v = described_class.parse('7.15-8.fc29')
|
25
|
+
expect([v.epoch, v.version, v.release, v.arch ]).to eq([nil, '7.15', '8.fc29', nil])
|
26
|
+
end
|
27
|
+
|
28
|
+
it "is parsing no epoch and no release basic version" do
|
29
|
+
v = described_class.parse('2.8.8')
|
30
|
+
expect([v.epoch, v.version, v.release, v.arch ]).to eq([nil, '2.8.8', nil, nil])
|
31
|
+
end
|
32
|
+
|
33
|
+
it "is parsing no epoch complex version" do
|
34
|
+
v = described_class.parse('1.4-0.24.20120830CVS.fc31')
|
35
|
+
expect([v.epoch, v.version, v.release, v.arch ]).to eq([nil, '1.4', '0.24.20120830CVS.fc31', nil])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when comparing two versions" do
|
40
|
+
context 'with invalid version' do
|
41
|
+
it 'raises ArgumentError' do
|
42
|
+
version = described_class.parse('0:1.5.3-3.el6')
|
43
|
+
invalid = 'invalid'
|
44
|
+
expect { version < invalid }.to \
|
45
|
+
raise_error(ArgumentError, 'Cannot compare, as invalid is not a Rpm Version')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'with valid versions' do
|
50
|
+
it "epoch has precedence" do
|
51
|
+
lower = described_class.parse('0:1.5.3-3.el6')
|
52
|
+
higher = described_class.parse('1:1.7.0-15.fc29')
|
53
|
+
expect(lower).to be < higher
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'handles no epoch as 0 epoch' do
|
57
|
+
lower = described_class.parse('1.5.3-3.el6')
|
58
|
+
higher = described_class.parse('1:1.7.0-15.fc29')
|
59
|
+
expect(lower).to be < higher
|
60
|
+
end
|
61
|
+
|
62
|
+
it "handles equals letters-only versions" do
|
63
|
+
first = described_class.parse('abd-def')
|
64
|
+
second = described_class.parse('abd-def')
|
65
|
+
expect(first).to eq(second)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "shorter version is smaller letters-only versions" do
|
69
|
+
lower = described_class.parse('ab')
|
70
|
+
higher = described_class.parse('abd')
|
71
|
+
expect(lower).to be < higher
|
72
|
+
end
|
73
|
+
|
74
|
+
it "shorter version is smaller even with digits" do
|
75
|
+
lower = described_class.parse('1.7')
|
76
|
+
higher = described_class.parse('1.7.0')
|
77
|
+
expect(lower).to be < higher
|
78
|
+
end
|
79
|
+
|
80
|
+
it "shorter version is smaller when number is less" do
|
81
|
+
lower = described_class.parse('1.7.0')
|
82
|
+
higher = described_class.parse('1.7.1')
|
83
|
+
expect(lower).to be < higher
|
84
|
+
end
|
85
|
+
|
86
|
+
it "shorter release is smaller " do
|
87
|
+
lower = described_class.parse('1.7.0-11.fc26')
|
88
|
+
higher = described_class.parse('1.7.0-11.fc27')
|
89
|
+
expect(lower).to be < higher
|
90
|
+
end
|
91
|
+
|
92
|
+
it "release letters are smaller letters-only" do
|
93
|
+
lower = described_class.parse('1.7.0-abc')
|
94
|
+
higher = described_class.parse('1.7.0-abd')
|
95
|
+
expect(lower).to be < higher
|
96
|
+
end
|
97
|
+
|
98
|
+
it "shorter release is smaller" do
|
99
|
+
lower = described_class.parse('1.7.0-11.fc2')
|
100
|
+
higher = described_class.parse('1.7.0-11.fc17')
|
101
|
+
expect(lower).to be < higher
|
102
|
+
end
|
103
|
+
|
104
|
+
it "handles equal release" do
|
105
|
+
first = described_class.parse('1.7.0-11.fc27')
|
106
|
+
second = described_class.parse('1.7.0-11.fc27')
|
107
|
+
expect(first).to eq(second)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'when one has no epoch' do
|
112
|
+
it 'handles no epoch as zero' do
|
113
|
+
version1 = described_class.parse('1:1.2')
|
114
|
+
version2 = described_class.parse('1.4')
|
115
|
+
|
116
|
+
expect(version1).to be > version2
|
117
|
+
expect(version2).to be < version1
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -13,21 +13,30 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
describe "#ps pid argument on posix", unless: Puppet::Util::Platform.windows? do
|
16
|
+
let(:other_pid) { Process.pid + 1 }
|
17
|
+
|
18
|
+
before do
|
19
|
+
# another process has locked the pidfile
|
20
|
+
File.write(@lockfile, other_pid)
|
21
|
+
|
22
|
+
# and it's still active
|
23
|
+
allow(Process).to receive(:kill).with(0, other_pid)
|
24
|
+
end
|
25
|
+
|
16
26
|
it "should fallback to '-p' when ps execution fails with '-eq' on Linux" do
|
17
|
-
|
18
|
-
|
27
|
+
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', other_pid, '-o', 'comm=']).and_raise(Puppet::ExecutionFailure, 'Execution of command returned 1: error')
|
28
|
+
|
29
|
+
expect(Puppet::Util::Execution).to receive(:execute).with(['ps', "-p", other_pid, '-o', 'comm=']).and_return('puppet')
|
30
|
+
expect(Puppet::Util::Execution).to receive(:execute).with(['ps', "-p", other_pid, '-o', 'args=']).and_return('puppet')
|
19
31
|
|
20
|
-
expect(Puppet::Util::Execution).to receive(:execute).with(['ps', "-p", @lock.lock_pid, '-o', 'comm=']).and_return('puppet')
|
21
|
-
expect(Puppet::Util::Execution).to receive(:execute).with(['ps', "-p", @lock.lock_pid, '-o', 'args=']).and_return('puppet')
|
22
32
|
expect(@lock).to be_locked
|
23
33
|
end
|
24
34
|
|
25
35
|
shared_examples_for 'a valid ps argument was provided' do |desired_kernel, ps_argument|
|
26
36
|
it "should be '#{ps_argument}' when current kernel is #{desired_kernel}" do
|
27
|
-
@lock.lock
|
28
37
|
allow(Facter).to receive(:value).with(:kernel).and_return(desired_kernel)
|
29
|
-
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', ps_argument,
|
30
|
-
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', ps_argument,
|
38
|
+
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', ps_argument, other_pid, '-o', 'comm=']).and_return('ruby')
|
39
|
+
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', ps_argument, other_pid, '-o', 'args=']).and_return('puppet')
|
31
40
|
expect(@lock).to be_locked
|
32
41
|
end
|
33
42
|
end
|
@@ -56,23 +65,6 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
|
|
56
65
|
|
57
66
|
it "should become locked" do
|
58
67
|
@lock.lock
|
59
|
-
if Puppet::Util::Platform.windows?
|
60
|
-
allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(@lock.lock_pid).and_return('C:\Program Files\Puppet Labs\Puppet\puppet\bin\ruby.exe')
|
61
|
-
else
|
62
|
-
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', @lock.lock_pid, '-o', 'comm=']).and_return('puppet')
|
63
|
-
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', @lock.lock_pid, '-o', 'args=']).and_return('puppet')
|
64
|
-
end
|
65
|
-
expect(@lock).to be_locked
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should become locked if puppet is a gem" do
|
69
|
-
@lock.lock
|
70
|
-
if Puppet::Util::Platform.windows?
|
71
|
-
allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(@lock.lock_pid).and_return('C:\tools\ruby25\bin\ruby.exe')
|
72
|
-
else
|
73
|
-
expect(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', @lock.lock_pid, '-o', 'comm=']).and_return('ruby')
|
74
|
-
expect(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', @lock.lock_pid, '-o', 'args=']).and_return('ruby /root/puppet/.bundle/ruby/2.3.0/bin/puppet agent --no-daemonize -v')
|
75
|
-
end
|
76
68
|
expect(@lock).to be_locked
|
77
69
|
end
|
78
70
|
|
@@ -151,23 +143,6 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
|
|
151
143
|
describe "#locked?" do
|
152
144
|
it "should return true if locked" do
|
153
145
|
@lock.lock
|
154
|
-
if Puppet::Util::Platform.windows?
|
155
|
-
allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(@lock.lock_pid).and_return('C:\Program Files\Puppet Labs\Puppet\puppet\bin\ruby.exe')
|
156
|
-
else
|
157
|
-
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', @lock.lock_pid, '-o', 'comm=']).and_return('puppet')
|
158
|
-
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', @lock.lock_pid, '-o', 'args=']).and_return('puppet')
|
159
|
-
end
|
160
|
-
expect(@lock).to be_locked
|
161
|
-
end
|
162
|
-
|
163
|
-
it "should return true if locked when puppet as gem" do
|
164
|
-
@lock.lock
|
165
|
-
if Puppet::Util::Platform.windows?
|
166
|
-
allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(@lock.lock_pid).and_return('C:\tools\ruby25\bin\ruby.exe')
|
167
|
-
else
|
168
|
-
expect(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', @lock.lock_pid, '-o', 'comm=']).and_return('ruby')
|
169
|
-
expect(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', @lock.lock_pid, '-o', 'args=']).and_return('ruby /root/puppet/.bundle/ruby/2.3.0/bin/puppet agent --no-daemonize -v')
|
170
|
-
end
|
171
146
|
expect(@lock).to be_locked
|
172
147
|
end
|
173
148
|
|
@@ -213,12 +188,6 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
|
|
213
188
|
end
|
214
189
|
|
215
190
|
it "should replace with new locks" do
|
216
|
-
if Puppet::Util::Platform.windows?
|
217
|
-
allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(6789).and_return('C:\Program Files\Puppet Labs\Puppet\puppet\bin\ruby.exe')
|
218
|
-
else
|
219
|
-
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', 6789, '-o', 'comm=']).and_return('puppet')
|
220
|
-
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', 6789, '-o', 'args=']).and_return('puppet')
|
221
|
-
end
|
222
191
|
@lock.lock
|
223
192
|
expect(Puppet::FileSystem.exist?(@lockfile)).to be_truthy
|
224
193
|
expect(@lock.lock_pid).to eq(6789)
|
@@ -239,6 +208,49 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
|
|
239
208
|
end
|
240
209
|
end
|
241
210
|
|
211
|
+
describe "with no access to open the process on Windows", :if => Puppet.features.microsoft_windows? do
|
212
|
+
before(:each) do
|
213
|
+
allow(Process).to receive(:pid).and_return(6789)
|
214
|
+
@lock.lock
|
215
|
+
allow(Process).to receive(:pid).and_return(1234)
|
216
|
+
exception = Puppet::Util::Windows::Error.new('Access Denied', 5) # ERROR_ACCESS_DENIED
|
217
|
+
allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(6789).and_raise(exception)
|
218
|
+
allow(Process).to receive(:kill).with(0, 6789)
|
219
|
+
allow(Process).to receive(:kill).with(0, 1234)
|
220
|
+
end
|
221
|
+
|
222
|
+
it "should be locked" do
|
223
|
+
expect(@lock).to be_locked
|
224
|
+
end
|
225
|
+
|
226
|
+
describe "#lock" do
|
227
|
+
it "should not be possible" do
|
228
|
+
expect(@lock.lock).to be_falsey
|
229
|
+
end
|
230
|
+
|
231
|
+
it "should not overwrite the lock" do
|
232
|
+
@lock.lock
|
233
|
+
expect(@lock).not_to be_mine
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe "#unlock" do
|
238
|
+
it "should not be possible" do
|
239
|
+
expect(@lock.unlock).to be_falsey
|
240
|
+
end
|
241
|
+
|
242
|
+
it "should not remove the lock file" do
|
243
|
+
@lock.unlock
|
244
|
+
expect(Puppet::FileSystem.exist?(@lockfile)).to be_truthy
|
245
|
+
end
|
246
|
+
|
247
|
+
it "should still not be our lock" do
|
248
|
+
@lock.unlock
|
249
|
+
expect(@lock).not_to be_mine
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
242
254
|
describe "with another process lock" do
|
243
255
|
before(:each) do
|
244
256
|
# fake our pid to be 1234
|
@@ -267,6 +279,30 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
|
|
267
279
|
expect(@lock).not_to be_mine
|
268
280
|
end
|
269
281
|
|
282
|
+
it "should be locked if the other process is a puppet gem" do
|
283
|
+
File.write(@lockfile, "1234")
|
284
|
+
|
285
|
+
if Puppet::Util::Platform.windows?
|
286
|
+
allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(1234).and_return('C:\Program Files\Puppet Labs\Puppet\puppet\bin\ruby.exe')
|
287
|
+
else
|
288
|
+
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 1234, '-o', 'comm=']).and_return('ruby')
|
289
|
+
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 1234, '-o', 'args=']).and_return('ruby /root/puppet/.bundle/ruby/2.3.0/bin/puppet agent --no-daemonize -v')
|
290
|
+
end
|
291
|
+
expect(@lock).to be_locked
|
292
|
+
end
|
293
|
+
|
294
|
+
it "should not be mine if the other process is a puppet gem" do
|
295
|
+
File.write(@lockfile, "1234")
|
296
|
+
|
297
|
+
if Puppet::Util::Platform.windows?
|
298
|
+
allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(1234).and_return('C:\Program Files\Puppet Labs\Puppet\puppet\bin\ruby.exe')
|
299
|
+
else
|
300
|
+
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 1234, '-o', 'comm=']).and_return('ruby')
|
301
|
+
allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 1234, '-o', 'args=']).and_return('ruby /root/puppet/.bundle/ruby/2.3.0/bin/puppet agent --no-daemonize -v')
|
302
|
+
end
|
303
|
+
expect(@lock).to_not be_mine
|
304
|
+
end
|
305
|
+
|
270
306
|
describe "#lock" do
|
271
307
|
it "should not be possible" do
|
272
308
|
expect(@lock.lock).to be_falsey
|