puppet 6.14.0 → 6.15.0

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
@@ -63,10 +63,19 @@ describe Puppet::HTTP::Service::FileServer do
63
63
  status: 200, body: filemetadata.render, headers: { 'Content-Type' => 'application/json' }
64
64
  )
65
65
 
66
- metadata = subject.get_file_metadata(path: request_path, environment: environment)
66
+ _, metadata = subject.get_file_metadata(path: request_path, environment: environment)
67
67
  expect(metadata.path).to eq(path)
68
68
  end
69
69
 
70
+ it 'returns the request response' do
71
+ stub_request(:get, url).to_return(
72
+ status: 200, body: filemetadata.render, headers: { 'Content-Type' => 'application/json' }
73
+ )
74
+
75
+ resp, _ = subject.get_file_metadata(path: request_path, environment: environment)
76
+ expect(resp).to be_a(Puppet::HTTP::Response)
77
+ end
78
+
70
79
  it 'raises a protocol error if the Content-Type header is missing from the response' do
71
80
  stub_request(:get, url).to_return(status: 200, body: '', headers: {})
72
81
 
@@ -136,10 +145,19 @@ describe Puppet::HTTP::Service::FileServer do
136
145
  status: 200, body: formatter.render_multiple(filemetadatas), headers: { 'Content-Type' => 'application/json' }
137
146
  )
138
147
 
139
- metadatas = subject.get_file_metadatas(path: request_path, environment: environment)
148
+ _, metadatas = subject.get_file_metadatas(path: request_path, environment: environment)
140
149
  expect(metadatas.first.path).to eq(path)
141
150
  end
142
151
 
152
+ it 'returns the request response' do
153
+ stub_request(:get, url).to_return(
154
+ status: 200, body: formatter.render_multiple(filemetadatas), headers: { 'Content-Type' => 'application/json' }
155
+ )
156
+
157
+ resp, _ = subject.get_file_metadatas(path: request_path, environment: environment)
158
+ expect(resp).to be_a(Puppet::HTTP::Response)
159
+ end
160
+
143
161
  it 'automatically converts an array of parameters to the stringified query' do
144
162
  url = "https://www.example.com/puppet/v3/file_metadatas/:mount/#{path}?checksum_type=md5&environment=testing&ignore=CVS&ignore=.git&ignore=.hg&links=manage&recurse=false&source_permissions=ignore"
145
163
  stub_request(:get, url).with(
@@ -148,7 +166,7 @@ describe Puppet::HTTP::Service::FileServer do
148
166
  status: 200, body: formatter.render_multiple(filemetadatas), headers: { 'Content-Type' => 'application/json' }
149
167
  )
150
168
 
151
- metadatas = subject.get_file_metadatas(path: request_path, environment: environment, ignore: ['CVS', '.git', '.hg'])
169
+ _, metadatas = subject.get_file_metadatas(path: request_path, environment: environment, ignore: ['CVS', '.git', '.hg'])
152
170
  expect(metadatas.first.path).to eq(path)
153
171
  end
154
172
 
@@ -222,6 +240,13 @@ describe Puppet::HTTP::Service::FileServer do
222
240
  }.to yield_with_args("and beyond")
223
241
  end
224
242
 
243
+ it 'returns the request response' do
244
+ stub_request(:get, uri)
245
+
246
+ resp = subject.get_file_content(path: '/:mount/:path', environment: environment) { |b| b }
247
+ expect(resp).to be_a(Puppet::HTTP::Response)
248
+ end
249
+
225
250
  it 'raises response error if unsuccessful' do
226
251
  stub_request(:get, uri).to_return(status: [400, 'Bad Request'])
227
252
 
@@ -255,6 +280,13 @@ describe Puppet::HTTP::Service::FileServer do
255
280
  }.to yield_with_args("and beyond")
256
281
  end
257
282
 
283
+ it 'returns the request response' do
284
+ stub_request(:get, uri)
285
+
286
+ resp = subject.get_static_file_content(path: '/:mount/:path', environment: environment, code_id: code_id) { |b| b }
287
+ expect(resp).to be_a(Puppet::HTTP::Response)
288
+ end
289
+
258
290
  it 'raises response error if unsuccessful' do
259
291
  stub_request(:get, uri).to_return(status: [400, 'Bad Request'])
260
292
 
@@ -85,7 +85,9 @@ describe Puppet::HTTP::Service::Report do
85
85
  stub_request(:put, url)
86
86
  .to_return(status: 200, body: body, headers: {'Content-Type' => 'application/json'})
87
87
 
88
- expect(subject.put_report('infinity', report, environment: environment).body).to eq(body)
88
+ resp = subject.put_report('infinity', report, environment: environment)
89
+ expect(resp.body).to eq(body)
90
+ expect(resp).to be_a(Puppet::HTTP::Response)
89
91
  end
90
92
 
91
93
  it 'raises response error if unsuccessful' do
@@ -17,7 +17,7 @@ describe Puppet::HTTP::Service do
17
17
  @client.get(
18
18
  url,
19
19
  headers: add_puppet_headers({'Default-Header' => 'default-value'}),
20
- ssl_context: ssl_context
20
+ options: {ssl_context: ssl_context}
21
21
  )
22
22
  end
23
23
 
@@ -82,14 +82,14 @@ describe Puppet::HTTP::Service do
82
82
  end
83
83
 
84
84
  it "connects to the base URL with a nil ssl context" do
85
- expect(client).to receive(:connect).with(url, ssl_context: nil)
85
+ expect(client).to receive(:connect).with(url, options: {ssl_context: nil})
86
86
 
87
87
  service.connect
88
88
  end
89
89
 
90
90
  it "accepts an optional ssl_context" do
91
91
  other_ctx = Puppet::SSL::SSLContext.new
92
- expect(client).to receive(:connect).with(url, ssl_context: other_ctx)
92
+ expect(client).to receive(:connect).with(url, options: {ssl_context: other_ctx})
93
93
 
94
94
  service.connect(ssl_context: other_ctx)
95
95
  end
@@ -10,10 +10,14 @@ describe Puppet::HTTP::Session do
10
10
  double('good', url: uri, connect: nil)
11
11
  }
12
12
  let(:bad_service) {
13
+ create_bad_service
14
+ }
15
+
16
+ def create_bad_service(failure_message = 'whoops')
13
17
  service = double('bad', url: uri)
14
- allow(service).to receive(:connect).and_raise(Puppet::HTTP::ConnectionError, 'whoops')
18
+ allow(service).to receive(:connect).and_raise(Puppet::HTTP::ConnectionError, failure_message)
15
19
  service
16
- }
20
+ end
17
21
 
18
22
  class DummyResolver < Puppet::HTTP::Resolver
19
23
  attr_reader :count
@@ -23,21 +27,19 @@ describe Puppet::HTTP::Session do
23
27
  @count = 0
24
28
  end
25
29
 
26
- def resolve(session, name, ssl_context: nil)
30
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
27
31
  @count += 1
28
- return @service if check_connection?(session, @service, ssl_context: ssl_context)
32
+ return @service if check_connection?(session, @service, ssl_context: ssl_context, error_handler: error_handler)
29
33
  end
30
34
  end
31
35
 
32
36
  context 'when routing' do
33
37
  it 'returns the first resolved service' do
34
- Puppet[:log_level] = :debug
35
38
  resolvers = [DummyResolver.new(bad_service), DummyResolver.new(good_service)]
36
39
  session = described_class.new(client, resolvers)
37
40
  resolved = session.route_to(:ca)
38
41
 
39
42
  expect(resolved).to eq(good_service)
40
- expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Connection to #{uri} failed, trying next route: whoops"))
41
43
  end
42
44
 
43
45
  it 'only resolves once per session' do
@@ -58,6 +60,29 @@ describe Puppet::HTTP::Session do
58
60
  }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
59
61
  end
60
62
 
63
+ it 'logs all routing failures as errors when there are no more routes' do
64
+ resolvers = [DummyResolver.new(create_bad_service('whoops1')), DummyResolver.new(create_bad_service('whoops2'))]
65
+ session = described_class.new(client, resolvers)
66
+
67
+ expect {
68
+ session.route_to(:ca)
69
+ }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
70
+
71
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: "whoops1"),
72
+ an_object_having_attributes(level: :err, message: "whoops2"))
73
+ end
74
+
75
+ it 'logs routing failures as debug until routing succeeds' do
76
+ Puppet[:log_level] = 'debug'
77
+
78
+ resolvers = [DummyResolver.new(bad_service), DummyResolver.new(good_service)]
79
+ session = described_class.new(client, resolvers)
80
+ session.route_to(:ca)
81
+
82
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Connection to #{uri} failed, trying next route: whoops"))
83
+ expect(@logs).to_not include(an_object_having_attributes(level: :err))
84
+ end
85
+
61
86
  it 'accepts an ssl context to use when connecting' do
62
87
  alt_context = Puppet::SSL::SSLContext.new
63
88
  expect(good_service).to receive(:connect).with(ssl_context: alt_context)
@@ -166,9 +191,12 @@ describe Puppet::HTTP::Session do
166
191
 
167
192
  Puppet::HTTP::Service::SERVICE_NAMES.each do |name|
168
193
  it "resolves #{name} using server_list" do
169
- stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 200)
194
+ Puppet[:server_list] = 'apple.example.com'
195
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
170
196
 
171
197
  session.route_to(name)
198
+
199
+ expect(req).to have_been_requested
172
200
  end
173
201
  end
174
202
 
@@ -183,6 +211,27 @@ describe Puppet::HTTP::Session do
183
211
 
184
212
  expect(session.route_to(:report).url.to_s).to eq("https://cherry.example.com:8140/puppet/v3")
185
213
  end
214
+
215
+ it 'resolves once for all services in a session' do
216
+ Puppet[:server_list] = 'apple.example.com'
217
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
218
+
219
+ Puppet::HTTP::Service::SERVICE_NAMES.each do |name|
220
+ session.route_to(name)
221
+ end
222
+
223
+ expect(req).to have_been_requested
224
+ end
225
+
226
+ it 'resolves server_list for each new session' do
227
+ Puppet[:server_list] = 'apple.example.com'
228
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
229
+
230
+ client.create_session.route_to(:puppet)
231
+ client.create_session.route_to(:puppet)
232
+
233
+ expect(req).to have_been_requested.twice
234
+ end
186
235
  end
187
236
 
188
237
  context 'when retrieving capabilities' do
@@ -3,7 +3,87 @@ require 'spec_helper'
3
3
  require 'puppet/indirector/file_bucket_file/rest'
4
4
 
5
5
  describe Puppet::FileBucketFile::Rest do
6
- it "should be a sublcass of Puppet::Indirector::REST" do
7
- expect(Puppet::FileBucketFile::Rest.superclass).to equal(Puppet::Indirector::REST)
6
+ let(:rest_path) {"filebucket://xanadu:8141/"}
7
+ let(:file_bucket_file) {Puppet::FileBucket::File.new('file contents', :bucket_path => '/some/random/path')}
8
+ let(:files_original_path) {'/path/to/file'}
9
+ let(:dest_path) {"#{rest_path}#{file_bucket_file.name}/#{files_original_path}"}
10
+ let(:file_bucket_path) {"#{rest_path}#{file_bucket_file.checksum_type}/#{file_bucket_file.checksum_data}/#{files_original_path}"}
11
+ let(:source_path) {"#{rest_path}#{file_bucket_file.checksum_type}/#{file_bucket_file.checksum_data}"}
12
+
13
+ let(:uri) { %r{/puppet/v3/file_bucket_file} }
14
+
15
+ describe '#head' do
16
+ it 'includes the environment as a request parameter' do
17
+ stub_request(:head, uri).with(query: hash_including(environment: 'outerspace'))
18
+
19
+ described_class.indirection.head(file_bucket_path, :bucket_path => file_bucket_file.bucket_path, environment: Puppet::Node::Environment.remote('outerspace'))
20
+ end
21
+
22
+ it 'includes bucket path in the request if bucket path is set' do
23
+ stub_request(:head, uri).with(query: hash_including(bucket_path: '/some/random/path'))
24
+
25
+ described_class.indirection.head(file_bucket_path, :bucket_path => file_bucket_file.bucket_path)
26
+ end
27
+
28
+ it "returns nil on 404" do
29
+ stub_request(:head, uri).to_return(status: 404)
30
+
31
+ expect(described_class.indirection.head(file_bucket_path, :bucket_path => file_bucket_file.bucket_path)).to be_falsy
32
+ end
33
+
34
+ it "raises for all other fail codes" do
35
+ stub_request(:head, uri).to_return(status: [503, 'server unavailable'])
36
+
37
+ expect{described_class.indirection.head(file_bucket_path, :bucket_path => file_bucket_file.bucket_path)}.to raise_error(Net::HTTPError, "Error 503 on SERVER: server unavailable")
38
+ end
39
+ end
40
+
41
+ describe '#find' do
42
+ it 'includes the environment as a request parameter' do
43
+ stub_request(:get, uri).with(query: hash_including(environment: 'outerspace')).to_return(status: 200, headers: {'Content-Type' => 'application/octet-stream'})
44
+
45
+ described_class.indirection.find(source_path, :bucket_path => nil, environment: Puppet::Node::Environment.remote('outerspace'))
46
+ end
47
+
48
+ {bucket_path: 'path', diff_with: '4aabe1257043bd0', list_all: 'true', fromdate: '20200404', todate: '20200404'}.each do |param, val|
49
+ it "includes #{param} as a parameter in the request if #{param} is set" do
50
+ stub_request(:get, uri).with(query: hash_including(param => val)).to_return(status: 200, headers: {'Content-Type' => 'application/octet-stream'})
51
+
52
+ options = { param => val }
53
+ described_class.indirection.find(source_path, **options)
54
+ end
55
+ end
56
+
57
+ it 'raises if unsuccessful' do
58
+ stub_request(:get, uri).to_return(status: [503, 'server unavailable'])
59
+
60
+ expect{described_class.indirection.find(source_path, :bucket_path => nil)}.to raise_error(Net::HTTPError, "Error 503 on SERVER: server unavailable")
61
+ end
62
+
63
+ it 'raises if Content-Type is not included in the response' do
64
+ stub_request(:get, uri).to_return(status: 200, headers: {})
65
+
66
+ expect{described_class.indirection.find(source_path, :bucket_path => nil)}.to raise_error(RuntimeError, "No content type in http response; cannot parse")
67
+ end
68
+ end
69
+
70
+ describe '#save' do
71
+ it 'includes the environment as a request parameter' do
72
+ stub_request(:put, uri).with(query: hash_including(environment: 'outerspace'))
73
+
74
+ described_class.indirection.save(file_bucket_file, dest_path, environment: Puppet::Node::Environment.remote('outerspace'))
75
+ end
76
+
77
+ it 'sends the contents of the file as the request body' do
78
+ stub_request(:put, uri).with(body: file_bucket_file.contents)
79
+
80
+ described_class.indirection.save(file_bucket_file, dest_path)
81
+ end
82
+
83
+ it 'raises if unsuccessful' do
84
+ stub_request(:put, uri).to_return(status: [503, 'server unavailable'])
85
+
86
+ expect{described_class.indirection.save(file_bucket_file, dest_path)}.to raise_error(Net::HTTPError, "Error 503 on SERVER: server unavailable")
87
+ end
8
88
  end
9
89
  end
@@ -26,11 +26,11 @@ describe Puppet::Network::HTTP::Pool do
26
26
  end
27
27
 
28
28
  def create_pool
29
- Puppet::Network::HTTP::Pool.new
29
+ Puppet::Network::HTTP::Pool.new(15)
30
30
  end
31
31
 
32
32
  def create_pool_with_connections(site, *connections)
33
- pool = Puppet::Network::HTTP::Pool.new
33
+ pool = Puppet::Network::HTTP::Pool.new(15)
34
34
  connections.each do |conn|
35
35
  pool.release(site, verifier, conn)
36
36
  end
@@ -38,7 +38,7 @@ describe Puppet::Network::HTTP::Pool do
38
38
  end
39
39
 
40
40
  def create_pool_with_http_connections(site, *connections)
41
- pool = Puppet::Network::HTTP::Pool.new
41
+ pool = Puppet::Network::HTTP::Pool.new(15)
42
42
  connections.each do |conn|
43
43
  pool.release(site, nil, conn)
44
44
  end
@@ -422,6 +422,22 @@ describe Puppet::Node::Environment do
422
422
 
423
423
  env.modules
424
424
  end
425
+
426
+ it "includes the Bolt project in modules if it's defined" do
427
+ path = tmpdir('project')
428
+ PuppetSpec::Modules.generate_files('bolt_project', path)
429
+ project = Struct.new("Project", :name, :path).new('bolt_project', path)
430
+
431
+ Puppet.override(bolt_project: project) do
432
+ %w{foo bar}.each do |mod_name|
433
+ PuppetSpec::Modules.generate_files(mod_name, first_modulepath)
434
+ end
435
+ %w{bee baz}.each do |mod_name|
436
+ PuppetSpec::Modules.generate_files(mod_name, second_modulepath)
437
+ end
438
+ expect(env.modules.collect{|mod| mod.name}.sort).to eq(%w{bolt_project foo bar bee baz}.sort)
439
+ end
440
+ end
425
441
  end
426
442
  end
427
443
  end
@@ -33,13 +33,18 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
33
33
  let(:user1) { double(:account => 'user1', :domain => '.', :sid => 'user1sid') }
34
34
  let(:user2) { double(:account => 'user2', :domain => '.', :sid => 'user2sid') }
35
35
  let(:user3) { double(:account => 'user3', :domain => '.', :sid => 'user3sid') }
36
+ let(:user_without_domain) { double(:account => 'user_without_domain', :domain => nil, :sid => 'user_without_domain_sid') }
37
+
36
38
  let(:invalid_user) { SecureRandom.uuid }
39
+ let(:invalid_user_principal) { double(:account => "#{invalid_user}", :domain => nil, :sid => "#{invalid_user}") }
37
40
 
38
41
  before :each do
39
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1').and_return(user1)
40
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2').and_return(user2)
41
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3').and_return(user3)
42
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1', any_args).and_return(user1)
43
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2', any_args).and_return(user2)
44
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3', any_args).and_return(user3)
45
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user_without_domain', any_args).and_return(user_without_domain)
42
46
  allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with(invalid_user).and_return(nil)
47
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with(invalid_user, true).and_return(invalid_user_principal)
43
48
  end
44
49
 
45
50
  describe "#members_insync?" do
@@ -199,7 +204,15 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
199
204
  ]
200
205
  expect(provider.members_insync?(current, ['user2','user1'])).to be_truthy
201
206
  end
207
+
208
+ it "should return true even if a current user is unresolvable if should is included" do
209
+ current = [
210
+ "#{invalid_user}",
211
+ 'user2',
212
+ ]
213
+ expect(provider.members_insync?(current, ['user2'])).to be_truthy
202
214
  end
215
+ end
203
216
  end
204
217
 
205
218
  describe "#members_to_s" do
@@ -222,8 +235,8 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
222
235
  expect(provider.members_to_s(['user1', 'user2'])).to eq('.\user1,.\user2')
223
236
  end
224
237
 
225
- it "should return the username when it cannot be resolved to a SID (for the sake of resource_harness error messages)" do
226
- expect(provider.members_to_s([invalid_user])).to eq("#{invalid_user}")
238
+ it "should return a user string without domain if domain is not set" do
239
+ expect(provider.members_to_s(['user_without_domain'])).to eq('user_without_domain')
227
240
  end
228
241
 
229
242
  it "should return the username when it cannot be resolved to a SID (for the sake of resource_harness error messages)" do
@@ -237,10 +250,14 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
237
250
  let(:user2) { double(:account => 'user2', :domain => '.', :sid => 'user2sid') }
238
251
  let(:user3) { double(:account => 'user3', :domain => '.', :sid => 'user3sid') }
239
252
 
253
+ let(:invalid_user) { SecureRandom.uuid }
254
+ let(:invalid_user_principal) { double(:account => "#{invalid_user}", :domain => nil, :sid => "#{invalid_user}") }
255
+
240
256
  before :each do
241
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1').and_return(user1)
242
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2').and_return(user2)
243
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3').and_return(user3)
257
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1', any_args).and_return(user1)
258
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2', any_args).and_return(user2)
259
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3', any_args).and_return(user3)
260
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with(invalid_user, true).and_return(invalid_user_principal)
244
261
 
245
262
  resource[:auth_membership] = true
246
263
  end
@@ -261,6 +278,22 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
261
278
  expect(provider.members).to match_array(expected_members)
262
279
  end
263
280
 
281
+ it "should be able to handle unresolvable SID in list of members" do
282
+ allow(provider.group).to receive(:members).and_return([
283
+ 'user1',
284
+ "#{invalid_user}",
285
+ 'user3',
286
+ ])
287
+
288
+ expected_member_sids = [user1.sid, invalid_user_principal.sid, user3.sid]
289
+ expected_members = ['user1', "#{invalid_user}", 'user3']
290
+ allow(provider).to receive(:members_to_s)
291
+ .with(expected_member_sids)
292
+ .and_return(expected_members.join(','))
293
+
294
+ expect(provider.members).to match_array(expected_members)
295
+ end
296
+
264
297
  it "should be able to set group members" do
265
298
  allow(provider.group).to receive(:members).and_return(['user1', 'user2'])
266
299
 
@@ -272,8 +305,8 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
272
305
 
273
306
  allow(provider.group).to receive(:member_sids).and_return(member_sids[0..1])
274
307
 
275
- expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2').and_return(member_sids[1])
276
- expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3').and_return(member_sids[2])
308
+ expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2', any_args).and_return(member_sids[1])
309
+ expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3', any_args).and_return(member_sids[2])
277
310
 
278
311
  expect(provider.group).to receive(:remove_member_sids).with(member_sids[0])
279
312
  expect(provider.group).to receive(:add_member_sids).with(member_sids[2])