puppet 6.12.0-x64-mingw32 → 6.17.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 (412) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +39 -36
  6. data/README.md +18 -25
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/windows/service/daemon.rb +3 -3
  9. data/lib/puppet.rb +52 -13
  10. data/lib/puppet/agent.rb +20 -14
  11. data/lib/puppet/application/agent.rb +26 -17
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/resource.rb +1 -1
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +65 -69
  19. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  20. data/lib/puppet/confine.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +154 -58
  24. data/lib/puppet/environments.rb +27 -20
  25. data/lib/puppet/face/facts.rb +8 -5
  26. data/lib/puppet/face/help.rb +29 -3
  27. data/lib/puppet/face/module/search.rb +5 -0
  28. data/lib/puppet/face/plugin.rb +2 -2
  29. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  30. data/lib/puppet/file_serving/metadata.rb +4 -1
  31. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  32. data/lib/puppet/file_system/file_impl.rb +14 -10
  33. data/lib/puppet/file_system/memory_file.rb +6 -0
  34. data/lib/puppet/file_system/memory_impl.rb +13 -0
  35. data/lib/puppet/file_system/uniquefile.rb +12 -16
  36. data/lib/puppet/file_system/windows.rb +7 -10
  37. data/lib/puppet/forge.rb +1 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge/repository.rb +4 -7
  40. data/lib/puppet/functions/call.rb +1 -1
  41. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  42. data/lib/puppet/functions/filter.rb +1 -0
  43. data/lib/puppet/functions/reduce.rb +2 -4
  44. data/lib/puppet/http.rb +5 -0
  45. data/lib/puppet/http/client.rb +293 -73
  46. data/lib/puppet/http/errors.rb +2 -0
  47. data/lib/puppet/http/external_client.rb +90 -0
  48. data/lib/puppet/http/redirector.rb +43 -7
  49. data/lib/puppet/http/resolver.rb +46 -3
  50. data/lib/puppet/http/resolver/server_list.rb +76 -16
  51. data/lib/puppet/http/resolver/settings.rb +23 -3
  52. data/lib/puppet/http/resolver/srv.rb +29 -3
  53. data/lib/puppet/http/response.rb +87 -1
  54. data/lib/puppet/http/retry_after_handler.rb +39 -0
  55. data/lib/puppet/http/service.rb +151 -7
  56. data/lib/puppet/http/service/ca.rb +76 -14
  57. data/lib/puppet/http/service/compiler.rb +319 -0
  58. data/lib/puppet/http/service/file_server.rb +206 -0
  59. data/lib/puppet/http/service/report.rb +49 -23
  60. data/lib/puppet/http/session.rb +103 -7
  61. data/lib/puppet/indirector.rb +1 -1
  62. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  63. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  64. data/lib/puppet/indirector/facts/rest.rb +42 -0
  65. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  66. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  67. data/lib/puppet/indirector/file_content/http.rb +5 -0
  68. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  69. data/lib/puppet/indirector/file_metadata/http.rb +27 -8
  70. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  71. data/lib/puppet/indirector/json.rb +1 -1
  72. data/lib/puppet/indirector/msgpack.rb +1 -1
  73. data/lib/puppet/indirector/node/rest.rb +24 -0
  74. data/lib/puppet/indirector/report/rest.rb +19 -0
  75. data/lib/puppet/indirector/report/yaml.rb +23 -0
  76. data/lib/puppet/indirector/request.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +12 -0
  78. data/lib/puppet/indirector/status/rest.rb +18 -0
  79. data/lib/puppet/loaders.rb +6 -0
  80. data/lib/puppet/metatype/manager.rb +80 -80
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  83. data/lib/puppet/network/http/base_pool.rb +7 -2
  84. data/lib/puppet/network/http/compression.rb +7 -0
  85. data/lib/puppet/network/http/connection.rb +6 -0
  86. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  87. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  88. data/lib/puppet/network/http/pool.rb +13 -6
  89. data/lib/puppet/network/http_pool.rb +2 -1
  90. data/lib/puppet/node/environment.rb +11 -1
  91. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  92. data/lib/puppet/pal/pal_impl.rb +4 -29
  93. data/lib/puppet/parser/ast/leaf.rb +5 -5
  94. data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
  95. data/lib/puppet/parser/compiler.rb +43 -33
  96. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  97. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  98. data/lib/puppet/parser/environment_compiler.rb +4 -1
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/filter.rb +1 -0
  101. data/lib/puppet/parser/resource.rb +3 -2
  102. data/lib/puppet/parser/resource/param.rb +6 -0
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
  105. data/lib/puppet/pops/issues.rb +5 -0
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/parser/evaluating_parser.rb +5 -7
  109. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  110. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  111. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  112. data/lib/puppet/pops/validation/checker4_0.rb +11 -1
  113. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  114. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  115. data/lib/puppet/provider/aix_object.rb +4 -2
  116. data/lib/puppet/provider/group/aix.rb +1 -0
  117. data/lib/puppet/provider/group/groupadd.rb +57 -24
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/package/aix.rb +17 -2
  120. data/lib/puppet/provider/package/apt.rb +78 -4
  121. data/lib/puppet/provider/package/aptitude.rb +1 -1
  122. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  123. data/lib/puppet/provider/package/dpkg.rb +14 -7
  124. data/lib/puppet/provider/package/fink.rb +20 -3
  125. data/lib/puppet/provider/package/gem.rb +41 -7
  126. data/lib/puppet/provider/package/openbsd.rb +13 -1
  127. data/lib/puppet/provider/package/pacman.rb +2 -5
  128. data/lib/puppet/provider/package/pip.rb +143 -48
  129. data/lib/puppet/provider/package/pip3.rb +0 -2
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +2 -2
  134. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  135. data/lib/puppet/provider/package/rpm.rb +6 -213
  136. data/lib/puppet/provider/package/yum.rb +109 -25
  137. data/lib/puppet/provider/package/zypper.rb +59 -1
  138. data/lib/puppet/provider/service/systemd.rb +22 -4
  139. data/lib/puppet/provider/service/windows.rb +23 -7
  140. data/lib/puppet/provider/user/aix.rb +1 -0
  141. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  142. data/lib/puppet/provider/user/useradd.rb +22 -12
  143. data/lib/puppet/reports/http.rb +15 -9
  144. data/lib/puppet/reports/store.rb +1 -1
  145. data/lib/puppet/resource.rb +2 -1
  146. data/lib/puppet/resource/type.rb +8 -0
  147. data/lib/puppet/resource/type_collection.rb +20 -16
  148. data/lib/puppet/runtime.rb +31 -1
  149. data/lib/puppet/settings.rb +4 -0
  150. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  151. data/lib/puppet/ssl.rb +1 -0
  152. data/lib/puppet/ssl/certificate.rb +2 -1
  153. data/lib/puppet/ssl/host.rb +4 -4
  154. data/lib/puppet/ssl/oids.rb +1 -0
  155. data/lib/puppet/ssl/ssl_context.rb +2 -2
  156. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  157. data/lib/puppet/ssl/state_machine.rb +81 -35
  158. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  159. data/lib/puppet/test/test_helper.rb +15 -11
  160. data/lib/puppet/transaction/report.rb +2 -2
  161. data/lib/puppet/transaction/resource_harness.rb +1 -1
  162. data/lib/puppet/trusted_external.rb +29 -1
  163. data/lib/puppet/type.rb +18 -6
  164. data/lib/puppet/type/file.rb +51 -13
  165. data/lib/puppet/type/file/checksum.rb +4 -4
  166. data/lib/puppet/type/file/source.rb +51 -60
  167. data/lib/puppet/type/group.rb +2 -2
  168. data/lib/puppet/type/package.rb +102 -10
  169. data/lib/puppet/type/service.rb +55 -8
  170. data/lib/puppet/type/user.rb +3 -28
  171. data/lib/puppet/util.rb +39 -15
  172. data/lib/puppet/util/at_fork.rb +1 -1
  173. data/lib/puppet/util/autoload.rb +4 -18
  174. data/lib/puppet/util/checksums.rb +19 -4
  175. data/lib/puppet/util/fileparsing.rb +2 -2
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/package/version/debian.rb +175 -0
  179. data/lib/puppet/util/package/version/gem.rb +15 -0
  180. data/lib/puppet/util/package/version/pip.rb +167 -0
  181. data/lib/puppet/util/package/version/range.rb +53 -0
  182. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  183. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  185. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  187. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  188. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  189. data/lib/puppet/util/package/version/rpm.rb +73 -0
  190. data/lib/puppet/util/pidlock.rb +36 -10
  191. data/lib/puppet/util/platform.rb +5 -0
  192. data/lib/puppet/util/plist.rb +6 -0
  193. data/lib/puppet/util/provider_features.rb +1 -1
  194. data/lib/puppet/util/reference.rb +1 -1
  195. data/lib/puppet/util/rpm_compare.rb +193 -0
  196. data/lib/puppet/util/storage.rb +0 -1
  197. data/lib/puppet/util/windows/adsi.rb +2 -2
  198. data/lib/puppet/util/windows/api_types.rb +45 -32
  199. data/lib/puppet/util/windows/eventlog.rb +1 -6
  200. data/lib/puppet/util/windows/principal.rb +8 -6
  201. data/lib/puppet/util/windows/process.rb +15 -14
  202. data/lib/puppet/util/windows/registry.rb +11 -11
  203. data/lib/puppet/util/windows/security.rb +1 -0
  204. data/lib/puppet/util/windows/service.rb +43 -26
  205. data/lib/puppet/util/windows/sid.rb +3 -3
  206. data/lib/puppet/util/windows/user.rb +23 -8
  207. data/lib/puppet/util/yaml.rb +1 -1
  208. data/lib/puppet/version.rb +1 -1
  209. data/locales/puppet.pot +707 -574
  210. data/man/man5/puppet.conf.5 +74 -14
  211. data/man/man8/puppet-agent.8 +7 -7
  212. data/man/man8/puppet-apply.8 +1 -1
  213. data/man/man8/puppet-catalog.8 +1 -1
  214. data/man/man8/puppet-config.8 +1 -1
  215. data/man/man8/puppet-describe.8 +1 -1
  216. data/man/man8/puppet-device.8 +2 -2
  217. data/man/man8/puppet-doc.8 +1 -1
  218. data/man/man8/puppet-epp.8 +1 -1
  219. data/man/man8/puppet-facts.8 +1 -1
  220. data/man/man8/puppet-filebucket.8 +17 -2
  221. data/man/man8/puppet-generate.8 +1 -1
  222. data/man/man8/puppet-help.8 +6 -3
  223. data/man/man8/puppet-key.8 +1 -1
  224. data/man/man8/puppet-lookup.8 +1 -1
  225. data/man/man8/puppet-man.8 +1 -1
  226. data/man/man8/puppet-module.8 +4 -1
  227. data/man/man8/puppet-node.8 +1 -1
  228. data/man/man8/puppet-parser.8 +1 -1
  229. data/man/man8/puppet-plugin.8 +1 -1
  230. data/man/man8/puppet-report.8 +1 -1
  231. data/man/man8/puppet-resource.8 +1 -1
  232. data/man/man8/puppet-script.8 +1 -1
  233. data/man/man8/puppet-ssl.8 +2 -2
  234. data/man/man8/puppet-status.8 +1 -1
  235. data/man/man8/puppet.8 +2 -2
  236. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  237. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  238. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  239. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  240. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  241. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  242. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  243. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  244. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  247. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  248. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  249. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  250. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  251. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  252. data/spec/integration/application/agent_spec.rb +483 -0
  253. data/spec/integration/application/apply_spec.rb +132 -3
  254. data/spec/integration/application/filebucket_spec.rb +190 -0
  255. data/spec/integration/application/plugin_spec.rb +73 -0
  256. data/spec/integration/configurer_spec.rb +26 -7
  257. data/spec/integration/defaults_spec.rb +1 -2
  258. data/spec/integration/http/client_spec.rb +47 -37
  259. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  260. data/spec/integration/indirector/report/yaml.rb +83 -0
  261. data/spec/integration/module_tool/forge_spec.rb +2 -15
  262. data/spec/integration/network/http_pool_spec.rb +93 -20
  263. data/spec/integration/node/environment_spec.rb +15 -0
  264. data/spec/integration/parser/compiler_spec.rb +11 -0
  265. data/spec/integration/type/file_spec.rb +1 -1
  266. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  267. data/spec/integration/util/windows/registry_spec.rb +7 -7
  268. data/spec/integration/util/windows/user_spec.rb +40 -5
  269. data/spec/lib/puppet/test_ca.rb +2 -2
  270. data/spec/lib/puppet_spec/https.rb +16 -7
  271. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  272. data/spec/shared_contexts/https.rb +29 -0
  273. data/spec/unit/agent_spec.rb +80 -26
  274. data/spec/unit/application/agent_spec.rb +9 -5
  275. data/spec/unit/application/apply_spec.rb +2 -12
  276. data/spec/unit/application/describe_spec.rb +88 -50
  277. data/spec/unit/application/device_spec.rb +2 -2
  278. data/spec/unit/application/filebucket_spec.rb +22 -2
  279. data/spec/unit/application/resource_spec.rb +2 -2
  280. data/spec/unit/configurer/fact_handler_spec.rb +4 -8
  281. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  282. data/spec/unit/configurer_spec.rb +17 -18
  283. data/spec/unit/context/trusted_information_spec.rb +25 -2
  284. data/spec/unit/daemon_spec.rb +5 -64
  285. data/spec/unit/defaults_spec.rb +25 -2
  286. data/spec/unit/environments_spec.rb +65 -28
  287. data/spec/unit/face/facts_spec.rb +24 -20
  288. data/spec/unit/face/module/search_spec.rb +17 -0
  289. data/spec/unit/face/plugin_spec.rb +12 -10
  290. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  291. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  292. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  293. data/spec/unit/file_system_spec.rb +26 -2
  294. data/spec/unit/functions/lookup_spec.rb +13 -0
  295. data/spec/unit/http/client_spec.rb +327 -35
  296. data/spec/unit/http/external_client_spec.rb +201 -0
  297. data/spec/unit/http/resolver_spec.rb +34 -2
  298. data/spec/unit/http/response_spec.rb +75 -0
  299. data/spec/unit/http/service/ca_spec.rb +53 -11
  300. data/spec/unit/http/service/compiler_spec.rb +627 -0
  301. data/spec/unit/http/service/file_server_spec.rb +308 -0
  302. data/spec/unit/http/service/report_spec.rb +27 -9
  303. data/spec/unit/http/service_spec.rb +98 -5
  304. data/spec/unit/http/session_spec.rb +190 -7
  305. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  306. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  307. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  308. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  309. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  310. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  311. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  312. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  313. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  314. data/spec/unit/indirector/request_spec.rb +1 -1
  315. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  316. data/spec/unit/indirector/rest_spec.rb +13 -0
  317. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  318. data/spec/unit/interface_spec.rb +3 -3
  319. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  320. data/spec/unit/network/http/connection_spec.rb +559 -175
  321. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  322. data/spec/unit/network/http/pool_spec.rb +89 -11
  323. data/spec/unit/network/http_pool_spec.rb +63 -57
  324. data/spec/unit/network/http_spec.rb +1 -1
  325. data/spec/unit/node/environment_spec.rb +16 -0
  326. data/spec/unit/node/facts_spec.rb +2 -1
  327. data/spec/unit/node_spec.rb +7 -4
  328. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  329. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  330. data/spec/unit/parser/scope_spec.rb +1 -1
  331. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  332. data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
  333. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  334. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  335. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  336. data/spec/unit/provider/aix_object_spec.rb +16 -2
  337. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  338. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  339. data/spec/unit/provider/package/aix_spec.rb +29 -0
  340. data/spec/unit/provider/package/apt_spec.rb +43 -2
  341. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  342. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  343. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  344. data/spec/unit/provider/package/gem_spec.rb +40 -0
  345. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  346. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  347. data/spec/unit/provider/package/pip_spec.rb +68 -19
  348. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  349. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  350. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  351. data/spec/unit/provider/package/portage_spec.rb +5 -0
  352. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  353. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  354. data/spec/unit/provider/package/yum_spec.rb +292 -0
  355. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  356. data/spec/unit/provider/service/init_spec.rb +1 -0
  357. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  358. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  359. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  360. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  361. data/spec/unit/provider/service/windows_spec.rb +22 -14
  362. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  363. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  364. data/spec/unit/provider/user/useradd_spec.rb +43 -24
  365. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  366. data/spec/unit/puppet_pal_2pec.rb +0 -26
  367. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  368. data/spec/unit/puppet_spec.rb +47 -0
  369. data/spec/unit/reports/http_spec.rb +70 -52
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  372. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  373. data/spec/unit/ssl/certificate_spec.rb +7 -0
  374. data/spec/unit/ssl/host_spec.rb +4 -2
  375. data/spec/unit/ssl/oids_spec.rb +1 -0
  376. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  377. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  378. data/spec/unit/test/test_helper_spec.rb +17 -0
  379. data/spec/unit/transaction/persistence_spec.rb +1 -10
  380. data/spec/unit/transaction/report_spec.rb +5 -1
  381. data/spec/unit/transaction_spec.rb +0 -2
  382. data/spec/unit/type/file/ensure_spec.rb +1 -2
  383. data/spec/unit/type/file/source_spec.rb +89 -38
  384. data/spec/unit/type/file_spec.rb +122 -96
  385. data/spec/unit/type/package_spec.rb +8 -0
  386. data/spec/unit/type/service_spec.rb +185 -8
  387. data/spec/unit/type/user_spec.rb +1 -2
  388. data/spec/unit/type_spec.rb +50 -0
  389. data/spec/unit/util/at_fork_spec.rb +3 -2
  390. data/spec/unit/util/autoload_spec.rb +2 -1
  391. data/spec/unit/util/checksums_spec.rb +16 -0
  392. data/spec/unit/util/log/destinations_spec.rb +1 -29
  393. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  394. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  395. data/spec/unit/util/package/version/range_spec.rb +175 -0
  396. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  397. data/spec/unit/util/pidlock_spec.rb +112 -42
  398. data/spec/unit/util/plist_spec.rb +20 -0
  399. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  400. data/spec/unit/util/storage_spec.rb +1 -8
  401. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  402. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  403. data/spec/unit/util/windows/service_spec.rb +4 -4
  404. data/spec/unit/util/windows/sid_spec.rb +2 -2
  405. data/spec/unit/util_spec.rb +3 -3
  406. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  407. data/tasks/generate_cert_fixtures.rake +15 -1
  408. data/tasks/manpages.rake +5 -35
  409. metadata +73 -12
  410. data/COMMITTERS.md +0 -244
  411. data/spec/integration/faces/plugin_spec.rb +0 -61
  412. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -834,6 +834,17 @@ describe Puppet::Parser::Compiler do
834
834
  MANIFEST
835
835
  end.to raise_error(/Foo\[bar\]:\s+parameter 'a' expects a value for key 'd'\s+parameter 'a' unrecognized key 'c'/m)
836
836
  end
837
+
838
+ it 'handles Sensitive type in resource array' do
839
+ catalog = compile_to_catalog(<<-MANIFEST)
840
+ define foo(Sensitive[String] $password) {
841
+ notify{ "${title}": message => "${password}" }
842
+ }
843
+ foo { ['testA', 'testB']: password =>Sensitive('some password') }
844
+ MANIFEST
845
+ expect(catalog).to have_resource("Notify[testA]").with_parameter(:message, 'Sensitive [value redacted]')
846
+ expect(catalog).to have_resource("Notify[testB]").with_parameter(:message, 'Sensitive [value redacted]')
847
+ end
837
848
  end
838
849
 
839
850
  context 'when using typed parameters in class' do
@@ -1160,7 +1160,7 @@ describe Puppet::Type.type(:file), :uses_checksums => true do
1160
1160
  source_prefix = Puppet::Util::Platform.windows? ? '/' : ''
1161
1161
 
1162
1162
  # the URI can be round-tripped through unescape
1163
- expect(URI.unescape(uri_path)).to eq(source_prefix + source)
1163
+ expect(Puppet::Util.uri_unescape(uri_path)).to eq(source_prefix + source)
1164
1164
  # and is properly UTF-8
1165
1165
  expect(uri_path.encoding).to eq (Encoding::UTF_8)
1166
1166
 
@@ -82,6 +82,9 @@ describe Puppet::Util::Windows::ADSI::Group,
82
82
  it 'should return a list of members resolvable with Puppet::Util::Windows::ADSI::Group.name_sid_hash' do
83
83
  temp_groupname = "g#{SecureRandom.uuid}"
84
84
  temp_username = "u#{SecureRandom.uuid}"[0..12]
85
+ # From https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/password-must-meet-complexity-requirements
86
+ specials = "~!@#$%^&*_-+=`|\(){}[]:;\"'<>,.?/"
87
+ temp_password = "p#{SecureRandom.uuid[0..7]}-#{SecureRandom.uuid.upcase[0..7]}-#{specials[rand(specials.length)]}"
85
88
 
86
89
  # select a virtual account that requires an authority to be able to resolve to SID
87
90
  # the Dhcp service is chosen for no particular reason aside from it's a service available on all Windows versions
@@ -110,6 +113,8 @@ describe Puppet::Util::Windows::ADSI::Group,
110
113
  begin
111
114
  # :SidTypeUser as user on localhost, can be resolved with or without authority prefix
112
115
  user = Puppet::Util::Windows::ADSI::User.create(temp_username)
116
+ # appveyor sometimes requires a password
117
+ user.password = temp_password
113
118
  user.commit()
114
119
  users.push({ :sid => user.sid.sid, :name => Puppet::Util::Windows::ADSI.computer_name + '\\' + temp_username })
115
120
 
@@ -160,7 +165,7 @@ describe Puppet::Util::Windows::ADSI::Group,
160
165
 
161
166
  # unresolvable SID
162
167
  expect(admins.members[1].sid).to eq('S-1-5-21-3661721861-956923663-2119435483-1112')
163
- expect(admins.members[1].account).to eq('S-1-5-21-3661721861-956923663-2119435483-1112 (unresolvable)')
168
+ expect(admins.members[1].account).to eq('S-1-5-21-3661721861-956923663-2119435483-1112')
164
169
  expect(admins.members[1].account_type).to eq(:SidTypeUnknown)
165
170
  end
166
171
 
@@ -259,23 +259,23 @@ describe Puppet::Util::Windows::Registry do
259
259
  {
260
260
  name: 'REG_SZ',
261
261
  type: Win32::Registry::REG_SZ,
262
- value: "reg sz\u0000 string",
263
- expected_value: "reg sz string"
262
+ value: "reg sz\u0000\u0000 string",
263
+ expected_value: "reg sz"
264
264
  },
265
265
  {
266
266
  name: 'REG_SZ_2',
267
267
  type: Win32::Registry::REG_SZ,
268
- value: "reg sz\x00 string",
269
- expected_value: "reg sz string"
268
+ value: "reg sz 2\x00\x00 string",
269
+ expected_value: "reg sz 2"
270
270
  },
271
271
  {
272
272
  name: 'REG_EXPAND_SZ',
273
273
  type: Win32::Registry::REG_EXPAND_SZ,
274
- value: "\0reg expand string",
275
- expected_value: " reg expand string"
274
+ value: "\0\0\0reg expand string",
275
+ expected_value: ""
276
276
  }
277
277
  ].each do |pair|
278
- it 'replaces null bytes with spaces' do
278
+ it 'reads up to the first wide null' do
279
279
  hklm.create("#{puppet_key}\\#{subkey_name}", Win32::Registry::KEY_ALL_ACCESS) do |reg|
280
280
  reg.write(value_name, pair[:type], pair[:value])
281
281
  end
@@ -125,19 +125,16 @@ describe "Puppet::Util::Windows::User", :if => Puppet::Util::Platform.windows? d
125
125
  end
126
126
 
127
127
  it 'should raise error given that logon returns false' do
128
-
129
128
  allow(Puppet::Util::Windows::User).to receive(:logon_user_by_logon_type).with(
130
- user, passwd, fLOGON32_LOGON_NETWORK, fLOGON32_PROVIDER_DEFAULT, anything).and_return (0)
129
+ user, '.', passwd, fLOGON32_LOGON_NETWORK, fLOGON32_PROVIDER_DEFAULT, anything).and_return (0)
131
130
  allow(Puppet::Util::Windows::User).to receive(:logon_user_by_logon_type).with(
132
- user, passwd, fLOGON32_LOGON_INTERACTIVE, fLOGON32_PROVIDER_DEFAULT, anything).and_return(0)
131
+ user, '.', passwd, fLOGON32_LOGON_INTERACTIVE, fLOGON32_PROVIDER_DEFAULT, anything).and_return(0)
133
132
 
134
133
  expect {Puppet::Util::Windows::User.logon_user(user, passwd) {}}
135
134
  .to raise_error(Puppet::Util::Windows::Error, /Failed to logon user/)
136
-
137
135
  end
138
136
  end
139
137
 
140
-
141
138
  describe "password_is?" do
142
139
  it "should return false given an incorrect username and password" do
143
140
  expect(Puppet::Util::Windows::User.password_is?(username, bad_password)).to be_falsey
@@ -180,5 +177,43 @@ describe "Puppet::Util::Windows::User", :if => Puppet::Util::Platform.windows? d
180
177
  expect { Puppet::Util::Windows::User.check_token_membership }.not_to raise_error
181
178
  end
182
179
  end
180
+
181
+ describe "default_system_account?" do
182
+ it "should succesfully identify 'SYSTEM' user as a default system account" do
183
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('SYSTEM').and_return(Puppet::Util::Windows::SID::LocalSystem)
184
+ expect(Puppet::Util::Windows::User.default_system_account?('SYSTEM')).to eq(true)
185
+ end
186
+
187
+ it "should succesfully identify 'NETWORK SERVICE' user as a default system account" do
188
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('NETWORK SERVICE').and_return(Puppet::Util::Windows::SID::NtNetwork)
189
+ expect(Puppet::Util::Windows::User.default_system_account?('NETWORK SERVICE')).to eq(true)
190
+ end
191
+
192
+ it "should succesfully identify 'LOCAL SERVICE' user as a default system account" do
193
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('LOCAL SERVICE').and_return(Puppet::Util::Windows::SID::NtLocal)
194
+ expect(Puppet::Util::Windows::User.default_system_account?('LOCAL SERVICE')).to eq(true)
195
+ end
196
+
197
+ it "should not identify user with unknown sid as a default system account" do
198
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('UnknownUser').and_return(Puppet::Util::Windows::SID::Null)
199
+ expect(Puppet::Util::Windows::User.default_system_account?('UnknownUser')).to eq(false)
200
+ end
201
+ end
202
+
203
+ describe "localsystem?" do
204
+ before do
205
+ allow(Puppet::Util::Windows::ADSI).to receive(:computer_name).and_return("myPC")
206
+ end
207
+
208
+ ['LocalSystem', '.\LocalSystem', 'myPC\LocalSystem', 'lOcALsysTem'].each do |input|
209
+ it "should succesfully identify #{input} as the 'LocalSystem' account" do
210
+ expect(Puppet::Util::Windows::User.localsystem?(input)).to eq(true)
211
+ end
212
+ end
213
+
214
+ it "should not identify any other user as the 'LocalSystem' account" do
215
+ expect(Puppet::Util::Windows::User.localsystem?('OtherUser')).to eq(false)
216
+ end
217
+ end
183
218
  end
184
219
  end
@@ -21,9 +21,9 @@ module Puppet
21
21
  id
22
22
  end
23
23
 
24
- def initialize
24
+ def initialize(name = 'Test CA')
25
25
  @digest = OpenSSL::Digest::SHA256.new
26
- info = create_cacert('Test CA')
26
+ info = create_cacert(name)
27
27
  @key = info[:private_key]
28
28
  @ca_cert = info[:cert]
29
29
  @ca_crl = create_crl(@ca_cert, @key)
@@ -6,11 +6,11 @@ class PuppetSpec::HTTPSServer
6
6
 
7
7
  attr_reader :ca_cert, :ca_crl, :server_cert, :server_key
8
8
 
9
- def initialize
10
- @ca_cert = cert_fixture('ca.pem')
11
- @ca_crl = crl_fixture('crl.pem')
12
- @server_key = key_fixture('127.0.0.1-key.pem')
13
- @server_cert = cert_fixture('127.0.0.1.pem')
9
+ def initialize(ca_cert: nil, ca_crl: nil, server_key: nil, server_cert: nil)
10
+ @ca_cert = ca_cert || cert_fixture('ca.pem')
11
+ @ca_crl = ca_crl || crl_fixture('crl.pem')
12
+ @server_key = server_key || key_fixture('127.0.0.1-key.pem')
13
+ @server_cert = server_cert || cert_fixture('127.0.0.1.pem')
14
14
  @config = WEBrick::Config::HTTP.dup
15
15
  end
16
16
 
@@ -18,10 +18,19 @@ class PuppetSpec::HTTPSServer
18
18
  req = WEBrick::HTTPRequest.new(@config)
19
19
  req.parse(ssl)
20
20
 
21
+ # always drain request body
22
+ req.body
23
+
21
24
  res = WEBrick::HTTPResponse.new(@config)
22
25
  res.status = 200
23
26
  res.body = 'OK'
24
- response_proc.call(res) if response_proc
27
+ # The server explicitly closes the connection after handling it,
28
+ # so explicitly tell the client we're not going to keep it open.
29
+ # Without this, ruby will add `Connection: Keep-Alive`, which
30
+ # confuses the client when it tries to reuse the half-closed
31
+ # connection.
32
+ res['Connection'] = 'close'
33
+ response_proc.call(req, res) if response_proc
25
34
 
26
35
  res.send_response(ssl)
27
36
  end
@@ -52,7 +61,7 @@ class PuppetSpec::HTTPSServer
52
61
 
53
62
  loop do
54
63
  readable, = IO.select([ssls, stop_pipe_r])
55
- break if readable.include? stop_pipe_r
64
+ break if readable.include?(stop_pipe_r)
56
65
 
57
66
  ssl = ssls.accept
58
67
  begin
@@ -0,0 +1,119 @@
1
+ require 'spec_helper'
2
+ require 'webrick'
3
+ require "webrick/ssl"
4
+
5
+ class PuppetSpec::Puppetserver
6
+ include PuppetSpec::Fixtures
7
+ include PuppetSpec::Files
8
+
9
+ attr_reader :ca_cert, :ca_crl, :server_cert, :server_key
10
+
11
+ class NodeServlet < WEBrick::HTTPServlet::AbstractServlet
12
+ def do_GET request, response
13
+ node = Puppet::Node.new(Puppet[:certname])
14
+ response.body = node.render(:json)
15
+ response['Content-Type'] = 'application/json'
16
+ end
17
+ end
18
+
19
+ class CatalogServlet < WEBrick::HTTPServlet::AbstractServlet
20
+ def do_POST request, response
21
+ response['Content-Type'] = 'application/json'
22
+ catalog = Puppet::Resource::Catalog.new(Puppet[:certname], 'production')
23
+ response.body = catalog.render(:json)
24
+ end
25
+ end
26
+
27
+ class FileMetadatasServlet < WEBrick::HTTPServlet::AbstractServlet
28
+ def do_GET request, response
29
+ response['Content-Type'] = 'application/json'
30
+ response.body = "[{\"path\":\"/etc/puppetlabs/code/environments/production/modules\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-03-06 20:14:25 UTC\"},\"type\":\"directory\",\"destination\":null}]"
31
+ end
32
+ end
33
+
34
+ class ReportServlet < WEBrick::HTTPServlet::AbstractServlet
35
+ def do_PUT request, response
36
+ response['Content-Type'] = 'application/json'
37
+ response.body = "[]"
38
+ end
39
+ end
40
+
41
+ class StaticFileContentServlet < WEBrick::HTTPServlet::AbstractServlet
42
+ def do_GET request, response
43
+ response.status = 404
44
+ end
45
+ end
46
+
47
+ class FilebucketServlet < WEBrick::HTTPServlet::AbstractServlet
48
+ def do_GET request, response
49
+ end
50
+ def do_PUT request, response
51
+ response['Content-Type'] = 'application/octet-stream'
52
+ end
53
+ def do_HEAD request, response
54
+ response.status = 404
55
+ end
56
+ end
57
+
58
+ def initialize
59
+ @ca_cert = cert_fixture('ca.pem')
60
+ @ca_crl = crl_fixture('crl.pem')
61
+ @server_key = key_fixture('127.0.0.1-key.pem')
62
+ @server_cert = cert_fixture('127.0.0.1.pem')
63
+ @path = tmpfile('webrick')
64
+
65
+ @https = WEBrick::HTTPServer.new(
66
+ BindAddress: "127.0.0.1",
67
+ Port: 0, # webrick will choose the first available port, and set it in the config
68
+ SSLEnable: true,
69
+ SSLStartImmediately: true,
70
+ SSLCACertificateFile: File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'ca.pem'),
71
+ SSLCertificate: @server_cert,
72
+ SSLPrivateKey: @server_key,
73
+ Logger: WEBrick::Log.new(@path),
74
+ AccessLog: [
75
+ [@path, WEBrick::AccessLog::COMBINED_LOG_FORMAT],
76
+ ]
77
+ )
78
+
79
+ trap('INT') do
80
+ @https.shutdown
81
+ end
82
+
83
+ # Enable this line for more detailed webrick logging
84
+ # @https.logger.level = 5 # DEBUG
85
+ end
86
+
87
+ def start_server(mounts: {}, &block)
88
+ register_mounts(mounts: mounts)
89
+
90
+ Thread.new do
91
+ @https.start
92
+ end
93
+
94
+ begin
95
+ yield @https.config[:Port]
96
+ ensure
97
+ @https.shutdown
98
+ end
99
+ end
100
+
101
+ def register_mounts(mounts: {})
102
+ register_mount('/status/v1/simple/master', proc { |req, res| }, nil)
103
+ register_mount('/puppet/v3/node', mounts[:node], NodeServlet)
104
+ register_mount('/puppet/v3/catalog', mounts[:catalog], CatalogServlet)
105
+ register_mount('/puppet/v3/file_metadatas', mounts[:file_metadatas], FileMetadatasServlet)
106
+ register_mount('/puppet/v3/static_file_content', mounts[:static_file_content], StaticFileContentServlet)
107
+ register_mount('/puppet/v3/report', mounts[:report], ReportServlet)
108
+ register_mount('/puppet/v3/file_bucket_file', mounts[:filebucket], FilebucketServlet)
109
+ end
110
+
111
+ def register_mount(path, user_proc, default_servlet)
112
+ handler = if user_proc
113
+ WEBrick::HTTPServlet::ProcHandler.new(user_proc)
114
+ else
115
+ default_servlet
116
+ end
117
+ @https.mount(path, handler)
118
+ end
119
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.shared_context('https client') do
4
+ before :all do
5
+ WebMock.disable!
6
+ end
7
+
8
+ after :all do
9
+ WebMock.enable!
10
+ end
11
+
12
+ before :each do
13
+ # make sure we don't take too long
14
+ Puppet[:http_connect_timeout] = '5s'
15
+ Puppet[:server] = '127.0.0.1'
16
+ Puppet[:certname] = '127.0.0.1'
17
+
18
+ Puppet[:localcacert] = File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'ca.pem')
19
+ Puppet[:hostcrl] = File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'crl.pem')
20
+ Puppet[:hostprivkey] = File.join(PuppetSpec::FIXTURE_DIR, 'ssl', '127.0.0.1-key.pem')
21
+ Puppet[:hostcert] = File.join(PuppetSpec::FIXTURE_DIR, 'ssl', '127.0.0.1.pem')
22
+
23
+ # set in memory facts since certname is changed above
24
+ facts = Puppet::Node::Facts.new(Puppet[:certname])
25
+ Puppet::Node::Facts.indirection.save(facts)
26
+ end
27
+
28
+ let(:https_server) { PuppetSpec::HTTPSServer.new }
29
+ end
@@ -179,37 +179,78 @@ describe Puppet::Agent do
179
179
  expect(@agent.run).to eq(:result)
180
180
  end
181
181
 
182
+ describe "and a puppet agent is already running" do
183
+ before(:each) do
184
+ allow_any_instance_of(Object).to receive(:sleep)
185
+ lockfile = double('lockfile')
186
+ expect(@agent).to receive(:lockfile).and_return(lockfile).at_least(:once)
187
+ # so the lock method raises Puppet::LockError
188
+ allow(lockfile).to receive(:lock).and_return(false)
189
+ end
190
+
191
+ it "should notify that a run is already in progres" do
192
+ client = AgentTestClient.new
193
+ expect(AgentTestClient).to receive(:new).and_return(client)
194
+ expect(Puppet).to receive(:notice).with(/Run of .* already in progress; skipping .* exists/)
195
+ @agent.run
196
+ end
197
+
198
+ it "should inform that a run is already in progres and try to run every X seconds if waitforlock is used" do
199
+ # so the locked file exists
200
+ allow(File).to receive(:file?).and_return(true)
201
+ # so we don't have to wait again for the run to exit (default maxwaitforcert is 60)
202
+ # first 0 is to get the time, second 0 is to inform user, then 1000 so the time expires
203
+ allow(Time).to receive(:now).and_return(0, 0, 1000)
204
+ allow(Puppet).to receive(:info)
205
+ client = AgentTestClient.new
206
+ expect(AgentTestClient).to receive(:new).and_return(client)
207
+
208
+ Puppet[:waitforlock] = 1
209
+ Puppet[:maxwaitforlock] = 2
210
+ expect(Puppet).to receive(:info).with(/Another puppet instance is already running; --waitforlock flag used, waiting for running instance to finish./)
211
+ expect(Puppet).to receive(:info).with(/Will try again in #{Puppet[:waitforlock]} seconds./)
212
+ @agent.run
213
+ end
214
+
215
+ it "should notify that the run is exiting if waitforlock is used and maxwaitforlock is exceeded" do
216
+ # so we don't have to wait again for the run to exit (default maxwaitforcert is 60)
217
+ # first 0 is to get the time, then 1000 so that the time expires
218
+ allow(Time).to receive(:now).and_return(0, 1000)
219
+ client = AgentTestClient.new
220
+ expect(AgentTestClient).to receive(:new).and_return(client)
221
+
222
+ Puppet[:waitforlock] = 1
223
+ expect(Puppet).to receive(:notice).with(/Exiting now because the maxwaitforlock timeout has been exceeded./)
224
+ @agent.run
225
+ end
226
+ end
227
+
182
228
  describe "when should_fork is true", :if => Puppet.features.posix? && RUBY_PLATFORM != 'java' do
183
229
  before do
184
230
  @agent = Puppet::Agent.new(AgentTestClient, true)
185
231
 
186
232
  # So we don't actually try to hit the filesystem.
187
233
  allow(@agent).to receive(:lock).and_yield
188
-
189
- allow(Kernel).to receive(:fork)
190
- allow(Process).to receive(:waitpid2).and_return([123, double('process::status', :exitstatus => 0)])
191
- allow(@agent).to receive(:exit)
192
234
  end
193
235
 
194
236
  it "should run the agent in a forked process" do
195
237
  client = AgentTestClient.new
196
238
  expect(AgentTestClient).to receive(:new).and_return(client)
197
239
 
198
- expect(client).to receive(:run)
240
+ expect(client).to receive(:run).and_return(0)
199
241
 
200
242
  expect(Kernel).to receive(:fork).and_yield
201
- @agent.run
243
+ expect { @agent.run }.to exit_with(0)
202
244
  end
203
245
 
204
246
  it "should exit child process if child exit" do
205
247
  client = AgentTestClient.new
206
248
  expect(AgentTestClient).to receive(:new).and_return(client)
207
249
 
208
- expect(client).to receive(:run).and_raise(SystemExit)
250
+ expect(client).to receive(:run).and_raise(SystemExit.new(-1))
209
251
 
210
252
  expect(Kernel).to receive(:fork).and_yield
211
- expect(@agent).to receive(:exit).with(-1)
212
- @agent.run
253
+ expect { @agent.run }.to exit_with(-1)
213
254
  end
214
255
 
215
256
  it 'should exit with 1 if an exception is raised' do
@@ -219,31 +260,44 @@ describe Puppet::Agent do
219
260
  expect(client).to receive(:run).and_raise(StandardError)
220
261
 
221
262
  expect(Kernel).to receive(:fork).and_yield
222
- expect(@agent).to receive(:exit).with(1)
223
- @agent.run
263
+ expect { @agent.run }.to exit_with(1)
224
264
  end
225
265
 
226
- it "should re-raise exit happening in the child" do
227
- allow(Process).to receive(:waitpid2).and_return([123, double('process::status', :exitstatus => -1)])
228
- expect { @agent.run }.to raise_error(SystemExit)
266
+ it 'should exit with 254 if NoMemoryError exception is raised' do
267
+ client = AgentTestClient.new
268
+ expect(AgentTestClient).to receive(:new).and_return(client)
269
+
270
+ expect(client).to receive(:run).and_raise(NoMemoryError)
271
+
272
+ expect(Kernel).to receive(:fork).and_yield
273
+ expect { @agent.run }.to exit_with(254)
229
274
  end
230
275
 
231
- it "should re-raise NoMoreMemory happening in the child" do
232
- allow(Process).to receive(:waitpid2).and_return([123, double('process::status', :exitstatus => -2)])
233
- expect { @agent.run }.to raise_error(NoMemoryError)
276
+ it "should return the block exit code as the child exit code" do
277
+ expect(Kernel).to receive(:fork).and_yield
278
+ expect {
279
+ @agent.run_in_fork {
280
+ 777
281
+ }
282
+ }.to exit_with(777)
234
283
  end
235
284
 
236
- it "should return the child exit code" do
237
- allow(Process).to receive(:waitpid2).and_return([123, double('process::status', :exitstatus => 777)])
238
- expect(@agent.run).to eq(777)
285
+ it "should return `1` exit code if the block returns `nil`" do
286
+ expect(Kernel).to receive(:fork).and_yield
287
+ expect {
288
+ @agent.run_in_fork {
289
+ nil
290
+ }
291
+ }.to exit_with(1)
239
292
  end
240
293
 
241
- it "should return the block exit code as the child exit code" do
294
+ it "should return `1` exit code if the block returns `false`" do
242
295
  expect(Kernel).to receive(:fork).and_yield
243
- expect(@agent).to receive(:exit).with(777)
244
- @agent.run_in_fork {
245
- 777
246
- }
296
+ expect {
297
+ @agent.run_in_fork {
298
+ false
299
+ }
300
+ }.to exit_with(1)
247
301
  end
248
302
  end
249
303
 
@@ -283,7 +337,7 @@ describe Puppet::Agent do
283
337
  expect(client).not_to receive(:handling)
284
338
  expect(Puppet).to receive(:log_exception).with(be_an_instance_of(Puppet::Agent::RunTimeoutError), anything)
285
339
 
286
- expect(@agent.run).to eq(1)
340
+ expect(@agent.run).to eq(nil)
287
341
  end
288
342
  end
289
343
  end