puppet 5.5.17-universal-darwin → 5.5.22-universal-darwin

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

Potentially problematic release.


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

Files changed (340) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +1 -1
  3. data/Gemfile +4 -5
  4. data/Gemfile.lock +59 -55
  5. data/ext/build_defaults.yaml +1 -0
  6. data/ext/cert_inspector +3 -3
  7. data/ext/puppet-test +2 -2
  8. data/ext/regexp_nodes/regexp_nodes.rb +4 -4
  9. data/ext/windows/service/daemon.rb +54 -8
  10. data/install.rb +6 -6
  11. data/lib/puppet.rb +5 -2
  12. data/lib/puppet/agent.rb +5 -13
  13. data/lib/puppet/application.rb +1 -1
  14. data/lib/puppet/application/agent.rb +3 -1
  15. data/lib/puppet/application/apply.rb +2 -2
  16. data/lib/puppet/application/describe.rb +3 -9
  17. data/lib/puppet/application/doc.rb +1 -1
  18. data/lib/puppet/application/filebucket.rb +13 -0
  19. data/lib/puppet/application/lookup.rb +1 -1
  20. data/lib/puppet/application/script.rb +2 -2
  21. data/lib/puppet/configurer.rb +106 -31
  22. data/lib/puppet/configurer/downloader.rb +33 -16
  23. data/lib/puppet/daemon.rb +1 -1
  24. data/lib/puppet/defaults.rb +86 -40
  25. data/lib/puppet/error.rb +9 -1
  26. data/lib/puppet/external/nagios/base.rb +1 -1
  27. data/lib/puppet/face/ca.rb +1 -1
  28. data/lib/puppet/face/module/list.rb +5 -5
  29. data/lib/puppet/face/module/search.rb +1 -1
  30. data/lib/puppet/face/module/uninstall.rb +1 -1
  31. data/lib/puppet/face/module/upgrade.rb +1 -1
  32. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  33. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  34. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  35. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  36. data/lib/puppet/file_system.rb +0 -8
  37. data/lib/puppet/file_system/memory_file.rb +1 -1
  38. data/lib/puppet/file_system/posix.rb +3 -2
  39. data/lib/puppet/file_system/uniquefile.rb +4 -0
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/functions/epp.rb +4 -4
  42. data/lib/puppet/functions/inline_epp.rb +5 -5
  43. data/lib/puppet/functions/new.rb +8 -3
  44. data/lib/puppet/functions/reduce.rb +2 -4
  45. data/lib/puppet/functions/reverse_each.rb +1 -1
  46. data/lib/puppet/functions/step.rb +1 -1
  47. data/lib/puppet/gettext/module_translations.rb +1 -1
  48. data/lib/puppet/graph/rb_tree_map.rb +2 -2
  49. data/lib/puppet/graph/simple_graph.rb +6 -5
  50. data/lib/puppet/indirector/catalog/compiler.rb +8 -0
  51. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  52. data/lib/puppet/indirector/hiera.rb +6 -0
  53. data/lib/puppet/indirector/resource/ral.rb +1 -3
  54. data/lib/puppet/indirector/resource/validator.rb +1 -1
  55. data/lib/puppet/interface.rb +2 -1
  56. data/lib/puppet/loaders.rb +0 -1
  57. data/lib/puppet/metatype/manager.rb +1 -1
  58. data/lib/puppet/module.rb +1 -1
  59. data/lib/puppet/module_tool/applications/builder.rb +1 -1
  60. data/lib/puppet/module_tool/applications/installer.rb +1 -1
  61. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
  62. data/lib/puppet/module_tool/metadata.rb +1 -1
  63. data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
  64. data/lib/puppet/module_tool/tar/mini.rb +1 -1
  65. data/lib/puppet/network/http/api/indirected_routes.rb +13 -12
  66. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  67. data/lib/puppet/network/http/connection.rb +14 -12
  68. data/lib/puppet/network/http/pool.rb +7 -1
  69. data/lib/puppet/network/http/rack/rest.rb +2 -2
  70. data/lib/puppet/network/http/site.rb +1 -1
  71. data/lib/puppet/network/resolver.rb +2 -2
  72. data/lib/puppet/node/environment.rb +11 -3
  73. data/lib/puppet/parser/ast.rb +1 -1
  74. data/lib/puppet/parser/ast/resourceparam.rb +1 -1
  75. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  76. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  77. data/lib/puppet/parser/environment_compiler.rb +3 -0
  78. data/lib/puppet/parser/functions.rb +14 -10
  79. data/lib/puppet/parser/functions/epp.rb +3 -3
  80. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  81. data/lib/puppet/parser/resource.rb +3 -2
  82. data/lib/puppet/parser/resource/param.rb +6 -0
  83. data/lib/puppet/pops/adaptable.rb +7 -13
  84. data/lib/puppet/pops/adapters.rb +8 -4
  85. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  86. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  87. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
  88. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
  89. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  90. data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
  91. data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
  92. data/lib/puppet/pops/issues.rb +5 -0
  93. data/lib/puppet/pops/loaders.rb +1 -1
  94. data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
  95. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  96. data/lib/puppet/pops/merge_strategy.rb +22 -18
  97. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  98. data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
  99. data/lib/puppet/pops/parser/locator.rb +1 -1
  100. data/lib/puppet/pops/parser/pn_parser.rb +17 -16
  101. data/lib/puppet/pops/puppet_stack.rb +51 -48
  102. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  103. data/lib/puppet/pops/types/iterable.rb +34 -8
  104. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  105. data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
  106. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  107. data/lib/puppet/pops/types/string_converter.rb +10 -10
  108. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  109. data/lib/puppet/pops/types/types.rb +3 -3
  110. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  111. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  112. data/lib/puppet/property.rb +1 -1
  113. data/lib/puppet/property/ensure.rb +1 -1
  114. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  115. data/lib/puppet/provider/cron/crontab.rb +1 -1
  116. data/lib/puppet/provider/exec.rb +6 -2
  117. data/lib/puppet/provider/group/groupadd.rb +19 -19
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  120. data/lib/puppet/provider/mount.rb +1 -1
  121. data/lib/puppet/provider/mount/parsed.rb +8 -8
  122. data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
  123. data/lib/puppet/provider/nameservice/pw.rb +2 -2
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +14 -3
  126. data/lib/puppet/provider/package/dnfmodule.rb +141 -0
  127. data/lib/puppet/provider/package/dpkg.rb +16 -18
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +4 -2
  130. data/lib/puppet/provider/package/openbsd.rb +14 -2
  131. data/lib/puppet/provider/package/pip.rb +37 -10
  132. data/lib/puppet/provider/package/pkg.rb +18 -5
  133. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  134. data/lib/puppet/provider/package/pkgng.rb +16 -4
  135. data/lib/puppet/provider/package/portage.rb +4 -4
  136. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  137. data/lib/puppet/provider/package/rpm.rb +6 -6
  138. data/lib/puppet/provider/package/windows/package.rb +1 -1
  139. data/lib/puppet/provider/package/yum.rb +28 -20
  140. data/lib/puppet/provider/package/zypper.rb +1 -0
  141. data/lib/puppet/provider/package_targetable.rb +5 -4
  142. data/lib/puppet/provider/parsedfile.rb +1 -1
  143. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +3 -3
  144. data/lib/puppet/provider/selmodule/semodule.rb +43 -26
  145. data/lib/puppet/provider/service/daemontools.rb +9 -9
  146. data/lib/puppet/provider/service/openbsd.rb +1 -1
  147. data/lib/puppet/provider/service/rcng.rb +2 -2
  148. data/lib/puppet/provider/service/runit.rb +2 -8
  149. data/lib/puppet/provider/service/systemd.rb +31 -13
  150. data/lib/puppet/provider/user/directoryservice.rb +31 -6
  151. data/lib/puppet/provider/user/hpux.rb +1 -1
  152. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  153. data/lib/puppet/provider/user/useradd.rb +39 -20
  154. data/lib/puppet/provider/user/windows_adsi.rb +4 -5
  155. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  156. data/lib/puppet/reference/indirection.rb +2 -2
  157. data/lib/puppet/reference/metaparameter.rb +1 -3
  158. data/lib/puppet/reference/providers.rb +1 -1
  159. data/lib/puppet/reference/type.rb +3 -9
  160. data/lib/puppet/reports.rb +1 -1
  161. data/lib/puppet/resource.rb +1 -1
  162. data/lib/puppet/resource/catalog.rb +1 -1
  163. data/lib/puppet/resource/type.rb +10 -1
  164. data/lib/puppet/settings.rb +3 -3
  165. data/lib/puppet/settings/environment_conf.rb +1 -0
  166. data/lib/puppet/ssl/certificate.rb +2 -1
  167. data/lib/puppet/ssl/certificate_authority.rb +6 -5
  168. data/lib/puppet/ssl/certificate_authority/interface.rb +1 -1
  169. data/lib/puppet/ssl/certificate_factory.rb +2 -2
  170. data/lib/puppet/ssl/host.rb +3 -3
  171. data/lib/puppet/ssl/oids.rb +1 -1
  172. data/lib/puppet/test/test_helper.rb +20 -12
  173. data/lib/puppet/transaction/report.rb +1 -1
  174. data/lib/puppet/transaction/resource_harness.rb +1 -1
  175. data/lib/puppet/type.rb +8 -4
  176. data/lib/puppet/type/cron.rb +1 -1
  177. data/lib/puppet/type/exec.rb +7 -3
  178. data/lib/puppet/type/file.rb +14 -2
  179. data/lib/puppet/type/file/data_sync.rb +5 -1
  180. data/lib/puppet/type/group.rb +4 -2
  181. data/lib/puppet/type/interface.rb +1 -1
  182. data/lib/puppet/type/notify.rb +3 -2
  183. data/lib/puppet/type/package.rb +97 -8
  184. data/lib/puppet/type/schedule.rb +1 -1
  185. data/lib/puppet/type/selboolean.rb +17 -3
  186. data/lib/puppet/type/service.rb +2 -8
  187. data/lib/puppet/type/user.rb +5 -9
  188. data/lib/puppet/util.rb +35 -12
  189. data/lib/puppet/util/autoload.rb +9 -7
  190. data/lib/puppet/util/command_line/trollop.rb +1 -1
  191. data/lib/puppet/util/http_proxy.rb +8 -14
  192. data/lib/puppet/util/instance_loader.rb +1 -1
  193. data/lib/puppet/util/log.rb +1 -1
  194. data/lib/puppet/util/log/destinations.rb +3 -12
  195. data/lib/puppet/util/logging.rb +30 -18
  196. data/lib/puppet/util/metric.rb +2 -2
  197. data/lib/puppet/util/monkey_patches.rb +1 -1
  198. data/lib/puppet/util/nagios_maker.rb +2 -2
  199. data/lib/puppet/util/network_device/cisco/device.rb +1 -1
  200. data/lib/puppet/util/network_device/cisco/interface.rb +2 -2
  201. data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
  202. data/lib/puppet/util/pidlock.rb +12 -6
  203. data/lib/puppet/util/plist.rb +6 -0
  204. data/lib/puppet/util/provider_features.rb +2 -4
  205. data/lib/puppet/util/rdoc.rb +1 -1
  206. data/lib/puppet/util/reference.rb +1 -1
  207. data/lib/puppet/util/resource_template.rb +1 -1
  208. data/lib/puppet/util/selinux.rb +3 -1
  209. data/lib/puppet/util/windows/adsi.rb +60 -30
  210. data/lib/puppet/util/windows/api_types.rb +45 -32
  211. data/lib/puppet/util/windows/eventlog.rb +1 -6
  212. data/lib/puppet/util/windows/principal.rb +8 -6
  213. data/lib/puppet/util/windows/process.rb +16 -15
  214. data/lib/puppet/util/windows/registry.rb +17 -15
  215. data/lib/puppet/util/windows/security.rb +1 -0
  216. data/lib/puppet/util/windows/sid.rb +3 -3
  217. data/lib/puppet/vendor.rb +1 -1
  218. data/lib/puppet/version.rb +1 -1
  219. data/lib/puppet_pal.rb +2 -2
  220. data/locales/puppet.pot +362 -318
  221. data/man/man5/puppet.conf.5 +39 -9
  222. data/man/man8/puppet-agent.8 +2 -2
  223. data/man/man8/puppet-apply.8 +1 -1
  224. data/man/man8/puppet-ca.8 +1 -1
  225. data/man/man8/puppet-catalog.8 +1 -1
  226. data/man/man8/puppet-cert.8 +1 -1
  227. data/man/man8/puppet-certificate.8 +1 -1
  228. data/man/man8/puppet-certificate_request.8 +1 -1
  229. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  230. data/man/man8/puppet-config.8 +1 -1
  231. data/man/man8/puppet-describe.8 +1 -1
  232. data/man/man8/puppet-device.8 +1 -1
  233. data/man/man8/puppet-doc.8 +1 -1
  234. data/man/man8/puppet-epp.8 +1 -1
  235. data/man/man8/puppet-facts.8 +1 -1
  236. data/man/man8/puppet-filebucket.8 +16 -1
  237. data/man/man8/puppet-generate.8 +1 -1
  238. data/man/man8/puppet-help.8 +1 -1
  239. data/man/man8/puppet-key.8 +1 -1
  240. data/man/man8/puppet-lookup.8 +1 -1
  241. data/man/man8/puppet-man.8 +1 -1
  242. data/man/man8/puppet-master.8 +1 -1
  243. data/man/man8/puppet-module.8 +1 -1
  244. data/man/man8/puppet-node.8 +1 -1
  245. data/man/man8/puppet-parser.8 +1 -1
  246. data/man/man8/puppet-plugin.8 +1 -1
  247. data/man/man8/puppet-report.8 +1 -1
  248. data/man/man8/puppet-resource.8 +1 -1
  249. data/man/man8/puppet-script.8 +1 -1
  250. data/man/man8/puppet-status.8 +1 -1
  251. data/man/man8/puppet.8 +2 -2
  252. data/spec/fixtures/integration/provider/mailalias/aliases/test1 +1 -0
  253. data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list.txt +19 -0
  254. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  255. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  256. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  257. data/spec/integration/configurer_spec.rb +66 -0
  258. data/spec/integration/data_binding_spec.rb +1 -0
  259. data/spec/integration/defaults_spec.rb +1 -2
  260. data/spec/integration/faces/plugin_spec.rb +29 -47
  261. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  262. data/spec/integration/parser/compiler_spec.rb +11 -0
  263. data/spec/integration/type/notify_spec.rb +46 -0
  264. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  265. data/spec/integration/util/windows/registry_spec.rb +7 -7
  266. data/spec/shared_contexts/types_setup.rb +2 -0
  267. data/spec/unit/agent_spec.rb +34 -26
  268. data/spec/unit/application/apply_spec.rb +2 -12
  269. data/spec/unit/configurer/downloader_spec.rb +10 -0
  270. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  271. data/spec/unit/configurer_spec.rb +430 -415
  272. data/spec/unit/daemon_spec.rb +0 -1
  273. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  274. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  275. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  276. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  277. data/spec/unit/forge/forge_spec.rb +1 -3
  278. data/spec/unit/forge/repository_spec.rb +1 -3
  279. data/spec/unit/indirector/catalog/compiler_spec.rb +45 -26
  280. data/spec/unit/indirector/resource/ral_spec.rb +4 -4
  281. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  282. data/spec/unit/network/http/connection_spec.rb +43 -1
  283. data/spec/unit/network/http/pool_spec.rb +32 -0
  284. data/spec/unit/node_spec.rb +7 -4
  285. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  286. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  287. data/spec/unit/provider/exec_spec.rb +209 -0
  288. data/spec/unit/provider/group/groupadd_spec.rb +30 -1
  289. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  290. data/spec/unit/provider/package/aix_spec.rb +29 -0
  291. data/spec/unit/provider/package/apt_spec.rb +13 -2
  292. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  293. data/spec/unit/provider/package/dnfmodule_spec.rb +247 -0
  294. data/spec/unit/provider/package/dpkg_spec.rb +35 -7
  295. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  296. data/spec/unit/provider/package/pip_spec.rb +93 -22
  297. data/spec/unit/provider/package/pkg_spec.rb +13 -1
  298. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  299. data/spec/unit/provider/package/pkgng_spec.rb +36 -0
  300. data/spec/unit/provider/package/portage_spec.rb +4 -4
  301. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  302. data/spec/unit/provider/package/yum_spec.rb +90 -0
  303. data/spec/unit/provider/package/zypper_spec.rb +13 -0
  304. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  305. data/spec/unit/provider/selmodule_spec.rb +118 -47
  306. data/spec/unit/provider/service/daemontools_spec.rb +24 -0
  307. data/spec/unit/provider/service/runit_spec.rb +24 -0
  308. data/spec/unit/provider/service/systemd_spec.rb +109 -36
  309. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  310. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  311. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  312. data/spec/unit/provider/user/useradd_spec.rb +81 -16
  313. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  314. data/spec/unit/puppet_pal_2pec.rb +3 -0
  315. data/spec/unit/ssl/certificate_authority_spec.rb +2 -3
  316. data/spec/unit/ssl/certificate_spec.rb +7 -0
  317. data/spec/unit/ssl/host_spec.rb +2 -0
  318. data/spec/unit/test/test_helper_spec.rb +17 -0
  319. data/spec/unit/type/exec_spec.rb +6 -12
  320. data/spec/unit/type/file/content_spec.rb +9 -3
  321. data/spec/unit/type/file_spec.rb +9 -4
  322. data/spec/unit/type/package_spec.rb +8 -0
  323. data/spec/unit/type/selboolean_spec.rb +4 -6
  324. data/spec/unit/type/service_spec.rb +9 -8
  325. data/spec/unit/type/user_spec.rb +19 -13
  326. data/spec/unit/util/execution_spec.rb +16 -0
  327. data/spec/unit/util/http_proxy_spec.rb +97 -0
  328. data/spec/unit/util/log/destinations_spec.rb +2 -26
  329. data/spec/unit/util/log_spec.rb +0 -138
  330. data/spec/unit/util/logging_spec.rb +200 -0
  331. data/spec/unit/util/pidlock_spec.rb +67 -40
  332. data/spec/unit/util/plist_spec.rb +20 -0
  333. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  334. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  335. data/spec/unit/util/windows/sid_spec.rb +2 -2
  336. data/tasks/manpages.rake +1 -0
  337. metadata +16 -7
  338. data/lib/puppet/pops/loader/null_loader.rb +0 -60
  339. data/locales/ja/puppet.po +0 -12114
  340. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -14,14 +14,6 @@ describe Puppet::Application::Apply do
14
14
  Puppet[:reports] = "none"
15
15
  end
16
16
 
17
- after :each do
18
- Puppet::Node::Facts.indirection.reset_terminus_class
19
- Puppet::Node::Facts.indirection.cache_class = nil
20
-
21
- Puppet::Node.indirection.reset_terminus_class
22
- Puppet::Node.indirection.cache_class = nil
23
- end
24
-
25
17
  [:debug,:loadclasses,:test,:verbose,:use_nodes,:detailed_exitcodes,:catalog, :write_catalog_summary].each do |option|
26
18
  it "should declare handle_#{option} method" do
27
19
  expect(@apply).to respond_to("handle_#{option}".to_sym)
@@ -182,13 +174,11 @@ describe Puppet::Application::Apply do
182
174
  Puppet[:prerun_command] = ''
183
175
  Puppet[:postrun_command] = ''
184
176
 
185
- Puppet::Node::Facts.indirection.terminus_class = :memory
186
- Puppet::Node::Facts.indirection.cache_class = :memory
187
177
  Puppet::Node.indirection.terminus_class = :memory
188
178
  Puppet::Node.indirection.cache_class = :memory
189
179
 
190
- @facts = Puppet::Node::Facts.new(Puppet[:node_name_value])
191
- Puppet::Node::Facts.indirection.save(@facts)
180
+ facts = Puppet::Node::Facts.new(Puppet[:node_name_value])
181
+ Puppet::Node::Facts.indirection.save(facts)
192
182
 
193
183
  @node = Puppet::Node.new(Puppet[:node_name_value])
194
184
  Puppet::Node.indirection.save(@node)
@@ -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
@@ -22,10 +22,6 @@ describe Puppet::Configurer::FactHandler do
22
22
 
23
23
  let(:facthandler) { FactHandlerTester.new('production') }
24
24
 
25
- before :each do
26
- Puppet::Node::Facts.indirection.terminus_class = :memory
27
- end
28
-
29
25
  describe "when finding facts" do
30
26
  it "should use the node name value to retrieve the facts" do
31
27
  foo_facts = Puppet::Node::Facts.new('foo')
@@ -1,108 +1,127 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/configurer'
3
+ require 'webmock/rspec'
3
4
 
4
5
  describe Puppet::Configurer do
5
6
  before do
6
- allow(Puppet.settings).to receive(:use).and_return(true)
7
- @agent = Puppet::Configurer.new
8
- allow(@agent).to receive(:init_storage)
9
- allow(Puppet::Util::Storage).to receive(:store)
10
7
  Puppet[:server] = "puppetmaster"
11
8
  Puppet[:report] = true
12
- end
13
9
 
14
- it "should include the Fact Handler module" do
15
- expect(Puppet::Configurer.ancestors).to be_include(Puppet::Configurer::FactHandler)
10
+ catalog.add_resource(resource)
11
+
12
+ allow(Puppet::SSL::Host).to receive(:localhost).and_return(double('host'))
16
13
  end
17
14
 
15
+ let(:configurer) { Puppet::Configurer.new }
16
+ let(:report) { Puppet::Transaction::Report.new }
17
+ let(:catalog) { Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym)) }
18
+ let(:resource) { Puppet::Resource.new(:notice, 'a') }
19
+ let(:facts) { Puppet::Node::Facts.new(Puppet[:node_name_value]) }
20
+
18
21
  describe "when executing a pre-run hook" do
19
22
  it "should do nothing if the hook is set to an empty string" do
20
23
  Puppet.settings[:prerun_command] = ""
21
- expect(Puppet::Util).not_to receive(:exec)
24
+ expect(Puppet::Util::Execution).not_to receive(:execute)
22
25
 
23
- @agent.execute_prerun_command
26
+ configurer.execute_prerun_command
24
27
  end
25
28
 
26
29
  it "should execute any pre-run command provided via the 'prerun_command' setting" do
27
30
  Puppet.settings[:prerun_command] = "/my/command"
28
31
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
29
32
 
30
- @agent.execute_prerun_command
33
+ configurer.execute_prerun_command
31
34
  end
32
35
 
33
36
  it "should fail if the command fails" do
34
37
  Puppet.settings[:prerun_command] = "/my/command"
35
38
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
36
39
 
37
- expect(@agent.execute_prerun_command).to be_falsey
40
+ expect(configurer.execute_prerun_command).to be_falsey
38
41
  end
39
42
  end
40
43
 
41
44
  describe "when executing a post-run hook" do
42
45
  it "should do nothing if the hook is set to an empty string" do
43
46
  Puppet.settings[:postrun_command] = ""
44
- expect(Puppet::Util).not_to receive(:exec)
47
+ expect(Puppet::Util::Execution).not_to receive(:execute)
45
48
 
46
- @agent.execute_postrun_command
49
+ configurer.execute_postrun_command
47
50
  end
48
51
 
49
52
  it "should execute any post-run command provided via the 'postrun_command' setting" do
50
53
  Puppet.settings[:postrun_command] = "/my/command"
51
54
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
52
55
 
53
- @agent.execute_postrun_command
56
+ configurer.execute_postrun_command
54
57
  end
55
58
 
56
59
  it "should fail if the command fails" do
57
60
  Puppet.settings[:postrun_command] = "/my/command"
58
61
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
59
62
 
60
- expect(@agent.execute_postrun_command).to be_falsey
63
+ expect(configurer.execute_postrun_command).to be_falsey
61
64
  end
62
65
  end
63
66
 
64
67
  describe "when executing a catalog run" do
65
68
  before do
66
- allow(Puppet.settings).to receive(:use).and_return(true)
67
- allow(@agent).to receive(:download_plugins)
68
- Puppet::Node::Facts.indirection.terminus_class = :memory
69
- @facts = Puppet::Node::Facts.new(Puppet[:node_name_value])
70
- Puppet::Node::Facts.indirection.save(@facts)
71
-
72
- @catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
73
- allow(@catalog).to receive(:to_ral).and_return(@catalog)
74
69
  Puppet::Resource::Catalog.indirection.terminus_class = :rest
75
- allow(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(@catalog)
76
- allow(@agent).to receive(:send_report)
77
- allow(@agent).to receive(:save_last_run_summary)
78
-
79
- allow(Puppet::Util::Log).to receive(:close_all)
80
- end
81
-
82
- after :all do
83
- Puppet::Node::Facts.indirection.reset_terminus_class
84
- Puppet::Resource::Catalog.indirection.reset_terminus_class
85
- end
86
-
87
- it "should initialize storage" do
88
- expect(Puppet::Util::Storage).to receive(:load)
89
- @agent.run
70
+ allow(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(catalog)
90
71
  end
91
72
 
92
73
  it "downloads plugins when told" do
93
- expect(@agent).to receive(:download_plugins)
94
- @agent.run(:pluginsync => true)
74
+ expect(configurer).to receive(:download_plugins)
75
+ configurer.run(:pluginsync => true)
95
76
  end
96
77
 
97
78
  it "does not download plugins when told" do
98
- expect(@agent).not_to receive(:download_plugins)
99
- @agent.run(:pluginsync => false)
79
+ expect(configurer).not_to receive(:download_plugins)
80
+ configurer.run(:pluginsync => false)
100
81
  end
101
82
 
102
83
  it "should carry on when it can't fetch its node definition" do
103
84
  error = Net::HTTPError.new(400, 'dummy server communication error')
104
85
  expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
105
- expect(@agent.run).to eq(0)
86
+ expect(configurer.run).to eq(0)
87
+ end
88
+
89
+ it "fails the run if pluginsync fails when usecacheonfailure is false" do
90
+ Puppet[:ignore_plugin_errors] = false
91
+
92
+ # --test implies these, set them so we don't fall back to a cached catalog
93
+ Puppet[:use_cached_catalog] = false
94
+ Puppet[:usecacheonfailure] = false
95
+
96
+ body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
97
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
98
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
99
+ )
100
+ stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
101
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
102
+ )
103
+
104
+ configurer.run(pluginsync: true)
105
+
106
+ 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}))
107
+ end
108
+
109
+ it "applies a cached catalog if pluginsync fails when usecacheonfailure is true" do
110
+ Puppet[:ignore_plugin_errors] = false
111
+
112
+ Puppet[:use_cached_catalog] = false
113
+ Puppet[:usecacheonfailure] = true
114
+
115
+ body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
116
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
117
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
118
+ )
119
+ stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
120
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
121
+ )
122
+
123
+ expect(configurer.run(pluginsync: true, :report => report)).to eq(0)
124
+ expect(report.cached_catalog_status).to eq('on_failure')
106
125
  end
107
126
 
108
127
  it "applies a cached catalog when it can't connect to the master" do
@@ -110,208 +129,159 @@ describe Puppet::Configurer do
110
129
 
111
130
  expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
112
131
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_cache => true)).and_raise(error)
113
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_terminus => true)).and_return(@catalog)
132
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_terminus => true)).and_return(catalog)
114
133
 
115
- expect(@agent.run).to eq(0)
134
+ expect(configurer.run).to eq(0)
116
135
  end
117
136
 
118
137
  it "should initialize a transaction report if one is not provided" do
119
- report = Puppet::Transaction::Report.new
120
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
138
+ # host and settings catalogs each create a report...
139
+ expect(Puppet::Transaction::Report).to receive(:new).and_return(report).twice
121
140
 
122
- @agent.run
141
+ configurer.run
123
142
  end
124
143
 
125
144
  it "should respect node_name_fact when setting the host on a report" do
126
145
  Puppet[:node_name_fact] = 'my_name_fact'
127
- @facts.values = {'my_name_fact' => 'node_name_from_fact'}
128
-
129
- report = Puppet::Transaction::Report.new
146
+ facts.values = {'my_name_fact' => 'node_name_from_fact'}
147
+ Puppet::Node::Facts.indirection.save(facts)
130
148
 
131
- @agent.run(:report => report)
149
+ configurer.run(:report => report)
132
150
  expect(report.host).to eq('node_name_from_fact')
133
151
  end
134
152
 
135
- it "should pass the new report to the catalog" do
136
- report = Puppet::Transaction::Report.new
137
- allow(Puppet::Transaction::Report).to receive(:new).and_return(report)
138
- expect(@catalog).to receive(:apply).with(hash_including(report: report))
139
-
140
- @agent.run
141
- end
142
-
143
- it "should use the provided report if it was passed one" do
144
- report = Puppet::Transaction::Report.new
145
- expect(@catalog).to receive(:apply).with(hash_including(report: report))
146
-
147
- @agent.run(:report => report)
148
- end
149
-
150
- it "should set the report as a log destination" do
151
- report = Puppet::Transaction::Report.new
152
-
153
- expect(report).to receive(:<<).with(instance_of(Puppet::Util::Log)).at_least(:once)
153
+ it "creates a new report when applying the catalog" do
154
+ options = {}
155
+ configurer.run(options)
154
156
 
155
- @agent.run(:report => report)
157
+ expect(options[:report].metrics['time']['catalog_application']).to be_an_instance_of(Float)
156
158
  end
157
159
 
158
- it "should retrieve the catalog" do
159
- expect(@agent).to receive(:retrieve_catalog)
160
+ it "uses the provided report when applying the catalog" do
161
+ configurer.run(:report => report)
160
162
 
161
- @agent.run
163
+ expect(report.metrics['time']['catalog_application']).to be_an_instance_of(Float)
162
164
  end
163
165
 
164
166
  it "should log a failure and do nothing if no catalog can be retrieved" do
165
- expect(@agent).to receive(:retrieve_catalog).and_return(nil)
167
+ expect(configurer).to receive(:retrieve_catalog).and_return(nil)
166
168
 
167
169
  expect(Puppet).to receive(:err).with("Could not retrieve catalog; skipping run")
168
170
 
169
- @agent.run
171
+ configurer.run
170
172
  end
171
173
 
172
- it "should apply the catalog with all options to :run" do
173
- expect(@agent).to receive(:retrieve_catalog).and_return(@catalog)
174
+ it "passes arbitrary options when applying the catalog" do
175
+ expect(catalog).to receive(:apply).with(hash_including(one: true))
174
176
 
175
- expect(@catalog).to receive(:apply).with(hash_including(one: true))
176
- @agent.run :one => true
177
- end
178
-
179
- it "should accept a catalog and use it instead of retrieving a different one" do
180
- expect(@agent).not_to receive(:retrieve_catalog)
181
-
182
- expect(@catalog).to receive(:apply)
183
- @agent.run :one => true, :catalog => @catalog
177
+ configurer.run(catalog: catalog, one: true)
184
178
  end
185
179
 
186
180
  it "should benchmark how long it takes to apply the catalog" do
187
- expect(@agent).to receive(:benchmark).with(:notice, instance_of(String))
188
-
189
- expect(@agent).to receive(:retrieve_catalog).and_return(@catalog)
190
-
191
- expect(@catalog).not_to receive(:apply) # because we're not yielding
192
- @agent.run
193
- end
194
-
195
- it "should execute post-run hooks after the run" do
196
- expect(@agent).to receive(:execute_postrun_command)
181
+ configurer.run(report: report)
197
182
 
198
- @agent.run
183
+ expect(report.logs).to include(an_object_having_attributes(level: :notice, message: /Applied catalog in .* seconds/))
199
184
  end
200
185
 
201
186
  it "should create report with passed transaction_uuid and job_id" do
202
- @agent = Puppet::Configurer.new("test_tuuid", "test_jid")
203
- allow(@agent).to receive(:init_storage)
187
+ configurer = Puppet::Configurer.new("test_tuuid", "test_jid")
204
188
 
205
189
  report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
206
190
  expect(Puppet::Transaction::Report).to receive(:new).with(anything, anything, 'test_tuuid', 'test_jid').and_return(report)
207
- expect(@agent).to receive(:send_report).with(report)
191
+ expect(configurer).to receive(:send_report).with(report)
208
192
 
209
- @agent.run
193
+ configurer.run
210
194
  end
211
195
 
212
196
  it "should send the report" do
213
197
  report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
214
198
  expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
215
- expect(@agent).to receive(:send_report).with(report)
199
+ expect(configurer).to receive(:send_report).with(report)
216
200
 
217
201
  expect(report.environment).to eq("test")
218
202
  expect(report.transaction_uuid).to eq("aaaa")
219
203
 
220
- @agent.run
204
+ configurer.run
221
205
  end
222
206
 
223
207
  it "should send the transaction report even if the catalog could not be retrieved" do
224
- expect(@agent).to receive(:retrieve_catalog).and_return(nil)
208
+ expect(configurer).to receive(:retrieve_catalog).and_return(nil)
225
209
 
226
210
  report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
227
211
  expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
228
- expect(@agent).to receive(:send_report).with(report)
212
+ expect(configurer).to receive(:send_report).with(report)
229
213
 
230
214
  expect(report.environment).to eq("test")
231
215
  expect(report.transaction_uuid).to eq("aaaa")
232
216
 
233
- @agent.run
217
+ configurer.run
234
218
  end
235
219
 
236
220
  it "should send the transaction report even if there is a failure" do
237
- expect(@agent).to receive(:retrieve_catalog).and_raise("whatever")
221
+ expect(configurer).to receive(:retrieve_catalog).and_raise("whatever")
238
222
 
239
223
  report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
240
224
  expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
241
- expect(@agent).to receive(:send_report).with(report)
225
+ expect(configurer).to receive(:send_report).with(report)
242
226
 
243
227
  expect(report.environment).to eq("test")
244
228
  expect(report.transaction_uuid).to eq("aaaa")
245
229
 
246
- expect(@agent.run).to be_nil
230
+ expect(configurer.run).to be_nil
247
231
  end
248
232
 
249
233
  it "should remove the report as a log destination when the run is finished" do
250
- report = Puppet::Transaction::Report.new
251
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
252
-
253
- @agent.run
234
+ configurer.run(report: report)
254
235
 
255
236
  expect(Puppet::Util::Log.destinations).not_to include(report)
256
237
  end
257
238
 
258
- it "should return the report exit_status as the result of the run" do
259
- report = Puppet::Transaction::Report.new
260
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
261
- expect(report).to receive(:exit_status).and_return(1234)
239
+ it "should return an exit status of 2 due to the notify resource 'changing'" do
240
+ cat = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
241
+ cat.add_resource(Puppet::Type.type(:notify).new(:name => 'something changed'))
262
242
 
263
- expect(@agent.run).to eq(1234)
243
+ expect(configurer.run(catalog: cat, report: report)).to eq(2)
264
244
  end
265
245
 
266
246
  it "should return nil if catalog application fails" do
267
- expect(@catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
268
- report = Puppet::Transaction::Report.new
269
- expect(@agent.run(catalog: @catalog, report: report)).to be_nil
247
+ expect(catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
248
+
249
+ expect(configurer.run(catalog: catalog, report: report)).to be_nil
270
250
  end
271
251
 
272
252
  it "should send the transaction report even if the pre-run command fails" do
273
- report = Puppet::Transaction::Report.new
274
253
  expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
275
254
 
276
255
  Puppet.settings[:prerun_command] = "/my/command"
277
256
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
278
- expect(@agent).to receive(:send_report).with(report)
257
+ expect(configurer).to receive(:send_report).with(report)
279
258
 
280
- expect(@agent.run).to be_nil
259
+ expect(configurer.run).to be_nil
281
260
  end
282
261
 
283
262
  it "should include the pre-run command failure in the report" do
284
- report = Puppet::Transaction::Report.new
285
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
286
-
287
263
  Puppet.settings[:prerun_command] = "/my/command"
288
264
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
289
265
 
290
- expect(@agent.run).to be_nil
266
+ expect(configurer.run(report: report)).to be_nil
291
267
  expect(report.logs.find { |x| x.message =~ /Could not run command from prerun_command/ }).to be
292
268
  end
293
269
 
294
270
  it "should send the transaction report even if the post-run command fails" do
295
- report = Puppet::Transaction::Report.new
296
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
297
-
298
271
  Puppet.settings[:postrun_command] = "/my/command"
299
272
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
300
- expect(@agent).to receive(:send_report).with(report)
273
+ expect(configurer).to receive(:send_report).with(report)
301
274
 
302
- expect(@agent.run).to be_nil
275
+ expect(configurer.run(report: report)).to be_nil
303
276
  end
304
277
 
305
278
  it "should include the post-run command failure in the report" do
306
- report = Puppet::Transaction::Report.new
307
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
308
-
309
279
  Puppet.settings[:postrun_command] = "/my/command"
310
280
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
311
281
 
312
282
  expect(report).to receive(:<<) { |log, _| expect(log.message).to match(/Could not run command from postrun_command/) }.at_least(:once)
313
283
 
314
- expect(@agent.run).to be_nil
284
+ expect(configurer.run(report: report)).to be_nil
315
285
  end
316
286
 
317
287
  it "should execute post-run command even if the pre-run command fails" do
@@ -320,47 +290,36 @@ describe Puppet::Configurer do
320
290
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/precommand"]).and_raise(Puppet::ExecutionFailure, "Failed")
321
291
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/postcommand"])
322
292
 
323
- expect(@agent.run).to be_nil
293
+ expect(configurer.run).to be_nil
324
294
  end
325
295
 
326
296
  it "should finalize the report" do
327
- report = Puppet::Transaction::Report.new
328
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
329
-
330
297
  expect(report).to receive(:finalize_report)
331
- @agent.run
298
+ configurer.run(report: report)
332
299
  end
333
300
 
334
301
  it "should not apply the catalog if the pre-run command fails" do
335
- report = Puppet::Transaction::Report.new
336
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
337
-
338
302
  Puppet.settings[:prerun_command] = "/my/command"
339
303
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
340
304
 
341
- expect(@catalog).not_to receive(:apply)
342
- expect(@agent).to receive(:send_report)
305
+ expect_any_instance_of(Puppet::Resource::Catalog).not_to receive(:apply)
306
+ expect(configurer).to receive(:send_report)
343
307
 
344
- expect(@agent.run).to be_nil
308
+ expect(configurer.run(report: report)).to be_nil
345
309
  end
346
310
 
347
311
  it "should apply the catalog, send the report, and return nil if the post-run command fails" do
348
- report = Puppet::Transaction::Report.new
349
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
350
-
351
312
  Puppet.settings[:postrun_command] = "/my/command"
352
313
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
353
314
 
354
- expect(@catalog).to receive(:apply)
355
- expect(@agent).to receive(:send_report)
315
+ expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply)
316
+ expect(configurer).to receive(:send_report)
356
317
 
357
- expect(@agent.run).to be_nil
318
+ expect(configurer.run(report: report)).to be_nil
358
319
  end
359
320
 
360
321
  it 'includes total time metrics in the report after successfully applying the catalog' do
361
- report = Puppet::Transaction::Report.new
362
- allow(@catalog).to receive(:apply).with(:report => report)
363
- @agent.run(report: report)
322
+ configurer.run(report: report)
364
323
 
365
324
  expect(report.metrics['time']).to be
366
325
  expect(report.metrics['time']['total']).to be_a_kind_of(Numeric)
@@ -370,17 +329,15 @@ describe Puppet::Configurer do
370
329
  Puppet.settings[:prerun_command] = "/my/command"
371
330
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
372
331
 
373
- report = Puppet::Transaction::Report.new
374
- @agent.run(report: report)
332
+ configurer.run(report: report)
375
333
 
376
334
  expect(report.metrics['time']).to be
377
335
  expect(report.metrics['time']['total']).to be_a_kind_of(Numeric)
378
336
  end
379
337
 
380
338
  it 'includes total time metrics in the report even if catalog retrieval fails' do
381
- report = Puppet::Transaction::Report.new
382
- allow(@agent).to receive(:prepare_and_retrieve_catalog_from_cache).and_raise
383
- @agent.run(:report => report)
339
+ allow(configurer).to receive(:prepare_and_retrieve_catalog_from_cache).and_raise
340
+ configurer.run(:report => report)
384
341
 
385
342
  expect(report.metrics['time']).to be
386
343
  expect(report.metrics['time']['total']).to be_a_kind_of(Numeric)
@@ -388,96 +345,93 @@ describe Puppet::Configurer do
388
345
 
389
346
  it "should refetch the catalog if the server specifies a new environment in the catalog" do
390
347
  catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
391
- expect(@agent).to receive(:retrieve_catalog).and_return(catalog).twice
348
+ expect(configurer).to receive(:retrieve_catalog).and_return(catalog).twice
392
349
 
393
- @agent.run
350
+ configurer.run
394
351
  end
395
352
 
396
- it "should change the environment setting if the server specifies a new environment in the catalog" do
397
- allow(@catalog).to receive(:environment).and_return("second_env")
353
+ it "changes the configurer's environment if the server specifies a new environment in the catalog" do
354
+ allow_any_instance_of(Puppet::Resource::Catalog).to receive(:environment).and_return("second_env")
398
355
 
399
- @agent.run
356
+ configurer.run
400
357
 
401
- expect(@agent.environment).to eq("second_env")
358
+ expect(configurer.environment).to eq("second_env")
402
359
  end
403
360
 
404
- it "should fix the report if the server specifies a new environment in the catalog" do
405
- report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
406
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
407
- expect(@agent).to receive(:send_report).with(report)
408
-
409
- allow(@catalog).to receive(:environment).and_return("second_env")
410
- allow(@agent).to receive(:retrieve_catalog).and_return(@catalog)
361
+ it "changes the report's environment if the server specifies a new environment in the catalog" do
362
+ allow_any_instance_of(Puppet::Resource::Catalog).to receive(:environment).and_return("second_env")
411
363
 
412
- @agent.run
364
+ configurer.run(report: report)
413
365
 
414
366
  expect(report.environment).to eq("second_env")
415
367
  end
416
368
 
417
369
  it "sends the transaction uuid in a catalog request" do
418
- @agent.instance_variable_set(:@transaction_uuid, 'aaa')
370
+ configurer = Puppet::Configurer.new('aaa')
419
371
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(transaction_uuid: 'aaa'))
420
- @agent.run
372
+ configurer.run
421
373
  end
422
374
 
423
375
  it "sends the transaction uuid in a catalog request" do
424
- @agent.instance_variable_set(:@job_id, 'aaa')
376
+ configurer = Puppet::Configurer.new('b', 'aaa')
425
377
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(job_id: 'aaa'))
426
- @agent.run
378
+ configurer.run
427
379
  end
428
380
 
429
381
  it "sets the static_catalog query param to true in a catalog request" do
430
382
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(static_catalog: true))
431
- @agent.run
383
+ configurer.run
432
384
  end
433
385
 
434
386
  it "sets the checksum_type query param to the default supported_checksum_types in a catalog request" do
435
387
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything,
436
388
  hash_including(checksum_type: 'md5.sha256.sha384.sha512.sha224'))
437
- @agent.run
389
+ configurer.run
438
390
  end
439
391
 
440
392
  it "sets the checksum_type query param to the supported_checksum_types setting in a catalog request" do
441
- # Regenerate the agent to pick up the new setting
442
393
  Puppet[:supported_checksum_types] = ['sha256']
443
- @agent = Puppet::Configurer.new
444
- allow(@agent).to receive(:init_storage)
445
- allow(@agent).to receive(:download_plugins)
446
- allow(@agent).to receive(:send_report)
447
- allow(@agent).to receive(:save_last_run_summary)
394
+ # Regenerate the agent to pick up the new setting
395
+ configurer = Puppet::Configurer.new
448
396
 
449
397
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(checksum_type: 'sha256'))
450
- @agent.run
398
+ configurer.run
451
399
  end
452
400
 
453
401
  describe "when not using a REST terminus for catalogs" do
454
402
  it "should not pass any facts when retrieving the catalog" do
403
+ # This is weird, we collect facts when constructing the node,
404
+ # but we don't send them in the indirector request. Then the compiler
405
+ # looks up the node, and collects its facts, which we could have sent
406
+ # in the first place. This seems like a bug.
455
407
  Puppet::Resource::Catalog.indirection.terminus_class = :compiler
456
- expect(@agent).not_to receive(:facts_for_uploading)
408
+
457
409
  expect(Puppet::Resource::Catalog.indirection).to receive(:find) do |name, options|
458
- options[:facts].nil?
459
- end.and_return(@catalog)
410
+ expect(options[:facts]).to be_nil
411
+ end.and_return(catalog)
460
412
 
461
- @agent.run
413
+ configurer.run
462
414
  end
463
415
  end
464
416
 
465
417
  describe "when using a REST terminus for catalogs" do
466
- it "should pass the prepared facts and the facts format as arguments when retrieving the catalog" do
418
+ it "should pass the url encoded facts and facts format as arguments when retrieving the catalog" do
467
419
  Puppet::Resource::Catalog.indirection.terminus_class = :rest
468
- expect(@agent).to receive(:facts_for_uploading).and_return(:facts => "myfacts", :facts_format => :foo)
469
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(facts: "myfacts", facts_format: :foo)).and_return(@catalog)
470
420
 
471
- @agent.run
472
- end
473
- end
474
- end
421
+ facts.values = { 'foo' => 'bar' }
422
+ Puppet::Node::Facts.indirection.save(facts)
423
+
424
+ expect(
425
+ Puppet::Resource::Catalog.indirection
426
+ ).to receive(:find) do |_, options|
427
+ expect(options[:facts_format]).to eq("application/json")
475
428
 
476
- describe "when initialized with a transaction_uuid" do
477
- it "stores it" do
478
- expect(SecureRandom).not_to receive(:uuid)
479
- configurer = Puppet::Configurer.new('foo')
480
- expect(configurer.instance_variable_get(:@transaction_uuid) == 'foo')
429
+ unescaped = JSON.parse(CGI.unescape(options[:facts]))
430
+ expect(unescaped).to include("values" => {"foo" => "bar"})
431
+ end.and_return(catalog)
432
+
433
+ configurer.run
434
+ end
481
435
  end
482
436
  end
483
437
 
@@ -485,56 +439,52 @@ describe Puppet::Configurer do
485
439
  include PuppetSpec::Files
486
440
 
487
441
  before do
488
- allow(Puppet.settings).to receive(:use).and_return(true)
489
- @configurer = Puppet::Configurer.new
490
442
  Puppet[:lastrunfile] = tmpfile('last_run_file')
491
-
492
- @report = Puppet::Transaction::Report.new
493
443
  Puppet[:reports] = "none"
494
444
  end
495
445
 
496
446
  it "should print a report summary if configured to do so" do
497
447
  Puppet.settings[:summarize] = true
498
448
 
499
- expect(@report).to receive(:summary).and_return("stuff")
449
+ expect(report).to receive(:summary).and_return("stuff")
500
450
 
501
- expect(@configurer).to receive(:puts).with("stuff")
502
- @configurer.send_report(@report)
451
+ expect(configurer).to receive(:puts).with("stuff")
452
+ configurer.send_report(report)
503
453
  end
504
454
 
505
455
  it "should not print a report summary if not configured to do so" do
506
456
  Puppet.settings[:summarize] = false
507
457
 
508
- expect(@configurer).not_to receive(:puts)
509
- @configurer.send_report(@report)
458
+ expect(configurer).not_to receive(:puts)
459
+ configurer.send_report(report)
510
460
  end
511
461
 
512
462
  it "should save the report if reporting is enabled" do
513
463
  Puppet.settings[:report] = true
514
464
 
515
- expect(Puppet::Transaction::Report.indirection).to receive(:save).with(@report, nil, instance_of(Hash))
516
- @configurer.send_report(@report)
465
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash))
466
+ configurer.send_report(report)
517
467
  end
518
468
 
519
469
  it "should not save the report if reporting is disabled" do
520
470
  Puppet.settings[:report] = false
521
471
 
522
- expect(Puppet::Transaction::Report.indirection).not_to receive(:save).with(@report, nil, instance_of(Hash))
523
- @configurer.send_report(@report)
472
+ expect(Puppet::Transaction::Report.indirection).not_to receive(:save).with(report, nil, instance_of(Hash))
473
+ configurer.send_report(report)
524
474
  end
525
475
 
526
476
  it "should save the last run summary if reporting is enabled" do
527
477
  Puppet.settings[:report] = true
528
478
 
529
- expect(@configurer).to receive(:save_last_run_summary).with(@report)
530
- @configurer.send_report(@report)
479
+ expect(configurer).to receive(:save_last_run_summary).with(report)
480
+ configurer.send_report(report)
531
481
  end
532
482
 
533
483
  it "should save the last run summary if reporting is disabled" do
534
484
  Puppet.settings[:report] = false
535
485
 
536
- expect(@configurer).to receive(:save_last_run_summary).with(@report)
537
- @configurer.send_report(@report)
486
+ expect(configurer).to receive(:save_last_run_summary).with(report)
487
+ configurer.send_report(report)
538
488
  end
539
489
 
540
490
  it "should log but not fail if saving the report fails" do
@@ -543,7 +493,7 @@ describe Puppet::Configurer do
543
493
  expect(Puppet::Transaction::Report.indirection).to receive(:save).and_raise("whatever")
544
494
 
545
495
  expect(Puppet).to receive(:err)
546
- expect { @configurer.send_report(@report) }.not_to raise_error
496
+ expect { configurer.send_report(report) }.not_to raise_error
547
497
  end
548
498
  end
549
499
 
@@ -551,22 +501,17 @@ describe Puppet::Configurer do
551
501
  include PuppetSpec::Files
552
502
 
553
503
  before do
554
- allow(Puppet.settings).to receive(:use).and_return(true)
555
- @configurer = Puppet::Configurer.new
556
-
557
- @report = double('report', :raw_summary => {})
558
-
559
504
  Puppet[:lastrunfile] = tmpfile('last_run_file')
560
505
  end
561
506
 
562
507
  it "should write the last run file" do
563
- @configurer.save_last_run_summary(@report)
508
+ configurer.save_last_run_summary(report)
564
509
  expect(Puppet::FileSystem.exist?(Puppet[:lastrunfile])).to be_truthy
565
510
  end
566
511
 
567
512
  it "should write the raw summary as yaml" do
568
- expect(@report).to receive(:raw_summary).and_return("summary")
569
- @configurer.save_last_run_summary(@report)
513
+ expect(report).to receive(:raw_summary).and_return("summary")
514
+ configurer.save_last_run_summary(report)
570
515
  expect(File.read(Puppet[:lastrunfile])).to eq(YAML.dump("summary"))
571
516
  end
572
517
 
@@ -582,12 +527,12 @@ describe Puppet::Configurer do
582
527
  expect(Puppet::Util).to receive(:replace_file).and_yield(fh)
583
528
 
584
529
  expect(Puppet).to receive(:err)
585
- expect { @configurer.save_last_run_summary(@report) }.to_not raise_error
530
+ expect { configurer.save_last_run_summary(report) }.to_not raise_error
586
531
  end
587
532
 
588
533
  it "should create the last run file with the correct mode" do
589
534
  expect(Puppet.settings.setting(:lastrunfile)).to receive(:mode).and_return('664')
590
- @configurer.save_last_run_summary(@report)
535
+ configurer.save_last_run_summary(report)
591
536
 
592
537
  if Puppet::Util::Platform.windows?
593
538
  require 'puppet/util/windows/security'
@@ -601,28 +546,37 @@ describe Puppet::Configurer do
601
546
  it "should report invalid last run file permissions" do
602
547
  expect(Puppet.settings.setting(:lastrunfile)).to receive(:mode).and_return('892')
603
548
  expect(Puppet).to receive(:err).with(/Could not save last run local report.*892 is invalid/)
604
- @configurer.save_last_run_summary(@report)
549
+ configurer.save_last_run_summary(report)
605
550
  end
606
551
  end
607
552
 
608
553
  describe "when requesting a node" do
609
554
  it "uses the transaction uuid in the request" do
610
555
  expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(transaction_uuid: anything)).twice
611
- @agent.run
556
+ configurer.run
612
557
  end
613
558
 
614
559
  it "sends an explicitly configured environment request" do
615
560
  expect(Puppet.settings).to receive(:set_by_config?).with(:environment).and_return(true)
616
561
  expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: Puppet[:environment])).twice
617
- @agent.run
562
+ configurer.run
618
563
  end
619
564
 
620
565
  it "does not send a configured_environment when using the default" do
621
566
  expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: nil)).twice
622
- @agent.run
567
+ configurer.run
623
568
  end
624
569
  end
625
570
 
571
+ def expects_pluginsync
572
+ 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}]"
573
+ stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
574
+
575
+ # response retains owner/group/mode due to source_permissions => use
576
+ 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}]"
577
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(status: 200, body: facts_metadata, headers: {'Content-Type' => 'application/json'})
578
+ end
579
+
626
580
  def expects_new_catalog_only(catalog)
627
581
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
628
582
  expect(Puppet::Resource::Catalog.indirection).not_to receive(:find).with(anything, hash_including(ignore_terminus: true))
@@ -639,6 +593,7 @@ describe Puppet::Configurer do
639
593
  end
640
594
 
641
595
  def expects_fallback_to_new_catalog(catalog)
596
+ expects_pluginsync
642
597
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(nil)
643
598
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
644
599
  end
@@ -650,14 +605,6 @@ describe Puppet::Configurer do
650
605
 
651
606
  describe "when retrieving a catalog" do
652
607
  before do
653
- allow(Puppet.settings).to receive(:use).and_return(true)
654
- allow(@agent).to receive(:facts_for_uploading).and_return({})
655
- allow(@agent).to receive(:download_plugins)
656
-
657
- # retrieve a catalog in the current environment, so we don't try to converge unexpectedly
658
- @catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
659
-
660
- # this is the default when using a Configurer instance
661
608
  allow(Puppet::Resource::Catalog.indirection).to receive(:terminus_class).and_return(:rest)
662
609
  end
663
610
 
@@ -667,100 +614,127 @@ describe Puppet::Configurer do
667
614
  end
668
615
 
669
616
  it "should first look in the cache for a catalog" do
670
- expects_cached_catalog_only(@catalog)
617
+ expects_cached_catalog_only(catalog)
671
618
 
672
- expect(@agent.retrieve_catalog({})).to eq(@catalog)
619
+ configurer.run
673
620
  end
674
621
 
675
622
  it "should not make a node request or pluginsync when a cached catalog is successfully retrieved" do
676
623
  expect(Puppet::Node.indirection).not_to receive(:find)
677
- expects_cached_catalog_only(@catalog)
678
- expect(@agent).not_to receive(:download_plugins)
624
+ expects_cached_catalog_only(catalog)
625
+ expect(configurer).not_to receive(:download_plugins)
679
626
 
680
- @agent.run
627
+ configurer.run
681
628
  end
682
629
 
683
630
  it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
684
631
  expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
685
- expects_fallback_to_new_catalog(@catalog)
686
- expect(@agent).to receive(:download_plugins)
632
+ expects_fallback_to_new_catalog(catalog)
687
633
 
688
- @agent.run
634
+ configurer.run
689
635
  end
690
636
 
691
637
  it "should set its cached_catalog_status to 'explicitly_requested'" do
692
- expects_cached_catalog_only(@catalog)
638
+ expects_cached_catalog_only(catalog)
693
639
 
694
- @agent.retrieve_catalog({})
695
- expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('explicitly_requested')
640
+ options = {}
641
+ configurer.run(options)
642
+
643
+ expect(options[:report].cached_catalog_status).to eq('explicitly_requested')
696
644
  end
697
645
 
698
646
  it "should set its cached_catalog_status to 'explicitly requested' if the cached catalog is from a different environment" do
699
647
  cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
700
648
  expects_cached_catalog_only(cached_catalog)
701
649
 
702
- @agent.retrieve_catalog({})
703
- expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('explicitly_requested')
650
+ options = {}
651
+ configurer.run(options)
652
+
653
+ expect(options[:report].cached_catalog_status).to eq('explicitly_requested')
704
654
  end
705
655
 
706
656
  it "should compile a new catalog if none is found in the cache" do
707
- expects_fallback_to_new_catalog(@catalog)
657
+ expects_fallback_to_new_catalog(catalog)
708
658
 
709
- expect(@agent.retrieve_catalog({})).to eq(@catalog)
710
- end
711
-
712
- it "should set its cached_catalog_status to 'not_used' if no catalog is found in the cache" do
713
- expects_fallback_to_new_catalog(@catalog)
659
+ options = {}
660
+ configurer.run(options)
714
661
 
715
- @agent.retrieve_catalog({})
716
- expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
662
+ expect(options[:report].cached_catalog_status).to eq('not_used')
717
663
  end
718
664
 
719
665
  it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
720
666
  expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
721
667
  expects_neither_new_or_cached_catalog
668
+ expects_pluginsync
722
669
 
723
- @agent.run
670
+ configurer.run
724
671
  end
725
672
 
726
673
  it "should return the cached catalog when the environment doesn't match" do
727
674
  cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
728
675
  expects_cached_catalog_only(cached_catalog)
729
676
 
677
+ allow(Puppet).to receive(:info)
730
678
  expect(Puppet).to receive(:info).with("Using cached catalog from environment 'second_env'")
731
- expect(@agent.retrieve_catalog({})).to eq(cached_catalog)
679
+
680
+ configurer.run
681
+ end
682
+
683
+ it "applies the catalog passed as options when the catalog cache terminus is not set" do
684
+ expects_pluginsync
685
+
686
+ catalog.add_resource(Puppet::Resource.new('notify', 'from apply'))
687
+ configurer.run(catalog: catalog.to_ral)
688
+
689
+ # make sure cache class is not set to avoid surprises later
690
+ expect(Puppet::Resource::Catalog.indirection).to_not be_cache
691
+ expect(@logs).to include(an_object_having_attributes(level: :notice, message: /defined 'message' as 'from apply'/))
692
+ end
693
+
694
+ it "applies the cached catalog when the catalog cache terminus is set, ignoring the catalog passed as options" do
695
+ Puppet::Resource::Catalog.indirection.cache_class = :json
696
+
697
+ cached_catalog = Puppet::Resource::Catalog.new(Puppet[:node_name_value], Puppet[:environment])
698
+ cached_catalog.add_resource(Puppet::Resource.new('notify', 'from cache'))
699
+
700
+ # update cached catalog
701
+ Puppet.settings.use(:main, :agent)
702
+ path = Puppet::Resource::Catalog.indirection.cache.path(cached_catalog.name)
703
+ FileUtils.mkdir(File.dirname(path))
704
+ File.write(path, cached_catalog.render(:json))
705
+
706
+ configurer.run(catalog: catalog.to_ral)
707
+
708
+ expect(@logs).to include(an_object_having_attributes(level: :notice, message: /defined 'message' as 'from cache'/))
732
709
  end
733
710
  end
734
711
 
735
712
  describe "and strict environment mode is set" do
736
713
  before do
737
- allow(@catalog).to receive(:to_ral).and_return(@catalog)
738
- allow(@catalog).to receive(:write_class_file)
739
- allow(@catalog).to receive(:write_resource_file)
740
- allow(@agent).to receive(:send_report)
741
- allow(@agent).to receive(:save_last_run_summary)
742
714
  Puppet.settings[:strict_environment_mode] = true
743
715
  end
744
716
 
745
717
  it "should not make a node request" do
746
718
  expect(Puppet::Node.indirection).not_to receive(:find)
747
719
 
748
- @agent.run
720
+ configurer.run
749
721
  end
750
722
 
751
723
  it "should return nil when the catalog's environment doesn't match the agent specified environment" do
752
- @agent.instance_variable_set(:@environment, 'second_env')
753
- expects_new_catalog_only(@catalog)
724
+ Puppet[:environment] = 'second_env'
725
+ configurer = Puppet::Configurer.new
726
+
727
+ catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote("production"))
728
+ expects_new_catalog_only(catalog)
754
729
 
755
730
  expect(Puppet).to receive(:err).with("Not using catalog because its environment 'production' does not match agent specified environment 'second_env' and strict_environment_mode is set")
756
- expect(@agent.run).to be_nil
731
+ expect(configurer.run).to be_nil
757
732
  end
758
733
 
759
- it "should not return nil when the catalog's environment matches the agent specified environment" do
760
- @agent.instance_variable_set(:@environment, 'production')
761
- expects_new_catalog_only(@catalog)
734
+ it "should return 0 when the catalog's environment matches the agent specified environment" do
735
+ expects_new_catalog_only(catalog)
762
736
 
763
- expect(@agent.run).to eq(0)
737
+ expect(configurer.run).to eq(0)
764
738
  end
765
739
 
766
740
  describe "and a cached catalog is explicitly requested" do
@@ -769,83 +743,81 @@ describe Puppet::Configurer do
769
743
  end
770
744
 
771
745
  it "should return nil when the cached catalog's environment doesn't match the agent specified environment" do
772
- @agent.instance_variable_set(:@environment, 'second_env')
773
- expects_cached_catalog_only(@catalog)
746
+ Puppet[:environment] = 'second_env'
747
+ configurer = Puppet::Configurer.new
748
+
749
+ catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote("production"))
750
+ expects_cached_catalog_only(catalog)
774
751
 
775
752
  expect(Puppet).to receive(:err).with("Not using catalog because its environment 'production' does not match agent specified environment 'second_env' and strict_environment_mode is set")
776
- expect(@agent.run).to be_nil
753
+ expect(configurer.run).to be_nil
777
754
  end
778
755
 
779
756
  it "should proceed with the cached catalog if its environment matchs the local environment" do
780
- Puppet.settings[:use_cached_catalog] = true
781
- @agent.instance_variable_set(:@environment, 'production')
782
- expects_cached_catalog_only(@catalog)
757
+ expects_cached_catalog_only(catalog)
783
758
 
784
- expect(@agent.run).to eq(0)
759
+ expect(configurer.run).to eq(0)
785
760
  end
786
761
  end
787
762
  end
788
763
 
789
- it "should use the Catalog class to get its catalog" do
790
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(@catalog)
791
-
792
- @agent.retrieve_catalog({})
793
- end
794
-
795
764
  it "should set its cached_catalog_status to 'not_used' when downloading a new catalog" do
796
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(@catalog)
765
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
797
766
 
798
- @agent.retrieve_catalog({})
799
- expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
767
+ options = {}
768
+ configurer.run(options)
769
+
770
+ expect(options[:report].cached_catalog_status).to eq('not_used')
800
771
  end
801
772
 
802
773
  it "should use its node_name_value to retrieve the catalog" do
803
- allow(Facter).to receive(:value).and_return("eh")
804
- Puppet.settings[:node_name_value] = "myhost.domain.com"
805
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with("myhost.domain.com", anything).and_return(@catalog)
806
-
807
- @agent.retrieve_catalog({})
808
- end
774
+ myhost_facts = Puppet::Node::Facts.new("myhost.domain.com")
775
+ Puppet::Node::Facts.indirection.save(myhost_facts)
809
776
 
810
- it "should default to returning a catalog retrieved directly from the server, skipping the cache" do
811
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(@catalog)
777
+ Puppet.settings[:node_name_value] = "myhost.domain.com"
778
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with("myhost.domain.com", anything).and_return(catalog)
812
779
 
813
- expect(@agent.retrieve_catalog({})).to eq(@catalog)
780
+ configurer.run
814
781
  end
815
782
 
816
- it "should log and return the cached catalog when no catalog can be retrieved from the server" do
817
- expects_fallback_to_cached_catalog(@catalog)
783
+ it "should log when no catalog can be retrieved from the server" do
784
+ expects_fallback_to_cached_catalog(catalog)
818
785
 
786
+ allow(Puppet).to receive(:info)
819
787
  expect(Puppet).to receive(:info).with("Using cached catalog from environment 'production'")
820
- expect(@agent.retrieve_catalog({})).to eq(@catalog)
788
+ configurer.run
821
789
  end
822
790
 
823
791
  it "should set its cached_catalog_status to 'on_failure' when no catalog can be retrieved from the server" do
824
- expects_fallback_to_cached_catalog(@catalog)
792
+ expects_fallback_to_cached_catalog(catalog)
793
+
794
+ options = {}
795
+ configurer.run(options)
825
796
 
826
- @agent.retrieve_catalog({})
827
- expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('on_failure')
797
+ expect(options[:report].cached_catalog_status).to eq('on_failure')
828
798
  end
829
799
 
830
800
  it "should not look in the cache for a catalog if one is returned from the server" do
831
- expects_new_catalog_only(@catalog)
801
+ expects_new_catalog_only(catalog)
832
802
 
833
- expect(@agent.retrieve_catalog({})).to eq(@catalog)
803
+ configurer.run
834
804
  end
835
805
 
836
806
  it "should return the cached catalog when retrieving the remote catalog throws an exception" do
837
807
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_raise("eh")
838
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(@catalog)
808
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(catalog)
839
809
 
840
- expect(@agent.retrieve_catalog({})).to eq(@catalog)
810
+ configurer.run
841
811
  end
842
812
 
843
813
  it "should set its cached_catalog_status to 'on_failure' when retrieving the remote catalog throws an exception" do
844
814
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_raise("eh")
845
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(@catalog)
815
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(catalog)
816
+
817
+ options = {}
818
+ configurer.run(options)
846
819
 
847
- @agent.retrieve_catalog({})
848
- expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('on_failure')
820
+ expect(options[:report].cached_catalog_status).to eq('on_failure')
849
821
  end
850
822
 
851
823
  it "should log and return nil if no catalog can be retrieved from the server and :usecacheonfailure is disabled" do
@@ -854,120 +826,173 @@ describe Puppet::Configurer do
854
826
 
855
827
  expect(Puppet).to receive(:warning).with('Not using cache on failed catalog')
856
828
 
857
- expect(@agent.retrieve_catalog({})).to be_nil
829
+ expect(configurer.run).to be_nil
858
830
  end
859
831
 
860
832
  it "should set its cached_catalog_status to 'not_used' if no catalog can be retrieved from the server and :usecacheonfailure is disabled or fails to retrieve a catalog" do
861
833
  Puppet[:usecacheonfailure] = false
862
834
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(nil)
863
835
 
864
- @agent.retrieve_catalog({})
865
- expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
836
+ options = {}
837
+ configurer.run(options)
838
+
839
+ expect(options[:report].cached_catalog_status).to eq('not_used')
866
840
  end
867
841
 
868
842
  it "should return nil if no cached catalog is available and no catalog can be retrieved from the server" do
869
843
  expects_neither_new_or_cached_catalog
870
844
 
871
- expect(@agent.retrieve_catalog({})).to be_nil
845
+ expect(configurer.run).to be_nil
872
846
  end
873
847
 
874
848
  it "should return nil if its cached catalog environment doesn't match server-specified environment" do
875
849
  cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
876
- @agent.instance_variable_set(:@node_environment, 'production')
877
850
 
878
851
  expects_fallback_to_cached_catalog(cached_catalog)
879
852
 
853
+ allow(Puppet).to receive(:err)
880
854
  expect(Puppet).to receive(:err).with("Not using cached catalog because its environment 'second_env' does not match 'production'")
881
- expect(@agent.retrieve_catalog({})).to be_nil
855
+ expect(configurer.run).to be_nil
882
856
  end
883
857
 
884
858
  it "should set its cached_catalog_status to 'not_used' if the cached catalog environment doesn't match server-specified environment" do
885
859
  cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
886
- @agent.instance_variable_set(:@node_environment, 'production')
887
-
888
- expects_fallback_to_cached_catalog(cached_catalog)
889
-
890
- @agent.retrieve_catalog({})
891
- expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
892
- end
893
-
894
- it "should return its cached catalog if the environment matches the server-specified environment" do
895
- cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment]))
896
- @agent.instance_variable_set(:@node_environment, cached_catalog.environment)
897
860
 
898
861
  expects_fallback_to_cached_catalog(cached_catalog)
899
862
 
900
- expect(@agent.retrieve_catalog({})).to eq(cached_catalog)
863
+ options = {}
864
+ configurer.run(options)
865
+ expect(options[:report].cached_catalog_status).to eq('not_used')
901
866
  end
902
867
 
903
868
  it "should set its cached_catalog_status to 'on_failure' if the cached catalog environment matches server-specified environment" do
904
- cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment]))
905
- @agent.instance_variable_set(:@node_environment, cached_catalog.environment)
906
-
907
- expects_fallback_to_cached_catalog(cached_catalog)
869
+ expects_fallback_to_cached_catalog(catalog)
908
870
 
909
- @agent.retrieve_catalog({})
910
- expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('on_failure')
871
+ options = {}
872
+ configurer.run(options)
873
+ expect(options[:report].cached_catalog_status).to eq('on_failure')
911
874
  end
912
875
 
913
876
  it "should not update the cached catalog in noop mode" do
914
877
  Puppet[:noop] = true
915
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true, ignore_cache_save: true)).and_return(@catalog)
916
878
 
917
- @agent.retrieve_catalog({})
879
+ stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
880
+
881
+ Puppet::Resource::Catalog.indirection.cache_class = :json
882
+ path = Puppet::Resource::Catalog.indirection.cache.path(catalog.name)
883
+
884
+ expect(File).to_not be_exist(path)
885
+ configurer.run
886
+ expect(File).to_not be_exist(path)
918
887
  end
919
888
 
920
889
  it "should update the cached catalog when not in noop mode" do
921
890
  Puppet[:noop] = false
922
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true, ignore_cache_save: false)).and_return(@catalog)
891
+ Puppet[:log_level] = 'info'
892
+
893
+ stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
894
+
895
+ Puppet::Resource::Catalog.indirection.cache_class = :json
896
+ cache_path = Puppet::Resource::Catalog.indirection.cache.path(Puppet[:node_name_value])
923
897
 
924
- @agent.retrieve_catalog({})
898
+ expect(File).to_not be_exist(cache_path)
899
+ configurer.run
900
+ expect(File).to be_exist(cache_path)
901
+
902
+ expect(@logs).to include(an_object_having_attributes(level: :info, message: "Caching catalog for #{Puppet[:node_name_value]}"))
903
+ end
904
+
905
+ it "successfully applies the catalog without a cache" do
906
+ stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
907
+
908
+ Puppet::Resource::Catalog.indirection.cache_class = nil
909
+
910
+ expect(configurer.run).to eq(0)
911
+ end
912
+
913
+ it "should not update the cached catalog when running puppet apply" do
914
+ Puppet::Resource::Catalog.indirection.cache_class = :json
915
+ path = Puppet::Resource::Catalog.indirection.cache.path(catalog.name)
916
+
917
+ expect(File).to_not be_exist(path)
918
+ configurer.run(catalog: catalog)
919
+ expect(File).to_not be_exist(path)
925
920
  end
926
921
  end
927
922
 
928
- describe "when converting the catalog" do
929
- before do
930
- allow(Puppet.settings).to receive(:use).and_return(true)
923
+ describe "when converging the environment" do
924
+ let(:apple) { Puppet::Resource::Catalog.new(Puppet[:node_name_value], Puppet::Node::Environment.remote('apple')) }
925
+ let(:banana) { Puppet::Resource::Catalog.new(Puppet[:node_name_value], Puppet::Node::Environment.remote('banana')) }
931
926
 
932
- allow(catalog).to receive(:to_ral).and_return(ral_catalog)
927
+ before :each do
928
+ apple.add_resource(resource)
929
+ banana.add_resource(resource)
933
930
  end
934
931
 
935
- let (:catalog) { Puppet::Resource::Catalog.new('tester', Puppet::Node::Environment.remote(Puppet[:environment].to_sym)) }
936
- let (:ral_catalog) { Puppet::Resource::Catalog.new('tester', Puppet::Node::Environment.remote(Puppet[:environment].to_sym)) }
932
+ it "converges after multiple attempts" do
933
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(apple, banana, banana)
937
934
 
938
- it "should convert the catalog to a RAL-formed catalog" do
939
- expect(@agent.convert_catalog(catalog, 10)).to equal(ral_catalog)
935
+ allow(Puppet).to receive(:notice)
936
+ expect(Puppet).to receive(:notice).with("Local environment: 'production' doesn't match server specified environment 'apple', restarting agent run with environment 'apple'")
937
+ expect(Puppet).to receive(:notice).with("Local environment: 'apple' doesn't match server specified environment 'banana', restarting agent run with environment 'banana'")
938
+
939
+ configurer.run
940
940
  end
941
941
 
942
- it "should finalize the catalog" do
943
- expect(ral_catalog).to receive(:finalize)
942
+ it "raises if it can't converge after 4 tries after the initial catalog request" do
943
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(apple, banana, apple, banana, apple)
944
+
945
+ expect(Puppet).to receive(:err).with("Failed to apply catalog: Catalog environment didn't stabilize after 4 fetches, aborting run")
944
946
 
945
- @agent.convert_catalog(catalog, 10)
947
+ configurer.run
946
948
  end
949
+ end
947
950
 
948
- it "should record the passed retrieval time with the RAL catalog" do
949
- expect(ral_catalog).to receive(:retrieval_duration=).with(10)
951
+ describe "when converting the catalog" do
952
+ it "converts Puppet::Resource into Puppet::Type::Notify" do
953
+ expect(configurer).to receive(:apply_catalog) do |ral, _|
954
+ expect(ral.resources).to contain(an_instance_of(Puppet::Type::Notify))
955
+ end
950
956
 
951
- @agent.convert_catalog(catalog, 10)
957
+ configurer.run(catalog: catalog)
952
958
  end
953
959
 
954
- it "should write the RAL catalog's class file" do
955
- expect(ral_catalog).to receive(:write_class_file)
960
+ it "adds default schedules" do
961
+ expect(configurer).to receive(:apply_catalog) do |ral, _|
962
+ expect(ral.resources.map(&:to_ref)).to contain(%w{Schedule[puppet] Schedule[hourly] Schedule[daily] Schedule[weekly] Schedule[monthly] Schedule[never]})
963
+ end
956
964
 
957
- @agent.convert_catalog(catalog, 10)
965
+ configurer.run
958
966
  end
959
967
 
960
- it "should write the RAL catalog's resource file" do
961
- expect(ral_catalog).to receive(:write_resource_file)
968
+ it "records the retrieval duration to the catalog" do
969
+ expect(configurer).to receive(:apply_catalog) do |ral, _|
970
+ expect(ral.retrieval_duration).to be_an_instance_of(Float)
971
+ end
962
972
 
963
- @agent.convert_catalog(catalog, 10)
973
+ configurer.run
964
974
  end
965
975
 
966
- it "should set catalog conversion time on the report" do
967
- report = Puppet::Transaction::Report.new
976
+ it "writes the class file containing applied settings classes" do
977
+ expect(File).to_not be_exist(Puppet[:classfile])
978
+
979
+ configurer.run
968
980
 
969
- expect(report).to receive(:add_times).with(:convert_catalog, kind_of(Numeric))
970
- @agent.convert_catalog(catalog, 10, {:report => report})
981
+ expect(File.read(Puppet[:classfile]).chomp).to eq('settings')
982
+ end
983
+
984
+ it "writes an empty resource file since no resources are 'managed'" do
985
+ expect(File).to_not be_exist(Puppet[:resourcefile])
986
+
987
+ configurer.run
988
+
989
+ expect(File.read(Puppet[:resourcefile]).chomp).to eq("")
990
+ end
991
+
992
+ it "adds the conversion time to the report" do
993
+ configurer.run(report: report)
994
+
995
+ expect(report.metrics['time']['convert_catalog']).to be_an_instance_of(Float)
971
996
  end
972
997
  end
973
998
 
@@ -1002,80 +1027,70 @@ describe Puppet::Configurer do
1002
1027
  describe "when attempting failover" do
1003
1028
  it "should not failover if server_list is not set" do
1004
1029
  Puppet.settings[:server_list] = []
1005
- expect(@agent).not_to receive(:find_functional_server)
1006
- @agent.run
1030
+ configurer.run
1007
1031
  end
1008
1032
 
1009
1033
  it "should not failover during an apply run" do
1010
1034
  Puppet.settings[:server_list] = ["myserver:123"]
1011
- expect(@agent).not_to receive(:find_functional_server)
1012
1035
  catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
1013
- @agent.run :catalog => catalog
1036
+ configurer.run(catalog: catalog)
1014
1037
  end
1015
1038
 
1016
1039
  it "should select a server when it receives 200 OK response" do
1017
1040
  Puppet.settings[:server_list] = ["myserver:123"]
1018
- response = Net::HTTPOK.new(nil, 200, 'OK')
1019
- allow(Puppet::Network::HttpPool).to receive(:http_ssl_instance).with('myserver', '123').and_return(double('request', get: response))
1020
- allow(@agent).to receive(:run_internal)
1041
+
1042
+ stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 200)
1021
1043
 
1022
1044
  options = {}
1023
- @agent.run(options)
1045
+ configurer.run(options)
1024
1046
  expect(options[:report].master_used).to eq('myserver:123')
1025
1047
  end
1026
1048
 
1027
1049
  it "should select a server when it receives 403 Forbidden" do
1028
1050
  Puppet.settings[:server_list] = ["myserver:123"]
1029
- response = Net::HTTPForbidden.new(nil, 403, 'Forbidden')
1030
- allow(Puppet::Network::HttpPool).to receive(:http_ssl_instance).with('myserver', '123').and_return(double('request', get: response))
1031
- allow(@agent).to receive(:run_internal)
1051
+
1052
+ stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 403)
1032
1053
 
1033
1054
  options = {}
1034
- @agent.run(options)
1055
+ configurer.run(options)
1035
1056
  expect(options[:report].master_used).to eq('myserver:123')
1036
1057
  end
1037
1058
 
1038
- it "queries the simple status for the 'master' service" do
1039
- Puppet.settings[:server_list] = ["myserver:123"]
1040
- response = Net::HTTPOK.new(nil, 200, 'OK')
1041
- http = double('request')
1042
- expect(http).to receive(:get).with('/status/v1/simple/master').and_return(response)
1043
- allow(Puppet::Network::HttpPool).to receive(:http_ssl_instance).with('myserver', '123').and_return(http)
1044
- allow(@agent).to receive(:run_internal)
1045
-
1046
- @agent.run
1047
- end
1048
-
1049
1059
  it "should report when a server is unavailable" do
1050
1060
  Puppet.settings[:server_list] = ["myserver:123"]
1051
- response = Net::HTTPInternalServerError.new(nil, 500, 'Internal Server Error')
1052
- allow(Puppet::Network::HttpPool).to receive(:http_ssl_instance).with('myserver', '123').and_return(double('request', get: response))
1053
- allow(@agent).to receive(:run_internal)
1054
1061
 
1062
+ stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: [500, "Internal Server Error"])
1063
+
1064
+ allow(Puppet).to receive(:debug)
1055
1065
  expect(Puppet).to receive(:debug).with("Puppet server myserver:123 is unavailable: 500 Internal Server Error")
1056
- expect { @agent.run }.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list:/)
1066
+ expect {
1067
+ configurer.run
1068
+ }.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list:/)
1057
1069
  end
1058
1070
 
1059
1071
  it "should error when no servers in 'server_list' are reachable" do
1060
1072
  Puppet.settings[:server_list] = "myserver:123,someotherservername"
1061
- pool = Puppet::Network::HTTP::Pool.new(Puppet[:http_keepalive_timeout])
1062
- allow(Puppet::Network::HTTP::Pool).to receive(:new).and_return(pool)
1063
- allow(Puppet).to receive(:override).with({:http_pool => pool}).and_yield
1064
- allow(Puppet).to receive(:override).with({:server => "myserver", :serverport => '123'}).and_yield
1065
- allow(Puppet).to receive(:override).with({:server => "someotherservername", :serverport => 8140}).and_yield
1066
- error = Net::HTTPError.new(400, 'dummy server communication error')
1067
- allow(Puppet::Node.indirection).to receive(:find).and_raise(error)
1068
- expect{ @agent.run }.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list: 'myserver:123,someotherservername'/)
1073
+
1074
+ stub_request(:get, 'https://myserver/status/v1/simple/master').to_return(status: 400)
1075
+ stub_request(:get, 'https://someotherservername/status/v1/simple/master').to_return(status: 400)
1076
+
1077
+ expect{
1078
+ configurer.run
1079
+ }.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list: 'myserver:123,someotherservername'/)
1069
1080
  end
1070
1081
 
1071
- it "should not make multiple node requets when the server is found" do
1072
- response = Net::HTTPOK.new(nil, 200, 'OK')
1073
- allow(Puppet::Network::HttpPool).to receive(:http_ssl_instance).with('myserver', '123').and_return(double('request', get: response))
1074
-
1082
+ it "should not make multiple node requests when the server is found" do
1075
1083
  Puppet.settings[:server_list] = ["myserver:123"]
1076
- expect(Puppet::Node.indirection).to receive(:find).and_return("mynode").once
1077
- expect(@agent).to receive(:prepare_and_retrieve_catalog).and_return(nil)
1078
- @agent.run
1084
+ Puppet::Node.indirection.terminus_class = :rest
1085
+ Puppet::Resource::Catalog.indirection.terminus_class = :rest
1086
+
1087
+ stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 200)
1088
+ stub_request(:get, %r{https://myserver:123/puppet/v3/catalog}).to_return(status: 200)
1089
+ node_request = stub_request(:get, %r{https://myserver:123/puppet/v3/node/}).to_return(status: 200)
1090
+
1091
+ configurer.run
1092
+
1093
+ expect(node_request).to have_been_requested.once
1079
1094
  end
1080
1095
  end
1081
1096
  end