puppet 6.11.1-x86-mingw32 → 6.16.0-x86-mingw32

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

Potentially problematic release.


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

Files changed (395) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +3 -8
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +39 -36
  6. data/README.md +17 -24
  7. data/ext/build_defaults.yaml +1 -0
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/windows/service/daemon.rb +25 -20
  10. data/lib/puppet.rb +52 -13
  11. data/lib/puppet/agent.rb +20 -14
  12. data/lib/puppet/application/agent.rb +12 -14
  13. data/lib/puppet/application/describe.rb +7 -5
  14. data/lib/puppet/application/device.rb +2 -2
  15. data/lib/puppet/application/filebucket.rb +19 -15
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/resource.rb +1 -1
  18. data/lib/puppet/application/ssl.rb +4 -4
  19. data/lib/puppet/concurrent.rb +2 -0
  20. data/lib/puppet/concurrent/lock.rb +16 -0
  21. data/lib/puppet/concurrent/synchronized.rb +15 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
  23. data/lib/puppet/configurer.rb +85 -83
  24. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  25. data/lib/puppet/context/trusted_information.rb +14 -8
  26. data/lib/puppet/daemon.rb +13 -27
  27. data/lib/puppet/defaults.rb +158 -40
  28. data/lib/puppet/environments.rb +30 -20
  29. data/lib/puppet/error.rb +9 -1
  30. data/lib/puppet/face/facts.rb +8 -5
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/plugin.rb +2 -2
  34. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  35. data/lib/puppet/file_system/file_impl.rb +13 -9
  36. data/lib/puppet/file_system/memory_file.rb +6 -0
  37. data/lib/puppet/file_system/memory_impl.rb +13 -0
  38. data/lib/puppet/file_system/uniquefile.rb +4 -0
  39. data/lib/puppet/file_system/windows.rb +7 -10
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/forge/errors.rb +2 -2
  42. data/lib/puppet/forge/repository.rb +31 -86
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/camelcase.rb +2 -2
  45. data/lib/puppet/functions/epp.rb +4 -4
  46. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/find_file.rb +9 -9
  49. data/lib/puppet/functions/find_template.rb +63 -0
  50. data/lib/puppet/functions/inline_epp.rb +5 -5
  51. data/lib/puppet/functions/reduce.rb +2 -4
  52. data/lib/puppet/http.rb +7 -0
  53. data/lib/puppet/http/client.rb +341 -54
  54. data/lib/puppet/http/errors.rb +2 -0
  55. data/lib/puppet/http/external_client.rb +90 -0
  56. data/lib/puppet/http/redirector.rb +34 -0
  57. data/lib/puppet/http/resolver.rb +57 -1
  58. data/lib/puppet/http/resolver/server_list.rb +98 -0
  59. data/lib/puppet/http/resolver/settings.rb +23 -2
  60. data/lib/puppet/http/resolver/srv.rb +36 -4
  61. data/lib/puppet/http/response.rb +68 -1
  62. data/lib/puppet/http/retry_after_handler.rb +39 -0
  63. data/lib/puppet/http/service.rb +179 -3
  64. data/lib/puppet/http/service/ca.rb +84 -21
  65. data/lib/puppet/http/service/compiler.rb +319 -0
  66. data/lib/puppet/http/service/file_server.rb +206 -0
  67. data/lib/puppet/http/service/report.rb +66 -0
  68. data/lib/puppet/http/session.rb +106 -31
  69. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  70. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  71. data/lib/puppet/indirector/facts/rest.rb +42 -0
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  73. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  74. data/lib/puppet/indirector/file_content/http.rb +5 -0
  75. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  76. data/lib/puppet/indirector/file_metadata/http.rb +4 -4
  77. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  78. data/lib/puppet/indirector/json.rb +1 -1
  79. data/lib/puppet/indirector/msgpack.rb +1 -1
  80. data/lib/puppet/indirector/node/rest.rb +24 -0
  81. data/lib/puppet/indirector/report/rest.rb +19 -0
  82. data/lib/puppet/indirector/report/yaml.rb +23 -0
  83. data/lib/puppet/indirector/rest.rb +12 -0
  84. data/lib/puppet/indirector/status/rest.rb +18 -0
  85. data/lib/puppet/loaders.rb +6 -0
  86. data/lib/puppet/metatype/manager.rb +80 -80
  87. data/lib/puppet/network/http/base_pool.rb +19 -1
  88. data/lib/puppet/network/http/compression.rb +7 -0
  89. data/lib/puppet/network/http/connection.rb +6 -0
  90. data/lib/puppet/network/http/connection_adapter.rb +182 -0
  91. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  92. data/lib/puppet/network/http/pool.rb +13 -6
  93. data/lib/puppet/network/http_pool.rb +2 -1
  94. data/lib/puppet/node/environment.rb +24 -8
  95. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  96. data/lib/puppet/pal/pal_impl.rb +9 -29
  97. data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
  98. data/lib/puppet/parser/compiler.rb +42 -32
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/epp.rb +3 -3
  101. data/lib/puppet/parser/functions/filter.rb +1 -0
  102. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  105. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/lookup/invocation.rb +10 -3
  109. data/lib/puppet/pops/model/pn_transformer.rb +5 -9
  110. data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
  111. data/lib/puppet/pops/serialization/json_path.rb +3 -3
  112. data/lib/puppet/pops/time/timespan.rb +3 -5
  113. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  114. data/lib/puppet/pops/types/string_converter.rb +6 -9
  115. data/lib/puppet/pops/types/type_calculator.rb +30 -10
  116. data/lib/puppet/pops/types/type_formatter.rb +9 -11
  117. data/lib/puppet/pops/types/type_parser.rb +3 -3
  118. data/lib/puppet/pops/validation/checker4_0.rb +1 -1
  119. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  120. data/lib/puppet/provider/aix_object.rb +4 -2
  121. data/lib/puppet/provider/group/aix.rb +1 -0
  122. data/lib/puppet/provider/group/groupadd.rb +57 -24
  123. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +78 -4
  126. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  127. data/lib/puppet/provider/package/dpkg.rb +14 -7
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +41 -7
  130. data/lib/puppet/provider/package/openbsd.rb +13 -1
  131. data/lib/puppet/provider/package/pacman.rb +2 -5
  132. data/lib/puppet/provider/package/pip.rb +143 -48
  133. data/lib/puppet/provider/package/pip3.rb +0 -2
  134. data/lib/puppet/provider/package/pkg.rb +18 -5
  135. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  136. data/lib/puppet/provider/package/pkgng.rb +16 -4
  137. data/lib/puppet/provider/package/portage.rb +5 -5
  138. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  139. data/lib/puppet/provider/package/rpm.rb +6 -213
  140. data/lib/puppet/provider/package/yum.rb +108 -24
  141. data/lib/puppet/provider/package/zypper.rb +59 -1
  142. data/lib/puppet/provider/package_targetable.rb +5 -4
  143. data/lib/puppet/provider/service/systemd.rb +23 -5
  144. data/lib/puppet/provider/user/aix.rb +1 -0
  145. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  146. data/lib/puppet/provider/user/hpux.rb +1 -1
  147. data/lib/puppet/provider/user/useradd.rb +11 -8
  148. data/lib/puppet/reports/http.rb +13 -9
  149. data/lib/puppet/reports/store.rb +1 -1
  150. data/lib/puppet/resource/type_collection.rb +20 -16
  151. data/lib/puppet/runtime.rb +32 -1
  152. data/lib/puppet/settings.rb +4 -0
  153. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  154. data/lib/puppet/ssl.rb +1 -0
  155. data/lib/puppet/ssl/certificate.rb +2 -1
  156. data/lib/puppet/ssl/host.rb +4 -4
  157. data/lib/puppet/ssl/oids.rb +1 -0
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -0
  159. data/lib/puppet/ssl/state_machine.rb +81 -35
  160. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  161. data/lib/puppet/test/test_helper.rb +7 -1
  162. data/lib/puppet/transaction.rb +33 -11
  163. data/lib/puppet/transaction/report.rb +2 -2
  164. data/lib/puppet/transaction/resource_harness.rb +1 -1
  165. data/lib/puppet/type.rb +7 -2
  166. data/lib/puppet/type/file.rb +13 -0
  167. data/lib/puppet/type/file/data_sync.rb +5 -1
  168. data/lib/puppet/type/file/source.rb +49 -58
  169. data/lib/puppet/type/group.rb +5 -4
  170. data/lib/puppet/type/package.rb +102 -10
  171. data/lib/puppet/type/service.rb +6 -8
  172. data/lib/puppet/type/user.rb +6 -30
  173. data/lib/puppet/util.rb +34 -11
  174. data/lib/puppet/util/at_fork.rb +1 -1
  175. data/lib/puppet/util/autoload.rb +4 -18
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/logging.rb +30 -18
  179. data/lib/puppet/util/package/version/debian.rb +175 -0
  180. data/lib/puppet/util/package/version/gem.rb +15 -0
  181. data/lib/puppet/util/package/version/pip.rb +167 -0
  182. data/lib/puppet/util/package/version/range.rb +53 -0
  183. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  185. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  187. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  188. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  189. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  190. data/lib/puppet/util/package/version/rpm.rb +73 -0
  191. data/lib/puppet/util/pidlock.rb +36 -10
  192. data/lib/puppet/util/platform.rb +5 -0
  193. data/lib/puppet/util/plist.rb +6 -0
  194. data/lib/puppet/util/rpm_compare.rb +193 -0
  195. data/lib/puppet/util/storage.rb +0 -1
  196. data/lib/puppet/util/windows/adsi.rb +50 -20
  197. data/lib/puppet/util/windows/process.rb +15 -14
  198. data/lib/puppet/util/windows/security.rb +1 -0
  199. data/lib/puppet/util/windows/sid.rb +3 -3
  200. data/lib/puppet/util/yaml.rb +1 -1
  201. data/lib/puppet/version.rb +1 -1
  202. data/lib/puppet/x509/cert_provider.rb +9 -5
  203. data/locales/puppet.pot +640 -521
  204. data/man/man5/puppet.conf.5 +88 -9
  205. data/man/man8/puppet-agent.8 +6 -6
  206. data/man/man8/puppet-apply.8 +1 -1
  207. data/man/man8/puppet-catalog.8 +1 -1
  208. data/man/man8/puppet-config.8 +1 -1
  209. data/man/man8/puppet-describe.8 +1 -1
  210. data/man/man8/puppet-device.8 +2 -2
  211. data/man/man8/puppet-doc.8 +1 -1
  212. data/man/man8/puppet-epp.8 +1 -1
  213. data/man/man8/puppet-facts.8 +1 -1
  214. data/man/man8/puppet-filebucket.8 +17 -2
  215. data/man/man8/puppet-generate.8 +1 -1
  216. data/man/man8/puppet-help.8 +6 -3
  217. data/man/man8/puppet-key.8 +1 -1
  218. data/man/man8/puppet-lookup.8 +1 -1
  219. data/man/man8/puppet-man.8 +1 -1
  220. data/man/man8/puppet-module.8 +4 -1
  221. data/man/man8/puppet-node.8 +1 -1
  222. data/man/man8/puppet-parser.8 +1 -1
  223. data/man/man8/puppet-plugin.8 +1 -1
  224. data/man/man8/puppet-report.8 +1 -1
  225. data/man/man8/puppet-resource.8 +1 -1
  226. data/man/man8/puppet-script.8 +1 -1
  227. data/man/man8/puppet-ssl.8 +2 -2
  228. data/man/man8/puppet-status.8 +1 -1
  229. data/man/man8/puppet.8 +2 -2
  230. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  231. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  232. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  233. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  234. data/spec/fixtures/unit/forge/bacula.json +76 -0
  235. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  236. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  238. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  239. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  241. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  242. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  243. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  244. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  247. data/spec/integration/application/agent_spec.rb +394 -0
  248. data/spec/integration/application/apply_spec.rb +132 -3
  249. data/spec/integration/application/filebucket_spec.rb +190 -0
  250. data/spec/integration/application/plugin_spec.rb +73 -0
  251. data/spec/integration/configurer_spec.rb +26 -7
  252. data/spec/integration/http/client_spec.rb +154 -0
  253. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  254. data/spec/integration/indirector/report/yaml.rb +83 -0
  255. data/spec/integration/module_tool/forge_spec.rb +51 -0
  256. data/spec/integration/network/http_pool_spec.rb +76 -20
  257. data/spec/integration/node/environment_spec.rb +15 -0
  258. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  259. data/spec/lib/puppet/test_ca.rb +2 -2
  260. data/spec/lib/puppet_spec/https.rb +20 -9
  261. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  262. data/spec/shared_contexts/https.rb +29 -0
  263. data/spec/spec_helper.rb +6 -2
  264. data/spec/unit/agent_spec.rb +80 -26
  265. data/spec/unit/application/agent_spec.rb +9 -5
  266. data/spec/unit/application/apply_spec.rb +2 -12
  267. data/spec/unit/application/describe_spec.rb +88 -50
  268. data/spec/unit/application/device_spec.rb +2 -2
  269. data/spec/unit/application/filebucket_spec.rb +22 -2
  270. data/spec/unit/application/resource_spec.rb +2 -2
  271. data/spec/unit/concurrent/lock_spec.rb +29 -0
  272. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  273. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  274. data/spec/unit/configurer_spec.rb +400 -406
  275. data/spec/unit/context/trusted_information_spec.rb +17 -0
  276. data/spec/unit/daemon_spec.rb +5 -64
  277. data/spec/unit/defaults_spec.rb +38 -4
  278. data/spec/unit/environments_spec.rb +65 -28
  279. data/spec/unit/face/facts_spec.rb +24 -20
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/plugin_spec.rb +12 -10
  282. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  283. data/spec/unit/file_system_spec.rb +26 -2
  284. data/spec/unit/forge/errors_spec.rb +1 -1
  285. data/spec/unit/forge/forge_spec.rb +12 -54
  286. data/spec/unit/forge/module_release_spec.rb +19 -6
  287. data/spec/unit/forge/repository_spec.rb +63 -157
  288. data/spec/unit/forge_spec.rb +46 -116
  289. data/spec/unit/functions/find_template_spec.rb +69 -0
  290. data/spec/unit/functions/lookup_spec.rb +13 -0
  291. data/spec/unit/http/client_spec.rb +395 -27
  292. data/spec/unit/http/external_client_spec.rb +201 -0
  293. data/spec/unit/http/resolver_spec.rb +81 -12
  294. data/spec/unit/http/response_spec.rb +69 -0
  295. data/spec/unit/http/service/ca_spec.rb +100 -7
  296. data/spec/unit/http/service/compiler_spec.rb +627 -0
  297. data/spec/unit/http/service/file_server_spec.rb +308 -0
  298. data/spec/unit/http/service/report_spec.rb +118 -0
  299. data/spec/unit/http/service_spec.rb +117 -4
  300. data/spec/unit/http/session_spec.rb +237 -19
  301. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  302. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  303. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  304. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  305. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  306. data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
  307. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  308. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  309. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  310. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  311. data/spec/unit/indirector/rest_spec.rb +13 -0
  312. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  313. data/spec/unit/network/http/connection_spec.rb +549 -176
  314. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  315. data/spec/unit/network/http/pool_spec.rb +89 -11
  316. data/spec/unit/network/http_pool_spec.rb +63 -57
  317. data/spec/unit/network/http_spec.rb +1 -1
  318. data/spec/unit/node/environment_spec.rb +16 -0
  319. data/spec/unit/node/facts_spec.rb +2 -1
  320. data/spec/unit/node_spec.rb +7 -4
  321. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  322. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  323. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  324. data/spec/unit/provider/aix_object_spec.rb +16 -2
  325. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  326. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  327. data/spec/unit/provider/package/aix_spec.rb +29 -0
  328. data/spec/unit/provider/package/apt_spec.rb +43 -2
  329. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  330. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  331. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  332. data/spec/unit/provider/package/gem_spec.rb +40 -0
  333. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  334. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  335. data/spec/unit/provider/package/pip_spec.rb +68 -19
  336. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  337. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  338. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  339. data/spec/unit/provider/package/portage_spec.rb +9 -4
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  341. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  342. data/spec/unit/provider/package/yum_spec.rb +292 -0
  343. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  344. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  345. data/spec/unit/provider/service/init_spec.rb +1 -0
  346. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  347. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  348. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  349. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  350. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  351. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  352. data/spec/unit/provider/user/useradd_spec.rb +21 -8
  353. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  354. data/spec/unit/puppet_pal_2pec.rb +0 -26
  355. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  356. data/spec/unit/puppet_spec.rb +47 -0
  357. data/spec/unit/reports/http_spec.rb +70 -52
  358. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  359. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  360. data/spec/unit/ssl/certificate_spec.rb +7 -0
  361. data/spec/unit/ssl/host_spec.rb +4 -2
  362. data/spec/unit/ssl/oids_spec.rb +1 -0
  363. data/spec/unit/ssl/ssl_provider_spec.rb +71 -0
  364. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  365. data/spec/unit/transaction/persistence_spec.rb +1 -10
  366. data/spec/unit/transaction/report_spec.rb +4 -0
  367. data/spec/unit/transaction_spec.rb +45 -1
  368. data/spec/unit/type/file/content_spec.rb +9 -3
  369. data/spec/unit/type/file/ensure_spec.rb +1 -2
  370. data/spec/unit/type/file/source_spec.rb +86 -35
  371. data/spec/unit/type/package_spec.rb +8 -0
  372. data/spec/unit/type/service_spec.rb +9 -8
  373. data/spec/unit/type/user_spec.rb +1 -2
  374. data/spec/unit/util/at_fork_spec.rb +3 -2
  375. data/spec/unit/util/autoload_spec.rb +2 -1
  376. data/spec/unit/util/log/destinations_spec.rb +1 -29
  377. data/spec/unit/util/log_spec.rb +0 -138
  378. data/spec/unit/util/logging_spec.rb +200 -0
  379. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  380. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  381. data/spec/unit/util/package/version/range_spec.rb +175 -0
  382. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  383. data/spec/unit/util/pidlock_spec.rb +112 -42
  384. data/spec/unit/util/plist_spec.rb +20 -0
  385. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  386. data/spec/unit/util/storage_spec.rb +1 -8
  387. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  388. data/spec/unit/util/windows/sid_spec.rb +2 -2
  389. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  390. data/tasks/generate_cert_fixtures.rake +15 -1
  391. data/tasks/manpages.rake +6 -35
  392. metadata +92 -12
  393. data/COMMITTERS.md +0 -244
  394. data/spec/integration/faces/plugin_spec.rb +0 -61
  395. data/spec/lib/puppet_spec/validators.rb +0 -37
@@ -1,8 +1,9 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet_spec/files'
3
3
  require 'puppet_spec/compiler'
4
+ require 'puppet_spec/https'
4
5
 
5
- describe "apply" do
6
+ describe "apply", unless: Puppet::Util::Platform.jruby? do
6
7
  include PuppetSpec::Files
7
8
 
8
9
  before :each do
@@ -257,7 +258,7 @@ end
257
258
  expect(@logs.map(&:to_s)).to include(/{environment =>.*/)
258
259
  end
259
260
 
260
- it "applies a given file even when an ENC is configured", :unless => Puppet::Util::Platform.windows? || RUBY_PLATFORM == 'java' do
261
+ it "applies a given file even when an ENC is configured", :unless => Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
261
262
  manifest = file_containing("manifest.pp", "notice('specific manifest applied')")
262
263
  enc = script_containing('enc_script',
263
264
  :windows => '@echo classes: []' + "\n" + '@echo environment: special',
@@ -378,7 +379,7 @@ end
378
379
  # External node script execution will fail, likely due to the tampering
379
380
  # with the basic file descriptors.
380
381
  # Workaround: Define a log destination and merely inspect logs.
381
- context "with an ENC", :unless => RUBY_PLATFORM == 'java' do
382
+ context "with an ENC" do
382
383
  let(:logdest) { tmpfile('logdest') }
383
384
  let(:args) { ['-e', execute, '--logdest', logdest ] }
384
385
  let(:enc) do
@@ -534,4 +535,132 @@ class amod::bad_type {
534
535
  end
535
536
  end
536
537
  end
538
+
539
+ context 'puppet file sources' do
540
+ let(:env_name) { 'dev' }
541
+ let(:env_dir) { File.join(Puppet[:environmentpath], env_name) }
542
+ let(:env) { Puppet::Node::Environment.create(env_name.to_sym, [File.join(env_dir, 'modules')]) }
543
+ let(:node) { Puppet::Node.new(Puppet[:certname], environment: environment) }
544
+ let(:apply) { Puppet::Application[:apply] }
545
+
546
+ before :each do
547
+ Puppet[:environment] = env_name
548
+ Puppet::FileSystem.mkpath(env_dir)
549
+ end
550
+
551
+ it "recursively copies a directory from a module" do
552
+ dir = File.join(env.full_modulepath, 'amod', 'files', 'dir1', 'dir2')
553
+ Puppet::FileSystem.mkpath(dir)
554
+ File.write(File.join(dir, 'file'), 'content from the module')
555
+
556
+ base_dir = tmpdir('apply_spec_base')
557
+ manifest = file_containing("manifest.pp", <<-MANIFEST)
558
+ file { "#{base_dir}/dir1":
559
+ ensure => file,
560
+ source => "puppet:///modules/amod/dir1",
561
+ recurse => true,
562
+ }
563
+ MANIFEST
564
+
565
+ expect {
566
+ apply.command_line.args << manifest
567
+ apply.run
568
+ }.to exit_with(0)
569
+ .and output(a_string_matching(
570
+ /dir1\]\/ensure: created/
571
+ ).and matching(
572
+ /dir1\/dir2\]\/ensure: created/
573
+ ).and matching(
574
+ /dir1\/dir2\/file\]\/ensure: defined content as '{md5}51f37efb13c3a1e486106f90db6490a5'/
575
+ )).to_stdout
576
+
577
+ dest_file = File.join(base_dir, 'dir1', 'dir2', 'file')
578
+ expect(File.read(dest_file)).to eq("content from the module")
579
+ end
580
+ end
581
+
582
+ context 'http report processor' do
583
+ include_context 'https client'
584
+
585
+ before :each do
586
+ Puppet[:reports] = 'http'
587
+ end
588
+
589
+ let(:apply) { Puppet::Application[:apply] }
590
+ let(:unknown_server) do
591
+ unknown_ca_cert = cert_fixture('unknown-ca.pem')
592
+ PuppetSpec::HTTPSServer.new(
593
+ ca_cert: unknown_ca_cert,
594
+ server_cert: cert_fixture('unknown-127.0.0.1.pem'),
595
+ server_key: key_fixture('unknown-127.0.0.1-key.pem')
596
+ )
597
+ end
598
+
599
+ it 'submits a report via reporturl' do
600
+ report = nil
601
+
602
+ response_proc = -> (req, res) {
603
+ report = Puppet::Transaction::Report.convert_from(:yaml, req.body)
604
+ }
605
+
606
+ https = PuppetSpec::HTTPSServer.new
607
+ https.start_server(response_proc: response_proc) do |https_port|
608
+ Puppet[:reporturl] = "https://127.0.0.1:#{https_port}/reports/upload"
609
+
610
+ expect {
611
+ apply.command_line.args = ['-e', 'notify { "hi": }']
612
+ apply.run
613
+ }.to exit_with(0)
614
+ .and output(/Applied catalog/).to_stdout
615
+
616
+ expect(report).to be_a(Puppet::Transaction::Report)
617
+ expect(report.resource_statuses['Notify[hi]']).to be_a(Puppet::Resource::Status)
618
+ end
619
+ end
620
+
621
+ it 'rejects an HTTPS report server whose root cert is not the puppet CA' do
622
+ unknown_server.start_server do |https_port|
623
+ Puppet[:reporturl] = "https://127.0.0.1:#{https_port}/reports/upload"
624
+
625
+ # processing the report happens after the transaction is finished,
626
+ # so we expect exit code 0, with a later failure on stderr
627
+ expect {
628
+ apply.command_line.args = ['-e', 'notify { "hi": }']
629
+ apply.run
630
+ }.to exit_with(0)
631
+ .and output(/Applied catalog/).to_stdout
632
+ .and output(/Report processor failed: certificate verify failed \[self signed certificate in certificate chain for CN=Unknown CA\]/).to_stderr
633
+ end
634
+ end
635
+
636
+ it 'accepts an HTTPS report servers whose cert is in the system CA store' do
637
+ Puppet[:report_include_system_store] = true
638
+ report = nil
639
+
640
+ response_proc = -> (req, res) {
641
+ report = Puppet::Transaction::Report.convert_from(:yaml, req.body)
642
+ }
643
+
644
+ # create a temp cacert bundle
645
+ ssl_file = tmpfile('systemstore')
646
+ File.write(ssl_file, unknown_server.ca_cert.to_pem)
647
+
648
+ unknown_server.start_server(response_proc: response_proc) do |https_port|
649
+ Puppet[:reporturl] = "https://127.0.0.1:#{https_port}/reports/upload"
650
+
651
+ # override path to system cacert bundle, this must be done before
652
+ # the SSLContext is created and the call to X509::Store.set_default_paths
653
+ Puppet::Util.withenv("SSL_CERT_FILE" => ssl_file) do
654
+ expect {
655
+ apply.command_line.args = ['-e', 'notify { "hi": }']
656
+ apply.run
657
+ }.to exit_with(0)
658
+ .and output(/Applied catalog/).to_stdout
659
+ end
660
+
661
+ expect(report).to be_a(Puppet::Transaction::Report)
662
+ expect(report.resource_statuses['Notify[hi]']).to be_a(Puppet::Resource::Status)
663
+ end
664
+ end
665
+ end
537
666
  end
@@ -0,0 +1,190 @@
1
+ require 'spec_helper'
2
+ require 'puppet/face'
3
+ require 'puppet_spec/puppetserver'
4
+ require 'puppet_spec/files'
5
+
6
+ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
7
+ include PuppetSpec::Files
8
+ include_context "https client"
9
+
10
+ let(:server) { PuppetSpec::Puppetserver.new }
11
+ let(:filebucket) { Puppet::Application[:filebucket] }
12
+ let(:backup_file) { tmpfile('backup_file') }
13
+
14
+ before :each do
15
+ Puppet[:log_level] = 'debug'
16
+ end
17
+
18
+ it "backs up files to the filebucket server" do
19
+ File.binwrite(backup_file, 'some random text')
20
+ md5 = Digest::MD5.file(backup_file).to_s
21
+
22
+ server.start_server do |port|
23
+ Puppet[:masterport] = port
24
+ expect {
25
+ filebucket.command_line.args << 'backup'
26
+ filebucket.command_line.args << backup_file
27
+ filebucket.run
28
+ }.to output(a_string_matching(
29
+ %r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/#{md5}\/#{File.realpath(backup_file)}\?environment\=production returned 404 Not Found}
30
+ ).and matching(
31
+ %r{Debug: HTTP PUT https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/#{md5}\/#{File.realpath(backup_file)}\?environment\=production returned 200 OK}
32
+ ).and matching(
33
+ %r{#{backup_file}: #{md5}}
34
+ )).to_stdout
35
+ end
36
+ end
37
+
38
+ it "doesn't attempt to back up file that already exists on the filebucket server" do
39
+ file_exists_handler = -> (req, res) {
40
+ res.status = 200
41
+ }
42
+
43
+ File.binwrite(backup_file, 'some random text')
44
+ md5 = Digest::MD5.file(backup_file).to_s
45
+
46
+ server.start_server(mounts: {filebucket: file_exists_handler}) do |port|
47
+ Puppet[:masterport] = port
48
+ expect {
49
+ filebucket.command_line.args << 'backup'
50
+ filebucket.command_line.args << backup_file
51
+ filebucket.run
52
+ }.to output(a_string_matching(
53
+ %r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/#{md5}\/#{File.realpath(backup_file)}\?environment\=production returned 200 OK}
54
+ ).and matching(
55
+ %r{#{backup_file}: #{md5}}
56
+ )).to_stdout
57
+ end
58
+ end
59
+
60
+ it "downloads files from the filebucket server" do
61
+ get_handler = -> (req, res) {
62
+ res['Content-Type'] = 'application/octet-stream'
63
+ res.body = 'something to store'
64
+ }
65
+
66
+ server.start_server(mounts: {filebucket: get_handler}) do |port|
67
+ Puppet[:masterport] = port
68
+ expect {
69
+ filebucket.command_line.args << 'get'
70
+ filebucket.command_line.args << 'fac251367c9e083c6b1f0f3181'
71
+ filebucket.run
72
+ }.to output(a_string_matching(
73
+ %r{Debug: HTTP GET https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/fac251367c9e083c6b1f0f3181\?environment\=production returned 200 OK}
74
+ ).and matching(
75
+ %r{something to store}
76
+ )).to_stdout
77
+ end
78
+ end
79
+
80
+ context 'diff', unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
81
+ context 'using a remote bucket' do
82
+ it 'outputs a diff between a local and remote file' do
83
+ File.binwrite(backup_file, "bar\nbaz")
84
+
85
+ get_handler = -> (req, res) {
86
+ res['Content-Type'] = 'application/octet-stream'
87
+ res.body = 'foo'
88
+ }
89
+
90
+ server.start_server(mounts: {filebucket: get_handler}) do |port|
91
+ Puppet[:masterport] = port
92
+ expect {
93
+ filebucket.command_line.args += ['diff', 'fac251367c9e083c6b1f0f3181', backup_file, '--remote']
94
+ filebucket.run
95
+ }.to output(a_string_matching(
96
+ /[-<] ?foo/
97
+ ).and matching(
98
+ /[+>] ?bar/
99
+ ).and matching(
100
+ /[+>] ?baz/
101
+ )).to_stdout
102
+ end
103
+ end
104
+
105
+ it 'outputs a diff between two remote files' do
106
+ get_handler = -> (req, res) {
107
+ res['Content-Type'] = 'application/octet-stream'
108
+ res.body = <<~END
109
+ --- /opt/puppetlabs/server/data/puppetserver/bucket/d/3/b/0/7/3/8/4/d3b07384d113edec49eaa6238ad5ff00/contents\t2020-04-06 21:25:24.892367570 +0000
110
+ +++ /opt/puppetlabs/server/data/puppetserver/bucket/9/9/b/9/9/9/2/0/99b999207e287afffc86c053e5693247/contents\t2020-04-06 21:26:13.603398063 +0000
111
+ @@ -1 +1,2 @@
112
+ -foo
113
+ +bar
114
+ +baz
115
+ END
116
+ }
117
+
118
+ server.start_server(mounts: {filebucket: get_handler}) do |port|
119
+ Puppet[:masterport] = port
120
+ expect {
121
+ filebucket.command_line.args += ['diff', 'd3b07384d113edec49eaa6238ad5ff00', "99b999207e287afffc86c053e5693247", '--remote']
122
+ filebucket.run
123
+ }.to output(a_string_matching(
124
+ /[-<] ?foo/
125
+ ).and matching(
126
+ /[+>] ?bar/
127
+ ).and matching(
128
+ /[+>] ?baz/
129
+ )).to_stdout
130
+ end
131
+ end
132
+ end
133
+
134
+ context 'using a local bucket' do
135
+ let(:filea) {
136
+ f = tmpfile('filea')
137
+ File.binwrite(f, 'foo')
138
+ f
139
+ }
140
+ let(:fileb) {
141
+ f = tmpfile('fileb')
142
+ File.binwrite(f, "bar\nbaz")
143
+ f
144
+ }
145
+ let(:checksuma) { Digest::MD5.file(filea).to_s }
146
+ let(:checksumb) { Digest::MD5.file(fileb).to_s }
147
+
148
+ it 'compares to files stored in a local bucket' do
149
+ expect {
150
+ filebucket.command_line.args = ['backup', filea, '--local']
151
+ filebucket.run
152
+ }.to output(/#{filea}: #{checksuma}/).to_stdout
153
+
154
+ expect{
155
+ filebucket.command_line.args = ['backup', fileb, '--local']
156
+ filebucket.run
157
+ }.to output(/#{fileb}: #{checksumb}\n/).to_stdout
158
+
159
+ expect {
160
+ filebucket.command_line.args = ['diff', checksuma, checksumb, '--local']
161
+ filebucket.run
162
+ }.to output(a_string_matching(
163
+ /[-<] ?foo/
164
+ ).and matching(
165
+ /[+>] ?bar/
166
+ ).and matching(
167
+ /[+>] ?baz/
168
+ )).to_stdout
169
+ end
170
+
171
+ it 'compares a file on the filesystem and a file stored in a local bucket' do
172
+ expect {
173
+ filebucket.command_line.args = ['backup', filea, '--local']
174
+ filebucket.run
175
+ }.to output(/#{filea}: #{checksuma}/).to_stdout
176
+
177
+ expect {
178
+ filebucket.command_line.args = ['diff', checksuma, fileb, '--local']
179
+ filebucket.run
180
+ }.to output(a_string_matching(
181
+ /[-<] ?foo/
182
+ ).and matching(
183
+ /[+>] ?bar/
184
+ ).and matching(
185
+ /[+>] ?baz/
186
+ )).to_stdout
187
+ end
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+ require 'puppet/face'
3
+ require 'puppet_spec/puppetserver'
4
+
5
+ describe "puppet plugin" do
6
+ include_context "https client"
7
+
8
+ let(:server) { PuppetSpec::Puppetserver.new }
9
+ let(:plugin) { Puppet::Application[:plugin] }
10
+ let(:response_body) { "[{\"path\":\"/etc/puppetlabs/code/environments/production/modules\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-03-06 20:14:25 UTC\"},\"type\":\"directory\",\"destination\":null}]" }
11
+
12
+ it "downloads from plugins, pluginsfacts and locales mounts" do
13
+ current_version_handler = -> (req, res) {
14
+ res['X-Puppet-Version'] = Puppet.version
15
+ res['Content-Type'] = 'application/json'
16
+ res.body = response_body
17
+ }
18
+
19
+ server.start_server(mounts: {file_metadatas: current_version_handler}) do |port|
20
+ Puppet[:masterport] = port
21
+ expect {
22
+ plugin.command_line.args << 'download'
23
+ plugin.run
24
+ }.to exit_with(0)
25
+ .and output(matching(
26
+ "Downloaded these plugins: #{Regexp.escape(Puppet[:pluginfactdest])}, #{Regexp.escape(Puppet[:plugindest])}, #{Regexp.escape(Puppet[:localedest])}"
27
+ )).to_stdout
28
+ end
29
+ end
30
+
31
+ it "downloads from plugins and pluginsfacts from older puppetservers" do
32
+ no_locales_handler = -> (req, res) {
33
+ res['X-Puppet-Version'] = '5.3.3' # locales mount was added in 5.3.4
34
+ res['Content-Type'] = 'application/json'
35
+ res.body = response_body
36
+ }
37
+
38
+ server.start_server(mounts: {file_metadatas: no_locales_handler}) do |port|
39
+ Puppet[:masterport] = port
40
+ expect {
41
+ plugin.command_line.args << 'download'
42
+ plugin.run
43
+ }.to exit_with(0)
44
+ .and output(matching(
45
+ "Downloaded these plugins: #{Regexp.escape(Puppet[:pluginfactdest])}, #{Regexp.escape(Puppet[:plugindest])}"
46
+ )).to_stdout
47
+ end
48
+ end
49
+
50
+ it "downloads from an environment that doesn't exist locally" do
51
+ requested_environment = nil
52
+
53
+ current_version_handler = -> (req, res) {
54
+ res['X-Puppet-Version'] = Puppet.version
55
+ res['Content-Type'] = 'application/json'
56
+ res.body = response_body
57
+ requested_environment = req.query['environment']
58
+ }
59
+
60
+ server.start_server(mounts: {file_metadatas: current_version_handler}) do |port|
61
+ Puppet[:environment] = 'doesnotexistontheagent'
62
+ Puppet[:masterport] = port
63
+ expect {
64
+ plugin.command_line.args << 'download'
65
+ plugin.run
66
+ }.to exit_with(0)
67
+ .and output(matching("Downloaded these plugins")).to_stdout
68
+
69
+ expect(requested_environment).to eq('doesnotexistontheagent')
70
+ end
71
+ end
72
+
73
+ end
@@ -70,18 +70,26 @@ describe Puppet::Configurer do
70
70
  end
71
71
 
72
72
  context 'when resubmit_facts is set to true' do
73
- let(:test_facts) { Puppet::Node::Facts.new('configurer.test') }
74
- let(:fact_rest_terminus) { Puppet::Node::Facts.indirection.terminus(:rest) }
73
+ let(:test_facts) { Puppet::Node::Facts.new('configurer.test', {test_fact: 'test value'}) }
75
74
 
76
75
  before(:each) do
77
76
  Puppet[:resubmit_facts] = true
78
77
 
79
78
  allow(@configurer).to receive(:find_facts).and_return(test_facts)
80
- allow(fact_rest_terminus).to receive(:save)
81
79
  end
82
80
 
83
- it 'sends fact data using the rest terminus' do
84
- expect(fact_rest_terminus).to receive(:save)
81
+ it 'uploads facts as application/json' do
82
+ stub_request(:put, "https://puppet:8140/puppet/v3/facts/configurer.test?environment=production").
83
+ with(
84
+ body: hash_including(
85
+ {
86
+ "name" => "configurer.test",
87
+ "values" => {"test_fact" => 'test value',},
88
+ }),
89
+ headers: {
90
+ 'Accept'=>'application/json, application/x-msgpack, text/pson',
91
+ 'Content-Type'=>'application/json',
92
+ })
85
93
 
86
94
  @configurer.run(catalog: @catalog)
87
95
  end
@@ -95,8 +103,8 @@ describe Puppet::Configurer do
95
103
  end
96
104
 
97
105
  it 'logs errors that occur during fact submission' do
98
- allow(fact_rest_terminus).to receive(:save).and_raise('error sending facts')
99
- expect(Puppet).to receive(:log_exception).with(instance_of(RuntimeError),
106
+ stub_request(:put, "https://puppet:8140/puppet/v3/facts/configurer.test?environment=production").to_return(status: 502)
107
+ expect(Puppet).to receive(:log_exception).with(Puppet::HTTP::ResponseError,
100
108
  /^Failed to submit facts/)
101
109
 
102
110
  @configurer.run(catalog: @catalog)
@@ -105,6 +113,17 @@ describe Puppet::Configurer do
105
113
  it 'records time spent resubmitting facts' do
106
114
  report = Puppet::Transaction::Report.new
107
115
 
116
+ stub_request(:put, "https://puppet:8140/puppet/v3/facts/configurer.test?environment=production").
117
+ with(
118
+ body: hash_including({
119
+ "name" => "configurer.test",
120
+ "values" => {"test_fact": "test value"},
121
+ }),
122
+ headers: {
123
+ 'Accept'=>'application/json, application/x-msgpack, text/pson',
124
+ 'Content-Type'=>'application/json',
125
+ }).to_return(status: 200)
126
+
108
127
  @configurer.run(catalog: @catalog, report: report)
109
128
 
110
129
  expect(report.metrics['time'].values).to include(["resubmit_facts", anything, Numeric])