puppet 6.13.0-universal-darwin → 6.18.0-universal-darwin

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (461) 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 +36 -32
  6. data/README.md +17 -24
  7. data/ext/windows/service/daemon.rb +3 -3
  8. data/lib/puppet.rb +33 -9
  9. data/lib/puppet/agent.rb +20 -14
  10. data/lib/puppet/application/agent.rb +26 -17
  11. data/lib/puppet/application/apply.rb +18 -20
  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/lookup.rb +16 -4
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +58 -57
  19. data/lib/puppet/configurer/downloader.rb +31 -10
  20. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  21. data/lib/puppet/confine.rb +2 -2
  22. data/lib/puppet/confine/any.rb +1 -1
  23. data/lib/puppet/context/trusted_information.rb +14 -8
  24. data/lib/puppet/daemon.rb +13 -27
  25. data/lib/puppet/defaults.rb +92 -12
  26. data/lib/puppet/environments.rb +4 -5
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/plugin.rb +2 -2
  31. data/lib/puppet/feature/base.rb +1 -1
  32. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  33. data/lib/puppet/file_serving/metadata.rb +4 -1
  34. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  35. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  36. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  37. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  38. data/lib/puppet/file_system/file_impl.rb +17 -13
  39. data/lib/puppet/file_system/uniquefile.rb +12 -16
  40. data/lib/puppet/forge.rb +1 -1
  41. data/lib/puppet/forge/cache.rb +1 -1
  42. data/lib/puppet/forge/repository.rb +4 -7
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  45. data/lib/puppet/functions/filter.rb +1 -0
  46. data/lib/puppet/functions/lstrip.rb +4 -4
  47. data/lib/puppet/functions/reduce.rb +2 -4
  48. data/lib/puppet/functions/reverse_each.rb +1 -1
  49. data/lib/puppet/functions/rstrip.rb +4 -4
  50. data/lib/puppet/functions/step.rb +1 -1
  51. data/lib/puppet/functions/strip.rb +4 -4
  52. data/lib/puppet/gettext/config.rb +5 -5
  53. data/lib/puppet/gettext/module_translations.rb +4 -4
  54. data/lib/puppet/http.rb +3 -0
  55. data/lib/puppet/http/client.rb +263 -73
  56. data/lib/puppet/http/external_client.rb +90 -0
  57. data/lib/puppet/http/redirector.rb +43 -7
  58. data/lib/puppet/http/resolver.rb +46 -3
  59. data/lib/puppet/http/resolver/server_list.rb +76 -16
  60. data/lib/puppet/http/resolver/settings.rb +23 -3
  61. data/lib/puppet/http/resolver/srv.rb +29 -3
  62. data/lib/puppet/http/response.rb +87 -1
  63. data/lib/puppet/http/retry_after_handler.rb +39 -0
  64. data/lib/puppet/http/service.rb +97 -12
  65. data/lib/puppet/http/service/ca.rb +76 -14
  66. data/lib/puppet/http/service/compiler.rb +249 -16
  67. data/lib/puppet/http/service/file_server.rb +141 -20
  68. data/lib/puppet/http/service/report.rb +47 -17
  69. data/lib/puppet/http/session.rb +96 -7
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/rest.rb +42 -0
  75. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  76. data/lib/puppet/indirector/file_content/http.rb +5 -0
  77. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  78. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  79. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  80. data/lib/puppet/indirector/hiera.rb +4 -0
  81. data/lib/puppet/indirector/indirection.rb +1 -1
  82. data/lib/puppet/indirector/node/rest.rb +24 -0
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/report/rest.rb +19 -0
  85. data/lib/puppet/indirector/report/yaml.rb +23 -0
  86. data/lib/puppet/indirector/request.rb +1 -1
  87. data/lib/puppet/indirector/rest.rb +12 -0
  88. data/lib/puppet/indirector/status/rest.rb +18 -0
  89. data/lib/puppet/loaders.rb +6 -0
  90. data/lib/puppet/metatype/manager.rb +80 -80
  91. data/lib/puppet/module.rb +1 -2
  92. data/lib/puppet/network/format_support.rb +2 -2
  93. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  94. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  95. data/lib/puppet/network/http/base_pool.rb +7 -2
  96. data/lib/puppet/network/http/compression.rb +7 -0
  97. data/lib/puppet/network/http/connection.rb +2 -0
  98. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  99. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  100. data/lib/puppet/network/http/pool.rb +8 -5
  101. data/lib/puppet/network/http/route.rb +2 -2
  102. data/lib/puppet/network/http_pool.rb +2 -1
  103. data/lib/puppet/node/environment.rb +22 -5
  104. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  105. data/lib/puppet/pal/pal_impl.rb +30 -31
  106. data/lib/puppet/parameter.rb +1 -1
  107. data/lib/puppet/parser/ast/leaf.rb +5 -5
  108. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  109. data/lib/puppet/parser/compiler.rb +43 -33
  110. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  111. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  112. data/lib/puppet/parser/environment_compiler.rb +4 -1
  113. data/lib/puppet/parser/functions.rb +18 -9
  114. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  115. data/lib/puppet/parser/functions/filter.rb +1 -0
  116. data/lib/puppet/parser/resource.rb +3 -2
  117. data/lib/puppet/parser/resource/param.rb +6 -0
  118. data/lib/puppet/parser/type_loader.rb +2 -2
  119. data/lib/puppet/pops/adaptable.rb +7 -13
  120. data/lib/puppet/pops/adapters.rb +8 -4
  121. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  122. data/lib/puppet/pops/issues.rb +5 -0
  123. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  124. data/lib/puppet/pops/loaders.rb +24 -15
  125. data/lib/puppet/pops/lookup/context.rb +1 -1
  126. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  128. data/lib/puppet/pops/types/iterable.rb +34 -8
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/group/groupadd.rb +9 -4
  133. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  134. data/lib/puppet/provider/package/aix.rb +17 -2
  135. data/lib/puppet/provider/package/apt.rb +98 -1
  136. data/lib/puppet/provider/package/aptitude.rb +1 -1
  137. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  138. data/lib/puppet/provider/package/gem.rb +45 -9
  139. data/lib/puppet/provider/package/pacman.rb +2 -5
  140. data/lib/puppet/provider/package/pip.rb +143 -48
  141. data/lib/puppet/provider/package/pip3.rb +0 -2
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +16 -4
  144. data/lib/puppet/provider/package/portage.rb +2 -2
  145. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  146. data/lib/puppet/provider/package/rpm.rb +6 -213
  147. data/lib/puppet/provider/package/yum.rb +100 -20
  148. data/lib/puppet/provider/package/zypper.rb +62 -1
  149. data/lib/puppet/provider/service/systemd.rb +22 -4
  150. data/lib/puppet/provider/service/windows.rb +23 -7
  151. data/lib/puppet/provider/user/aix.rb +1 -1
  152. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  153. data/lib/puppet/provider/user/useradd.rb +16 -5
  154. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  155. data/lib/puppet/reports/http.rb +15 -9
  156. data/lib/puppet/resource.rb +2 -1
  157. data/lib/puppet/resource/type.rb +8 -0
  158. data/lib/puppet/resource/type_collection.rb +20 -16
  159. data/lib/puppet/runtime.rb +31 -1
  160. data/lib/puppet/settings.rb +3 -1
  161. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  162. data/lib/puppet/ssl.rb +1 -0
  163. data/lib/puppet/ssl/host.rb +4 -4
  164. data/lib/puppet/ssl/oids.rb +1 -0
  165. data/lib/puppet/ssl/ssl_context.rb +2 -2
  166. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  167. data/lib/puppet/ssl/state_machine.rb +81 -35
  168. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  169. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  170. data/lib/puppet/test/test_helper.rb +21 -14
  171. data/lib/puppet/transaction.rb +2 -2
  172. data/lib/puppet/transaction/persistence.rb +1 -1
  173. data/lib/puppet/transaction/report.rb +3 -3
  174. data/lib/puppet/trusted_external.rb +29 -1
  175. data/lib/puppet/type.rb +21 -8
  176. data/lib/puppet/type/file.rb +51 -13
  177. data/lib/puppet/type/file/checksum.rb +4 -4
  178. data/lib/puppet/type/file/source.rb +75 -64
  179. data/lib/puppet/type/notify.rb +2 -2
  180. data/lib/puppet/type/package.rb +41 -3
  181. data/lib/puppet/type/service.rb +59 -8
  182. data/lib/puppet/type/user.rb +19 -29
  183. data/lib/puppet/util.rb +41 -3
  184. data/lib/puppet/util/at_fork.rb +1 -1
  185. data/lib/puppet/util/autoload.rb +13 -25
  186. data/lib/puppet/util/character_encoding.rb +9 -5
  187. data/lib/puppet/util/checksums.rb +19 -4
  188. data/lib/puppet/util/execution.rb +2 -2
  189. data/lib/puppet/util/fileparsing.rb +2 -2
  190. data/lib/puppet/util/instance_loader.rb +14 -10
  191. data/lib/puppet/util/log/destinations.rb +1 -10
  192. data/lib/puppet/util/package/version/debian.rb +175 -0
  193. data/lib/puppet/util/package/version/gem.rb +15 -0
  194. data/lib/puppet/util/package/version/pip.rb +167 -0
  195. data/lib/puppet/util/package/version/range.rb +53 -0
  196. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  197. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  198. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  199. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  200. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  201. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  202. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  203. data/lib/puppet/util/package/version/rpm.rb +73 -0
  204. data/lib/puppet/util/pidlock.rb +13 -7
  205. data/lib/puppet/util/platform.rb +5 -0
  206. data/lib/puppet/util/provider_features.rb +1 -1
  207. data/lib/puppet/util/reference.rb +1 -1
  208. data/lib/puppet/util/rpm_compare.rb +193 -0
  209. data/lib/puppet/util/windows.rb +1 -0
  210. data/lib/puppet/util/windows/adsi.rb +2 -2
  211. data/lib/puppet/util/windows/api_types.rb +60 -33
  212. data/lib/puppet/util/windows/eventlog.rb +1 -6
  213. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  214. data/lib/puppet/util/windows/principal.rb +8 -6
  215. data/lib/puppet/util/windows/process.rb +15 -14
  216. data/lib/puppet/util/windows/registry.rb +11 -11
  217. data/lib/puppet/util/windows/security.rb +5 -4
  218. data/lib/puppet/util/windows/service.rb +43 -26
  219. data/lib/puppet/util/windows/sid.rb +3 -3
  220. data/lib/puppet/util/windows/user.rb +242 -8
  221. data/lib/puppet/version.rb +1 -1
  222. data/locales/puppet.pot +641 -511
  223. data/man/man5/puppet.conf.5 +75 -10
  224. data/man/man8/puppet-agent.8 +7 -7
  225. data/man/man8/puppet-apply.8 +1 -1
  226. data/man/man8/puppet-catalog.8 +1 -1
  227. data/man/man8/puppet-config.8 +1 -1
  228. data/man/man8/puppet-describe.8 +1 -1
  229. data/man/man8/puppet-device.8 +2 -2
  230. data/man/man8/puppet-doc.8 +1 -1
  231. data/man/man8/puppet-epp.8 +1 -1
  232. data/man/man8/puppet-facts.8 +1 -1
  233. data/man/man8/puppet-filebucket.8 +17 -2
  234. data/man/man8/puppet-generate.8 +1 -1
  235. data/man/man8/puppet-help.8 +6 -3
  236. data/man/man8/puppet-key.8 +1 -1
  237. data/man/man8/puppet-lookup.8 +2 -2
  238. data/man/man8/puppet-man.8 +1 -1
  239. data/man/man8/puppet-module.8 +4 -1
  240. data/man/man8/puppet-node.8 +1 -1
  241. data/man/man8/puppet-parser.8 +1 -1
  242. data/man/man8/puppet-plugin.8 +1 -1
  243. data/man/man8/puppet-report.8 +1 -1
  244. data/man/man8/puppet-resource.8 +1 -1
  245. data/man/man8/puppet-script.8 +1 -1
  246. data/man/man8/puppet-ssl.8 +2 -2
  247. data/man/man8/puppet-status.8 +1 -1
  248. data/man/man8/puppet.8 +2 -2
  249. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  250. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  251. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  252. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  253. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  254. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  255. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  256. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  257. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  258. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  259. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  260. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  261. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  262. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -67
  263. 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 -69
  264. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -69
  265. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -67
  266. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -65
  267. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -67
  268. 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 -67
  269. data/spec/integration/application/agent_spec.rb +475 -0
  270. data/spec/integration/application/apply_spec.rb +279 -150
  271. data/spec/integration/application/config_spec.rb +74 -0
  272. data/spec/integration/application/doc_spec.rb +16 -6
  273. data/spec/integration/application/filebucket_spec.rb +239 -0
  274. data/spec/integration/application/help_spec.rb +42 -0
  275. data/spec/integration/application/lookup_spec.rb +13 -0
  276. data/spec/integration/application/module_spec.rb +68 -0
  277. data/spec/integration/application/plugin_spec.rb +123 -0
  278. data/spec/integration/data_binding_spec.rb +82 -0
  279. data/spec/integration/defaults_spec.rb +1 -2
  280. data/spec/integration/directory_environments_spec.rb +17 -17
  281. data/spec/integration/http/client_spec.rb +47 -37
  282. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  283. data/spec/integration/indirector/report/yaml.rb +83 -0
  284. data/spec/integration/network/http_pool_spec.rb +93 -20
  285. data/spec/integration/node/environment_spec.rb +15 -0
  286. data/spec/integration/parser/compiler_spec.rb +11 -0
  287. data/spec/integration/type/file_spec.rb +1 -1
  288. data/spec/integration/util/execution_spec.rb +22 -0
  289. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  290. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  291. data/spec/integration/util/windows/process_spec.rb +26 -32
  292. data/spec/integration/util/windows/registry_spec.rb +7 -7
  293. data/spec/integration/util/windows/user_spec.rb +47 -5
  294. data/spec/integration/util_spec.rb +7 -33
  295. data/spec/lib/puppet/test_ca.rb +2 -2
  296. data/spec/lib/puppet_spec/https.rb +16 -7
  297. data/spec/lib/puppet_spec/matchers.rb +0 -80
  298. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  299. data/spec/shared_contexts/https.rb +29 -0
  300. data/spec/unit/agent_spec.rb +80 -26
  301. data/spec/unit/application/agent_spec.rb +12 -9
  302. data/spec/unit/application/describe_spec.rb +88 -50
  303. data/spec/unit/application/device_spec.rb +2 -2
  304. data/spec/unit/application/face_base_spec.rb +6 -4
  305. data/spec/unit/application/facts_spec.rb +39 -10
  306. data/spec/unit/application/filebucket_spec.rb +22 -2
  307. data/spec/unit/application/man_spec.rb +52 -0
  308. data/spec/unit/application/resource_spec.rb +3 -1
  309. data/spec/unit/application/ssl_spec.rb +15 -2
  310. data/spec/unit/configurer/downloader_spec.rb +10 -0
  311. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  312. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  313. data/spec/unit/configurer_spec.rb +64 -46
  314. data/spec/unit/confine_spec.rb +2 -1
  315. data/spec/unit/context/trusted_information_spec.rb +25 -2
  316. data/spec/unit/daemon_spec.rb +5 -64
  317. data/spec/unit/defaults_spec.rb +24 -1
  318. data/spec/unit/environments_spec.rb +8 -0
  319. data/spec/unit/face/config_spec.rb +3 -1
  320. data/spec/unit/face/module/search_spec.rb +17 -0
  321. data/spec/unit/face/plugin_spec.rb +12 -10
  322. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  323. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  324. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  325. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  326. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  327. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  328. data/spec/unit/file_system_spec.rb +10 -0
  329. data/spec/unit/functions/lookup_spec.rb +13 -0
  330. data/spec/unit/http/client_spec.rb +321 -36
  331. data/spec/unit/http/external_client_spec.rb +201 -0
  332. data/spec/unit/http/resolver_spec.rb +34 -3
  333. data/spec/unit/http/response_spec.rb +75 -0
  334. data/spec/unit/http/service/ca_spec.rb +53 -12
  335. data/spec/unit/http/service/compiler_spec.rb +332 -28
  336. data/spec/unit/http/service/file_server_spec.rb +100 -12
  337. data/spec/unit/http/service/report_spec.rb +19 -9
  338. data/spec/unit/http/service_spec.rb +94 -6
  339. data/spec/unit/http/session_spec.rb +159 -8
  340. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  341. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  342. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  343. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  344. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  345. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  346. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  347. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  348. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  349. data/spec/unit/indirector/request_spec.rb +1 -1
  350. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  351. data/spec/unit/indirector/rest_spec.rb +13 -0
  352. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  353. data/spec/unit/interface_spec.rb +3 -3
  354. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  355. data/spec/unit/network/format_support_spec.rb +3 -2
  356. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  357. data/spec/unit/network/http/connection_spec.rb +552 -190
  358. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  359. data/spec/unit/network/http/pool_spec.rb +59 -13
  360. data/spec/unit/network/http_pool_spec.rb +63 -57
  361. data/spec/unit/network/http_spec.rb +1 -1
  362. data/spec/unit/node/environment_spec.rb +33 -0
  363. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  364. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  365. data/spec/unit/parser/scope_spec.rb +1 -1
  366. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  367. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  368. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  369. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  370. data/spec/unit/provider/group/groupadd_spec.rb +22 -8
  371. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  372. data/spec/unit/provider/package/aix_spec.rb +29 -0
  373. data/spec/unit/provider/package/apt_spec.rb +107 -0
  374. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  375. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  376. data/spec/unit/provider/package/gem_spec.rb +40 -0
  377. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  378. data/spec/unit/provider/package/pip_spec.rb +68 -19
  379. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  380. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  381. data/spec/unit/provider/package/portage_spec.rb +5 -0
  382. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  383. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  384. data/spec/unit/provider/package/yum_spec.rb +243 -1
  385. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  386. data/spec/unit/provider/service/init_spec.rb +42 -0
  387. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  388. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  389. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  390. data/spec/unit/provider/service/systemd_spec.rb +93 -18
  391. data/spec/unit/provider/service/windows_spec.rb +50 -14
  392. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  393. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  394. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  395. data/spec/unit/puppet_pal_2pec.rb +11 -0
  396. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  397. data/spec/unit/puppet_spec.rb +33 -0
  398. data/spec/unit/reports/http_spec.rb +70 -52
  399. data/spec/unit/reports/store_spec.rb +17 -13
  400. data/spec/unit/resource_spec.rb +3 -3
  401. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  402. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  403. data/spec/unit/ssl/host_spec.rb +4 -2
  404. data/spec/unit/ssl/oids_spec.rb +1 -0
  405. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  406. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  407. data/spec/unit/test/test_helper_spec.rb +17 -0
  408. data/spec/unit/transaction/persistence_spec.rb +15 -0
  409. data/spec/unit/transaction/report_spec.rb +5 -1
  410. data/spec/unit/transaction_spec.rb +0 -2
  411. data/spec/unit/type/file/ensure_spec.rb +1 -2
  412. data/spec/unit/type/file/source_spec.rb +89 -38
  413. data/spec/unit/type/file_spec.rb +122 -96
  414. data/spec/unit/type/service_spec.rb +218 -8
  415. data/spec/unit/type/user_spec.rb +32 -3
  416. data/spec/unit/type_spec.rb +50 -0
  417. data/spec/unit/util/at_fork_spec.rb +3 -2
  418. data/spec/unit/util/autoload_spec.rb +2 -1
  419. data/spec/unit/util/character_encoding_spec.rb +4 -4
  420. data/spec/unit/util/checksums_spec.rb +16 -0
  421. data/spec/unit/util/command_line_spec.rb +11 -6
  422. data/spec/unit/util/log/destinations_spec.rb +1 -29
  423. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  424. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  425. data/spec/unit/util/package/version/range_spec.rb +175 -0
  426. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  427. data/spec/unit/util/pidlock_spec.rb +102 -54
  428. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  429. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  430. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  431. data/spec/unit/util/windows/service_spec.rb +4 -4
  432. data/spec/unit/util/windows/sid_spec.rb +2 -2
  433. data/spec/unit/util_spec.rb +3 -3
  434. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  435. data/tasks/generate_cert_fixtures.rake +15 -1
  436. data/tasks/manpages.rake +5 -35
  437. metadata +84 -52
  438. data/COMMITTERS.md +0 -244
  439. data/spec/integration/faces/config_spec.rb +0 -91
  440. data/spec/integration/faces/documentation_spec.rb +0 -57
  441. data/spec/integration/faces/plugin_spec.rb +0 -61
  442. data/spec/integration/file_bucket/file_spec.rb +0 -50
  443. data/spec/integration/file_serving/content_spec.rb +0 -7
  444. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  445. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  446. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  447. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  448. data/spec/integration/module_tool/forge_spec.rb +0 -64
  449. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  450. data/spec/integration/provider/service/init_spec.rb +0 -48
  451. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  452. data/spec/integration/provider/service/windows_spec.rb +0 -50
  453. data/spec/integration/reference/providers_spec.rb +0 -21
  454. data/spec/integration/reports_spec.rb +0 -13
  455. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  456. data/spec/integration/ssl/host_spec.rb +0 -72
  457. data/spec/integration/ssl/key_spec.rb +0 -99
  458. data/spec/integration/test/test_helper_spec.rb +0 -31
  459. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  460. data/spec/unit/face/man_spec.rb +0 -25
  461. data/spec/unit/man_spec.rb +0 -31
@@ -66,75 +66,9 @@ http_interactions:
66
66
  string: ''
67
67
  http_version:
68
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
- - request:
105
- method: head
106
- uri: http://my-server/file
107
- body:
108
- encoding: US-ASCII
109
- string: ''
110
- headers:
111
- Accept:
112
- - ! '*/*'
113
- User-Agent:
114
- - Ruby
115
- response:
116
- status:
117
- code: 301
118
- message: ! 'Moved Permanently '
119
- headers:
120
- Location:
121
- - http://my-server/file/
122
- Server:
123
- - WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
124
- Date:
125
- - Sun, 22 Mar 2015 22:57:44 GMT
126
- Content-Length:
127
- - '44'
128
- Connection:
129
- - Keep-Alive
130
- body:
131
- encoding: US-ASCII
132
- string: ''
133
- http_version:
134
- recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
135
69
  - request:
136
70
  method: get
137
- uri: http://my-server/file/
71
+ uri: http://my-server/file
138
72
  body:
139
73
  encoding: US-ASCII
140
74
  string: ''
@@ -66,75 +66,9 @@ http_interactions:
66
66
  string: ''
67
67
  http_version:
68
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
- - request:
105
- method: head
106
- uri: http://my-server/file
107
- body:
108
- encoding: US-ASCII
109
- string: ''
110
- headers:
111
- Accept:
112
- - ! '*/*'
113
- User-Agent:
114
- - Ruby
115
- response:
116
- status:
117
- code: 301
118
- message: ! 'Moved Permanently '
119
- headers:
120
- Location:
121
- - http://my-server/file/
122
- Server:
123
- - WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
124
- Date:
125
- - Sun, 22 Mar 2015 22:57:44 GMT
126
- Content-Length:
127
- - '44'
128
- Connection:
129
- - Keep-Alive
130
- body:
131
- encoding: US-ASCII
132
- string: ''
133
- http_version:
134
- recorded_at: Sun, 22 Mar 2015 22:57:44 GMT
135
69
  - request:
136
70
  method: get
137
- uri: http://my-server/file/
71
+ uri: http://my-server/file
138
72
  body:
139
73
  encoding: US-ASCII
140
74
  string: ''
@@ -0,0 +1,475 @@
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
+ agent.command_line.args << '--test'
29
+ agent.run
30
+ }.to exit_with(0)
31
+ .and output(%r{HTTP GET https://127.0.0.1:#{port}/status/v1/simple/master returned 200 OK}).to_stdout
32
+ end
33
+ end
34
+
35
+ it "falls back, recording the first viable server in the report" do
36
+ Puppet[:server_list] = "puppet.example.com,#{Puppet[:server]}"
37
+
38
+ server.start_server do |port|
39
+ Puppet[:masterport] = port
40
+ expect {
41
+ agent.command_line.args << '--test'
42
+ agent.run
43
+ }.to exit_with(0)
44
+ .and 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
45
+
46
+ report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
47
+ expect(report.master_used).to eq("127.0.0.1:#{port}")
48
+ end
49
+ end
50
+
51
+ it "doesn't write a report if no servers could be contacted" do
52
+ Puppet[:server_list] = "puppet.example.com"
53
+
54
+ expect {
55
+ agent.command_line.args << '--test'
56
+ agent.run
57
+ }.to exit_with(1)
58
+ .and 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
59
+ .and output(/Error: Could not run Puppet configuration client: Could not select a functional puppet master from server_list: 'puppet.example.com'/).to_stderr
60
+
61
+ # I'd expect puppet to update the last run report even if the server_list was
62
+ # exhausted, but it doesn't work that way currently, see PUP-6708
63
+ expect(File).to_not be_exist(Puppet[:lastrunreport])
64
+ end
65
+
66
+ it "omits master_used when not using server_list" do
67
+ server.start_server do |port|
68
+ Puppet[:masterport] = port
69
+ expect {
70
+ agent.command_line.args << '--test'
71
+ agent.run
72
+ }.to exit_with(0)
73
+ .and output(%r{Resolved service 'puppet' to https://127.0.0.1:#{port}/puppet/v3}).to_stdout
74
+ end
75
+
76
+ report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
77
+ expect(report.master_used).to be_nil
78
+ end
79
+
80
+ it "server_list takes precedence over server" do
81
+ Puppet[:server] = 'notvalid.example.com'
82
+
83
+ server.start_server do |port|
84
+ Puppet[:server_list] = "127.0.0.1:#{port}"
85
+
86
+ expect {
87
+ agent.command_line.args << '--test'
88
+ agent.run
89
+ }.to exit_with(0)
90
+ .and output(%r{Debug: Resolved service 'puppet' to https://127.0.0.1:#{port}/puppet/v3}).to_stdout
91
+
92
+ report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
93
+ expect(report.master_used).to eq("127.0.0.1:#{port}")
94
+ end
95
+ end
96
+ end
97
+
98
+ context 'rich data' do
99
+ it "applies deferred values" do
100
+ catalog_handler = -> (req, res) {
101
+ catalog = compile_to_catalog(<<-MANIFEST, node)
102
+ notify { 'deferred':
103
+ message => Deferred('join', [[1,2,3], ':'])
104
+ }
105
+ MANIFEST
106
+
107
+ res.body = formatter.render(catalog)
108
+ res['Content-Type'] = formatter.mime
109
+ }
110
+
111
+ server.start_server(mounts: {catalog: catalog_handler}) do |port|
112
+ Puppet[:masterport] = port
113
+ expect {
114
+ agent.command_line.args << '--test'
115
+ agent.run
116
+ }.to exit_with(2)
117
+ .and output(%r{Notice: /Stage\[main\]/Main/Notify\[deferred\]/message: defined 'message' as '1:2:3'}).to_stdout
118
+ end
119
+ end
120
+
121
+ it "redacts sensitive values" do
122
+ catalog_handler = -> (req, res) {
123
+ catalog = compile_to_catalog(<<-MANIFEST, node)
124
+ notify { 'sensitive':
125
+ message => Sensitive('supersecret')
126
+ }
127
+ MANIFEST
128
+
129
+ res.body = formatter.render(catalog)
130
+ res['Content-Type'] = formatter.mime
131
+ }
132
+
133
+ server.start_server(mounts: {catalog: catalog_handler}) do |port|
134
+ Puppet[:masterport] = port
135
+ expect {
136
+ agent.command_line.args << '--test'
137
+ agent.run
138
+ }.to exit_with(2)
139
+ .and output(a_string_matching(
140
+ /Notice: Sensitive \[value redacted\]/
141
+ ).and matching(
142
+ /Notify\[sensitive\]\/message: changed \[redacted\] to \[redacted\]/
143
+ )).to_stdout
144
+ end
145
+ end
146
+
147
+ it "applies binary data in a cached catalog" do
148
+ catalog = compile_to_catalog(<<-MANIFEST, node)
149
+ notify { 'some title':
150
+ message => Binary.new('aGk=')
151
+ }
152
+ MANIFEST
153
+
154
+ catalog_dir = File.join(Puppet[:client_datadir], 'catalog')
155
+ Puppet::FileSystem.mkpath(catalog_dir)
156
+ cached_catalog = "#{File.join(catalog_dir, Puppet[:certname])}.json"
157
+ File.write(cached_catalog, catalog.render(:rich_data_json))
158
+
159
+ expect {
160
+ Puppet[:report] = false
161
+ Puppet[:use_cached_catalog] = true
162
+ Puppet[:usecacheonfailure] = false
163
+ agent.command_line.args << '-t'
164
+ agent.run
165
+ }.to exit_with(2)
166
+ .and output(%r{defined 'message' as 'hi'}).to_stdout
167
+ end
168
+ end
169
+
170
+ context 'static catalogs' do
171
+ let(:path) { tmpfile('file') }
172
+ let(:metadata) { Puppet::FileServing::Metadata.new(path) }
173
+ let(:source) { "puppet:///modules/foo/foo.txt" }
174
+
175
+ before :each do
176
+ Puppet::FileSystem.touch(path)
177
+
178
+ metadata.collect
179
+ metadata.source = source
180
+ metadata.content_uri = "puppet:///modules/foo/files/foo.txt"
181
+ end
182
+
183
+ it 'uses inline file metadata to determine the file is insync' do
184
+ catalog_handler = -> (req, res) {
185
+ catalog = compile_to_catalog(<<-MANIFEST, node)
186
+ file { "#{path}":
187
+ ensure => file,
188
+ source => "#{source}"
189
+ }
190
+ MANIFEST
191
+ catalog.metadata = { path => metadata }
192
+
193
+ res.body = formatter.render(catalog)
194
+ res['Content-Type'] = formatter.mime
195
+ }
196
+
197
+ server.start_server(mounts: {catalog: catalog_handler}) do |port|
198
+ Puppet[:masterport] = port
199
+ expect {
200
+ expect {
201
+ agent.command_line.args << '--test'
202
+ agent.run
203
+ }.to exit_with(0)
204
+ }.to_not output(/content changed/).to_stdout
205
+ end
206
+ end
207
+
208
+ it 'retrieves file content using the content_uri from the inlined file metadata' do
209
+ # create file with binary content
210
+ binary_content = "\xC0\xFF".force_encoding('binary')
211
+ File.binwrite(path, binary_content)
212
+
213
+ # recollect metadata
214
+ metadata.collect
215
+
216
+ # overwrite local file so it is no longer in sync
217
+ File.binwrite(path, "")
218
+
219
+ catalog_handler = -> (req, res) {
220
+ catalog = compile_to_catalog(<<-MANIFEST, node)
221
+ file { "#{path}":
222
+ ensure => file,
223
+ source => "#{source}",
224
+ }
225
+ MANIFEST
226
+ catalog.metadata = { path => metadata }
227
+
228
+ res.body = formatter.render(catalog)
229
+ res['Content-Type'] = formatter.mime
230
+ }
231
+
232
+ static_file_content_handler = -> (req, res) {
233
+ res.body = binary_content
234
+ res['Content-Type'] = 'application/octet-stream'
235
+ }
236
+
237
+ mounts = {
238
+ catalog: catalog_handler,
239
+ static_file_content: static_file_content_handler
240
+ }
241
+
242
+ server.start_server(mounts: mounts) do |port|
243
+ Puppet[:masterport] = port
244
+ expect {
245
+ agent.command_line.args << '--test'
246
+ agent.run
247
+ }.to exit_with(2)
248
+ .and output(/content changed '{md5}d41d8cd98f00b204e9800998ecf8427e' to '{md5}4cf49285ae567157ebfba72bd04ccf32'/).to_stdout
249
+
250
+ # verify puppet restored binary content
251
+ expect(File.binread(path)).to eq(binary_content)
252
+ end
253
+ end
254
+ end
255
+
256
+ context 'https file sources' do
257
+ let(:path) { tmpfile('https_file_source') }
258
+ let(:response_body) { "from https server" }
259
+ let(:digest) { Digest::SHA1.hexdigest(response_body) }
260
+
261
+ it 'rejects HTTPS servers whose root cert is not in the system CA store' do
262
+ unknown_ca_cert = cert_fixture('unknown-ca.pem')
263
+ https = PuppetSpec::HTTPSServer.new(
264
+ ca_cert: unknown_ca_cert,
265
+ server_cert: cert_fixture('unknown-127.0.0.1.pem'),
266
+ server_key: key_fixture('unknown-127.0.0.1-key.pem')
267
+ )
268
+
269
+ # create a temp cacert bundle
270
+ ssl_file = tmpfile('systemstore')
271
+ # add CA cert that is neither the puppet CA nor unknown CA
272
+ File.write(ssl_file, cert_fixture('netlock-arany-utf8.pem').to_pem)
273
+
274
+ https.start_server do |https_port|
275
+ catalog_handler = -> (req, res) {
276
+ catalog = compile_to_catalog(<<-MANIFEST, node)
277
+ file { "#{path}":
278
+ ensure => file,
279
+ backup => false,
280
+ checksum => sha1,
281
+ checksum_value => '#{digest}',
282
+ source => "https://127.0.0.1:#{https_port}/path/to/file"
283
+ }
284
+ MANIFEST
285
+
286
+ res.body = formatter.render(catalog)
287
+ res['Content-Type'] = formatter.mime
288
+ }
289
+
290
+ server.start_server(mounts: {catalog: catalog_handler}) do |puppetserver_port|
291
+ Puppet[:masterport] = puppetserver_port
292
+
293
+ # override path to system cacert bundle, this must be done before
294
+ # the SSLContext is created and the call to X509::Store.set_default_paths
295
+ Puppet::Util.withenv("SSL_CERT_FILE" => ssl_file) do
296
+ expect {
297
+ agent.command_line.args << '--test'
298
+ agent.run
299
+ }.to exit_with(4)
300
+ .and output(/Notice: Applied catalog/).to_stdout
301
+ .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
302
+ end
303
+
304
+ expect(File).to_not be_exist(path)
305
+ end
306
+ end
307
+ end
308
+
309
+ it 'accepts HTTPS servers whose cert is in the system CA store' do
310
+ unknown_ca_cert = cert_fixture('unknown-ca.pem')
311
+ https = PuppetSpec::HTTPSServer.new(
312
+ ca_cert: unknown_ca_cert,
313
+ server_cert: cert_fixture('unknown-127.0.0.1.pem'),
314
+ server_key: key_fixture('unknown-127.0.0.1-key.pem')
315
+ )
316
+
317
+ # create a temp cacert bundle
318
+ ssl_file = tmpfile('systemstore')
319
+ File.write(ssl_file, unknown_ca_cert.to_pem)
320
+
321
+ response_proc = -> (req, res) {
322
+ res.status = 200
323
+ res.body = response_body
324
+ }
325
+
326
+ https.start_server(response_proc: response_proc) do |https_port|
327
+ catalog_handler = -> (req, res) {
328
+ catalog = compile_to_catalog(<<-MANIFEST, node)
329
+ file { "#{path}":
330
+ ensure => file,
331
+ backup => false,
332
+ checksum => sha1,
333
+ checksum_value => '#{digest}',
334
+ source => "https://127.0.0.1:#{https_port}/path/to/file"
335
+ }
336
+ MANIFEST
337
+
338
+ res.body = formatter.render(catalog)
339
+ res['Content-Type'] = formatter.mime
340
+ }
341
+
342
+ server.start_server(mounts: {catalog: catalog_handler}) do |puppetserver_port|
343
+ Puppet[:masterport] = puppetserver_port
344
+
345
+ # override path to system cacert bundle, this must be done before
346
+ # the SSLContext is created and the call to X509::Store.set_default_paths
347
+ Puppet::Util.withenv("SSL_CERT_FILE" => ssl_file) do
348
+ expect {
349
+ agent.command_line.args << '--test'
350
+ agent.run
351
+ }.to exit_with(2)
352
+ .and output(%r{https_file_source.*/ensure: created}).to_stdout
353
+ end
354
+
355
+ expect(File.binread(path)).to eq("from https server")
356
+ end
357
+ end
358
+ end
359
+
360
+ it 'accepts HTTPS servers whose cert is in the external CA store' do
361
+ unknown_ca_cert = cert_fixture('unknown-ca.pem')
362
+ https = PuppetSpec::HTTPSServer.new(
363
+ ca_cert: unknown_ca_cert,
364
+ server_cert: cert_fixture('unknown-127.0.0.1.pem'),
365
+ server_key: key_fixture('unknown-127.0.0.1-key.pem')
366
+ )
367
+
368
+ # create a temp cacert bundle
369
+ ssl_file = tmpfile('systemstore')
370
+ File.write(ssl_file, unknown_ca_cert.to_pem)
371
+
372
+ response_proc = -> (req, res) {
373
+ res.status = 200
374
+ res.body = response_body
375
+ }
376
+
377
+ https.start_server(response_proc: response_proc) do |https_port|
378
+ catalog_handler = -> (req, res) {
379
+ catalog = compile_to_catalog(<<-MANIFEST, node)
380
+ file { "#{path}":
381
+ ensure => file,
382
+ backup => false,
383
+ checksum => sha1,
384
+ checksum_value => '#{digest}',
385
+ source => "https://127.0.0.1:#{https_port}/path/to/file"
386
+ }
387
+ MANIFEST
388
+
389
+ res.body = formatter.render(catalog)
390
+ res['Content-Type'] = formatter.mime
391
+ }
392
+
393
+ server.start_server(mounts: {catalog: catalog_handler}) do |puppetserver_port|
394
+ Puppet[:masterport] = puppetserver_port
395
+
396
+ # set path to external cacert bundle, this must be done before
397
+ # the SSLContext is created
398
+ Puppet[:ssl_trust_store] = ssl_file
399
+ expect {
400
+ agent.command_line.args << '--test'
401
+ agent.run
402
+ }.to exit_with(2)
403
+ .and output(%r{https_file_source.*/ensure: created}).to_stdout
404
+ end
405
+
406
+ expect(File.binread(path)).to eq("from https server")
407
+ end
408
+ end
409
+ end
410
+
411
+ context 'multiple agents running' do
412
+ it "exits if an agent is already running" do
413
+ path = Puppet[:agent_catalog_run_lockfile]
414
+
415
+ th = Thread.new {
416
+ %x{ruby -e "$0 = 'puppet'; File.write('#{path}', Process.pid); sleep(2)"}
417
+ }
418
+
419
+ until File.exists?(path) && File.size(path) > 0 do
420
+ sleep 0.1
421
+ end
422
+
423
+ expect {
424
+ agent.command_line.args << '--test'
425
+ agent.run
426
+ }.to exit_with(1).and output(/Run of Puppet configuration client already in progress; skipping/).to_stdout
427
+
428
+ th.kill # kill thread so we don't wait too much
429
+ end
430
+
431
+ it "waits for other agent run to finish before starting" do
432
+ server.start_server do |port|
433
+ path = Puppet[:agent_catalog_run_lockfile]
434
+ Puppet[:masterport] = port
435
+ Puppet[:waitforlock] = 1
436
+
437
+ th = Thread.new {
438
+ %x{ruby -e "$0 = 'puppet'; File.write('#{path}', Process.pid); sleep(2)"}
439
+ }
440
+
441
+ until File.exists?(path) && File.size(path) > 0 do
442
+ sleep 0.1
443
+ end
444
+
445
+ expect {
446
+ agent.command_line.args << '--test'
447
+ agent.run
448
+ }.to exit_with(0).and output(/Info: Will try again in #{Puppet[:waitforlock]} seconds./).to_stdout
449
+
450
+ th.kill # kill thread so we don't wait too much
451
+ end
452
+ end
453
+
454
+ it "exits if maxwaitforlock is exceeded" do
455
+ path = Puppet[:agent_catalog_run_lockfile]
456
+ Puppet[:waitforlock] = 1
457
+ Puppet[:maxwaitforlock] = 0
458
+
459
+ th = Thread.new {
460
+ %x{ruby -e "$0 = 'puppet'; File.write('#{path}', Process.pid); sleep(2)"}
461
+ }
462
+
463
+ until File.exists?(path) && File.size(path) > 0 do
464
+ sleep 0.1
465
+ end
466
+
467
+ expect {
468
+ agent.command_line.args << '--test'
469
+ agent.run
470
+ }.to exit_with(1).and output(/Exiting now because the maxwaitforlock timeout has been exceeded./).to_stdout
471
+
472
+ th.kill # kill thread so we don't wait too much
473
+ end
474
+ end
475
+ end