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
@@ -3,7 +3,7 @@ require 'puppet/network/http'
3
3
 
4
4
  module Puppet
5
5
  class ConfigurationError < Puppet::Error; end
6
- class Network::AuthConfig
6
+ class Network::DefaultAuthProvider
7
7
  attr_accessor :rights
8
8
 
9
9
  def self.master_url_prefix
@@ -89,4 +89,24 @@ module Puppet
89
89
  insert_default_acl
90
90
  end
91
91
  end
92
+
93
+ class Network::AuthConfig
94
+ @@authprovider_class = nil
95
+
96
+ def self.authprovider_class=(klass)
97
+ @@authprovider_class = klass
98
+ end
99
+
100
+ def self.authprovider_class
101
+ @@authprovider_class || Puppet::Network::DefaultAuthProvider
102
+ end
103
+
104
+ def initialize(rights=nil)
105
+ @authprovider = self.class.authprovider_class.new(rights)
106
+ end
107
+
108
+ def check_authorization(method, path, params)
109
+ @authprovider.check_authorization(method, path, params)
110
+ end
111
+ end
92
112
  end
@@ -21,8 +21,15 @@ module Puppet::Network
21
21
  end
22
22
 
23
23
  module Authorization
24
+ @@authconfigloader_class = nil
25
+
26
+ def self.authconfigloader_class=(klass)
27
+ @@authconfigloader_class = klass
28
+ end
29
+
24
30
  def authconfig
25
- AuthConfigLoader.authconfig
31
+ authconfigloader = @@authconfigloader_class || AuthConfigLoader
32
+ authconfigloader.authconfig
26
33
  end
27
34
 
28
35
  # Verify that our client has access.
@@ -1,6 +1,7 @@
1
1
  class Puppet::Network::HTTP::API::Master::V3
2
2
  require 'puppet/network/http/api/master/v3/authorization'
3
3
  require 'puppet/network/http/api/master/v3/environments'
4
+ require 'puppet/network/http/api/master/v3/environment'
4
5
  require 'puppet/network/http/api/indirected_routes'
5
6
 
6
7
  AUTHZ = Authorization.new
@@ -14,9 +15,14 @@ class Puppet::Network::HTTP::API::Master::V3
14
15
  Environments.new(Puppet.lookup(:environments))
15
16
  end)
16
17
 
18
+ ENVIRONMENT = Puppet::Network::HTTP::Route.
19
+ path(%r{/environment/[^/]+$}).get(AUTHZ.wrap do
20
+ Environment.new
21
+ end)
22
+
17
23
  def self.routes
18
24
  Puppet::Network::HTTP::Route.path(%r{v3}).
19
25
  any.
20
- chain(ENVIRONMENTS, INDIRECTED)
26
+ chain(ENVIRONMENTS, ENVIRONMENT, INDIRECTED)
21
27
  end
22
28
  end
@@ -0,0 +1,59 @@
1
+ require 'json'
2
+ require 'puppet/parser/environment_compiler'
3
+
4
+ class Puppet::Network::HTTP::API::Master::V3::Environment
5
+ def call(request, response)
6
+ env_name = request.routing_path.split('/').last
7
+ env = Puppet.lookup(:environments).get(env_name)
8
+
9
+ if env.nil?
10
+ raise Puppet::Network::HTTP::Error::HTTPNotFoundError.new("#{env_name} is not a known environment", Puppet::Network::HTTP::Issues::RESOURCE_NOT_FOUND)
11
+ end
12
+
13
+ catalog = Puppet::Parser::EnvironmentCompiler.compile(env).to_resource
14
+
15
+ env_graph = {:environment => env.name, :applications => {}}
16
+ applications = catalog.resources.select do |res|
17
+ type = res.resource_type
18
+ type.is_a?(Puppet::Resource::Type) && type.application?
19
+ end
20
+ applications.each do |app|
21
+ app_components = {}
22
+ # Turn the 'nodes' hash into a map component ref => node name
23
+ node_mapping = {}
24
+ app['nodes'].each do |node, comps|
25
+ comps = [comps] unless comps.is_a?(Array)
26
+ comps.each do |comp|
27
+ raise Puppet::ParseError, "Application #{app} maps component #{comp} to multiple nodes" if node_mapping.include?(comp.ref)
28
+ node_mapping[comp.ref] = node.title
29
+ end
30
+ end
31
+
32
+ catalog.direct_dependents_of(app).each do |comp|
33
+ mapped_node = node_mapping[comp.ref]
34
+ if mapped_node.nil?
35
+ raise Puppet::ParseError, "Component #{comp} is not mapped to any node"
36
+ end
37
+ app_components[comp.ref] = {
38
+ :produces => comp.export.map(&:ref),
39
+ :consumes => prerequisites(comp).map(&:ref),
40
+ :node => mapped_node
41
+ }
42
+ end
43
+ env_graph[:applications][app.ref] = app_components
44
+ end
45
+ response.respond_with(200, "application/json", JSON.dump(env_graph))
46
+ end
47
+
48
+ private
49
+
50
+ # Finds all the prerequisites of component +comp+. They are all the
51
+ # capability resources that +comp+ depends on; this includes resources
52
+ # that +comp+ consumes but also resources it merely requires
53
+ def prerequisites(comp)
54
+ params = Puppet::Type.relationship_params.select { |p| p.direction == :in }.map(&:name)
55
+ params.map { |rel| comp[rel] }.flatten.compact.select do |rel|
56
+ rel.resource_type && rel.resource_type.is_capability?
57
+ end
58
+ end
59
+ end
@@ -182,11 +182,18 @@ class Puppet::Node::Environment
182
182
  # @api private
183
183
  def conflicting_manifest_settings?
184
184
  return false if !Puppet[:disable_per_environment_manifest]
185
- environment_conf = Puppet.lookup(:environments).get_conf(name)
186
- original_manifest = environment_conf.raw_setting(:manifest)
185
+ original_manifest = configuration.raw_setting(:manifest)
187
186
  !original_manifest.nil? && !original_manifest.empty? && original_manifest != Puppet[:default_manifest]
188
187
  end
189
188
 
189
+ # Return the environment configuration
190
+ # @return [Puppet::Settings::EnvironmentConf] The configuration
191
+ #
192
+ # @api private
193
+ def configuration
194
+ Puppet.lookup(:environments).get_conf(name)
195
+ end
196
+
190
197
  # Checks the environment and settings for any conflicts
191
198
  # @return [Array<String>] an array of validation errors
192
199
  # @api public
data/lib/puppet/parser.rb CHANGED
@@ -3,6 +3,7 @@ module Puppet::Parser; end
3
3
 
4
4
  require 'puppet/parser/ast'
5
5
  require 'puppet/parser/compiler'
6
+ require 'puppet/parser/compiler/catalog_validator'
6
7
  require 'puppet/resource/type_collection'
7
8
 
8
9
  require 'puppet/parser/functions'
@@ -13,5 +14,7 @@ require 'puppet/resource/type_collection_helper'
13
14
  require 'puppet/resource/type'
14
15
  require 'monitor'
15
16
 
17
+ Dir[File.dirname(__FILE__) + '/parser/compiler/catalog_validator/*.rb'].each { |f| require f }
18
+
16
19
  # PUP-3274 This should probably go someplace else
17
20
  class Puppet::LexError < RuntimeError; end
@@ -88,12 +88,18 @@ class Puppet::Parser::AST::PopsBridge
88
88
  instantiate_HostClassDefinition(d, modname)
89
89
  when Puppet::Pops::Model::ResourceTypeDefinition
90
90
  instantiate_ResourceTypeDefinition(d, modname)
91
+ when Puppet::Pops::Model::CapabilityMapping
92
+ instantiate_CapabilityMapping(d, modname)
91
93
  when Puppet::Pops::Model::NodeDefinition
92
94
  instantiate_NodeDefinition(d, modname)
95
+ when Puppet::Pops::Model::SiteDefinition
96
+ instantiate_SiteDefinition(d, modname)
93
97
  when Puppet::Pops::Model::FunctionDefinition
94
98
  instantiate_FunctionDefinition(d, modname)
95
99
  # The 3x logic calling this will not know what to do with the result, it is compacted away at the end
96
100
  next
101
+ when Puppet::Pops::Model::Application
102
+ instantiate_ApplicationDefinition(d, modname)
97
103
  else
98
104
  raise Puppet::ParseError, "Internal Error: Unknown type of definition - got '#{d.class}'"
99
105
  end
@@ -182,6 +188,27 @@ class Puppet::Parser::AST::PopsBridge
182
188
  Puppet::Resource::Type.new(:definition, o.name, @context.merge(args_from_definition(o, modname)))
183
189
  end
184
190
 
191
+ def instantiate_CapabilityMapping(o, modname)
192
+ # Use an intermediate 'capability_mapping' type to pass this info to the compiler where the
193
+ # actual mapping takes place
194
+ Puppet::Resource::Type.new(:capability_mapping, "#{o.component} #{o.kind} #{o.capability}", { :arguments => {
195
+ 'component' => o.component,
196
+ 'kind' => o.kind,
197
+ 'blueprint' => {
198
+ :capability => o.capability,
199
+ :mappings => o.mappings.reduce({}) do |memo, mapping|
200
+ memo[mapping.attribute_name] =
201
+ Expression.new(:value => mapping.value_expr)
202
+ memo
203
+ end
204
+ }}})
205
+ end
206
+
207
+ def instantiate_ApplicationDefinition(o, modname)
208
+ args = args_from_definition(o, modname)
209
+ Puppet::Resource::Type.new(:application, o.name, @context.merge(args))
210
+ end
211
+
185
212
  def instantiate_NodeDefinition(o, modname)
186
213
  args = { :module_name => modname }
187
214
 
@@ -192,14 +219,25 @@ class Puppet::Parser::AST::PopsBridge
192
219
  unless is_nop?(o.parent)
193
220
  args[:parent] = @ast_transformer.hostname(o.parent)
194
221
  end
222
+ args = @ast_transformer.merge_location(args, o)
195
223
 
196
224
  host_matches = @ast_transformer.hostname(o.host_matches)
197
- @ast_transformer.merge_location(args, o)
198
225
  host_matches.collect do |name|
199
226
  Puppet::Resource::Type.new(:node, name, @context.merge(args))
200
227
  end
201
228
  end
202
229
 
230
+ def instantiate_SiteDefinition(o, modname)
231
+ args = { :module_name => modname }
232
+
233
+ unless is_nop?(o.body)
234
+ args[:code] = Expression.new(:value => o.body)
235
+ end
236
+
237
+ args = @ast_transformer.merge_location(args, o)
238
+ Puppet::Resource::Type.new(:site, 'site', @context.merge(args))
239
+ end
240
+
203
241
  # Propagates a found Function to the appropriate loader.
204
242
  # This is for 4x evaluator/loader
205
243
  #
@@ -6,6 +6,7 @@ require 'puppet/util/errors'
6
6
 
7
7
  require 'puppet/resource/type_collection_helper'
8
8
  require 'puppet/loaders'
9
+ require 'puppet/pops'
9
10
 
10
11
  # Maintain a graph of scopes, along with a bunch of data
11
12
  # about the individual catalog we're compiling.
@@ -16,8 +17,9 @@ class Puppet::Parser::Compiler
16
17
  include Puppet::Util::Errors
17
18
  include Puppet::Util::MethodHelper
18
19
  include Puppet::Resource::TypeCollectionHelper
20
+ include Puppet::Pops::Evaluator::Runtime3Support
19
21
 
20
- def self.compile(node)
22
+ def self.compile(node, code_id = nil)
21
23
  $env_module_directories = nil
22
24
  node.environment.check_for_reparse
23
25
 
@@ -31,7 +33,7 @@ class Puppet::Parser::Compiler
31
33
  raise(Puppet::Error, errmsg.join(' '))
32
34
  end
33
35
 
34
- new(node).compile {|resulting_catalog| resulting_catalog.to_resource }
36
+ new(node, :code_id => code_id).compile {|resulting_catalog| resulting_catalog.to_resource }
35
37
  rescue Puppet::ParseErrorWithIssue => detail
36
38
  detail.node = node.name
37
39
  Puppet.log_exception(detail)
@@ -65,6 +67,10 @@ class Puppet::Parser::Compiler
65
67
  #
66
68
  attr_accessor :boot_injector
67
69
 
70
+ # The id of code input to the compiler.
71
+ # @api private
72
+ attr_accessor :code_id
73
+
68
74
  # Add a collection to the global list.
69
75
  def_delegator :@collections, :<<, :add_collection
70
76
  def_delegator :@relationships, :<<, :add_relationship
@@ -82,6 +88,22 @@ class Puppet::Parser::Compiler
82
88
  end
83
89
 
84
90
  def add_resource(scope, resource)
91
+ type = resource.resource_type
92
+ if type.is_a?(Puppet::Resource::Type) && type.application?
93
+ @applications << resource
94
+ assert_app_in_site(scope, resource)
95
+ return
96
+ end
97
+
98
+ if @current_app
99
+ # We are in the process of pulling application components out that
100
+ # apply to this node
101
+ Puppet.notice "Check #{resource}"
102
+ return unless @current_components.any? do |comp|
103
+ comp.type == resource.type && comp.title == resource.title
104
+ end
105
+ end
106
+
85
107
  @resources << resource
86
108
 
87
109
  # Note that this will fail if the resource is not unique.
@@ -99,7 +121,22 @@ class Puppet::Parser::Compiler
99
121
  # This adds a resource to the class it lexically appears in in the
100
122
  # manifest.
101
123
  unless resource.class?
102
- return @catalog.add_edge(scope.resource, resource)
124
+ @catalog.add_edge(scope.resource, resource)
125
+ end
126
+ end
127
+
128
+ def assert_app_in_site(scope, resource)
129
+ if resource.type == 'App'
130
+ if scope.resource
131
+ # directly contained in a Site
132
+ return if scope.resource.type == 'Site'
133
+ # contained in something that may be contained in Site
134
+ upstream = @catalog.upstream_from_vertex(scope.resource)
135
+ if upstream
136
+ return if upstream.keys.map(&:type).include?('Site')
137
+ end
138
+ end
139
+ raise ArgumentError, "Application instances like '#{resource}' can only be contained within a Site"
103
140
  end
104
141
  end
105
142
 
@@ -111,6 +148,16 @@ class Puppet::Parser::Compiler
111
148
  @catalog.add_class(name) unless name == ""
112
149
  end
113
150
 
151
+ # Add a catalog validator that will run at some stage to this compiler
152
+ # @param catalog_validators [Class<CatalogValidator>] The catalog validator class to add
153
+ def add_catalog_validator(catalog_validators)
154
+ @catalog_validators << catalog_validators
155
+ nil
156
+ end
157
+
158
+ def add_catalog_validators
159
+ add_catalog_validator(CatalogValidator::RelationshipValidator)
160
+ end
114
161
 
115
162
  # Return a list of all of the defined classes.
116
163
  def_delegator :@catalog, :classes, :classlist
@@ -128,18 +175,37 @@ class Puppet::Parser::Compiler
128
175
 
129
176
  activate_binder
130
177
 
178
+ Puppet::Util::Profiler.profile("Compile: Evaluated capability mappings", [:compiler, :evaluate_capability_mappings]) { evaluate_capability_mappings }
179
+
131
180
  Puppet::Util::Profiler.profile("Compile: Evaluated main", [:compiler, :evaluate_main]) { evaluate_main }
132
181
 
182
+ Puppet::Util::Profiler.profile("Compile: Evaluated site", [:compiler, :evaluate_site]) { evaluate_site }
183
+
133
184
  Puppet::Util::Profiler.profile("Compile: Evaluated AST node", [:compiler, :evaluate_ast_node]) { evaluate_ast_node }
134
185
 
135
186
  Puppet::Util::Profiler.profile("Compile: Evaluated node classes", [:compiler, :evaluate_node_classes]) { evaluate_node_classes }
136
187
 
188
+ Puppet::Util::Profiler.profile("Compile: Evaluated application instances", [:compiler, :evaluate_applications]) { evaluate_applications }
189
+
190
+ # New capability mappings may have been defined when the site was evaluated
191
+ Puppet::Util::Profiler.profile("Compile: Evaluated site capability mappings", [:compiler, :evaluate_capability_mappings]) { evaluate_capability_mappings }
192
+
137
193
  Puppet::Util::Profiler.profile("Compile: Evaluated generators", [:compiler, :evaluate_generators]) { evaluate_generators }
138
194
 
195
+ Puppet::Util::Profiler.profile("Compile: Validate Catalog pre-finish", [:compiler, :validate_pre_finish]) do
196
+ validate_catalog(CatalogValidator::PRE_FINISH)
197
+ end
198
+
139
199
  Puppet::Util::Profiler.profile("Compile: Finished catalog", [:compiler, :finish_catalog]) { finish }
140
200
 
201
+ Puppet::Util::Profiler.profile("Compile: Prune", [:compiler, :prune_catalog]) { prune_catalog }
202
+
141
203
  fail_on_unevaluated
142
204
 
205
+ Puppet::Util::Profiler.profile("Compile: Validate Catalog final", [:compiler, :validate_final]) do
206
+ validate_catalog(CatalogValidator::FINAL)
207
+ end
208
+
143
209
  if block_given?
144
210
  yield @catalog
145
211
  else
@@ -148,6 +214,10 @@ class Puppet::Parser::Compiler
148
214
  end
149
215
  end
150
216
 
217
+ def validate_catalog(validation_stage)
218
+ @catalog_validators.select { |vclass| vclass.validation_stage?(validation_stage) }.each { |vclass| vclass.new(@catalog).validate }
219
+ end
220
+
151
221
  # Constructs the overrides for the context
152
222
  def context_overrides()
153
223
  {
@@ -188,6 +258,111 @@ class Puppet::Parser::Compiler
188
258
  evaluate_classes(classes_without_params, @node_scope || topscope)
189
259
  end
190
260
 
261
+ # Evaluates the site - the top container for an environment catalog
262
+ # The site contain behaves analogous to a node - for the environment catalog, node expressions are ignored
263
+ # as the result is cross node. The site expression serves as a container for everything that is across
264
+ # all nodes.
265
+ #
266
+ # @api private
267
+ #
268
+ def evaluate_site
269
+ # Has a site been defined? If not, do nothing but issue a warning.
270
+ #
271
+ site = known_resource_types.find_site()
272
+ unless site
273
+ on_empty_site()
274
+ return
275
+ end
276
+
277
+ # Create a resource to model this site and add it to catalog
278
+ resource = site.ensure_in_catalog(topscope)
279
+
280
+ # The site sets node scope to be able to shadow what is in top scope
281
+ @node_scope = topscope.class_scope(site)
282
+
283
+ # Evaluates the logic contain in the site expression
284
+ resource.evaluate
285
+ end
286
+
287
+ # @api private
288
+ def on_empty_site
289
+ # do nothing
290
+ end
291
+
292
+ # Prunes the catalog by dropping all resources are contained under the Site (if a site expression is used).
293
+ # As a consequence all edges to/from dropped resources are also dropped.
294
+ # Once the pruning is performed, this compiler returns the pruned list when calling the #resources method.
295
+ # The pruning does not alter the order of resources in the resources list.
296
+ #
297
+ # @api private
298
+ def prune_catalog
299
+ prune_node_catalog
300
+ end
301
+
302
+ def prune_node_catalog
303
+ # Everything under Site[site] should be pruned as that is for the environment catalog, not a node
304
+ #
305
+ the_site_resource = @catalog.resource('Site', 'site')
306
+
307
+ if the_site_resource
308
+ # Get downstream vertexes returns a hash where the keys are the resources and values nesting level
309
+ to_be_removed = @catalog.downstream_from_vertex(the_site_resource).keys
310
+
311
+ # Drop the Site[site] resource if it has no content
312
+ if to_be_removed.empty?
313
+ to_be_removed << the_site_resource
314
+ end
315
+ else
316
+ to_be_removed = []
317
+ end
318
+
319
+ # keep_from_site is populated with any App resources.
320
+ application_resources = @resources.select {|r| r.type == 'App' }
321
+ # keep all applications plus what is directly referenced from applications
322
+ keep_from_site = application_resources
323
+ keep_from_site += application_resources.map {|app| @catalog.direct_dependents_of(app) }.flatten
324
+
325
+ to_be_removed -= keep_from_site
326
+ @catalog.remove_resource(*to_be_removed)
327
+ # set the pruned result
328
+ @resources = @catalog.resources
329
+ end
330
+
331
+ # @api private
332
+ def evaluate_applications
333
+ @applications.each do |app|
334
+ components = []
335
+ mapping = app.parameters[:nodes] ? app.parameters[:nodes].value : {}
336
+ raise Puppet::Error, "Invalid node mapping in #{app.ref}: Mapping must be a hash" unless mapping.is_a?(Hash)
337
+ all_mapped = Set.new
338
+ mapping.each do |k,v|
339
+ raise Puppet::Error, "Invalid node mapping in #{app.ref}: Key #{k} is not a Node" unless k.is_a?(Puppet::Resource) && k.type == 'Node'
340
+ v = [v] unless v.is_a?(Array)
341
+ v.each do |res|
342
+ raise Puppet::Error, "Invalid node mapping in #{app.ref}: Value #{res} is not a resource" unless res.is_a?(Puppet::Resource)
343
+ raise Puppet::Error, "Application #{app.ref} maps component #{res} to multiple nodes" if all_mapped.add?(res.ref).nil?
344
+ components << res if k.title == node.name
345
+ end
346
+ end
347
+ begin
348
+ @current_app = app
349
+ @current_components = components
350
+ unless @current_components.empty?
351
+ Puppet.notice "EVAL APP #{app} #{components.inspect}"
352
+ # Add the app itself since components mapped to the current node
353
+ # will have a containment edge for it
354
+ # @todo lutter 2015-01-28: the node mapping winds up in the
355
+ # catalog, but probably shouldn't
356
+ @catalog.add_resource(@current_app)
357
+ @current_app.evaluate
358
+ end
359
+ ensure
360
+ @current_app = nil
361
+ @current_components = nil
362
+ end
363
+ end
364
+ end
365
+
191
366
  # Evaluates each specified class in turn. If there are any classes that
192
367
  # can't be found, an error is raised. This method really just creates resource objects
193
368
  # that point back to the classes, and then the resources are themselves
@@ -203,6 +378,12 @@ class Puppet::Parser::Compiler
203
378
  classes = classes.keys
204
379
  end
205
380
 
381
+ unless @current_components.nil?
382
+ classes = classes.select do |title|
383
+ @current_components.any? { |comp| comp.class? && comp.title == title }
384
+ end
385
+ end
386
+
206
387
  hostclasses = classes.collect do |name|
207
388
  scope.find_hostclass(name) or raise Puppet::Error, "Could not find class #{name} for #{node.name}"
208
389
  end
@@ -232,9 +413,20 @@ class Puppet::Parser::Compiler
232
413
  def_delegator :@catalog, :resource, :findresource
233
414
 
234
415
  def initialize(node, options = {})
235
- @node = node
416
+ @node = sanitize_node(node)
417
+ # Array of resources representing all application instances we've found
418
+ @applications = []
419
+ # We use @current_app and @current_components to signal to the
420
+ # evaluator that we are in the middle of evaluating an
421
+ # application. They are set in evaluate_applications to the application
422
+ # instance, resp. to an array of the components of that application
423
+ # that is mapped to the current node. They are only non-nil when we are
424
+ # in the middle of executing evaluate_applications
425
+ @current_app = nil
426
+ @current_components = nil
236
427
  set_options(options)
237
428
  initvars
429
+ add_catalog_validators
238
430
  end
239
431
 
240
432
  # Create a new scope, with either a specified parent scope or
@@ -315,6 +507,38 @@ class Puppet::Parser::Compiler
315
507
  [already_included, newly_included]
316
508
  end
317
509
 
510
+ def evaluate_capability_mappings
511
+ krt = known_resource_types
512
+ krt.capability_mappings.each_value do |capability_mapping|
513
+ args = capability_mapping.arguments
514
+ component_ref = args['component']
515
+ kind = args['kind']
516
+
517
+ # That component_ref is either a QNAME or a Class['literal'|QREF] is asserted during validation so no
518
+ # need to check that here
519
+ if component_ref.is_a?(Puppet::Pops::Model::QualifiedName)
520
+ component_name = component_ref.value
521
+ component_type = 'type'
522
+ component = krt.find_definition(component_name)
523
+ else
524
+ component_name = component_ref.keys[0].value
525
+ component_type = 'class'
526
+ component = krt.find_hostclass(component_name)
527
+ end
528
+ if component.nil?
529
+ raise Puppet::ParseError, "Capability mapping error: #{kind} clause references nonexistent #{component_type} #{component_name}"
530
+ end
531
+
532
+ blueprint = args['blueprint']
533
+ if kind == 'produces'
534
+ component.add_produces(blueprint)
535
+ else
536
+ component.add_consumes(blueprint)
537
+ end
538
+ end
539
+ krt.capability_mappings.clear # No longer needed
540
+ end
541
+
318
542
  # If ast nodes are enabled, then see if we can find and evaluate one.
319
543
  def evaluate_ast_node
320
544
  return unless ast_nodes?
@@ -326,7 +550,7 @@ class Puppet::Parser::Compiler
326
550
  end
327
551
 
328
552
  unless (astnode ||= known_resource_types.node("default"))
329
- raise Puppet::ParseError, "Could not find default node or by name with '#{node.names.join(", ")}'"
553
+ raise Puppet::ParseError, "Could not find node statement with name 'default' or '#{node.names.join(", ")}'"
330
554
  end
331
555
 
332
556
  # Create a resource to model this node, and then add it to the list
@@ -363,9 +587,16 @@ class Puppet::Parser::Compiler
363
587
  def evaluate_definitions
364
588
  exceptwrap do
365
589
  Puppet::Util::Profiler.profile("Evaluated definitions", [:compiler, :evaluate_definitions]) do
366
- !unevaluated_resources.each do |resource|
367
- resource.evaluate
368
- end.empty?
590
+ urs = unevaluated_resources.each do |resource|
591
+ begin
592
+ resource.evaluate
593
+ rescue Puppet::Error => e
594
+ # PuppetError has the ability to wrap an exception, if so, use the wrapped exception's
595
+ # call stack instead
596
+ fail(Puppet::Pops::Issues::RUNTIME_ERROR, resource, {:detail => e.message}, e.original || e)
597
+ end
598
+ end
599
+ !urs.empty?
369
600
  end
370
601
  end
371
602
  end
@@ -420,8 +651,7 @@ class Puppet::Parser::Compiler
420
651
  remaining = @resource_overrides.values.flatten.collect(&:ref)
421
652
 
422
653
  if !remaining.empty?
423
- fail Puppet::ParseError,
424
- "Could not find resource(s) #{remaining.join(', ')} for overriding"
654
+ raise Puppet::ParseError, "Could not find resource(s) #{remaining.join(', ')} for overriding"
425
655
  end
426
656
  end
427
657
 
@@ -515,7 +745,7 @@ class Puppet::Parser::Compiler
515
745
  @relationships = []
516
746
 
517
747
  # For maintaining the relationship between scopes and their resources.
518
- @catalog = Puppet::Resource::Catalog.new(@node.name, @node.environment)
748
+ @catalog = Puppet::Resource::Catalog.new(@node.name, @node.environment, @code_id)
519
749
 
520
750
  # MOVED HERE - SCOPE IS NEEDED (MOVE-SCOPE)
521
751
  # Create the initial scope, it is needed early
@@ -547,6 +777,66 @@ class Puppet::Parser::Compiler
547
777
  else
548
778
  @catalog.add_class(*@node.classes)
549
779
  end
780
+
781
+ @catalog_validators = []
782
+ end
783
+
784
+ def sanitize_node(node)
785
+ # Resurrect "trusted information" that comes from node/fact terminus.
786
+ # The current way this is done in puppet db (currently the only one)
787
+ # is to store the node parameter 'trusted' as a hash of the trusted information.
788
+ #
789
+ # Thus here there are two main cases:
790
+ # 1. This terminus was used in a real agent call (only meaningful if someone curls the request as it would
791
+ # fail since the result is a hash of two catalogs).
792
+ # 2 It is a command line call with a given node that use a terminus that:
793
+ # 2.1 does not include a 'trusted' fact - use local from node trusted information
794
+ # 2.2 has a 'trusted' fact - this in turn could be
795
+ # 2.2.1 puppet db having stored trusted node data as a fact (not a great design)
796
+ # 2.2.2 some other terminus having stored a fact called "trusted" (most likely that would have failed earlier, but could
797
+ # be spoofed).
798
+ #
799
+ # For the reasons above, the resurection of trusted node data with authenticated => true is only performed
800
+ # if user is running as root, else it is resurrected as unauthenticated.
801
+ #
802
+ trusted_param = node.parameters['trusted']
803
+ if trusted_param
804
+ # Blows up if it is a parameter as it will be set as $trusted by the compiler as if it was a variable
805
+ node.parameters.delete('trusted')
806
+ if trusted_param.is_a?(Hash) && %w{authenticated certname extensions}.all? {|key| trusted_param.has_key?(key) }
807
+ # looks like a hash of trusted data - resurrect it
808
+ # Allow root to trust the authenticated information if option --trusted is given
809
+ if !Puppet.features.root?
810
+ # Set as not trusted - but keep the information
811
+ trusted_param['authenticated'] = false
812
+ end
813
+ else
814
+ # trusted is some kind of garbage, do not resurrect
815
+ trusted_param = nil
816
+ end
817
+ else
818
+ # trusted may be boolean false if set as a fact by someone
819
+ trusted_param = nil
820
+ end
821
+
822
+ # The options for node.trusted_data in priority order are:
823
+ # 1) node came with trusted_data so use that
824
+ # 2) else if there is :trusted_information in the puppet context
825
+ # 3) else if the node provided a 'trusted' parameter (parsed out above)
826
+ # 4) last, fallback to local node trusted information
827
+ #
828
+ # Note that trusted_data should be a hash, but (2) and (4) are not
829
+ # hashes, so we to_h at the end
830
+ if !node.trusted_data
831
+ trusted = Puppet.lookup(:trusted_information) do
832
+ trusted_param || Puppet::Context::TrustedInformation.local(node)
833
+ end
834
+
835
+ # Ruby 1.9.3 can't apply to_h to a hash, so check first
836
+ node.trusted_data = trusted.is_a?(Hash) ? trusted : trusted.to_h
837
+ end
838
+
839
+ node
550
840
  end
551
841
 
552
842
  # Set the node's parameters into the top-scope as variables.
@@ -608,5 +898,5 @@ class Puppet::Parser::Compiler
608
898
  unless activate_binder()
609
899
  raise Puppet::DevError, "The Puppet Binder was not activated"
610
900
  end
611
- end
901
+ end # Creates a diagnostic producer
612
902
  end