puppet 6.14.0-x64-mingw32 → 6.15.0-x64-mingw32

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.

Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +15 -15
  3. data/ext/windows/service/daemon.rb +3 -3
  4. data/lib/puppet.rb +1 -1
  5. data/lib/puppet/agent.rb +2 -10
  6. data/lib/puppet/application/agent.rb +2 -1
  7. data/lib/puppet/application/filebucket.rb +5 -14
  8. data/lib/puppet/application/ssl.rb +2 -2
  9. data/lib/puppet/configurer.rb +7 -3
  10. data/lib/puppet/configurer/plugin_handler.rb +1 -1
  11. data/lib/puppet/defaults.rb +22 -2
  12. data/lib/puppet/environments.rb +4 -5
  13. data/lib/puppet/face/plugin.rb +1 -1
  14. data/lib/puppet/file_system/file_impl.rb +13 -9
  15. data/lib/puppet/forge/repository.rb +1 -1
  16. data/lib/puppet/functions/call.rb +1 -1
  17. data/lib/puppet/functions/reduce.rb +2 -4
  18. data/lib/puppet/http.rb +2 -0
  19. data/lib/puppet/http/client.rb +191 -52
  20. data/lib/puppet/http/external_client.rb +96 -0
  21. data/lib/puppet/http/redirector.rb +34 -0
  22. data/lib/puppet/http/resolver.rb +46 -3
  23. data/lib/puppet/http/resolver/server_list.rb +75 -15
  24. data/lib/puppet/http/resolver/settings.rb +22 -2
  25. data/lib/puppet/http/resolver/srv.rb +28 -2
  26. data/lib/puppet/http/response.rb +63 -1
  27. data/lib/puppet/http/retry_after_handler.rb +39 -0
  28. data/lib/puppet/http/service.rb +67 -1
  29. data/lib/puppet/http/service/ca.rb +71 -9
  30. data/lib/puppet/http/service/compiler.rb +213 -11
  31. data/lib/puppet/http/service/file_server.rb +105 -4
  32. data/lib/puppet/http/service/report.rb +36 -3
  33. data/lib/puppet/http/session.rb +59 -8
  34. data/lib/puppet/indirector/catalog/rest.rb +2 -1
  35. data/lib/puppet/indirector/facts/rest.rb +2 -1
  36. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  37. data/lib/puppet/indirector/file_metadata/rest.rb +4 -2
  38. data/lib/puppet/indirector/node/rest.rb +2 -1
  39. data/lib/puppet/indirector/report/yaml.rb +23 -0
  40. data/lib/puppet/indirector/status/rest.rb +2 -1
  41. data/lib/puppet/metatype/manager.rb +80 -80
  42. data/lib/puppet/network/http/base_pool.rb +6 -1
  43. data/lib/puppet/network/http/pool.rb +2 -4
  44. data/lib/puppet/network/http_pool.rb +1 -0
  45. data/lib/puppet/node/environment.rb +11 -1
  46. data/lib/puppet/pal/pal_impl.rb +1 -29
  47. data/lib/puppet/parser/compiler.rb +14 -7
  48. data/lib/puppet/parser/functions.rb +18 -13
  49. data/lib/puppet/pops/loaders.rb +7 -5
  50. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  51. data/lib/puppet/provider/package/apt.rb +61 -1
  52. data/lib/puppet/provider/package/dnfmodule.rb +39 -12
  53. data/lib/puppet/provider/package/gem.rb +41 -7
  54. data/lib/puppet/provider/package/pacman.rb +2 -5
  55. data/lib/puppet/provider/package/pip.rb +105 -33
  56. data/lib/puppet/provider/package/pip3.rb +0 -2
  57. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  58. data/lib/puppet/provider/package/pkgng.rb +16 -4
  59. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  60. data/lib/puppet/provider/package/rpm.rb +6 -213
  61. data/lib/puppet/provider/package/yum.rb +92 -19
  62. data/lib/puppet/provider/service/systemd.rb +2 -1
  63. data/lib/puppet/reports/http.rb +13 -11
  64. data/lib/puppet/resource/type_collection.rb +20 -16
  65. data/lib/puppet/ssl.rb +1 -0
  66. data/lib/puppet/ssl/host.rb +4 -4
  67. data/lib/puppet/ssl/oids.rb +1 -0
  68. data/lib/puppet/ssl/state_machine.rb +50 -33
  69. data/lib/puppet/transaction/report.rb +2 -2
  70. data/lib/puppet/type.rb +6 -1
  71. data/lib/puppet/type/file/source.rb +4 -2
  72. data/lib/puppet/type/package.rb +25 -2
  73. data/lib/puppet/type/user.rb +0 -19
  74. data/lib/puppet/util/at_fork.rb +1 -1
  75. data/lib/puppet/util/autoload.rb +3 -0
  76. data/lib/puppet/util/instance_loader.rb +14 -10
  77. data/lib/puppet/util/package/version/debian.rb +175 -0
  78. data/lib/puppet/util/package/version/gem.rb +15 -0
  79. data/lib/puppet/util/package/version/pip.rb +167 -0
  80. data/lib/puppet/util/package/version/range.rb +50 -0
  81. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  82. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  83. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  84. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  85. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  86. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  87. data/lib/puppet/util/package/version/rpm.rb +73 -0
  88. data/lib/puppet/util/pidlock.rb +13 -7
  89. data/lib/puppet/util/platform.rb +5 -0
  90. data/lib/puppet/util/rpm_compare.rb +193 -0
  91. data/lib/puppet/util/windows/adsi.rb +2 -2
  92. data/lib/puppet/util/windows/process.rb +15 -14
  93. data/lib/puppet/util/windows/security.rb +1 -0
  94. data/lib/puppet/util/windows/sid.rb +3 -3
  95. data/lib/puppet/version.rb +1 -1
  96. data/locales/puppet.pot +207 -201
  97. data/man/man5/puppet.conf.5 +11 -3
  98. data/man/man8/puppet-agent.8 +1 -1
  99. data/man/man8/puppet-apply.8 +1 -1
  100. data/man/man8/puppet-catalog.8 +1 -1
  101. data/man/man8/puppet-config.8 +1 -1
  102. data/man/man8/puppet-describe.8 +1 -1
  103. data/man/man8/puppet-device.8 +1 -1
  104. data/man/man8/puppet-doc.8 +1 -1
  105. data/man/man8/puppet-epp.8 +1 -1
  106. data/man/man8/puppet-facts.8 +1 -1
  107. data/man/man8/puppet-filebucket.8 +1 -1
  108. data/man/man8/puppet-generate.8 +1 -1
  109. data/man/man8/puppet-help.8 +1 -1
  110. data/man/man8/puppet-key.8 +1 -1
  111. data/man/man8/puppet-lookup.8 +1 -1
  112. data/man/man8/puppet-man.8 +1 -1
  113. data/man/man8/puppet-module.8 +1 -1
  114. data/man/man8/puppet-node.8 +1 -1
  115. data/man/man8/puppet-parser.8 +1 -1
  116. data/man/man8/puppet-plugin.8 +1 -1
  117. data/man/man8/puppet-report.8 +1 -1
  118. data/man/man8/puppet-resource.8 +1 -1
  119. data/man/man8/puppet-script.8 +1 -1
  120. data/man/man8/puppet-ssl.8 +1 -1
  121. data/man/man8/puppet-status.8 +1 -1
  122. data/man/man8/puppet.8 +2 -2
  123. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  124. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  125. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  126. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  127. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list-enabled.txt} +2 -0
  128. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  129. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  130. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  131. data/spec/integration/application/agent_spec.rb +329 -0
  132. data/spec/integration/application/apply_spec.rb +132 -3
  133. data/spec/integration/application/filebucket_spec.rb +190 -0
  134. data/spec/integration/application/plugin_spec.rb +50 -0
  135. data/spec/integration/http/client_spec.rb +34 -40
  136. data/spec/integration/indirector/report/yaml.rb +83 -0
  137. data/spec/integration/module_tool/forge_spec.rb +2 -15
  138. data/spec/integration/network/http_pool_spec.rb +11 -19
  139. data/spec/integration/node/environment_spec.rb +15 -0
  140. data/spec/integration/util/windows/adsi_spec.rb +1 -1
  141. data/spec/lib/puppet/test_ca.rb +2 -2
  142. data/spec/lib/puppet_spec/https.rb +10 -7
  143. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  144. data/spec/shared_contexts/https.rb +29 -0
  145. data/spec/unit/agent_spec.rb +33 -25
  146. data/spec/unit/application/agent_spec.rb +5 -1
  147. data/spec/unit/application/device_spec.rb +2 -2
  148. data/spec/unit/application/filebucket_spec.rb +22 -2
  149. data/spec/unit/configurer_spec.rb +1 -1
  150. data/spec/unit/defaults_spec.rb +24 -1
  151. data/spec/unit/environments_spec.rb +8 -0
  152. data/spec/unit/file_system_spec.rb +10 -0
  153. data/spec/unit/http/client_spec.rb +105 -46
  154. data/spec/unit/http/external_client_spec.rb +201 -0
  155. data/spec/unit/http/resolver_spec.rb +20 -0
  156. data/spec/unit/http/service/ca_spec.rb +25 -2
  157. data/spec/unit/http/service/compiler_spec.rb +184 -6
  158. data/spec/unit/http/service/file_server_spec.rb +35 -3
  159. data/spec/unit/http/service/report_spec.rb +3 -1
  160. data/spec/unit/http/service_spec.rb +3 -3
  161. data/spec/unit/http/session_spec.rb +56 -7
  162. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  163. data/spec/unit/network/http/pool_spec.rb +3 -3
  164. data/spec/unit/node/environment_spec.rb +16 -0
  165. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  166. data/spec/unit/provider/package/apt_spec.rb +30 -0
  167. data/spec/unit/provider/package/dnfmodule_spec.rb +33 -14
  168. data/spec/unit/provider/package/gem_spec.rb +40 -0
  169. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  170. data/spec/unit/provider/package/pip_spec.rb +26 -3
  171. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  172. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  173. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  174. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  175. data/spec/unit/provider/package/yum_spec.rb +235 -1
  176. data/spec/unit/provider/service/systemd_spec.rb +10 -1
  177. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  178. data/spec/unit/puppet_pal_2pec.rb +0 -29
  179. data/spec/unit/reports/http_spec.rb +70 -52
  180. data/spec/unit/ssl/host_spec.rb +4 -2
  181. data/spec/unit/ssl/oids_spec.rb +1 -0
  182. data/spec/unit/ssl/state_machine_spec.rb +38 -6
  183. data/spec/unit/transaction/report_spec.rb +4 -0
  184. data/spec/unit/util/at_fork_spec.rb +2 -2
  185. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  186. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  187. data/spec/unit/util/package/version/range_spec.rb +154 -0
  188. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  189. data/spec/unit/util/pidlock_spec.rb +83 -47
  190. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  191. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  192. data/spec/unit/util/windows/sid_spec.rb +2 -2
  193. data/tasks/generate_cert_fixtures.rake +15 -1
  194. metadata +51 -6
  195. 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
- @lock.lock
18
- allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', @lock.lock_pid, '-o', 'comm=']).and_raise(Puppet::ExecutionFailure, 'Execution of command returned 1: error')
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, @lock.lock_pid, '-o', 'comm=']).and_return('ruby')
30
- allow(Puppet::Util::Execution).to receive(:execute).with(['ps', ps_argument, @lock.lock_pid, '-o', 'args=']).and_return('puppet')
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