puppet 4.2.3-x64-mingw32 → 4.3.0-x64-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 (337) hide show
  1. data/Gemfile +3 -0
  2. data/README.md +1 -1
  3. data/ext/debian/puppet.init +0 -1
  4. data/ext/debian/puppet.logrotate +14 -5
  5. data/ext/osx/puppet.plist +0 -2
  6. data/ext/redhat/client.init +13 -5
  7. data/ext/redhat/logrotate +15 -3
  8. data/ext/redhat/puppet.spec.erb +5 -1
  9. data/ext/redhat/server.init +1 -1
  10. data/ext/systemd/puppet.service +1 -0
  11. data/lib/puppet.rb +12 -0
  12. data/lib/puppet/agent.rb +4 -4
  13. data/lib/puppet/agent/locker.rb +11 -2
  14. data/lib/puppet/application/agent.rb +5 -1
  15. data/lib/puppet/application/apply.rb +4 -0
  16. data/lib/puppet/application/filebucket.rb +78 -4
  17. data/lib/puppet/application/lookup.rb +356 -0
  18. data/lib/puppet/application/master.rb +3 -0
  19. data/lib/puppet/configurer.rb +9 -5
  20. data/lib/puppet/context.rb +16 -1
  21. data/lib/puppet/context/trusted_information.rb +21 -1
  22. data/lib/puppet/daemon.rb +17 -13
  23. data/lib/puppet/data_binding.rb +4 -2
  24. data/lib/puppet/data_providers.rb +12 -13
  25. data/lib/puppet/data_providers/data_adapter.rb +7 -68
  26. data/lib/puppet/data_providers/data_function_support.rb +5 -26
  27. data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
  28. data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
  29. data/lib/puppet/data_providers/hiera_config.rb +106 -0
  30. data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
  31. data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
  32. data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
  33. data/lib/puppet/data_providers/hiera_support.rb +37 -0
  34. data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
  35. data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
  36. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
  37. data/lib/puppet/defaults.rb +12 -2
  38. data/lib/puppet/error.rb +4 -0
  39. data/lib/puppet/face/module/changes.rb +2 -1
  40. data/lib/puppet/feature/cfacter.rb +1 -0
  41. data/lib/puppet/file_bucket/dipper.rb +58 -2
  42. data/lib/puppet/functions.rb +2 -4
  43. data/lib/puppet/functions/assert_type.rb +48 -12
  44. data/lib/puppet/functions/defined.rb +79 -48
  45. data/lib/puppet/functions/each.rb +85 -27
  46. data/lib/puppet/functions/filter.rb +58 -23
  47. data/lib/puppet/functions/hiera.rb +76 -3
  48. data/lib/puppet/functions/hiera_array.rb +65 -3
  49. data/lib/puppet/functions/hiera_hash.rb +74 -2
  50. data/lib/puppet/functions/hiera_include.rb +75 -2
  51. data/lib/puppet/functions/lookup.rb +19 -17
  52. data/lib/puppet/functions/map.rb +56 -21
  53. data/lib/puppet/functions/match.rb +29 -12
  54. data/lib/puppet/functions/reduce.rb +95 -58
  55. data/lib/puppet/functions/versioncmp.rb +36 -0
  56. data/lib/puppet/functions/with.rb +15 -7
  57. data/lib/puppet/indirector/catalog/compiler.rb +3 -3
  58. data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
  59. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  60. data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
  61. data/lib/puppet/indirector/hiera.rb +4 -0
  62. data/lib/puppet/indirector/json.rb +1 -1
  63. data/lib/puppet/indirector/msgpack.rb +1 -1
  64. data/lib/puppet/indirector/request.rb +7 -8
  65. data/lib/puppet/indirector/resource_type/parser.rb +5 -3
  66. data/lib/puppet/info_service.rb +7 -0
  67. data/lib/puppet/info_service/class_information_service.rb +111 -0
  68. data/lib/puppet/module_tool/metadata.rb +32 -9
  69. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  70. data/lib/puppet/network/authconfig.rb +21 -1
  71. data/lib/puppet/network/authorization.rb +8 -1
  72. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  73. data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
  74. data/lib/puppet/node/environment.rb +9 -2
  75. data/lib/puppet/parser.rb +3 -0
  76. data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
  77. data/lib/puppet/parser/compiler.rb +302 -12
  78. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  79. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  80. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
  81. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  82. data/lib/puppet/parser/environment_compiler.rb +165 -0
  83. data/lib/puppet/parser/functions/assert_type.rb +46 -16
  84. data/lib/puppet/parser/functions/defined.rb +105 -68
  85. data/lib/puppet/parser/functions/each.rb +85 -27
  86. data/lib/puppet/parser/functions/filter.rb +59 -23
  87. data/lib/puppet/parser/functions/hiera.rb +83 -27
  88. data/lib/puppet/parser/functions/hiera_array.rb +71 -28
  89. data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
  90. data/lib/puppet/parser/functions/hiera_include.rb +81 -40
  91. data/lib/puppet/parser/functions/map.rb +55 -20
  92. data/lib/puppet/parser/functions/match.rb +27 -12
  93. data/lib/puppet/parser/functions/reduce.rb +97 -60
  94. data/lib/puppet/parser/functions/with.rb +16 -8
  95. data/lib/puppet/parser/resource.rb +98 -19
  96. data/lib/puppet/plugins/configuration.rb +3 -2
  97. data/lib/puppet/plugins/data_providers.rb +12 -60
  98. data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
  99. data/lib/puppet/plugins/data_providers/registry.rb +84 -0
  100. data/lib/puppet/pops.rb +19 -17
  101. data/lib/puppet/pops/adapters.rb +12 -0
  102. data/lib/puppet/pops/binder/binder.rb +2 -2
  103. data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
  104. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  105. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  106. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  107. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  108. data/lib/puppet/pops/binder/injector.rb +4 -4
  109. data/lib/puppet/pops/binder/key_factory.rb +3 -9
  110. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  111. data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
  112. data/lib/puppet/pops/evaluator/closure.rb +8 -8
  113. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  114. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  115. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  116. data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
  117. data/lib/puppet/pops/functions/dispatcher.rb +3 -3
  118. data/lib/puppet/pops/issues.rb +1 -1
  119. data/lib/puppet/pops/label_provider.rb +1 -1
  120. data/lib/puppet/pops/lookup.rb +25 -47
  121. data/lib/puppet/pops/lookup/explainer.rb +402 -0
  122. data/lib/puppet/pops/lookup/invocation.rb +117 -0
  123. data/lib/puppet/pops/merge_strategy.rb +73 -5
  124. data/lib/puppet/pops/model/factory.rb +34 -0
  125. data/lib/puppet/pops/model/model_label_provider.rb +10 -1
  126. data/lib/puppet/pops/model/model_meta.rb +15 -0
  127. data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
  128. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  129. data/lib/puppet/pops/parser/egrammar.ra +56 -3
  130. data/lib/puppet/pops/parser/eparser.rb +1549 -1352
  131. data/lib/puppet/pops/parser/lexer2.rb +31 -6
  132. data/lib/puppet/pops/parser/locator.rb +1 -1
  133. data/lib/puppet/pops/parser/parser_support.rb +25 -13
  134. data/lib/puppet/pops/types/enumeration.rb +1 -2
  135. data/lib/puppet/pops/types/type_asserter.rb +16 -15
  136. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  137. data/lib/puppet/pops/types/type_calculator.rb +171 -1020
  138. data/lib/puppet/pops/types/type_factory.rb +87 -148
  139. data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
  140. data/lib/puppet/pops/types/type_parser.rb +116 -127
  141. data/lib/puppet/pops/types/types.rb +1394 -255
  142. data/lib/puppet/pops/types/types_meta.rb +0 -234
  143. data/lib/puppet/pops/validation.rb +7 -2
  144. data/lib/puppet/pops/validation/checker4_0.rb +28 -0
  145. data/lib/puppet/provider/augeas/augeas.rb +50 -0
  146. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  147. data/lib/puppet/provider/package/dnf.rb +41 -0
  148. data/lib/puppet/provider/package/gem.rb +7 -2
  149. data/lib/puppet/provider/package/rpm.rb +1 -0
  150. data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
  151. data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
  152. data/lib/puppet/provider/package/windows/package.rb +9 -1
  153. data/lib/puppet/provider/package/yum.rb +14 -9
  154. data/lib/puppet/provider/service/bsd.rb +1 -1
  155. data/lib/puppet/provider/service/debian.rb +21 -0
  156. data/lib/puppet/provider/service/init.rb +6 -0
  157. data/lib/puppet/provider/service/rcng.rb +51 -0
  158. data/lib/puppet/provider/service/redhat.rb +2 -1
  159. data/lib/puppet/provider/service/smf.rb +43 -2
  160. data/lib/puppet/provider/service/src.rb +27 -0
  161. data/lib/puppet/provider/service/systemd.rb +15 -3
  162. data/lib/puppet/provider/sshkey/parsed.rb +19 -9
  163. data/lib/puppet/reference/report.rb +9 -12
  164. data/lib/puppet/reports.rb +5 -1
  165. data/lib/puppet/resource.rb +50 -73
  166. data/lib/puppet/resource/capability_finder.rb +95 -0
  167. data/lib/puppet/resource/catalog.rb +47 -7
  168. data/lib/puppet/resource/status.rb +0 -2
  169. data/lib/puppet/resource/type.rb +238 -44
  170. data/lib/puppet/resource/type_collection.rb +60 -2
  171. data/lib/puppet/settings.rb +2 -2
  172. data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
  173. data/lib/puppet/ssl/oids.rb +9 -1
  174. data/lib/puppet/transaction.rb +4 -1
  175. data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
  176. data/lib/puppet/transaction/resource_harness.rb +9 -4
  177. data/lib/puppet/type.rb +74 -3
  178. data/lib/puppet/type/augeas.rb +8 -0
  179. data/lib/puppet/type/file/source.rb +14 -12
  180. data/lib/puppet/type/user.rb +4 -2
  181. data/lib/puppet/util/windows/security.rb +4 -1
  182. data/lib/puppet/util/windows/taskscheduler.rb +1 -1
  183. data/lib/puppet/version.rb +1 -1
  184. data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
  185. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  186. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  187. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  188. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  189. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  190. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  191. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  192. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  193. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  194. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  195. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  196. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  197. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  198. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  199. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  200. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  201. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  202. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  203. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  204. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  205. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  206. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
  207. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  208. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
  209. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  210. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  211. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  212. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  213. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  214. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  215. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  216. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  217. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
  218. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  219. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  220. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  221. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
  222. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  223. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  224. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  225. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  226. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
  227. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  228. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  229. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
  230. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  231. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
  232. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
  233. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  234. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  235. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
  236. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  238. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  239. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  241. data/spec/integration/data_binding_spec.rb +229 -0
  242. data/spec/integration/file_bucket/file_spec.rb +2 -2
  243. data/spec/integration/parser/compiler_spec.rb +23 -19
  244. data/spec/integration/parser/resource_expressions_spec.rb +4 -4
  245. data/spec/integration/parser/undef_param_spec.rb +1 -1
  246. data/spec/integration/resource/catalog_spec.rb +1 -1
  247. data/spec/integration/type/package_spec.rb +2 -0
  248. data/spec/integration/util/windows/security_spec.rb +18 -0
  249. data/spec/lib/matchers/include_in_order.rb +2 -2
  250. data/spec/shared_behaviours/iterative_functions.rb +8 -8
  251. data/spec/spec_helper.rb +7 -0
  252. data/spec/unit/agent/locker_spec.rb +4 -4
  253. data/spec/unit/agent_spec.rb +0 -8
  254. data/spec/unit/application/agent_spec.rb +5 -0
  255. data/spec/unit/application/apply_spec.rb +8 -0
  256. data/spec/unit/application/filebucket_spec.rb +87 -1
  257. data/spec/unit/application/lookup_spec.rb +195 -0
  258. data/spec/unit/appmgmt_spec.rb +657 -0
  259. data/spec/unit/capability_spec.rb +414 -0
  260. data/spec/unit/configurer_spec.rb +7 -1
  261. data/spec/unit/context/trusted_information_spec.rb +24 -1
  262. data/spec/unit/daemon_spec.rb +18 -8
  263. data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
  264. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  265. data/spec/unit/functions/assert_type_spec.rb +5 -7
  266. data/spec/unit/functions/defined_spec.rb +2 -2
  267. data/spec/unit/functions/epp_spec.rb +2 -2
  268. data/spec/unit/functions/lookup_spec.rb +200 -9
  269. data/spec/unit/functions/regsubst_spec.rb +17 -8
  270. data/spec/unit/functions/scanf_spec.rb +1 -1
  271. data/spec/unit/functions/split_spec.rb +2 -2
  272. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  273. data/spec/unit/functions4_spec.rb +58 -72
  274. data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
  275. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  276. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  277. data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
  278. data/spec/unit/indirector/request_spec.rb +8 -8
  279. data/spec/unit/info_service_spec.rb +236 -0
  280. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  281. data/spec/unit/network/authconfig_spec.rb +62 -32
  282. data/spec/unit/network/authorization_spec.rb +30 -2
  283. data/spec/unit/network/http/connection_spec.rb +14 -19
  284. data/spec/unit/parser/compiler_spec.rb +86 -2
  285. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  286. data/spec/unit/parser/resource_spec.rb +2 -20
  287. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  288. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  289. data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
  290. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  291. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +19 -11
  292. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  293. data/spec/unit/pops/label_provider_spec.rb +5 -1
  294. data/spec/unit/pops/parser/lexer2_spec.rb +33 -7
  295. data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
  296. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
  297. data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
  298. data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
  299. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  300. data/spec/unit/pops/parser/parser_spec.rb +18 -0
  301. data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
  302. data/spec/unit/pops/types/type_factory_spec.rb +12 -12
  303. data/spec/unit/pops/types/type_parser_spec.rb +7 -12
  304. data/spec/unit/pops/validator/validator_spec.rb +25 -0
  305. data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
  306. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  307. data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
  308. data/spec/unit/provider/package/dnf_spec.rb +92 -0
  309. data/spec/unit/provider/package/gem_spec.rb +7 -0
  310. data/spec/unit/provider/package/rpm_spec.rb +25 -2
  311. data/spec/unit/provider/package/windows/package_spec.rb +41 -0
  312. data/spec/unit/provider/package/yum_spec.rb +21 -13
  313. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
  314. data/spec/unit/provider/service/debian_spec.rb +27 -0
  315. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  316. data/spec/unit/provider/service/redhat_spec.rb +8 -1
  317. data/spec/unit/provider/service/smf_spec.rb +30 -5
  318. data/spec/unit/provider/service/src_spec.rb +19 -4
  319. data/spec/unit/provider/service/systemd_spec.rb +78 -29
  320. data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
  321. data/spec/unit/reports_spec.rb +10 -0
  322. data/spec/unit/resource/capability_finder_spec.rb +56 -0
  323. data/spec/unit/resource/catalog_spec.rb +31 -8
  324. data/spec/unit/resource/type_collection_spec.rb +23 -2
  325. data/spec/unit/resource/type_spec.rb +1 -1
  326. data/spec/unit/resource_spec.rb +22 -4
  327. data/spec/unit/settings_spec.rb +90 -1
  328. data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
  329. data/spec/unit/ssl/oids_spec.rb +8 -0
  330. data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
  331. data/spec/unit/transaction/report_spec.rb +24 -1
  332. data/spec/unit/type/package_spec.rb +1 -0
  333. data/spec/unit/type/user_spec.rb +14 -7
  334. data/spec/unit/type_spec.rb +1 -1
  335. metadata +169 -5
  336. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  337. data/spec/integration/data_binding.rb +0 -104
@@ -1,33 +1,68 @@
1
- # Applies a parameterized block to each element in a sequence of entries from the first
2
- # argument and returns an array with the result of each invocation of the parameterized block.
1
+ # Applies a [lambda](http://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html)
2
+ # to every value in a data structure and returns an array containing the results.
3
3
  #
4
- # This function takes two mandatory arguments: the first should be an Array, Hash, or of Enumerable type
5
- # (integer, Integer range, or String), and the second a parameterized block as produced by the puppet syntax:
4
+ # This function takes two mandatory arguments, in this order:
6
5
  #
7
- # $a.map |$x| { ... }
8
- # map($a) |$x| { ... }
6
+ # 1. An array or hash the function will iterate over.
7
+ # 2. A lambda, which the function calls for each element in the first argument. It can
8
+ # request one or two parameters.
9
9
  #
10
- # When the first argument `$a` is an Array or of enumerable type, the block is called with each entry in turn.
11
- # When the first argument is a hash the entry is an array with `[key, value]`.
10
+ # @example Using the `map` function
12
11
  #
13
- # @example Using map with two arguments
12
+ # `$transformed_data = $data.map |$parameter| { <PUPPET CODE BLOCK> }`
14
13
  #
15
- # # Turns hash into array of values
16
- # $a.map |$x|{ $x[1] }
14
+ # or
17
15
  #
18
- # # Turns hash into array of keys
19
- # $a.map |$x| { $x[0] }
16
+ # `$transformed_data = map($data) |$parameter| { <PUPPET CODE BLOCK> }`
20
17
  #
21
- # When using a block with 2 parameters, the element's index (starting from 0) for an array, and the key for a hash
22
- # is given to the block's first parameter, and the value is given to the block's second parameter.args.
18
+ # When the first argument (`$data` in the above example) is an array, Puppet passes each
19
+ # value in turn to the lambda.
23
20
  #
24
- # @example Using map with two arguments
21
+ # @example Using the `map` function with an array and a one-parameter lambda
25
22
  #
26
- # # Turns hash into array of values
27
- # $a.map |$key,$val|{ $val }
23
+ # ~~~ puppet
24
+ # # For the array $data, return an array containing each value multiplied by 10
25
+ # $data = [1,2,3]
26
+ # $transformed_data = $data.map |$items| { $items * 10 }
27
+ # # $transformed_data contains [10,20,30]
28
+ # ~~~
28
29
  #
29
- # # Turns hash into array of keys
30
- # $a.map |$key,$val|{ $key }
30
+ # When the first argument is a hash, Puppet passes each key and value pair to the lambda
31
+ # as an array in the form `[key, value]`.
32
+ #
33
+ # @example Using the `map` function with a hash and a one-parameter lambda
34
+ #
35
+ # ~~~ puppet
36
+ # # For the hash $data, return an array containing the keys
37
+ # $data = {'a'=>1,'b'=>2,'c'=>3}
38
+ # $transformed_data = $data.map |$items| { $items[0] }
39
+ # # $transformed_data contains ['a','b','c']
40
+ # ~~~
41
+ #
42
+ # When the first argument is an array and the lambda has two parameters, Puppet passes the
43
+ # array's indexes (enumerated from 0) in the first parameter and its values in the second
44
+ # parameter.
45
+ #
46
+ # @example Using the `map` function with an array and a two-parameter lambda
47
+ #
48
+ # ~~~ puppet
49
+ # # For the array $data, return an array containing the indexes
50
+ # $data = [1,2,3]
51
+ # $transformed_data = $data.map |$index,$value| { $index }
52
+ # # $transformed_data contains [0,1,2]
53
+ # ~~~
54
+ #
55
+ # When the first argument is a hash, Puppet passes its keys to the first parameter and its
56
+ # values to the second parameter.
57
+ #
58
+ # @example Using the `map` function with a hash and a two-parameter lambda
59
+ #
60
+ # ~~~ puppet
61
+ # # For the hash $data, return an array containing each value
62
+ # $data = {'a'=>1,'b'=>2,'c'=>3}
63
+ # $transformed_data = $data.map |$key,$value| { $value }
64
+ # # $transformed_data contains [1,2,3]
65
+ # ~~~
31
66
  #
32
67
  # @since 4.0.0
33
68
  #
@@ -57,7 +92,7 @@ Puppet::Functions.create_function(:map) do
57
92
  end
58
93
 
59
94
  def map_Hash_2(hash)
60
- hash.map {|x, y| yield(x, y) }
95
+ hash.map {|x, y| yield(x, y) }
61
96
  end
62
97
 
63
98
  def map_Enumerable_1(enumerable)
@@ -1,19 +1,36 @@
1
- # Returns the match result of matching a String or Array[String] with one of:
1
+ # Matches a regular expression against a string and returns an array containing the match
2
+ # and any matched capturing groups.
2
3
  #
3
- # * Regexp
4
- # * String - transformed to a Regexp
5
- # * Pattern type
6
- # * Regexp type
4
+ # The first argument is a string or array of strings. The second argument is either a
5
+ # regular expression, regular expression represented as a string, or Regex or Pattern
6
+ # data type that the function matches against the first argument.
7
7
  #
8
- # Returns An Array with the entire match at index 0, and each subsequent submatch at index 1-n.
9
- # If there was no match, nil (ie. undef) is returned. If the value to match is an Array, a array
10
- # with mapped match results is returned.
8
+ # The returned array contains the entire match at index 0, and each captured group at
9
+ # subsequent index values. If the value or expression being matched is an array, the
10
+ # function returns an array with mapped match results.
11
11
  #
12
- # @example matching
13
- # "abc123".match(/([a-z]+)[1-9]+/) # => ["abc"]
14
- # "abc123".match(/([a-z]+)([1-9]+)/) # => ["abc", "123"]
12
+ # If the function doesn't find a match, it returns 'undef'.
13
+ #
14
+ # @example Matching a regular expression in a string
15
+ #
16
+ # ~~~ ruby
17
+ # $matches = "abc123".match(/[a-z]+[1-9]+/)
18
+ # # $matches contains [abc123]
19
+ # ~~~
20
+ #
21
+ # @example Matching a regular expressions with grouping captures in a string
22
+ #
23
+ # ~~~ ruby
24
+ # $matches = "abc123".match(/([a-z]+)([1-9]+)/)
25
+ # # $matches contains [abc123, abc, 123]
26
+ # ~~~
27
+ #
28
+ # @example Matching a regular expression with grouping captures in an array of strings
29
+ #
30
+ # ~~~ ruby
31
+ # $matches = ["abc123","def456"].match(/([a-z]+)([1-9]+)/)
32
+ # # $matches contains [[abc123, abc, 123], [def456, def, 456]]
15
33
  #
16
- # See the documentation for "The Puppet Type System" for more information about types.
17
34
  # @since 4.0.0
18
35
  #
19
36
  Puppet::Functions.create_function(:match) do
@@ -1,61 +1,98 @@
1
- # Applies a parameterized block to each element in a sequence of entries from the first
2
- # argument (_the enumerable_) and returns the last result of the invocation of the parameterized block.
3
- #
4
- # This function takes two mandatory arguments: the first should be an Array, Hash, or something of
5
- # enumerable type, and the last a parameterized block as produced by the puppet syntax:
6
- #
7
- # $a.reduce |$memo, $x| { ... }
8
- # reduce($a) |$memo, $x| { ... }
9
- #
10
- # When the first argument is an Array or someting of an enumerable type, the block is called with each entry in turn.
11
- # When the first argument is a hash each entry is converted to an array with `[key, value]` before being
12
- # fed to the block. An optional 'start memo' value may be supplied as an argument between the array/hash
13
- # and mandatory block.
14
- #
15
- # $a.reduce(start) |$memo, $x| { ... }
16
- # reduce($a, start) |$memo, $x| { ... }
17
- #
18
- # If no 'start memo' is given, the first invocation of the parameterized block will be given the first and second
19
- # elements of the enumeration, and if the enumerable has fewer than 2 elements, the first
20
- # element is produced as the result of the reduction without invocation of the block.
21
- #
22
- # On each subsequent invocation, the produced value of the invoked parameterized block is given as the memo in the
23
- # next invocation.
24
- #
25
- # @example Using reduce
26
- #
27
- # # Reduce an array
28
- # $a = [1,2,3]
29
- # $a.reduce |$memo, $entry| { $memo + $entry }
30
- # #=> 6
31
- #
32
- # # Reduce hash values
33
- # $a = {a => 1, b => 2, c => 3}
34
- # $a.reduce |$memo, $entry| { [sum, $memo[1]+$entry[1]] }
35
- # #=> [sum, 6]
36
- #
37
- # # reverse a string
38
- # "abc".reduce |$memo, $char| { "$char$memo" }
39
- # #=>"cbe"
40
- #
41
- # It is possible to provide a starting 'memo' as an argument.
42
- #
43
- # @example Using reduce with given start 'memo'
44
- #
45
- # # Reduce an array
46
- # $a = [1,2,3]
47
- # $a.reduce(4) |$memo, $entry| { $memo + $entry }
48
- # #=> 10
49
- #
50
- # # Reduce hash values
51
- # $a = {a => 1, b => 2, c => 3}
52
- # $a.reduce([na, 4]) |$memo, $entry| { [sum, $memo[1]+$entry[1]] }
53
- # #=> [sum, 10]
54
- #
55
- # @example Using reduce with an Integer range
56
- #
57
- # Integer[1,4].reduce |$memo, $x| { $memo + $x }
58
- # #=> 10
1
+ # Applies a [lambda](https://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html)
2
+ # to every value in a data structure from the first argument, carrying over the returned
3
+ # value of each iteration, and returns the result of the lambda's final iteration. This
4
+ # lets you create a new value or data structure by combining values from the first
5
+ # argument's data structure.
6
+ #
7
+ # This function takes two mandatory arguments, in this order:
8
+ #
9
+ # 1. An array or hash the function will iterate over.
10
+ # 2. A lambda, which the function calls for each element in the first argument. It takes
11
+ # two mandatory parameters:
12
+ # 1. A memo value that is overwritten after each iteration with the iteration's result.
13
+ # 2. A second value that is overwritten after each iteration with the next value in the
14
+ # function's first argument.
15
+ #
16
+ # @example Using the `reduce` function
17
+ #
18
+ # `$data.reduce |$memo, $value| { ... }`
19
+ #
20
+ # or
21
+ #
22
+ # `reduce($data) |$memo, $value| { ... }`
23
+ #
24
+ # You can also pass an optional "start memo" value as an argument, such as `start` below:
25
+ #
26
+ # `$data.reduce(start) |$memo, $value| { ... }`
27
+ #
28
+ # or
29
+ #
30
+ # `reduce($data, start) |$memo, $value| { ... }`
31
+ #
32
+ # When the first argument (`$data` in the above example) is an array, Puppet passes each
33
+ # of the data structure's values in turn to the lambda's parameters. When the first
34
+ # argument is a hash, Puppet converts each of the hash's values to an array in the form
35
+ # `[key, value]`.
36
+ #
37
+ # If you pass a start memo value, Puppet executes the lambda with the provided memo value
38
+ # and the data structure's first value. Otherwise, Puppet passes the structure's first two
39
+ # values to the lambda.
40
+ #
41
+ # Puppet calls the lambda for each of the data structure's remaining values. For each
42
+ # call, it passes the result of the previous call as the first parameter ($memo in the
43
+ # above examples) and the next value from the data structure as the second parameter
44
+ # ($value).
45
+ #
46
+ # If the structure has one value, Puppet returns the value and does not call the lambda.
47
+ #
48
+ # @example Using the `reduce` function
49
+ #
50
+ # ~~~ puppet
51
+ # # Reduce the array $data, returning the sum of all values in the array.
52
+ # $data = [1, 2, 3]
53
+ # $sum = $data.reduce |$memo, $value| { $memo + $value }
54
+ # # $sum contains 6
55
+ #
56
+ # # Reduce the array $data, returning the sum of a start memo value and all values in the
57
+ # # array.
58
+ # $data = [1, 2, 3]
59
+ # $sum = $data.reduce(4) |$memo, $value| { $memo + $value }
60
+ # # $sum contains 10
61
+ #
62
+ # # Reduce the hash $data, returning the sum of all values and concatenated string of all
63
+ # # keys.
64
+ # $data = {a => 1, b => 2, c => 3}
65
+ # $combine = $data.reduce |$memo, $value| {
66
+ # $string = "${memo[0]}${value[0]}"
67
+ # $number = $memo[1] + $value[1]
68
+ # [$string, $number]
69
+ # }
70
+ # # $combine contains [abc, 6]
71
+ # ~~~
72
+ #
73
+ # @example Using the `reduce` function with a start memo and two-parameter lambda
74
+ #
75
+ # ~~~ puppet
76
+ # # Reduce the array $data, returning the sum of all values in the array and starting
77
+ # # with $memo set to an arbitrary value instead of $data's first value.
78
+ # $data = [1, 2, 3]
79
+ # $sum = $data.reduce(4) |$memo, $value| { $memo + $value }
80
+ # # At the start of the lambda's first iteration, $memo contains 4 and $value contains 1.
81
+ # # After all iterations, $sum contains 10.
82
+ #
83
+ # # Reduce the hash $data, returning the sum of all values and concatenated string of
84
+ # # all keys, and starting with $memo set to an arbitrary array instead of $data's first
85
+ # # key-value pair.
86
+ # $data = {a => 1, b => 2, c => 3}
87
+ # $combine = $data.reduce( [d, 4] ) |$memo, $value| {
88
+ # $string = "${memo[0]}${value[0]}"
89
+ # $number = $memo[1] + $value[1]
90
+ # [$string, $number]
91
+ # }
92
+ # # At the start of the lambda's first iteration, $memo contains [d, 4] and $value
93
+ # # contains [a, 1].
94
+ # # $combine contains [dabc, 10]
95
+ # ~~~
59
96
  #
60
97
  # @since 4.0.0
61
98
  #
@@ -0,0 +1,36 @@
1
+ require 'puppet/util/package'
2
+
3
+ # Compares two version numbers.
4
+ #
5
+ # Prototype:
6
+ #
7
+ # \$result = versioncmp(a, b)
8
+ #
9
+ # Where a and b are arbitrary version strings.
10
+ #
11
+ # This function returns:
12
+ #
13
+ # * `1` if version a is greater than version b
14
+ # * `0` if the versions are equal
15
+ # * `-1` if version a is less than version b
16
+ #
17
+ # @example
18
+ #
19
+ # if versioncmp('2.6-1', '2.4.5') > 0 {
20
+ # notice('2.6-1 is > than 2.4.5')
21
+ # }
22
+ #
23
+ # This function uses the same version comparison algorithm used by Puppet's
24
+ # `package` type.
25
+ #
26
+ Puppet::Functions.create_function(:versioncmp) do
27
+
28
+ dispatch :versioncmp do
29
+ param 'String', :a
30
+ param 'String', :b
31
+ end
32
+
33
+ def versioncmp(a, b)
34
+ Puppet::Util::Package.versioncmp(a, b)
35
+ end
36
+ end
@@ -1,12 +1,20 @@
1
- # Call a lambda with the given arguments. Since the parameters of the lambda
2
- # are local to the lambda's scope, this can be used to create private sections
3
- # of logic in a class so that the variables are not visible outside of the
4
- # class.
1
+ # Call a [lambda](https://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html)
2
+ # with the given arguments and return the result. Since a lambda's scope is
3
+ # [local](https://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html#lambda-scope)
4
+ # to the lambda, you can use the `with` function to create private blocks of code within a
5
+ # class using variables whose values cannot be accessed outside of the lambda.
5
6
  #
6
- # @example Using with
7
+ # @example Using `with`
7
8
  #
8
- # # notices the array [1, 2, 'foo']
9
- # with(1, 2, 'foo') |$x, $y, $z| { notice [$x, $y, $z] }
9
+ # ~~~ puppet
10
+ # # Concatenate three strings into a single string formatted as a list.
11
+ # $fruit = with("apples", "oranges", "bananas") |$x, $y, $z| {
12
+ # "${x}, ${y}, and ${z}"
13
+ # }
14
+ # $check_var = $x
15
+ # # $fruit contains "apples, oranges, and bananas"
16
+ # # $check_var is undefined, as the value of $x is local to the lambda.
17
+ # ~~~
10
18
  #
11
19
  # @since 4.0.0
12
20
  #
@@ -47,7 +47,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
47
47
  node = node_from_request(request)
48
48
  node.trusted_data = Puppet.lookup(:trusted_information) { Puppet::Context::TrustedInformation.local(node) }.to_h
49
49
 
50
- if catalog = compile(node)
50
+ if catalog = compile(node, request.options[:code_id])
51
51
  return catalog
52
52
  else
53
53
  # This shouldn't actually happen; we should either return
@@ -82,7 +82,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
82
82
  end
83
83
 
84
84
  # Compile the actual catalog.
85
- def compile(node)
85
+ def compile(node, code_id)
86
86
  str = "Compiled catalog for #{node.name}"
87
87
  str += " in environment #{node.environment}" if node.environment
88
88
  config = nil
@@ -90,7 +90,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
90
90
  benchmark(:notice, str) do
91
91
  Puppet::Util::Profiler.profile(str, [:compiler, :compile, node.environment, node.name]) do
92
92
  begin
93
- config = Puppet::Parser::Compiler.compile(node)
93
+ config = Puppet::Parser::Compiler.compile(node, code_id)
94
94
  rescue Puppet::Error => detail
95
95
  Puppet.err(detail.to_s) if networked?
96
96
  raise
@@ -41,15 +41,17 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
41
41
  raise "Did not get catalog back" unless catalog.is_a?(model)
42
42
 
43
43
  catalog.resources.find_all { |res| res.type == "File" }.each do |resource|
44
+ next if resource[:ensure] == 'absent'
45
+
44
46
  next unless source = resource[:source]
45
47
  next unless source =~ /^puppet:/
46
48
 
47
49
  file = resource.to_ral
48
50
 
49
51
  if file.recurse?
50
- add_children(request.key, catalog, resource, file)
52
+ add_children(request, catalog, resource, file)
51
53
  else
52
- find_and_replace_metadata(request.key, resource, file)
54
+ find_and_replace_metadata(request, resource, file)
53
55
  end
54
56
  end
55
57
 
@@ -65,10 +67,10 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
65
67
  # from the resource, inserts the metadata into the file resource, and uploads
66
68
  # the file contents of the source to the file bucket.
67
69
  #
68
- # @param host [String] The host name of the node requesting this catalog
70
+ # @param request [Puppet::Indirector::Request] The request for the catalog
69
71
  # @param resource [Puppet::Resource] The resource to replace the metadata in
70
72
  # @param file [Puppet::Type::File] The file RAL associated with the resource
71
- def find_and_replace_metadata(host, resource, file)
73
+ def find_and_replace_metadata(request, resource, file)
72
74
  # We remove URL info from it, so it forces a local copy
73
75
  # rather than routing through the network.
74
76
  # Weird, but true.
@@ -77,7 +79,7 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
77
79
 
78
80
  raise "Could not get metadata for #{resource[:source]}" unless metadata = file.parameter(:source).metadata
79
81
 
80
- replace_metadata(host, resource, metadata)
82
+ replace_metadata(request, resource, metadata)
81
83
  end
82
84
 
83
85
  # Rewrite a given file resource with the metadata from a fileserver based file
@@ -85,13 +87,14 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
85
87
  # This performs the actual metadata rewrite for the given file resource and
86
88
  # uploads the content of the source file to the filebucket.
87
89
  #
88
- # @param host [String] The host name of the node requesting this catalog
90
+ # @param request [Puppet::Indirector::Request] The request for the catalog
89
91
  # @param resource [Puppet::Resource] The resource to add the metadata to
90
92
  # @param metadata [Puppet::FileServing::Metadata] The metadata of the given fileserver based file
91
- def replace_metadata(host, resource, metadata)
92
- [:mode, :owner, :group].each do |param|
93
- resource[param] ||= metadata.send(param)
93
+ def replace_metadata(request, resource, metadata)
94
+ [:owner, :group].each do |param|
95
+ resource[param] ||= metadata.send(param).to_s
94
96
  end
97
+ resource[:mode] ||= metadata.send(:mode).to_s(8)
95
98
 
96
99
  resource[:ensure] = metadata.ftype
97
100
  if metadata.ftype == "file"
@@ -101,21 +104,26 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
101
104
  end
102
105
  end
103
106
 
104
- store_content(resource) if resource[:ensure] == "file"
107
+ store_content(request, resource) if resource[:ensure] == "file"
105
108
  old_source = resource.delete(:source)
106
- Puppet.info "Metadata for #{resource} in catalog for '#{host}' added from '#{old_source}'"
109
+ Puppet.info "Metadata for #{resource} in catalog for '#{request.key}' added from '#{old_source}'"
107
110
  end
108
111
 
109
112
  # Generate children resources for a recursive file and add them to the catalog.
110
113
  #
111
- # @param host [String] The host name of the node requesting this catalog
114
+ # @param request [Puppet::Indirector::Request] The request for the catalog
112
115
  # @param catalog [Puppet::Resource::Catalog]
113
116
  # @param resource [Puppet::Resource]
114
117
  # @param file [Puppet::Type::File] The file RAL associated with the resource
115
- def add_children(host, catalog, resource, file)
116
- file = resource.to_ral
117
-
118
- children = get_child_resources(host, catalog, resource, file)
118
+ def add_children(request, catalog, resource, file)
119
+ children = get_child_resources(request, catalog, resource, file)
120
+ # get_child_resources() returned early because source is not
121
+ # a directory, but we still need to replace the metadata of the
122
+ # resource, so we do it here before returning.
123
+ if children.nil?
124
+ find_and_replace_metadata(request, resource, file)
125
+ return
126
+ end
119
127
 
120
128
  remove_existing_resources(children, catalog)
121
129
 
@@ -127,13 +135,13 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
127
135
 
128
136
  # Given a recursive file resource, recursively generate its children resources
129
137
  #
130
- # @param host [String] The host name of the node requesting this catalog
138
+ # @param request [Puppet::Indirector::Request] The request for the catalog
131
139
  # @param catalog [Puppet::Resource::Catalog]
132
140
  # @param resource [Puppet::Resource]
133
141
  # @param file [Puppet::Type::File] The file RAL associated with the resource
134
142
  #
135
143
  # @return [Array<Puppet::Resource>] The recursively generated File resources for the given resource
136
- def get_child_resources(host, catalog, resource, file)
144
+ def get_child_resources(request, catalog, resource, file)
137
145
  sourceselect = file[:sourceselect]
138
146
  children = {}
139
147
 
@@ -158,44 +166,52 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
158
166
  end
159
167
  end
160
168
 
169
+ parent_meta = nil
161
170
  total.each do |meta|
162
171
  # This is the top-level parent directory
163
172
  if meta.relative_path == "."
164
- replace_metadata(host, resource, meta)
173
+ parent_meta = meta
165
174
  next
166
175
  end
167
- children[meta.relative_path] ||= Puppet::Resource.new(:file, File.join(file[:path], meta.relative_path))
176
+ child = children[meta.relative_path] ||=
177
+ Puppet::Resource.new(:file, File.join(file[:path], meta.relative_path))
168
178
 
169
179
  # I think this is safe since it's a URL, not an actual file
170
- children[meta.relative_path][:source] = source + "/" + meta.relative_path
180
+ child[:source] = source + "/" + meta.relative_path
171
181
  resource.each do |param, value|
172
182
  # These should never be passed to our children.
173
183
  unless [:parent, :ensure, :recurse, :recurselimit, :target, :alias, :source].include? param
174
- children[meta.relative_path][param] = value
184
+ child[param] = value
175
185
  end
176
186
  end
177
- replace_metadata(host, children[meta.relative_path], meta)
187
+ replace_metadata(request, child, meta)
178
188
  end
189
+ replace_metadata(request, resource, parent_meta)
179
190
 
180
191
  children
181
192
  end
182
193
 
183
- # Remove any file resources in the catalog that will be duplicated by the
184
- # given file resources.
194
+ # Remove any recursed file resources already in the catalog
185
195
  #
186
196
  # @param children [Array<Puppet::Resource>]
187
197
  # @param catalog [Puppet::Resource::Catalog]
188
198
  def remove_existing_resources(children, catalog)
189
- existing_names = catalog.resources.collect { |r| r.to_s }
190
- both = (existing_names & children.keys).inject({}) { |hash, name| hash[name] = true; hash }
191
- both.each { |name| children.delete(name) }
199
+ relative_paths = children.keys
200
+ relative_paths.each do |relative_path|
201
+ child = children[relative_path]
202
+ if catalog.resource(child.ref)
203
+ Puppet.debug("Resource #{child.ref} already managed, removing from recursed children")
204
+ children.delete(relative_path)
205
+ end
206
+ end
192
207
  end
193
208
 
194
209
  # Retrieve the source of a file resource using a fileserver based source and
195
210
  # upload it to the filebucket.
196
211
  #
212
+ # @param request [Puppet::Indirector::Request] The request for the catalog
197
213
  # @param resource [Puppet::Resource]
198
- def store_content(resource)
214
+ def store_content(request, resource)
199
215
  @summer ||= Puppet::Util::Checksums
200
216
 
201
217
  type = @summer.sumtype(resource[:content])
@@ -205,7 +221,7 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
205
221
  Puppet.info "Content for '#{resource[:source]}' already exists"
206
222
  else
207
223
  Puppet.info "Storing content for source '#{resource[:source]}'"
208
- content = Puppet::FileServing::Content.indirection.find(resource[:source])
224
+ content = Puppet::FileServing::Content.indirection.find(resource[:source], {:environment => request.environment})
209
225
  file = Puppet::FileBucket::File.new(content.content)
210
226
  Puppet::FileBucket::File.indirection.save(file)
211
227
  end