puppet 6.11.1 → 6.16.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 (395) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +3 -8
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +39 -36
  6. data/README.md +17 -24
  7. data/ext/build_defaults.yaml +1 -0
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/windows/service/daemon.rb +25 -20
  10. data/lib/puppet.rb +52 -13
  11. data/lib/puppet/agent.rb +20 -14
  12. data/lib/puppet/application/agent.rb +12 -14
  13. data/lib/puppet/application/describe.rb +7 -5
  14. data/lib/puppet/application/device.rb +2 -2
  15. data/lib/puppet/application/filebucket.rb +19 -15
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/resource.rb +1 -1
  18. data/lib/puppet/application/ssl.rb +4 -4
  19. data/lib/puppet/concurrent.rb +2 -0
  20. data/lib/puppet/concurrent/lock.rb +16 -0
  21. data/lib/puppet/concurrent/synchronized.rb +15 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
  23. data/lib/puppet/configurer.rb +85 -83
  24. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  25. data/lib/puppet/context/trusted_information.rb +14 -8
  26. data/lib/puppet/daemon.rb +13 -27
  27. data/lib/puppet/defaults.rb +158 -40
  28. data/lib/puppet/environments.rb +30 -20
  29. data/lib/puppet/error.rb +9 -1
  30. data/lib/puppet/face/facts.rb +8 -5
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/plugin.rb +2 -2
  34. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  35. data/lib/puppet/file_system/file_impl.rb +13 -9
  36. data/lib/puppet/file_system/memory_file.rb +6 -0
  37. data/lib/puppet/file_system/memory_impl.rb +13 -0
  38. data/lib/puppet/file_system/uniquefile.rb +4 -0
  39. data/lib/puppet/file_system/windows.rb +7 -10
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/forge/errors.rb +2 -2
  42. data/lib/puppet/forge/repository.rb +31 -86
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/camelcase.rb +2 -2
  45. data/lib/puppet/functions/epp.rb +4 -4
  46. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/find_file.rb +9 -9
  49. data/lib/puppet/functions/find_template.rb +63 -0
  50. data/lib/puppet/functions/inline_epp.rb +5 -5
  51. data/lib/puppet/functions/reduce.rb +2 -4
  52. data/lib/puppet/http.rb +7 -0
  53. data/lib/puppet/http/client.rb +341 -54
  54. data/lib/puppet/http/errors.rb +2 -0
  55. data/lib/puppet/http/external_client.rb +90 -0
  56. data/lib/puppet/http/redirector.rb +34 -0
  57. data/lib/puppet/http/resolver.rb +57 -1
  58. data/lib/puppet/http/resolver/server_list.rb +98 -0
  59. data/lib/puppet/http/resolver/settings.rb +23 -2
  60. data/lib/puppet/http/resolver/srv.rb +36 -4
  61. data/lib/puppet/http/response.rb +68 -1
  62. data/lib/puppet/http/retry_after_handler.rb +39 -0
  63. data/lib/puppet/http/service.rb +179 -3
  64. data/lib/puppet/http/service/ca.rb +84 -21
  65. data/lib/puppet/http/service/compiler.rb +319 -0
  66. data/lib/puppet/http/service/file_server.rb +206 -0
  67. data/lib/puppet/http/service/report.rb +66 -0
  68. data/lib/puppet/http/session.rb +106 -31
  69. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  70. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  71. data/lib/puppet/indirector/facts/rest.rb +42 -0
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  73. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  74. data/lib/puppet/indirector/file_content/http.rb +5 -0
  75. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  76. data/lib/puppet/indirector/file_metadata/http.rb +4 -4
  77. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  78. data/lib/puppet/indirector/json.rb +1 -1
  79. data/lib/puppet/indirector/msgpack.rb +1 -1
  80. data/lib/puppet/indirector/node/rest.rb +24 -0
  81. data/lib/puppet/indirector/report/rest.rb +19 -0
  82. data/lib/puppet/indirector/report/yaml.rb +23 -0
  83. data/lib/puppet/indirector/rest.rb +12 -0
  84. data/lib/puppet/indirector/status/rest.rb +18 -0
  85. data/lib/puppet/loaders.rb +6 -0
  86. data/lib/puppet/metatype/manager.rb +80 -80
  87. data/lib/puppet/network/http/base_pool.rb +19 -1
  88. data/lib/puppet/network/http/compression.rb +7 -0
  89. data/lib/puppet/network/http/connection.rb +6 -0
  90. data/lib/puppet/network/http/connection_adapter.rb +182 -0
  91. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  92. data/lib/puppet/network/http/pool.rb +13 -6
  93. data/lib/puppet/network/http_pool.rb +2 -1
  94. data/lib/puppet/node/environment.rb +24 -8
  95. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  96. data/lib/puppet/pal/pal_impl.rb +9 -29
  97. data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
  98. data/lib/puppet/parser/compiler.rb +42 -32
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/epp.rb +3 -3
  101. data/lib/puppet/parser/functions/filter.rb +1 -0
  102. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  105. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  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/lookup/invocation.rb +10 -3
  109. data/lib/puppet/pops/model/pn_transformer.rb +5 -9
  110. data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
  111. data/lib/puppet/pops/serialization/json_path.rb +3 -3
  112. data/lib/puppet/pops/time/timespan.rb +3 -5
  113. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  114. data/lib/puppet/pops/types/string_converter.rb +6 -9
  115. data/lib/puppet/pops/types/type_calculator.rb +30 -10
  116. data/lib/puppet/pops/types/type_formatter.rb +9 -11
  117. data/lib/puppet/pops/types/type_parser.rb +3 -3
  118. data/lib/puppet/pops/validation/checker4_0.rb +1 -1
  119. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  120. data/lib/puppet/provider/aix_object.rb +4 -2
  121. data/lib/puppet/provider/group/aix.rb +1 -0
  122. data/lib/puppet/provider/group/groupadd.rb +57 -24
  123. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +78 -4
  126. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  127. data/lib/puppet/provider/package/dpkg.rb +14 -7
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +41 -7
  130. data/lib/puppet/provider/package/openbsd.rb +13 -1
  131. data/lib/puppet/provider/package/pacman.rb +2 -5
  132. data/lib/puppet/provider/package/pip.rb +143 -48
  133. data/lib/puppet/provider/package/pip3.rb +0 -2
  134. data/lib/puppet/provider/package/pkg.rb +18 -5
  135. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  136. data/lib/puppet/provider/package/pkgng.rb +16 -4
  137. data/lib/puppet/provider/package/portage.rb +5 -5
  138. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  139. data/lib/puppet/provider/package/rpm.rb +6 -213
  140. data/lib/puppet/provider/package/yum.rb +108 -24
  141. data/lib/puppet/provider/package/zypper.rb +59 -1
  142. data/lib/puppet/provider/package_targetable.rb +5 -4
  143. data/lib/puppet/provider/service/systemd.rb +23 -5
  144. data/lib/puppet/provider/user/aix.rb +1 -0
  145. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  146. data/lib/puppet/provider/user/hpux.rb +1 -1
  147. data/lib/puppet/provider/user/useradd.rb +11 -8
  148. data/lib/puppet/reports/http.rb +13 -9
  149. data/lib/puppet/reports/store.rb +1 -1
  150. data/lib/puppet/resource/type_collection.rb +20 -16
  151. data/lib/puppet/runtime.rb +32 -1
  152. data/lib/puppet/settings.rb +4 -0
  153. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  154. data/lib/puppet/ssl.rb +1 -0
  155. data/lib/puppet/ssl/certificate.rb +2 -1
  156. data/lib/puppet/ssl/host.rb +4 -4
  157. data/lib/puppet/ssl/oids.rb +1 -0
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -0
  159. data/lib/puppet/ssl/state_machine.rb +81 -35
  160. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  161. data/lib/puppet/test/test_helper.rb +7 -1
  162. data/lib/puppet/transaction.rb +33 -11
  163. data/lib/puppet/transaction/report.rb +2 -2
  164. data/lib/puppet/transaction/resource_harness.rb +1 -1
  165. data/lib/puppet/type.rb +7 -2
  166. data/lib/puppet/type/file.rb +13 -0
  167. data/lib/puppet/type/file/data_sync.rb +5 -1
  168. data/lib/puppet/type/file/source.rb +49 -58
  169. data/lib/puppet/type/group.rb +5 -4
  170. data/lib/puppet/type/package.rb +102 -10
  171. data/lib/puppet/type/service.rb +6 -8
  172. data/lib/puppet/type/user.rb +6 -30
  173. data/lib/puppet/util.rb +34 -11
  174. data/lib/puppet/util/at_fork.rb +1 -1
  175. data/lib/puppet/util/autoload.rb +4 -18
  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/logging.rb +30 -18
  179. data/lib/puppet/util/package/version/debian.rb +175 -0
  180. data/lib/puppet/util/package/version/gem.rb +15 -0
  181. data/lib/puppet/util/package/version/pip.rb +167 -0
  182. data/lib/puppet/util/package/version/range.rb +53 -0
  183. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  185. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  187. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  188. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  189. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  190. data/lib/puppet/util/package/version/rpm.rb +73 -0
  191. data/lib/puppet/util/pidlock.rb +36 -10
  192. data/lib/puppet/util/platform.rb +5 -0
  193. data/lib/puppet/util/plist.rb +6 -0
  194. data/lib/puppet/util/rpm_compare.rb +193 -0
  195. data/lib/puppet/util/storage.rb +0 -1
  196. data/lib/puppet/util/windows/adsi.rb +50 -20
  197. data/lib/puppet/util/windows/process.rb +15 -14
  198. data/lib/puppet/util/windows/security.rb +1 -0
  199. data/lib/puppet/util/windows/sid.rb +3 -3
  200. data/lib/puppet/util/yaml.rb +1 -1
  201. data/lib/puppet/version.rb +1 -1
  202. data/lib/puppet/x509/cert_provider.rb +9 -5
  203. data/locales/puppet.pot +640 -521
  204. data/man/man5/puppet.conf.5 +88 -9
  205. data/man/man8/puppet-agent.8 +6 -6
  206. data/man/man8/puppet-apply.8 +1 -1
  207. data/man/man8/puppet-catalog.8 +1 -1
  208. data/man/man8/puppet-config.8 +1 -1
  209. data/man/man8/puppet-describe.8 +1 -1
  210. data/man/man8/puppet-device.8 +2 -2
  211. data/man/man8/puppet-doc.8 +1 -1
  212. data/man/man8/puppet-epp.8 +1 -1
  213. data/man/man8/puppet-facts.8 +1 -1
  214. data/man/man8/puppet-filebucket.8 +17 -2
  215. data/man/man8/puppet-generate.8 +1 -1
  216. data/man/man8/puppet-help.8 +6 -3
  217. data/man/man8/puppet-key.8 +1 -1
  218. data/man/man8/puppet-lookup.8 +1 -1
  219. data/man/man8/puppet-man.8 +1 -1
  220. data/man/man8/puppet-module.8 +4 -1
  221. data/man/man8/puppet-node.8 +1 -1
  222. data/man/man8/puppet-parser.8 +1 -1
  223. data/man/man8/puppet-plugin.8 +1 -1
  224. data/man/man8/puppet-report.8 +1 -1
  225. data/man/man8/puppet-resource.8 +1 -1
  226. data/man/man8/puppet-script.8 +1 -1
  227. data/man/man8/puppet-ssl.8 +2 -2
  228. data/man/man8/puppet-status.8 +1 -1
  229. data/man/man8/puppet.8 +2 -2
  230. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  231. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  232. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  233. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  234. data/spec/fixtures/unit/forge/bacula.json +76 -0
  235. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  236. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  238. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  239. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  240. 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
  241. 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
  242. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  243. 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
  244. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  245. 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
  246. 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
  247. data/spec/integration/application/agent_spec.rb +394 -0
  248. data/spec/integration/application/apply_spec.rb +132 -3
  249. data/spec/integration/application/filebucket_spec.rb +190 -0
  250. data/spec/integration/application/plugin_spec.rb +73 -0
  251. data/spec/integration/configurer_spec.rb +26 -7
  252. data/spec/integration/http/client_spec.rb +154 -0
  253. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  254. data/spec/integration/indirector/report/yaml.rb +83 -0
  255. data/spec/integration/module_tool/forge_spec.rb +51 -0
  256. data/spec/integration/network/http_pool_spec.rb +76 -20
  257. data/spec/integration/node/environment_spec.rb +15 -0
  258. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  259. data/spec/lib/puppet/test_ca.rb +2 -2
  260. data/spec/lib/puppet_spec/https.rb +20 -9
  261. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  262. data/spec/shared_contexts/https.rb +29 -0
  263. data/spec/spec_helper.rb +6 -2
  264. data/spec/unit/agent_spec.rb +80 -26
  265. data/spec/unit/application/agent_spec.rb +9 -5
  266. data/spec/unit/application/apply_spec.rb +2 -12
  267. data/spec/unit/application/describe_spec.rb +88 -50
  268. data/spec/unit/application/device_spec.rb +2 -2
  269. data/spec/unit/application/filebucket_spec.rb +22 -2
  270. data/spec/unit/application/resource_spec.rb +2 -2
  271. data/spec/unit/concurrent/lock_spec.rb +29 -0
  272. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  273. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  274. data/spec/unit/configurer_spec.rb +400 -406
  275. data/spec/unit/context/trusted_information_spec.rb +17 -0
  276. data/spec/unit/daemon_spec.rb +5 -64
  277. data/spec/unit/defaults_spec.rb +38 -4
  278. data/spec/unit/environments_spec.rb +65 -28
  279. data/spec/unit/face/facts_spec.rb +24 -20
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/plugin_spec.rb +12 -10
  282. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  283. data/spec/unit/file_system_spec.rb +26 -2
  284. data/spec/unit/forge/errors_spec.rb +1 -1
  285. data/spec/unit/forge/forge_spec.rb +12 -54
  286. data/spec/unit/forge/module_release_spec.rb +19 -6
  287. data/spec/unit/forge/repository_spec.rb +63 -157
  288. data/spec/unit/forge_spec.rb +46 -116
  289. data/spec/unit/functions/find_template_spec.rb +69 -0
  290. data/spec/unit/functions/lookup_spec.rb +13 -0
  291. data/spec/unit/http/client_spec.rb +395 -27
  292. data/spec/unit/http/external_client_spec.rb +201 -0
  293. data/spec/unit/http/resolver_spec.rb +81 -12
  294. data/spec/unit/http/response_spec.rb +69 -0
  295. data/spec/unit/http/service/ca_spec.rb +100 -7
  296. data/spec/unit/http/service/compiler_spec.rb +627 -0
  297. data/spec/unit/http/service/file_server_spec.rb +308 -0
  298. data/spec/unit/http/service/report_spec.rb +118 -0
  299. data/spec/unit/http/service_spec.rb +117 -4
  300. data/spec/unit/http/session_spec.rb +237 -19
  301. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  302. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  303. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  304. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  305. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  306. data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
  307. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  308. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  309. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  310. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  311. data/spec/unit/indirector/rest_spec.rb +13 -0
  312. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  313. data/spec/unit/network/http/connection_spec.rb +549 -176
  314. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  315. data/spec/unit/network/http/pool_spec.rb +89 -11
  316. data/spec/unit/network/http_pool_spec.rb +63 -57
  317. data/spec/unit/network/http_spec.rb +1 -1
  318. data/spec/unit/node/environment_spec.rb +16 -0
  319. data/spec/unit/node/facts_spec.rb +2 -1
  320. data/spec/unit/node_spec.rb +7 -4
  321. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  322. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  323. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  324. data/spec/unit/provider/aix_object_spec.rb +16 -2
  325. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  326. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  327. data/spec/unit/provider/package/aix_spec.rb +29 -0
  328. data/spec/unit/provider/package/apt_spec.rb +43 -2
  329. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  330. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  331. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  332. data/spec/unit/provider/package/gem_spec.rb +40 -0
  333. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  334. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  335. data/spec/unit/provider/package/pip_spec.rb +68 -19
  336. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  337. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  338. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  339. data/spec/unit/provider/package/portage_spec.rb +9 -4
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  341. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  342. data/spec/unit/provider/package/yum_spec.rb +292 -0
  343. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  344. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  345. data/spec/unit/provider/service/init_spec.rb +1 -0
  346. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  347. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  348. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  349. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  350. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  351. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  352. data/spec/unit/provider/user/useradd_spec.rb +21 -8
  353. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  354. data/spec/unit/puppet_pal_2pec.rb +0 -26
  355. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  356. data/spec/unit/puppet_spec.rb +47 -0
  357. data/spec/unit/reports/http_spec.rb +70 -52
  358. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  359. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  360. data/spec/unit/ssl/certificate_spec.rb +7 -0
  361. data/spec/unit/ssl/host_spec.rb +4 -2
  362. data/spec/unit/ssl/oids_spec.rb +1 -0
  363. data/spec/unit/ssl/ssl_provider_spec.rb +71 -0
  364. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  365. data/spec/unit/transaction/persistence_spec.rb +1 -10
  366. data/spec/unit/transaction/report_spec.rb +4 -0
  367. data/spec/unit/transaction_spec.rb +45 -1
  368. data/spec/unit/type/file/content_spec.rb +9 -3
  369. data/spec/unit/type/file/ensure_spec.rb +1 -2
  370. data/spec/unit/type/file/source_spec.rb +86 -35
  371. data/spec/unit/type/package_spec.rb +8 -0
  372. data/spec/unit/type/service_spec.rb +9 -8
  373. data/spec/unit/type/user_spec.rb +1 -2
  374. data/spec/unit/util/at_fork_spec.rb +3 -2
  375. data/spec/unit/util/autoload_spec.rb +2 -1
  376. data/spec/unit/util/log/destinations_spec.rb +1 -29
  377. data/spec/unit/util/log_spec.rb +0 -138
  378. data/spec/unit/util/logging_spec.rb +200 -0
  379. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  380. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  381. data/spec/unit/util/package/version/range_spec.rb +175 -0
  382. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  383. data/spec/unit/util/pidlock_spec.rb +112 -42
  384. data/spec/unit/util/plist_spec.rb +20 -0
  385. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  386. data/spec/unit/util/storage_spec.rb +1 -8
  387. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  388. data/spec/unit/util/windows/sid_spec.rb +2 -2
  389. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  390. data/tasks/generate_cert_fixtures.rake +15 -1
  391. data/tasks/manpages.rake +6 -35
  392. metadata +92 -12
  393. data/COMMITTERS.md +0 -244
  394. data/spec/integration/faces/plugin_spec.rb +0 -61
  395. data/spec/lib/puppet_spec/validators.rb +0 -37
@@ -1,102 +1,5 @@
1
1
  ---
2
2
  http_interactions:
3
- - request:
4
- method: head
5
- uri: http://my-server/file
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- Accept:
11
- - ! '*/*'
12
- User-Agent:
13
- - Ruby
14
- response:
15
- status:
16
- code: 301
17
- message: ! 'Moved Permanently '
18
- headers:
19
- Location:
20
- - http://my-server/file/
21
- Server:
22
- - WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
23
- Date:
24
- - Sun, 22 Mar 2015 22:57:44 GMT
25
- Content-Length:
26
- - '44'
27
- Connection:
28
- - Keep-Alive
29
- body:
30
- encoding: US-ASCII
31
- string: ''
32
- http_version:
33
- recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
34
- - request:
35
- method: head
36
- uri: http://my-server/file/
37
- body:
38
- encoding: US-ASCII
39
- string: ''
40
- headers:
41
- Accept:
42
- - ! '*/*'
43
- User-Agent:
44
- - Ruby
45
- response:
46
- status:
47
- code: 200
48
- message: ! 'OK '
49
- headers:
50
- Etag:
51
- - 62e0b-184a-550f415e
52
- Content-Type:
53
- - text/html
54
- Content-Length:
55
- - '6218'
56
- Server:
57
- - WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
58
- Date:
59
- - Sun, 22 Mar 2015 22:57:44 GMT
60
- Connection:
61
- - Keep-Alive
62
- body:
63
- encoding: US-ASCII
64
- string: ''
65
- http_version:
66
- recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
67
- - request:
68
- method: head
69
- uri: http://my-server/file/
70
- body:
71
- encoding: US-ASCII
72
- string: ''
73
- headers:
74
- Accept:
75
- - ! '*/*'
76
- User-Agent:
77
- - Ruby
78
- response:
79
- status:
80
- code: 200
81
- message: ! 'OK '
82
- headers:
83
- Etag:
84
- - 62e0b-184a-550f415e
85
- Content-Type:
86
- - text/html
87
- Content-Length:
88
- - '6218'
89
- Server:
90
- - WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
91
- Date:
92
- - Sun, 22 Mar 2015 22:57:44 GMT
93
- Connection:
94
- - Keep-Alive
95
- body:
96
- encoding: US-ASCII
97
- string: ''
98
- http_version:
99
- recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
100
3
  - request:
101
4
  method: head
102
5
  uri: http://my-server/file
@@ -163,7 +66,7 @@ http_interactions:
163
66
  recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
164
67
  - request:
165
68
  method: get
166
- uri: http://my-server/file/
69
+ uri: http://my-server/file
167
70
  body:
168
71
  encoding: US-ASCII
169
72
  string: ''
@@ -1,106 +1,5 @@
1
1
  ---
2
2
  http_interactions:
3
- - request:
4
- method: head
5
- uri: http://my-server/file
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- Accept:
11
- - ! '*/*'
12
- User-Agent:
13
- - Ruby
14
- response:
15
- status:
16
- code: 301
17
- message: ! 'Moved Permanently '
18
- headers:
19
- Location:
20
- - http://my-server/file/
21
- Server:
22
- - WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
23
- Date:
24
- - Sun, 22 Mar 2015 22:57:44 GMT
25
- Content-Length:
26
- - '44'
27
- Connection:
28
- - Keep-Alive
29
- body:
30
- encoding: US-ASCII
31
- string: ''
32
- http_version:
33
- recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
34
- - request:
35
- method: head
36
- uri: http://my-server/file/
37
- body:
38
- encoding: US-ASCII
39
- string: ''
40
- headers:
41
- Accept:
42
- - ! '*/*'
43
- User-Agent:
44
- - Ruby
45
- response:
46
- status:
47
- code: 200
48
- message: ! 'OK '
49
- headers:
50
- Etag:
51
- - 62e0b-184a-550f415e
52
- Content-Type:
53
- - text/html
54
- Content-Length:
55
- - '6218'
56
- Last-Modified:
57
- - Sun, 22 Mar 2015 22:25:34 GMT
58
- Server:
59
- - WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
60
- Date:
61
- - Sun, 22 Mar 2015 22:57:44 GMT
62
- Connection:
63
- - Keep-Alive
64
- body:
65
- encoding: US-ASCII
66
- string: ''
67
- http_version:
68
- recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
69
- - request:
70
- method: head
71
- uri: http://my-server/file/
72
- body:
73
- encoding: US-ASCII
74
- string: ''
75
- headers:
76
- Accept:
77
- - ! '*/*'
78
- User-Agent:
79
- - Ruby
80
- response:
81
- status:
82
- code: 200
83
- message: ! 'OK '
84
- headers:
85
- Etag:
86
- - 62e0b-184a-550f415e
87
- Content-Type:
88
- - text/html
89
- Content-Length:
90
- - '6218'
91
- Last-Modified:
92
- - Sun, 22 Mar 2015 22:25:34 GMT
93
- Server:
94
- - WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
95
- Date:
96
- - Sun, 22 Mar 2015 22:57:44 GMT
97
- Connection:
98
- - Keep-Alive
99
- body:
100
- encoding: US-ASCII
101
- string: ''
102
- http_version:
103
- recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
104
3
  - request:
105
4
  method: head
106
5
  uri: http://my-server/file
@@ -169,7 +68,7 @@ http_interactions:
169
68
  recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
170
69
  - request:
171
70
  method: get
172
- uri: http://my-server/file/
71
+ uri: http://my-server/file
173
72
  body:
174
73
  encoding: US-ASCII
175
74
  string: ''
@@ -1,106 +1,5 @@
1
1
  ---
2
2
  http_interactions:
3
- - request:
4
- method: head
5
- uri: http://my-server/file
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- Accept:
11
- - ! '*/*'
12
- User-Agent:
13
- - Ruby
14
- response:
15
- status:
16
- code: 301
17
- message: ! 'Moved Permanently '
18
- headers:
19
- Location:
20
- - http://my-server/file/
21
- Server:
22
- - WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
23
- Date:
24
- - Sun, 22 Mar 2015 22:57:44 GMT
25
- Content-Length:
26
- - '44'
27
- Connection:
28
- - Keep-Alive
29
- body:
30
- encoding: US-ASCII
31
- string: ''
32
- http_version:
33
- recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
34
- - request:
35
- method: head
36
- uri: http://my-server/file/
37
- body:
38
- encoding: US-ASCII
39
- string: ''
40
- headers:
41
- Accept:
42
- - ! '*/*'
43
- User-Agent:
44
- - Ruby
45
- response:
46
- status:
47
- code: 200
48
- message: ! 'OK '
49
- headers:
50
- Etag:
51
- - 62e0b-184a-550f415e
52
- Content-Type:
53
- - text/html
54
- Content-Length:
55
- - '6218'
56
- Last-Modified:
57
- - Sun, 22 Mar 2015 22:25:34 GMT
58
- Server:
59
- - WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
60
- Date:
61
- - Sun, 22 Mar 2015 22:57:44 GMT
62
- Connection:
63
- - Keep-Alive
64
- body:
65
- encoding: US-ASCII
66
- string: ''
67
- http_version:
68
- recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
69
- - request:
70
- method: head
71
- uri: http://my-server/file/
72
- body:
73
- encoding: US-ASCII
74
- string: ''
75
- headers:
76
- Accept:
77
- - ! '*/*'
78
- User-Agent:
79
- - Ruby
80
- response:
81
- status:
82
- code: 200
83
- message: ! 'OK '
84
- headers:
85
- Etag:
86
- - 62e0b-184a-550f415e
87
- Content-Type:
88
- - text/html
89
- Content-Length:
90
- - '6218'
91
- Last-Modified:
92
- - Sun, 22 Mar 2015 22:25:34 GMT
93
- Server:
94
- - WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
95
- Date:
96
- - Sun, 22 Mar 2015 22:57:44 GMT
97
- Connection:
98
- - Keep-Alive
99
- body:
100
- encoding: US-ASCII
101
- string: ''
102
- http_version:
103
- recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
104
3
  - request:
105
4
  method: head
106
5
  uri: http://my-server/file
@@ -169,7 +68,7 @@ http_interactions:
169
68
  recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
170
69
  - request:
171
70
  method: get
172
- uri: http://my-server/file/
71
+ uri: http://my-server/file
173
72
  body:
174
73
  encoding: US-ASCII
175
74
  string: ''
@@ -0,0 +1,394 @@
1
+ require 'spec_helper'
2
+ require 'puppet_spec/files'
3
+ require 'puppet_spec/puppetserver'
4
+ require 'puppet_spec/compiler'
5
+ require 'puppet_spec/https'
6
+
7
+ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
8
+ include PuppetSpec::Files
9
+ include PuppetSpec::Compiler
10
+ include_context "https client"
11
+
12
+ let(:server) { PuppetSpec::Puppetserver.new }
13
+ let(:agent) { Puppet::Application[:agent] }
14
+ let(:node) { Puppet::Node.new(Puppet[:certname], environment: 'production')}
15
+ let(:formatter) { Puppet::Network::FormatHandler.format(:rich_data_json) }
16
+
17
+ context 'server_list' do
18
+ before :each do
19
+ Puppet[:log_level] = 'debug'
20
+ end
21
+
22
+ it "uses the first server in the list" do
23
+ Puppet[:server_list] = '127.0.0.1'
24
+
25
+ server.start_server do |port|
26
+ Puppet[:masterport] = port
27
+ expect {
28
+ expect {
29
+ agent.command_line.args << '--test'
30
+ agent.run
31
+ }.to exit_with(0)
32
+ }.to output(%r{HTTP GET https://127.0.0.1:#{port}/status/v1/simple/master returned 200 OK}).to_stdout
33
+ end
34
+ end
35
+
36
+ it "falls back, recording the first viable server in the report" do
37
+ Puppet[:server_list] = "puppet.example.com,#{Puppet[:server]}"
38
+
39
+ server.start_server do |port|
40
+ Puppet[:masterport] = port
41
+ expect {
42
+ expect {
43
+ agent.command_line.args << '--test'
44
+ agent.run
45
+ }.to exit_with(0)
46
+ }.to output(%r{Unable to connect to server from server_list setting: Request to https://puppet.example.com:#{port}/status/v1/simple/master failed}).to_stdout
47
+
48
+ report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
49
+ expect(report.master_used).to eq("127.0.0.1:#{port}")
50
+ end
51
+ end
52
+
53
+ it "doesn't write a report if no servers could be contacted" do
54
+ Puppet[:server_list] = "puppet.example.com"
55
+
56
+ expect {
57
+ expect {
58
+ expect {
59
+ agent.command_line.args << '--test'
60
+ agent.run
61
+ }.to exit_with(1)
62
+ }.to output(%r{Unable to connect to server from server_list setting: Could not select a functional puppet master from server_list: 'puppet.example.com'}).to_stdout
63
+ }.to output(/Error: Could not run Puppet configuration client: Could not select a functional puppet master from server_list: 'puppet.example.com'/).to_stderr
64
+
65
+ # I'd expect puppet to update the last run report even if the server_list was
66
+ # exhausted, but it doesn't work that way currently, see PUP-6708
67
+ expect(File).to_not be_exist(Puppet[:lastrunreport])
68
+ end
69
+
70
+ it "omits master_used when not using server_list" do
71
+ server.start_server do |port|
72
+ Puppet[:masterport] = port
73
+ expect {
74
+ expect {
75
+ agent.command_line.args << '--test'
76
+ agent.run
77
+ }.to exit_with(0)
78
+ }.to output(%r{Resolved service 'puppet' to https://127.0.0.1:#{port}/puppet/v3}).to_stdout
79
+ end
80
+
81
+ report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
82
+ expect(report.master_used).to be_nil
83
+ end
84
+ end
85
+
86
+ context 'rich data' do
87
+ it "applies deferred values" do
88
+ catalog_handler = -> (req, res) {
89
+ catalog = compile_to_catalog(<<-MANIFEST, node)
90
+ notify { 'deferred':
91
+ message => Deferred('join', [[1,2,3], ':'])
92
+ }
93
+ MANIFEST
94
+
95
+ res.body = formatter.render(catalog)
96
+ res['Content-Type'] = formatter.mime
97
+ }
98
+
99
+ server.start_server(mounts: {catalog: catalog_handler}) do |port|
100
+ Puppet[:masterport] = port
101
+ expect {
102
+ expect {
103
+ agent.command_line.args << '--test'
104
+ agent.run
105
+ }.to exit_with(2)
106
+ }.to output(%r{Notice: /Stage\[main\]/Main/Notify\[deferred\]/message: defined 'message' as '1:2:3'}).to_stdout
107
+ end
108
+ end
109
+
110
+ it "redacts sensitive values" do
111
+ catalog_handler = -> (req, res) {
112
+ catalog = compile_to_catalog(<<-MANIFEST, node)
113
+ notify { 'sensitive':
114
+ message => Sensitive('supersecret')
115
+ }
116
+ MANIFEST
117
+
118
+ res.body = formatter.render(catalog)
119
+ res['Content-Type'] = formatter.mime
120
+ }
121
+
122
+ server.start_server(mounts: {catalog: catalog_handler}) do |port|
123
+ Puppet[:masterport] = port
124
+ expect {
125
+ expect {
126
+ agent.command_line.args << '--test'
127
+ agent.run
128
+ }.to exit_with(2)
129
+ }.to output(a_string_matching(
130
+ /Notice: Sensitive \[value redacted\]/
131
+ ).and matching(
132
+ /Notify\[sensitive\]\/message: changed \[redacted\] to \[redacted\]/
133
+ )).to_stdout
134
+ end
135
+ end
136
+ end
137
+
138
+ context 'static catalogs' do
139
+ let(:path) { tmpfile('file') }
140
+ let(:metadata) { Puppet::FileServing::Metadata.new(path) }
141
+ let(:source) { "puppet:///modules/foo/foo.txt" }
142
+
143
+ before :each do
144
+ Puppet::FileSystem.touch(path)
145
+
146
+ metadata.collect
147
+ metadata.source = source
148
+ metadata.content_uri = "puppet:///modules/foo/files/foo.txt"
149
+ end
150
+
151
+ it 'uses inline file metadata to determine the file is insync' do
152
+ catalog_handler = -> (req, res) {
153
+ catalog = compile_to_catalog(<<-MANIFEST, node)
154
+ file { "#{path}":
155
+ ensure => file,
156
+ source => "#{source}"
157
+ }
158
+ MANIFEST
159
+ catalog.metadata = { path => metadata }
160
+
161
+ res.body = formatter.render(catalog)
162
+ res['Content-Type'] = formatter.mime
163
+ }
164
+
165
+ server.start_server(mounts: {catalog: catalog_handler}) do |port|
166
+ Puppet[:masterport] = port
167
+ expect {
168
+ expect {
169
+ agent.command_line.args << '--test'
170
+ agent.run
171
+ }.to exit_with(0)
172
+ }.to_not output(/content changed/).to_stdout
173
+ end
174
+ end
175
+
176
+ it 'retrieves file content using the content_uri from the inlined file metadata' do
177
+ # create file with binary content
178
+ binary_content = "\xC0\xFF".force_encoding('binary')
179
+ File.binwrite(path, binary_content)
180
+
181
+ # recollect metadata
182
+ metadata.collect
183
+
184
+ # overwrite local file so it is no longer in sync
185
+ File.binwrite(path, "")
186
+
187
+ catalog_handler = -> (req, res) {
188
+ catalog = compile_to_catalog(<<-MANIFEST, node)
189
+ file { "#{path}":
190
+ ensure => file,
191
+ source => "#{source}",
192
+ }
193
+ MANIFEST
194
+ catalog.metadata = { path => metadata }
195
+
196
+ res.body = formatter.render(catalog)
197
+ res['Content-Type'] = formatter.mime
198
+ }
199
+
200
+ static_file_content_handler = -> (req, res) {
201
+ res.body = binary_content
202
+ res['Content-Type'] = 'application/octet-stream'
203
+ }
204
+
205
+ mounts = {
206
+ catalog: catalog_handler,
207
+ static_file_content: static_file_content_handler
208
+ }
209
+
210
+ server.start_server(mounts: mounts) do |port|
211
+ Puppet[:masterport] = port
212
+ expect {
213
+ expect {
214
+ agent.command_line.args << '--test'
215
+ agent.run
216
+ }.to exit_with(2)
217
+ }.to output(/content changed '{md5}d41d8cd98f00b204e9800998ecf8427e' to '{md5}4cf49285ae567157ebfba72bd04ccf32'/).to_stdout
218
+
219
+ # verify puppet restored binary content
220
+ expect(File.binread(path)).to eq(binary_content)
221
+ end
222
+ end
223
+ end
224
+
225
+ context 'https file sources' do
226
+ let(:path) { tmpfile('https_file_source') }
227
+ let(:response_body) { "from https server" }
228
+ let(:digest) { Digest::SHA1.hexdigest(response_body) }
229
+
230
+ it 'rejects HTTPS servers whose root cert is not in the system CA store' do
231
+ unknown_ca_cert = cert_fixture('unknown-ca.pem')
232
+ https = PuppetSpec::HTTPSServer.new(
233
+ ca_cert: unknown_ca_cert,
234
+ server_cert: cert_fixture('unknown-127.0.0.1.pem'),
235
+ server_key: key_fixture('unknown-127.0.0.1-key.pem')
236
+ )
237
+
238
+ # create a temp cacert bundle
239
+ ssl_file = tmpfile('systemstore')
240
+ # add CA cert that is neither the puppet CA nor unknown CA
241
+ File.write(ssl_file, cert_fixture('netlock-arany-utf8.pem').to_pem)
242
+
243
+ https.start_server do |https_port|
244
+ catalog_handler = -> (req, res) {
245
+ catalog = compile_to_catalog(<<-MANIFEST, node)
246
+ file { "#{path}":
247
+ ensure => file,
248
+ backup => false,
249
+ checksum => sha1,
250
+ checksum_value => '#{digest}',
251
+ source => "https://127.0.0.1:#{https_port}/path/to/file"
252
+ }
253
+ MANIFEST
254
+
255
+ res.body = formatter.render(catalog)
256
+ res['Content-Type'] = formatter.mime
257
+ }
258
+
259
+ server.start_server(mounts: {catalog: catalog_handler}) do |puppetserver_port|
260
+ Puppet[:masterport] = puppetserver_port
261
+
262
+ # override path to system cacert bundle, this must be done before
263
+ # the SSLContext is created and the call to X509::Store.set_default_paths
264
+ Puppet::Util.withenv("SSL_CERT_FILE" => ssl_file) do
265
+ expect {
266
+ agent.command_line.args << '--test'
267
+ agent.run
268
+ }.to exit_with(4)
269
+ .and output(/Notice: Applied catalog/).to_stdout
270
+ .and output(%r{Error: Could not retrieve file metadata for https://127.0.0.1:#{https_port}/path/to/file: certificate verify failed}).to_stderr
271
+ end
272
+
273
+ expect(File).to_not be_exist(path)
274
+ end
275
+ end
276
+ end
277
+
278
+ it 'accepts HTTPS servers whose cert is in the system CA store' do
279
+ unknown_ca_cert = cert_fixture('unknown-ca.pem')
280
+ https = PuppetSpec::HTTPSServer.new(
281
+ ca_cert: unknown_ca_cert,
282
+ server_cert: cert_fixture('unknown-127.0.0.1.pem'),
283
+ server_key: key_fixture('unknown-127.0.0.1-key.pem')
284
+ )
285
+
286
+ # create a temp cacert bundle
287
+ ssl_file = tmpfile('systemstore')
288
+ File.write(ssl_file, unknown_ca_cert.to_pem)
289
+
290
+ response_proc = -> (req, res) {
291
+ res.status = 200
292
+ res.body = response_body
293
+ }
294
+
295
+ https.start_server(response_proc: response_proc) do |https_port|
296
+ catalog_handler = -> (req, res) {
297
+ catalog = compile_to_catalog(<<-MANIFEST, node)
298
+ file { "#{path}":
299
+ ensure => file,
300
+ backup => false,
301
+ checksum => sha1,
302
+ checksum_value => '#{digest}',
303
+ source => "https://127.0.0.1:#{https_port}/path/to/file"
304
+ }
305
+ MANIFEST
306
+
307
+ res.body = formatter.render(catalog)
308
+ res['Content-Type'] = formatter.mime
309
+ }
310
+
311
+ server.start_server(mounts: {catalog: catalog_handler}) do |puppetserver_port|
312
+ Puppet[:masterport] = puppetserver_port
313
+
314
+ # override path to system cacert bundle, this must be done before
315
+ # the SSLContext is created and the call to X509::Store.set_default_paths
316
+ Puppet::Util.withenv("SSL_CERT_FILE" => ssl_file) do
317
+ expect {
318
+ agent.command_line.args << '--test'
319
+ agent.run
320
+ }.to exit_with(2)
321
+ .and output(%r{https_file_source.*/ensure: created}).to_stdout
322
+ end
323
+
324
+ expect(File.binread(path)).to eq("from https server")
325
+ end
326
+ end
327
+ end
328
+ end
329
+
330
+ context 'multiple agents running' do
331
+ it "exits if an agent is already running" do
332
+ path = Puppet[:agent_catalog_run_lockfile]
333
+
334
+ th = Thread.new {
335
+ %x{ruby -e "$0 = 'puppet'; File.write('#{path}', Process.pid); sleep(2)"}
336
+ }
337
+
338
+ until File.exists?(path) && File.size(path) > 0 do
339
+ sleep 0.1
340
+ end
341
+
342
+ expect {
343
+ agent.command_line.args << '--test'
344
+ agent.run
345
+ }.to exit_with(1).and output(/Run of Puppet configuration client already in progress; skipping/).to_stdout
346
+
347
+ th.kill # kill thread so we don't wait too much
348
+ end
349
+
350
+ it "waits for other agent run to finish before starting" do
351
+ server.start_server do |port|
352
+ path = Puppet[:agent_catalog_run_lockfile]
353
+ Puppet[:masterport] = port
354
+ Puppet[:waitforlock] = 1
355
+
356
+ th = Thread.new {
357
+ %x{ruby -e "$0 = 'puppet'; File.write('#{path}', Process.pid); sleep(2)"}
358
+ }
359
+
360
+ until File.exists?(path) && File.size(path) > 0 do
361
+ sleep 0.1
362
+ end
363
+
364
+ expect {
365
+ agent.command_line.args << '--test'
366
+ agent.run
367
+ }.to exit_with(0).and output(/Info: Will try again in #{Puppet[:waitforlock]} seconds./).to_stdout
368
+
369
+ th.kill # kill thread so we don't wait too much
370
+ end
371
+ end
372
+
373
+ it "exits if maxwaitforlock is exceeded" do
374
+ path = Puppet[:agent_catalog_run_lockfile]
375
+ Puppet[:waitforlock] = 1
376
+ Puppet[:maxwaitforlock] = 0
377
+
378
+ th = Thread.new {
379
+ %x{ruby -e "$0 = 'puppet'; File.write('#{path}', Process.pid); sleep(2)"}
380
+ }
381
+
382
+ until File.exists?(path) && File.size(path) > 0 do
383
+ sleep 0.1
384
+ end
385
+
386
+ expect {
387
+ agent.command_line.args << '--test'
388
+ agent.run
389
+ }.to exit_with(1).and output(/Exiting now because the maxwaitforlock timeout has been exceeded./).to_stdout
390
+
391
+ th.kill # kill thread so we don't wait too much
392
+ end
393
+ end
394
+ end