puppet 6.14.0 → 6.19.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 (496) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/Gemfile +4 -2
  4. data/Gemfile.lock +36 -34
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  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/agent/locker.rb +0 -7
  11. data/lib/puppet/application/agent.rb +25 -9
  12. data/lib/puppet/application/apply.rb +18 -20
  13. data/lib/puppet/application/device.rb +1 -1
  14. data/lib/puppet/application/doc.rb +1 -1
  15. data/lib/puppet/application/filebucket.rb +5 -14
  16. data/lib/puppet/application/lookup.rb +16 -4
  17. data/lib/puppet/application/plugin.rb +1 -0
  18. data/lib/puppet/application/ssl.rb +3 -3
  19. data/lib/puppet/configurer.rb +68 -24
  20. data/lib/puppet/configurer/downloader.rb +31 -10
  21. data/lib/puppet/configurer/plugin_handler.rb +1 -1
  22. data/lib/puppet/confine.rb +2 -2
  23. data/lib/puppet/confine/any.rb +1 -1
  24. data/lib/puppet/context/trusted_information.rb +14 -8
  25. data/lib/puppet/daemon.rb +13 -27
  26. data/lib/puppet/defaults.rb +141 -41
  27. data/lib/puppet/environments.rb +55 -15
  28. data/lib/puppet/face/catalog.rb +1 -1
  29. data/lib/puppet/face/config.rb +46 -16
  30. data/lib/puppet/face/facts.rb +1 -1
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/node.rb +3 -3
  34. data/lib/puppet/face/node/clean.rb +2 -2
  35. data/lib/puppet/face/plugin.rb +2 -2
  36. data/lib/puppet/face/status.rb +1 -1
  37. data/lib/puppet/feature/base.rb +1 -1
  38. data/lib/puppet/file_bucket/dipper.rb +1 -1
  39. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  40. data/lib/puppet/file_serving/metadata.rb +4 -1
  41. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  42. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  43. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  44. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  45. data/lib/puppet/file_system/file_impl.rb +17 -13
  46. data/lib/puppet/file_system/uniquefile.rb +12 -16
  47. data/lib/puppet/forge.rb +1 -1
  48. data/lib/puppet/forge/cache.rb +1 -1
  49. data/lib/puppet/forge/repository.rb +4 -7
  50. data/lib/puppet/functions/call.rb +1 -1
  51. data/lib/puppet/functions/filter.rb +1 -0
  52. data/lib/puppet/functions/lstrip.rb +4 -4
  53. data/lib/puppet/functions/new.rb +8 -3
  54. data/lib/puppet/functions/reduce.rb +2 -4
  55. data/lib/puppet/functions/reverse_each.rb +1 -1
  56. data/lib/puppet/functions/rstrip.rb +4 -4
  57. data/lib/puppet/functions/step.rb +1 -1
  58. data/lib/puppet/functions/strip.rb +4 -4
  59. data/lib/puppet/gettext/config.rb +5 -5
  60. data/lib/puppet/gettext/module_translations.rb +4 -4
  61. data/lib/puppet/http.rb +3 -0
  62. data/lib/puppet/http/client.rb +215 -60
  63. data/lib/puppet/http/external_client.rb +90 -0
  64. data/lib/puppet/http/redirector.rb +43 -7
  65. data/lib/puppet/http/resolver.rb +43 -3
  66. data/lib/puppet/http/resolver/server_list.rb +66 -24
  67. data/lib/puppet/http/resolver/settings.rb +21 -1
  68. data/lib/puppet/http/resolver/srv.rb +28 -2
  69. data/lib/puppet/http/response.rb +82 -1
  70. data/lib/puppet/http/retry_after_handler.rb +39 -0
  71. data/lib/puppet/http/service.rb +70 -2
  72. data/lib/puppet/http/service/ca.rb +71 -9
  73. data/lib/puppet/http/service/compiler.rb +214 -12
  74. data/lib/puppet/http/service/file_server.rb +106 -5
  75. data/lib/puppet/http/service/puppetserver.rb +39 -0
  76. data/lib/puppet/http/service/report.rb +36 -3
  77. data/lib/puppet/http/session.rb +60 -8
  78. data/lib/puppet/indirector.rb +1 -1
  79. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  80. data/lib/puppet/indirector/catalog/rest.rb +2 -1
  81. data/lib/puppet/indirector/exec.rb +1 -1
  82. data/lib/puppet/indirector/facts/facter.rb +3 -3
  83. data/lib/puppet/indirector/facts/rest.rb +2 -1
  84. data/lib/puppet/indirector/facts/yaml.rb +1 -1
  85. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  86. data/lib/puppet/indirector/file_content/http.rb +5 -0
  87. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  88. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  89. data/lib/puppet/indirector/file_metadata/rest.rb +6 -4
  90. data/lib/puppet/indirector/hiera.rb +4 -0
  91. data/lib/puppet/indirector/indirection.rb +1 -1
  92. data/lib/puppet/indirector/json.rb +1 -1
  93. data/lib/puppet/indirector/msgpack.rb +1 -1
  94. data/lib/puppet/indirector/node/rest.rb +2 -1
  95. data/lib/puppet/indirector/report/processor.rb +2 -2
  96. data/lib/puppet/indirector/report/yaml.rb +23 -0
  97. data/lib/puppet/indirector/request.rb +5 -5
  98. data/lib/puppet/indirector/rest.rb +7 -1
  99. data/lib/puppet/indirector/status/rest.rb +2 -1
  100. data/lib/puppet/indirector/yaml.rb +1 -1
  101. data/lib/puppet/metatype/manager.rb +80 -80
  102. data/lib/puppet/module.rb +1 -2
  103. data/lib/puppet/network/format_support.rb +2 -2
  104. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  105. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  106. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  107. data/lib/puppet/network/http/base_pool.rb +6 -1
  108. data/lib/puppet/network/http/compression.rb +7 -0
  109. data/lib/puppet/network/http/connection.rb +2 -0
  110. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  111. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  112. data/lib/puppet/network/http/pool.rb +2 -4
  113. data/lib/puppet/network/http/route.rb +2 -2
  114. data/lib/puppet/network/http_pool.rb +2 -1
  115. data/lib/puppet/node/environment.rb +22 -5
  116. data/lib/puppet/node/facts.rb +17 -0
  117. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  118. data/lib/puppet/pal/pal_impl.rb +30 -31
  119. data/lib/puppet/parameter.rb +1 -1
  120. data/lib/puppet/parser/ast/leaf.rb +5 -5
  121. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  122. data/lib/puppet/parser/compiler.rb +43 -33
  123. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  124. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  125. data/lib/puppet/parser/environment_compiler.rb +4 -1
  126. data/lib/puppet/parser/functions.rb +18 -9
  127. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  128. data/lib/puppet/parser/functions/filter.rb +1 -0
  129. data/lib/puppet/parser/resource.rb +3 -2
  130. data/lib/puppet/parser/resource/param.rb +6 -0
  131. data/lib/puppet/parser/type_loader.rb +2 -2
  132. data/lib/puppet/pops/adaptable.rb +7 -13
  133. data/lib/puppet/pops/adapters.rb +8 -4
  134. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  135. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  136. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  137. data/lib/puppet/pops/issues.rb +5 -0
  138. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  139. data/lib/puppet/pops/loaders.rb +24 -15
  140. data/lib/puppet/pops/lookup/context.rb +1 -1
  141. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  142. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  143. data/lib/puppet/pops/types/iterable.rb +34 -8
  144. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  145. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  146. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  147. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  148. data/lib/puppet/provider/file/windows.rb +1 -1
  149. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  150. data/lib/puppet/provider/package/aix.rb +17 -2
  151. data/lib/puppet/provider/package/apt.rb +98 -1
  152. data/lib/puppet/provider/package/aptitude.rb +1 -1
  153. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  154. data/lib/puppet/provider/package/dpkg.rb +1 -1
  155. data/lib/puppet/provider/package/gem.rb +45 -9
  156. data/lib/puppet/provider/package/pacman.rb +2 -5
  157. data/lib/puppet/provider/package/pip.rb +143 -48
  158. data/lib/puppet/provider/package/pip2.rb +17 -0
  159. data/lib/puppet/provider/package/pip3.rb +0 -2
  160. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  161. data/lib/puppet/provider/package/pkgng.rb +16 -4
  162. data/lib/puppet/provider/package/portage.rb +2 -2
  163. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  164. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  165. data/lib/puppet/provider/package/rpm.rb +6 -213
  166. data/lib/puppet/provider/package/yum.rb +101 -20
  167. data/lib/puppet/provider/package/zypper.rb +62 -1
  168. data/lib/puppet/provider/service/systemd.rb +22 -4
  169. data/lib/puppet/provider/service/windows.rb +23 -7
  170. data/lib/puppet/provider/user/aix.rb +1 -1
  171. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  172. data/lib/puppet/provider/user/useradd.rb +16 -5
  173. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  174. data/lib/puppet/reports/http.rb +15 -9
  175. data/lib/puppet/resource.rb +2 -1
  176. data/lib/puppet/resource/type.rb +10 -1
  177. data/lib/puppet/resource/type_collection.rb +20 -16
  178. data/lib/puppet/rest/route.rb +2 -2
  179. data/lib/puppet/runtime.rb +25 -2
  180. data/lib/puppet/settings.rb +20 -6
  181. data/lib/puppet/ssl.rb +1 -0
  182. data/lib/puppet/ssl/host.rb +4 -4
  183. data/lib/puppet/ssl/oids.rb +1 -0
  184. data/lib/puppet/ssl/ssl_context.rb +2 -2
  185. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  186. data/lib/puppet/ssl/state_machine.rb +79 -37
  187. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  188. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  189. data/lib/puppet/test/test_helper.rb +19 -14
  190. data/lib/puppet/transaction.rb +2 -2
  191. data/lib/puppet/transaction/persistence.rb +1 -1
  192. data/lib/puppet/transaction/report.rb +14 -10
  193. data/lib/puppet/trusted_external.rb +29 -1
  194. data/lib/puppet/type.rb +21 -8
  195. data/lib/puppet/type/file.rb +40 -15
  196. data/lib/puppet/type/file/checksum.rb +4 -4
  197. data/lib/puppet/type/file/source.rb +35 -13
  198. data/lib/puppet/type/filebucket.rb +1 -1
  199. data/lib/puppet/type/notify.rb +2 -2
  200. data/lib/puppet/type/package.rb +41 -3
  201. data/lib/puppet/type/service.rb +59 -8
  202. data/lib/puppet/type/user.rb +19 -29
  203. data/lib/puppet/util.rb +41 -3
  204. data/lib/puppet/util/at_fork.rb +1 -1
  205. data/lib/puppet/util/autoload.rb +13 -25
  206. data/lib/puppet/util/character_encoding.rb +9 -5
  207. data/lib/puppet/util/checksums.rb +19 -4
  208. data/lib/puppet/util/connection.rb +8 -8
  209. data/lib/puppet/util/execution.rb +2 -2
  210. data/lib/puppet/util/fileparsing.rb +2 -2
  211. data/lib/puppet/util/instance_loader.rb +14 -10
  212. data/lib/puppet/util/log/destinations.rb +1 -10
  213. data/lib/puppet/util/package/version/debian.rb +175 -0
  214. data/lib/puppet/util/package/version/gem.rb +15 -0
  215. data/lib/puppet/util/package/version/pip.rb +167 -0
  216. data/lib/puppet/util/package/version/range.rb +53 -0
  217. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  218. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  219. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  220. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  221. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  222. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  223. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  224. data/lib/puppet/util/package/version/rpm.rb +73 -0
  225. data/lib/puppet/util/pidlock.rb +13 -7
  226. data/lib/puppet/util/platform.rb +5 -0
  227. data/lib/puppet/util/provider_features.rb +1 -1
  228. data/lib/puppet/util/reference.rb +1 -1
  229. data/lib/puppet/util/rpm_compare.rb +193 -0
  230. data/lib/puppet/util/run_mode.rb +5 -1
  231. data/lib/puppet/util/windows.rb +1 -0
  232. data/lib/puppet/util/windows/adsi.rb +2 -2
  233. data/lib/puppet/util/windows/api_types.rb +60 -33
  234. data/lib/puppet/util/windows/eventlog.rb +1 -6
  235. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  236. data/lib/puppet/util/windows/principal.rb +8 -6
  237. data/lib/puppet/util/windows/process.rb +15 -14
  238. data/lib/puppet/util/windows/registry.rb +11 -11
  239. data/lib/puppet/util/windows/security.rb +5 -4
  240. data/lib/puppet/util/windows/service.rb +43 -26
  241. data/lib/puppet/util/windows/sid.rb +3 -3
  242. data/lib/puppet/util/windows/user.rb +242 -8
  243. data/lib/puppet/version.rb +1 -1
  244. data/locales/puppet.pot +627 -507
  245. data/man/man5/puppet.conf.5 +93 -20
  246. data/man/man8/puppet-agent.8 +7 -4
  247. data/man/man8/puppet-apply.8 +1 -1
  248. data/man/man8/puppet-catalog.8 +1 -1
  249. data/man/man8/puppet-config.8 +6 -6
  250. data/man/man8/puppet-describe.8 +1 -1
  251. data/man/man8/puppet-device.8 +1 -1
  252. data/man/man8/puppet-doc.8 +1 -1
  253. data/man/man8/puppet-epp.8 +1 -1
  254. data/man/man8/puppet-facts.8 +1 -1
  255. data/man/man8/puppet-filebucket.8 +1 -1
  256. data/man/man8/puppet-generate.8 +1 -1
  257. data/man/man8/puppet-help.8 +6 -3
  258. data/man/man8/puppet-key.8 +1 -1
  259. data/man/man8/puppet-lookup.8 +2 -2
  260. data/man/man8/puppet-man.8 +1 -1
  261. data/man/man8/puppet-module.8 +4 -1
  262. data/man/man8/puppet-node.8 +4 -4
  263. data/man/man8/puppet-parser.8 +1 -1
  264. data/man/man8/puppet-plugin.8 +1 -1
  265. data/man/man8/puppet-report.8 +1 -1
  266. data/man/man8/puppet-resource.8 +1 -1
  267. data/man/man8/puppet-script.8 +1 -1
  268. data/man/man8/puppet-ssl.8 +1 -1
  269. data/man/man8/puppet-status.8 +2 -2
  270. data/man/man8/puppet.8 +2 -2
  271. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  272. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  273. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  274. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  275. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  276. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  277. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  278. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  279. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  280. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  281. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  282. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  283. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  284. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  285. data/spec/integration/application/agent_spec.rb +479 -0
  286. data/spec/integration/application/apply_spec.rb +279 -150
  287. data/spec/integration/application/config_spec.rb +74 -0
  288. data/spec/integration/application/doc_spec.rb +16 -6
  289. data/spec/integration/application/filebucket_spec.rb +239 -0
  290. data/spec/integration/application/help_spec.rb +42 -0
  291. data/spec/integration/application/lookup_spec.rb +13 -0
  292. data/spec/integration/application/module_spec.rb +68 -0
  293. data/spec/integration/application/plugin_spec.rb +123 -0
  294. data/spec/integration/configurer_spec.rb +14 -0
  295. data/spec/integration/data_binding_spec.rb +82 -0
  296. data/spec/integration/defaults_spec.rb +27 -3
  297. data/spec/integration/directory_environments_spec.rb +17 -17
  298. data/spec/integration/http/client_spec.rb +39 -40
  299. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  300. data/spec/integration/indirector/report/yaml.rb +83 -0
  301. data/spec/integration/network/http_pool_spec.rb +84 -19
  302. data/spec/integration/node/environment_spec.rb +15 -0
  303. data/spec/integration/parser/compiler_spec.rb +11 -0
  304. data/spec/integration/type/file_spec.rb +1 -1
  305. data/spec/integration/util/execution_spec.rb +22 -0
  306. data/spec/integration/util/windows/adsi_spec.rb +8 -3
  307. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  308. data/spec/integration/util/windows/process_spec.rb +26 -32
  309. data/spec/integration/util/windows/registry_spec.rb +7 -7
  310. data/spec/integration/util/windows/user_spec.rb +47 -5
  311. data/spec/integration/util_spec.rb +7 -33
  312. data/spec/lib/puppet/test_ca.rb +2 -2
  313. data/spec/lib/puppet_spec/https.rb +16 -7
  314. data/spec/lib/puppet_spec/matchers.rb +0 -80
  315. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  316. data/spec/shared_contexts/https.rb +29 -0
  317. data/spec/shared_contexts/types_setup.rb +2 -0
  318. data/spec/unit/agent_spec.rb +80 -26
  319. data/spec/unit/application/agent_spec.rb +12 -9
  320. data/spec/unit/application/device_spec.rb +2 -2
  321. data/spec/unit/application/doc_spec.rb +2 -2
  322. data/spec/unit/application/face_base_spec.rb +6 -4
  323. data/spec/unit/application/facts_spec.rb +41 -10
  324. data/spec/unit/application/filebucket_spec.rb +22 -2
  325. data/spec/unit/application/man_spec.rb +52 -0
  326. data/spec/unit/application/resource_spec.rb +3 -1
  327. data/spec/unit/application/ssl_spec.rb +15 -2
  328. data/spec/unit/application_spec.rb +9 -4
  329. data/spec/unit/configurer/downloader_spec.rb +10 -0
  330. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  331. data/spec/unit/configurer_spec.rb +87 -38
  332. data/spec/unit/confine_spec.rb +2 -1
  333. data/spec/unit/context/trusted_information_spec.rb +25 -2
  334. data/spec/unit/daemon_spec.rb +5 -64
  335. data/spec/unit/defaults_spec.rb +24 -1
  336. data/spec/unit/environments_spec.rb +107 -32
  337. data/spec/unit/face/config_spec.rb +59 -1
  338. data/spec/unit/face/module/search_spec.rb +17 -0
  339. data/spec/unit/face/node_spec.rb +2 -2
  340. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  341. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  342. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  343. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  344. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  345. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  346. data/spec/unit/file_system_spec.rb +11 -2
  347. data/spec/unit/http/client_spec.rb +173 -59
  348. data/spec/unit/http/external_client_spec.rb +201 -0
  349. data/spec/unit/http/resolver_spec.rb +44 -5
  350. data/spec/unit/http/response_spec.rb +6 -0
  351. data/spec/unit/http/service/ca_spec.rb +27 -5
  352. data/spec/unit/http/service/compiler_spec.rb +186 -9
  353. data/spec/unit/http/service/file_server_spec.rb +37 -6
  354. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  355. data/spec/unit/http/service/report_spec.rb +5 -4
  356. data/spec/unit/http/service_spec.rb +3 -4
  357. data/spec/unit/http/session_spec.rb +48 -12
  358. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  359. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  360. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  361. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  362. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  363. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  364. data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
  365. data/spec/unit/indirector/json_spec.rb +8 -8
  366. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  367. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  368. data/spec/unit/indirector/request_spec.rb +5 -5
  369. data/spec/unit/indirector/rest_spec.rb +14 -1
  370. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  371. data/spec/unit/indirector/yaml_spec.rb +7 -7
  372. data/spec/unit/interface_spec.rb +3 -3
  373. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  374. data/spec/unit/network/format_support_spec.rb +3 -2
  375. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  376. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  377. data/spec/unit/network/http/connection_spec.rb +552 -190
  378. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  379. data/spec/unit/network/http/pool_spec.rb +3 -3
  380. data/spec/unit/network/http_pool_spec.rb +63 -57
  381. data/spec/unit/network/http_spec.rb +1 -1
  382. data/spec/unit/node/environment_spec.rb +33 -0
  383. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  384. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  385. data/spec/unit/parser/scope_spec.rb +1 -1
  386. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  387. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  388. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  389. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  390. data/spec/unit/provider/exec_spec.rb +4 -3
  391. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  392. data/spec/unit/provider/package/aix_spec.rb +29 -0
  393. data/spec/unit/provider/package/apt_spec.rb +107 -0
  394. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  395. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  396. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  397. data/spec/unit/provider/package/gem_spec.rb +40 -0
  398. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  399. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  400. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  401. data/spec/unit/provider/package/pip_spec.rb +68 -19
  402. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  403. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  404. data/spec/unit/provider/package/portage_spec.rb +5 -0
  405. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  406. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  407. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  408. data/spec/unit/provider/package/yum_spec.rb +274 -1
  409. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  410. data/spec/unit/provider/service/base_spec.rb +2 -4
  411. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  412. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  413. data/spec/unit/provider/service/debian_spec.rb +3 -5
  414. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  415. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  416. data/spec/unit/provider/service/init_spec.rb +46 -5
  417. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  418. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  419. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  420. data/spec/unit/provider/service/openwrt_spec.rb +2 -1
  421. data/spec/unit/provider/service/redhat_spec.rb +10 -1
  422. data/spec/unit/provider/service/runit_spec.rb +2 -1
  423. data/spec/unit/provider/service/smf_spec.rb +1 -1
  424. data/spec/unit/provider/service/src_spec.rb +3 -5
  425. data/spec/unit/provider/service/systemd_spec.rb +95 -18
  426. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  427. data/spec/unit/provider/service/windows_spec.rb +50 -14
  428. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  429. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  430. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  431. data/spec/unit/puppet_pal_2pec.rb +11 -0
  432. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  433. data/spec/unit/puppet_spec.rb +33 -0
  434. data/spec/unit/reports/http_spec.rb +70 -52
  435. data/spec/unit/reports/store_spec.rb +17 -13
  436. data/spec/unit/resource_spec.rb +3 -3
  437. data/spec/unit/rest/route_spec.rb +4 -4
  438. data/spec/unit/settings_spec.rb +44 -22
  439. data/spec/unit/ssl/host_spec.rb +4 -2
  440. data/spec/unit/ssl/oids_spec.rb +1 -0
  441. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  442. data/spec/unit/ssl/state_machine_spec.rb +90 -14
  443. data/spec/unit/test/test_helper_spec.rb +17 -0
  444. data/spec/unit/transaction/persistence_spec.rb +15 -0
  445. data/spec/unit/transaction/report_spec.rb +7 -1
  446. data/spec/unit/type/file/source_spec.rb +4 -4
  447. data/spec/unit/type/file_spec.rb +122 -96
  448. data/spec/unit/type/filebucket_spec.rb +1 -1
  449. data/spec/unit/type/service_spec.rb +218 -8
  450. data/spec/unit/type/user_spec.rb +32 -3
  451. data/spec/unit/type_spec.rb +50 -0
  452. data/spec/unit/util/at_fork_spec.rb +2 -2
  453. data/spec/unit/util/autoload_spec.rb +2 -1
  454. data/spec/unit/util/character_encoding_spec.rb +4 -4
  455. data/spec/unit/util/checksums_spec.rb +16 -0
  456. data/spec/unit/util/command_line_spec.rb +11 -6
  457. data/spec/unit/util/log/destinations_spec.rb +1 -29
  458. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  459. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  460. data/spec/unit/util/package/version/range_spec.rb +175 -0
  461. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  462. data/spec/unit/util/pidlock_spec.rb +83 -47
  463. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  464. data/spec/unit/util/run_mode_spec.rb +6 -6
  465. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  466. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  467. data/spec/unit/util/windows/service_spec.rb +4 -4
  468. data/spec/unit/util/windows/sid_spec.rb +2 -2
  469. data/spec/unit/util_spec.rb +3 -3
  470. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  471. data/tasks/generate_cert_fixtures.rake +15 -1
  472. data/tasks/manpages.rake +5 -35
  473. metadata +90 -51
  474. data/spec/integration/faces/config_spec.rb +0 -91
  475. data/spec/integration/faces/documentation_spec.rb +0 -57
  476. data/spec/integration/faces/plugin_spec.rb +0 -63
  477. data/spec/integration/file_bucket/file_spec.rb +0 -50
  478. data/spec/integration/file_serving/content_spec.rb +0 -7
  479. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  480. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  481. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  482. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  483. data/spec/integration/module_tool/forge_spec.rb +0 -64
  484. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  485. data/spec/integration/provider/service/init_spec.rb +0 -48
  486. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  487. data/spec/integration/provider/service/windows_spec.rb +0 -50
  488. data/spec/integration/reference/providers_spec.rb +0 -21
  489. data/spec/integration/reports_spec.rb +0 -13
  490. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  491. data/spec/integration/ssl/host_spec.rb +0 -72
  492. data/spec/integration/ssl/key_spec.rb +0 -99
  493. data/spec/integration/test/test_helper_spec.rb +0 -31
  494. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  495. data/spec/unit/face/man_spec.rb +0 -25
  496. data/spec/unit/man_spec.rb +0 -31
@@ -118,6 +118,11 @@ describe Puppet::Application do
118
118
  @appclass.run_mode :agent
119
119
  expect(@appclass.run_mode.name).to eq(:agent)
120
120
  end
121
+
122
+ it "considers :server to be master" do
123
+ @appclass.run_mode :server
124
+ expect(@appclass.run_mode).to be_master
125
+ end
121
126
  end
122
127
 
123
128
  describe ".environment_mode" do
@@ -147,7 +152,7 @@ describe Puppet::Application do
147
152
  describe "when dealing with run_mode" do
148
153
 
149
154
  class TestApp < Puppet::Application
150
- run_mode :master
155
+ run_mode :server
151
156
  def run_command
152
157
  # no-op
153
158
  end
@@ -159,16 +164,16 @@ describe Puppet::Application do
159
164
  app = TestApp.new
160
165
  app.initialize_app_defaults
161
166
 
162
- expect(Puppet.run_mode).to be_master
167
+ expect(Puppet.run_mode).to be_server
163
168
  end
164
169
 
165
170
  it "should sadly and frighteningly allow run_mode to change at runtime via #run" do
166
171
  app = TestApp.new
167
172
  app.run
168
173
 
169
- expect(app.class.run_mode.name).to eq(:master)
174
+ expect(app.class.run_mode.name).to eq(:server)
170
175
 
171
- expect(Puppet.run_mode).to be_master
176
+ expect(Puppet.run_mode).to be_server
172
177
  end
173
178
  end
174
179
 
@@ -228,5 +228,15 @@ describe Puppet::Configurer::Downloader do
228
228
 
229
229
  expect { @dler.evaluate }.not_to raise_error
230
230
  end
231
+
232
+ it "raises an exception if catalog application fails" do
233
+ Puppet[:ignore_plugin_errors] = false
234
+
235
+ expect(@dler.file).to receive(:retrieve).and_raise(Puppet::Error, "testing")
236
+
237
+ expect {
238
+ @dler.evaluate
239
+ }.to raise_error(Puppet::Error, /testing/)
240
+ end
231
241
  end
232
242
  end
@@ -104,7 +104,7 @@ describe Puppet::Configurer::FactHandler do
104
104
  expect(text).to include(test_fact[:encoded])
105
105
 
106
106
  # this is not sufficient to test whether these values are sent via HTTP GET or HTTP POST in actual catalog request
107
- expect(JSON.parse(URI.unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
107
+ expect(JSON.parse(Puppet::Util.uri_unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
108
108
  end
109
109
  end
110
110
  end
@@ -129,7 +129,7 @@ describe Puppet::Configurer::FactHandler do
129
129
  expect(to_upload).to eq({:facts_format => 'application/json', :facts => text})
130
130
  expect(text).to include(test_fact[:encoded])
131
131
 
132
- expect(JSON.parse(URI.unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
132
+ expect(JSON.parse(Puppet::Util.uri_unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
133
133
  end
134
134
  end
135
135
  end
@@ -138,9 +138,9 @@ describe Puppet::Configurer::FactHandler do
138
138
  facts = Puppet::Node::Facts.new(Puppet[:node_name_value], 'my_name_fact' => 'other_node_name')
139
139
  Puppet::Node::Facts.indirection.save(facts)
140
140
 
141
- # prefer URI.unescape but validate CGI also works
141
+ # prefer Puppet::Util.uri_unescape but validate CGI also works
142
142
  encoded_facts = facthandler.facts_for_uploading[:facts]
143
- expect(URI.unescape(encoded_facts)).to validate_against('api/schemas/facts.json')
143
+ expect(Puppet::Util.uri_unescape(encoded_facts)).to validate_against('api/schemas/facts.json')
144
144
  expect(CGI.unescape(encoded_facts)).to validate_against('api/schemas/facts.json')
145
145
  end
146
146
  end
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/configurer'
3
- require 'webmock/rspec'
4
3
 
5
4
  describe Puppet::Configurer do
6
5
  before do
@@ -85,6 +84,44 @@ describe Puppet::Configurer do
85
84
  expect(configurer.run).to eq(0)
86
85
  end
87
86
 
87
+ it "fails the run if pluginsync fails when usecacheonfailure is false" do
88
+ Puppet[:ignore_plugin_errors] = false
89
+
90
+ # --test implies these, set them so we don't fall back to a cached catalog
91
+ Puppet[:use_cached_catalog] = false
92
+ Puppet[:usecacheonfailure] = false
93
+
94
+ body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
95
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
96
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
97
+ )
98
+ stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
99
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
100
+ )
101
+
102
+ configurer.run(pluginsync: true)
103
+
104
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: %r{Failed to apply catalog: Failed to retrieve pluginfacts: Could not retrieve information from environment production source\(s\) puppet:///pluginfacts}))
105
+ end
106
+
107
+ it "applies a cached catalog if pluginsync fails when usecacheonfailure is true" do
108
+ Puppet[:ignore_plugin_errors] = false
109
+
110
+ Puppet[:use_cached_catalog] = false
111
+ Puppet[:usecacheonfailure] = true
112
+
113
+ body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
114
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
115
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
116
+ )
117
+ stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
118
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
119
+ )
120
+
121
+ expect(configurer.run(pluginsync: true, :report => report)).to eq(0)
122
+ expect(report.cached_catalog_status).to eq('on_failure')
123
+ end
124
+
88
125
  it "applies a cached catalog when it can't connect to the master" do
89
126
  error = Errno::ECONNREFUSED.new('Connection refused - connect(2)')
90
127
 
@@ -96,7 +133,8 @@ describe Puppet::Configurer do
96
133
  end
97
134
 
98
135
  it "should initialize a transaction report if one is not provided" do
99
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
136
+ # host and settings catalogs each create a report...
137
+ expect(Puppet::Transaction::Report).to receive(:new).and_return(report).twice
100
138
 
101
139
  configurer.run
102
140
  end
@@ -148,7 +186,7 @@ describe Puppet::Configurer do
148
186
  configurer = Puppet::Configurer.new("test_tuuid", "test_jid")
149
187
 
150
188
  report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
151
- expect(Puppet::Transaction::Report).to receive(:new).with(anything, anything, 'test_tuuid', 'test_jid').and_return(report)
189
+ expect(Puppet::Transaction::Report).to receive(:new).with(anything, anything, 'test_tuuid', 'test_jid', anything).and_return(report)
152
190
  expect(configurer).to receive(:send_report).with(report)
153
191
 
154
192
  configurer.run
@@ -192,22 +230,21 @@ describe Puppet::Configurer do
192
230
  end
193
231
 
194
232
  it "should remove the report as a log destination when the run is finished" do
195
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
196
-
197
- configurer.run
233
+ configurer.run(report: report)
198
234
 
199
235
  expect(Puppet::Util::Log.destinations).not_to include(report)
200
236
  end
201
237
 
202
- it "should return the report exit_status as the result of the run" do
203
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
204
- expect(report).to receive(:exit_status).and_return(1234)
238
+ it "should return an exit status of 2 due to the notify resource 'changing'" do
239
+ cat = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
240
+ cat.add_resource(Puppet::Type.type(:notify).new(:name => 'something changed'))
205
241
 
206
- expect(configurer.run).to eq(1234)
242
+ expect(configurer.run(catalog: cat, report: report)).to eq(2)
207
243
  end
208
244
 
209
245
  it "should return nil if catalog application fails" do
210
- expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
246
+ expect(catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
247
+
211
248
  expect(configurer.run(catalog: catalog, report: report)).to be_nil
212
249
  end
213
250
 
@@ -222,34 +259,28 @@ describe Puppet::Configurer do
222
259
  end
223
260
 
224
261
  it "should include the pre-run command failure in the report" do
225
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
226
-
227
262
  Puppet.settings[:prerun_command] = "/my/command"
228
263
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
229
264
 
230
- expect(configurer.run).to be_nil
265
+ expect(configurer.run(report: report)).to be_nil
231
266
  expect(report.logs.find { |x| x.message =~ /Could not run command from prerun_command/ }).to be
232
267
  end
233
268
 
234
269
  it "should send the transaction report even if the post-run command fails" do
235
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
236
-
237
270
  Puppet.settings[:postrun_command] = "/my/command"
238
271
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
239
272
  expect(configurer).to receive(:send_report).with(report)
240
273
 
241
- expect(configurer.run).to be_nil
274
+ expect(configurer.run(report: report)).to be_nil
242
275
  end
243
276
 
244
277
  it "should include the post-run command failure in the report" do
245
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
246
-
247
278
  Puppet.settings[:postrun_command] = "/my/command"
248
279
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
249
280
 
250
281
  expect(report).to receive(:<<) { |log, _| expect(log.message).to match(/Could not run command from postrun_command/) }.at_least(:once)
251
282
 
252
- expect(configurer.run).to be_nil
283
+ expect(configurer.run(report: report)).to be_nil
253
284
  end
254
285
 
255
286
  it "should execute post-run command even if the pre-run command fails" do
@@ -262,34 +293,28 @@ describe Puppet::Configurer do
262
293
  end
263
294
 
264
295
  it "should finalize the report" do
265
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
266
-
267
296
  expect(report).to receive(:finalize_report)
268
- configurer.run
297
+ configurer.run(report: report)
269
298
  end
270
299
 
271
300
  it "should not apply the catalog if the pre-run command fails" do
272
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
273
-
274
301
  Puppet.settings[:prerun_command] = "/my/command"
275
302
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
276
303
 
277
304
  expect_any_instance_of(Puppet::Resource::Catalog).not_to receive(:apply)
278
305
  expect(configurer).to receive(:send_report)
279
306
 
280
- expect(configurer.run).to be_nil
307
+ expect(configurer.run(report: report)).to be_nil
281
308
  end
282
309
 
283
310
  it "should apply the catalog, send the report, and return nil if the post-run command fails" do
284
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
285
-
286
311
  Puppet.settings[:postrun_command] = "/my/command"
287
312
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
288
313
 
289
314
  expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply)
290
315
  expect(configurer).to receive(:send_report)
291
316
 
292
- expect(configurer.run).to be_nil
317
+ expect(configurer.run(report: report)).to be_nil
293
318
  end
294
319
 
295
320
  it 'includes total time metrics in the report after successfully applying the catalog' do
@@ -546,6 +571,15 @@ describe Puppet::Configurer do
546
571
  end
547
572
  end
548
573
 
574
+ def expects_pluginsync
575
+ metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":420,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
576
+ stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
577
+
578
+ # response retains owner/group/mode due to source_permissions => use
579
+ facts_metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":500,\"group\":500,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
580
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(status: 200, body: facts_metadata, headers: {'Content-Type' => 'application/json'})
581
+ end
582
+
549
583
  def expects_new_catalog_only(catalog)
550
584
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
551
585
  expect(Puppet::Resource::Catalog.indirection).not_to receive(:find).with(anything, hash_including(ignore_terminus: true))
@@ -562,6 +596,7 @@ describe Puppet::Configurer do
562
596
  end
563
597
 
564
598
  def expects_fallback_to_new_catalog(catalog)
599
+ expects_pluginsync
565
600
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(nil)
566
601
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
567
602
  end
@@ -598,7 +633,6 @@ describe Puppet::Configurer do
598
633
  it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
599
634
  expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
600
635
  expects_fallback_to_new_catalog(catalog)
601
- expect(configurer).to receive(:download_plugins)
602
636
 
603
637
  configurer.run
604
638
  end
@@ -636,6 +670,7 @@ describe Puppet::Configurer do
636
670
  it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
637
671
  expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
638
672
  expects_neither_new_or_cached_catalog
673
+ expects_pluginsync
639
674
 
640
675
  # after failing to use a cached catalog, we'll need to pluginsync before getting
641
676
  # a new catalog, which also fails.
@@ -656,8 +691,7 @@ describe Puppet::Configurer do
656
691
  end
657
692
 
658
693
  it "applies the catalog passed as options when the catalog cache terminus is not set" do
659
- stub_request(:get, %r{/puppet/v3/file_metadatas?/plugins}).to_return(:status => 404)
660
- stub_request(:get, %r{/puppet/v3/file_metadatas?/pluginfacts}).to_return(:status => 404)
694
+ expects_pluginsync
661
695
 
662
696
  catalog.add_resource(Puppet::Resource.new('notify', 'from apply'))
663
697
  configurer.run(catalog: catalog.to_ral)
@@ -1010,30 +1044,45 @@ describe Puppet::Configurer do
1010
1044
  options = {}
1011
1045
  configurer.run(options)
1012
1046
  expect(options[:report].master_used).to eq('myserver:123')
1047
+ expect(options[:report].server_used).to eq('myserver:123')
1013
1048
  end
1014
1049
 
1015
- it "should report when a server is unavailable" do
1050
+ it "should report when usecacheonfailure is false and server is unavailable" do
1016
1051
  Puppet.settings[:server_list] = ["myserver:123"]
1052
+ Puppet[:usecacheonfailure] = false
1017
1053
 
1018
1054
  stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: [500, "Internal Server Error"])
1019
1055
 
1020
- allow(Puppet).to receive(:debug)
1021
- expect(Puppet).to receive(:debug).with("Puppet server myserver:123 is unavailable: 500 Internal Server Error")
1022
-
1023
1056
  expect {
1024
1057
  configurer.run
1025
- }.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list:/)
1058
+ }.to raise_error(Puppet::Error, /Could not select a functional puppet server from server_list:/)
1059
+
1060
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: /Puppet server myserver:123 is unavailable: 500 Internal Server Error/))
1026
1061
  end
1027
1062
 
1028
1063
  it "should error when no servers in 'server_list' are reachable" do
1029
1064
  Puppet.settings[:server_list] = "myserver:123,someotherservername"
1065
+ Puppet[:usecacheonfailure] = false
1030
1066
 
1031
1067
  stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 400)
1032
1068
  stub_request(:get, 'https://someotherservername:8140/status/v1/simple/master').to_return(status: 400)
1033
1069
 
1034
1070
  expect{
1035
1071
  configurer.run
1036
- }.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list: 'myserver:123,someotherservername'/)
1072
+ }.to raise_error(Puppet::Error, /Could not select a functional puppet server from server_list: 'myserver:123,someotherservername'/)
1073
+ end
1074
+
1075
+ it "should not error when usecacheonfailure is true and no servers in 'server_list' are reachable" do
1076
+ Puppet.settings[:server_list] = "myserver:123,someotherservername"
1077
+ Puppet[:usecacheonfailure] = true
1078
+
1079
+ stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 400)
1080
+ stub_request(:get, 'https://someotherservername:8140/status/v1/simple/master').to_return(status: 400)
1081
+
1082
+ options = {}
1083
+
1084
+ expect(configurer.run(options)).to eq(0)
1085
+ expect(options[:report].server_used).to be_nil
1037
1086
  end
1038
1087
 
1039
1088
  it "should not make multiple node requests when the server is found" do
@@ -54,10 +54,11 @@ describe Puppet::Confine do
54
54
  end
55
55
 
56
56
  it "should log failing confines with the label and message" do
57
+ Puppet[:log_level] = 'debug'
57
58
  allow(@confine).to receive(:pass?).and_return(false)
58
59
  expect(@confine).to receive(:message).and_return("My message")
59
60
  expect(@confine).to receive(:label).and_return("Mylabel")
60
- expect(Puppet).to receive(:debug).with("Mylabel: My message")
61
+ expect(Puppet).to receive(:debug) { |&b| expect(b.call).to eq("Mylabel: My message") }
61
62
  @confine.valid?
62
63
  end
63
64
  end
@@ -41,8 +41,12 @@ describe Puppet::Context::TrustedInformation, :unless => RUBY_PLATFORM == 'java'
41
41
  }
42
42
 
43
43
  def allow_external_trusted_data(certname, data)
44
- Puppet[:trusted_external_command] = '/usr/bin/generate_data.sh'
45
- allow(Puppet::Util::Execution).to receive(:execute).with(['/usr/bin/generate_data.sh', certname], anything).and_return(JSON.dump(data))
44
+ command = 'generate_data.sh'
45
+ Puppet[:trusted_external_command] = command
46
+ # The expand_path bit is necessary b/c :trusted_external_command is a
47
+ # file_or_directory setting, and file_or_directory settings automatically
48
+ # expand the given path.
49
+ allow(Puppet::Util::Execution).to receive(:execute).with([File.expand_path(command), certname], anything).and_return(JSON.dump(data))
46
50
  end
47
51
 
48
52
  it "defaults external to an empty hash" do
@@ -90,6 +94,25 @@ describe Puppet::Context::TrustedInformation, :unless => RUBY_PLATFORM == 'java'
90
94
 
91
95
  expect(trusted.external).to eq(external_data)
92
96
  end
97
+
98
+ it 'does not run the trusted external command when creating a trusted context' do
99
+ Puppet[:trusted_external_command] = '/usr/bin/generate_data.sh'
100
+
101
+ expect(Puppet::Util::Execution).to receive(:execute).never
102
+ Puppet::Context::TrustedInformation.remote(true, 'cert name', cert)
103
+ end
104
+
105
+ it 'only runs the trusted external command the first time it is invoked' do
106
+ command = 'generate_data.sh'
107
+ Puppet[:trusted_external_command] = command
108
+
109
+ # See allow_external_trusted_data to understand why expand_path is necessary
110
+ expect(Puppet::Util::Execution).to receive(:execute).with([File.expand_path(command), 'cert name'], anything).and_return(JSON.dump(external_data)).once
111
+
112
+ trusted = Puppet::Context::TrustedInformation.remote(true, 'cert name', cert)
113
+ trusted.external
114
+ trusted.external
115
+ end
93
116
  end
94
117
 
95
118
  context "when local" do
@@ -32,13 +32,17 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
32
32
  let(:pidfile) { double("PidFile", :lock => true, :unlock => true, :file_path => 'fake.pid') }
33
33
  let(:scheduler) { RecordingScheduler.new }
34
34
 
35
- let(:daemon) { Puppet::Daemon.new(pidfile, scheduler) }
35
+ let(:daemon) { Puppet::Daemon.new(agent, pidfile, scheduler) }
36
36
 
37
37
  before(:each) do
38
38
  allow(Signal).to receive(:trap)
39
39
  allow(daemon).to receive(:close_streams).and_return(nil)
40
40
  end
41
41
 
42
+ it "should fail when no agent is provided" do
43
+ expect { Puppet::Daemon.new(nil, pidfile, scheduler) }.to raise_error(Puppet::DevError)
44
+ end
45
+
42
46
  it "should reopen the Log logs when told to reopen logs" do
43
47
  expect(Puppet::Util::Log).to receive(:reopen)
44
48
  daemon.reopen_logs
@@ -72,65 +76,21 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
72
76
  allow(daemon).to receive(:set_signal_traps)
73
77
  end
74
78
 
75
- it "should fail if it has neither agent nor server" do
76
- expect { daemon.start }.to raise_error(Puppet::DevError)
77
- end
78
-
79
79
  it "should create its pidfile" do
80
80
  expect(pidfile).to receive(:lock).and_return(true)
81
-
82
- daemon.agent = agent
83
81
  daemon.start
84
82
  end
85
83
 
86
84
  it "should fail if it cannot lock" do
87
85
  expect(pidfile).to receive(:lock).and_return(false)
88
- daemon.agent = agent
89
-
90
86
  expect { daemon.start }.to raise_error(RuntimeError, "Could not create PID file: #{pidfile.file_path}")
91
87
  end
92
88
 
93
- it "should start its server if one is configured" do
94
- daemon.server = server
95
-
96
- expect(server).to receive(:start)
97
-
98
- daemon.start
99
- end
100
-
101
89
  it "disables the reparse of configs if the filetimeout is 0" do
102
90
  Puppet[:filetimeout] = 0
103
- daemon.agent = agent
104
-
105
91
  daemon.start
106
-
107
92
  expect(scheduler.jobs[0]).not_to be_enabled
108
93
  end
109
-
110
- it "disables the agent run when there is no agent" do
111
- Puppet[:filetimeout] = 0
112
- daemon.server = server
113
-
114
- daemon.start
115
-
116
- expect(scheduler.jobs[1]).not_to be_enabled
117
- end
118
-
119
- it "waits for the server to shutdown when there is one" do
120
- daemon.server = server
121
-
122
- expect(server).to receive(:wait_for_shutdown)
123
-
124
- daemon.start
125
- end
126
-
127
- it "waits for the server to shutdown when there is one" do
128
- daemon.server = server
129
-
130
- expect(server).to receive(:wait_for_shutdown)
131
-
132
- daemon.start
133
- end
134
94
  end
135
95
 
136
96
  describe "when stopping" do
@@ -146,14 +106,6 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
146
106
  without_warnings { Puppet::Application = Puppet::Application.superclass }
147
107
  end
148
108
 
149
- it "should stop its server if one is configured" do
150
- expect(server).to receive(:stop)
151
-
152
- daemon.server = server
153
-
154
- expect { daemon.stop }.to exit_with 0
155
- end
156
-
157
109
  it 'should request a stop from Puppet::Application' do
158
110
  expect(Puppet::Application).to receive(:stop!)
159
111
  expect { daemon.stop }.to exit_with 0
@@ -161,7 +113,6 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
161
113
 
162
114
  it "should remove its pidfile" do
163
115
  expect(pidfile).to receive(:unlock)
164
-
165
116
  expect { daemon.stop }.to exit_with 0
166
117
  end
167
118
 
@@ -188,8 +139,6 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
188
139
  expect(agent).to receive(:run).with({:splay => false}).and_raise(Puppet::LockError, 'Failed to aquire lock')
189
140
  expect(Puppet).to receive(:notice).with('Not triggering already-running agent')
190
141
 
191
- daemon.agent = agent
192
-
193
142
  daemon.reload
194
143
  end
195
144
 
@@ -197,8 +146,6 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
197
146
  expect(agent).to receive(:run).with({:splay => false})
198
147
  expect(Puppet).not_to receive(:notice).with('Not triggering already-running agent')
199
148
 
200
- daemon.agent = agent
201
-
202
149
  daemon.reload
203
150
  end
204
151
  end
@@ -220,15 +167,11 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
220
167
 
221
168
  it "should reexec itself if no agent is available" do
222
169
  expect(daemon).to receive(:reexec)
223
-
224
170
  daemon.restart
225
171
  end
226
172
 
227
173
  it "should reexec itself if the agent is not running" do
228
- expect(agent).to receive(:running?).and_return(false)
229
- daemon.agent = agent
230
174
  expect(daemon).to receive(:reexec)
231
-
232
175
  daemon.restart
233
176
  end
234
177
  end
@@ -247,14 +190,12 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
247
190
  it "should shut down without exiting" do
248
191
  daemon.argv = %w{foo}
249
192
  expect(daemon).to receive(:stop).with(:exit => false)
250
-
251
193
  daemon.reexec
252
194
  end
253
195
 
254
196
  it "should call 'exec' with the original executable and arguments" do
255
197
  daemon.argv = %w{foo}
256
198
  expect(daemon).to receive(:exec).with($0 + " foo")
257
-
258
199
  daemon.reexec
259
200
  end
260
201
  end