puppet 4.2.3 → 4.3.0

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

Potentially problematic release.


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

Files changed (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
@@ -17,10 +17,28 @@ class Puppet::Context::TrustedInformation
17
17
  # @return [Hash{Object => Object}]
18
18
  attr_reader :extensions
19
19
 
20
+ # The domain name derived from the validated certificate name
21
+ #
22
+ # @return [String]
23
+ attr_reader :domain
24
+
25
+ # The hostname derived from the validated certificate name
26
+ #
27
+ # @return [String]
28
+ attr_reader :hostname
29
+
20
30
  def initialize(authenticated, certname, extensions)
21
31
  @authenticated = authenticated.freeze
22
32
  @certname = certname.freeze
23
33
  @extensions = extensions.freeze
34
+ if @certname
35
+ hostname, domain = @certname.split('.', 2)
36
+ else
37
+ hostname = nil
38
+ domain = nil
39
+ end
40
+ @hostname = hostname.freeze
41
+ @domain = domain.freeze
24
42
  end
25
43
 
26
44
  def self.remote(authenticated, node_name, certificate)
@@ -50,7 +68,9 @@ class Puppet::Context::TrustedInformation
50
68
  {
51
69
  'authenticated'.freeze => authenticated,
52
70
  'certname'.freeze => certname,
53
- 'extensions'.freeze => extensions
71
+ 'extensions'.freeze => extensions,
72
+ 'hostname'.freeze => hostname,
73
+ 'domain'.freeze => domain,
54
74
  }.freeze
55
75
  end
56
76
  end
@@ -24,6 +24,7 @@ class Puppet::Daemon
24
24
  SIGNAL_CHECK_INTERVAL = 5
25
25
 
26
26
  attr_accessor :agent, :server, :argv
27
+ attr_reader :signals
27
28
 
28
29
  def initialize(pidfile, scheduler = Puppet::Scheduler::Scheduler.new())
29
30
  @scheduler = scheduler
@@ -87,12 +88,9 @@ class Puppet::Daemon
87
88
 
88
89
  def reload
89
90
  return unless agent
90
- if agent.running?
91
- Puppet.notice "Not triggering already-running agent"
92
- return
93
- end
94
-
95
91
  agent.run({:splay => false})
92
+ rescue Puppet::LockError
93
+ Puppet.notice "Not triggering already-running agent"
96
94
  end
97
95
 
98
96
  def restart
@@ -107,13 +105,21 @@ class Puppet::Daemon
107
105
  # Trap a couple of the main signals. This should probably be handled
108
106
  # in a way that anyone else can register callbacks for traps, but, eh.
109
107
  def set_signal_traps
110
- signals = {:INT => :stop, :TERM => :stop }
111
- # extended signals not supported under windows
112
- signals.update({:HUP => :restart, :USR1 => :reload, :USR2 => :reopen_logs }) unless Puppet.features.microsoft_windows?
113
- signals.each do |signal, method|
108
+ [:INT, :TERM].each do |signal|
114
109
  Signal.trap(signal) do
115
- Puppet.notice "Caught #{signal}; storing #{method}"
116
- @signals << method
110
+ Puppet.notice "Caught #{signal}; exiting"
111
+ stop
112
+ end
113
+ end
114
+
115
+ # extended signals not supported under windows
116
+ if !Puppet.features.microsoft_windows?
117
+ signals = {:HUP => :restart, :USR1 => :reload, :USR2 => :reopen_logs }
118
+ signals.each do |signal, method|
119
+ Signal.trap(signal) do
120
+ Puppet.notice "Caught #{signal}; storing #{method}"
121
+ @signals << method
122
+ end
117
123
  end
118
124
  end
119
125
  end
@@ -132,8 +138,6 @@ class Puppet::Daemon
132
138
  end
133
139
 
134
140
  def start
135
- set_signal_traps
136
-
137
141
  create_pidfile
138
142
 
139
143
  raise Puppet::DevError, "Daemons must have an agent, server, or both" unless agent or server
@@ -2,11 +2,13 @@ require 'puppet/indirector'
2
2
 
3
3
  # A class for managing data lookups
4
4
  class Puppet::DataBinding
5
- class LookupError < Puppet::Error; end
6
-
7
5
  # Set up indirection, so that data can be looked for in the compiler
8
6
  extend Puppet::Indirector
9
7
 
10
8
  indirects(:data_binding, :terminus_setting => :data_binding_terminus,
11
9
  :doc => "Where to find external data bindings.")
10
+
11
+ class LookupError < Puppet::PreformattedError; end
12
+
13
+ class RecursiveLookupError < Puppet::DataBinding::LookupError; end
12
14
  end
@@ -4,28 +4,27 @@ module Puppet::DataProviders
4
4
  unless @loaded
5
5
  require 'puppet/pops'
6
6
  require 'puppet/data_providers/data_adapter'
7
+ require 'puppet/data_providers/lookup_adapter'
7
8
  end
8
9
  @loaded = true
9
10
  end
10
11
 
11
- def self.lookup_in_environment(name, scope, merge)
12
- assert_loaded()
13
- adapter = Puppet::DataProviders::DataAdapter.adapt(Puppet.lookup(:current_environment))
14
- adapter.env_provider.lookup(name, scope, merge)
12
+ # @deprecated use `lookup_adapter(lookup_invocation).lookup` instead
13
+ def self.lookup_in_environment(name, lookup_invocation, merge)
14
+ Puppet.deprecation_warning('The method Puppet::DataProviders.lookup_in_environment is deprecated and will be removed in the next major release of Puppet.')
15
+ lookup_adapter(lookup_invocation).lookup_in_environment(name, lookup_invocation, Puppet::Pops::MergeStrategy.strategy(merge))
15
16
  end
16
17
 
17
18
  MODULE_NAME = 'module_name'.freeze
18
19
 
19
- def self.lookup_in_module(name, scope, merge)
20
- # Do not attempt to do a lookup in a module unless the name is qualified.
21
- qual_index = name.index('::')
22
- throw :no_such_key if qual_index.nil?
23
- module_name = name[0..qual_index-1]
20
+ # @deprecated use `adapter(lookup_invocation).lookup` instead
21
+ def self.lookup_in_module(name, lookup_invocation, merge)
22
+ Puppet.deprecation_warning('The method Puppet::DataProviders.lookup_in_module is deprecated and will be removed in the next major release of Puppet.')
23
+ lookup_adapter(lookup_invocation).lookup_in_module(name, lookup_invocation, Puppet::Pops::MergeStrategy.strategy(merge))
24
+ end
24
25
 
26
+ def self.lookup_adapter(lookup_invocation)
25
27
  assert_loaded()
26
- adapter = Puppet::DataProviders::DataAdapter.adapt(Puppet.lookup(:current_environment))
27
- data_provider = adapter.module_provider(module_name)
28
- throw :no_such_key if data_provider.nil?
29
- data_provider.lookup(name, scope, merge)
28
+ LookupAdapter.adapt(lookup_invocation.scope.environment)
30
29
  end
31
30
  end
@@ -1,11 +1,15 @@
1
1
  # A DataAdapter adapts an object with a Hash of data
2
2
  #
3
3
  class Puppet::DataProviders::DataAdapter < Puppet::Pops::Adaptable::Adapter
4
+ include Puppet::Plugins::DataProviders
5
+
4
6
  attr_accessor :data
5
- attr_accessor :env_provider
6
7
 
7
- def initialize(env)
8
- @env = env
8
+ def self.create_adapter(o)
9
+ new
10
+ end
11
+
12
+ def initialize
9
13
  @data = {}
10
14
  end
11
15
 
@@ -23,69 +27,4 @@ class Puppet::DataProviders::DataAdapter < Puppet::Pops::Adaptable::Adapter
23
27
  end
24
28
  @data[name] = value
25
29
  end
26
-
27
- def env_provider
28
- @env_provider ||= initialize_env_provider
29
- end
30
-
31
- def module_provider(module_name)
32
- # Test if the key is present for the given module_name. It might be there even if the
33
- # value is nil (which indicates that no module provider is configured for the given name)
34
- unless @data.include?(module_name)
35
- @data[module_name] = initialize_module_provider(module_name)
36
- end
37
- @data[module_name]
38
- end
39
-
40
- def self.create_adapter(environment)
41
- new(environment)
42
- end
43
-
44
- def initialize_module_provider(module_name)
45
- # Support running tests without an injector being configured == using a null implementation
46
- unless injector = Puppet.lookup(:injector) { nil }
47
- return Puppet::Plugins::DataProviders::ModuleDataProvider.new()
48
- end
49
- # Get the registry of module to provider implementation name
50
- module_service_type = Puppet::Plugins::DataProviders.hash_of_per_module_data_provider
51
- module_service_name = Puppet::Plugins::DataProviders::PER_MODULE_DATA_PROVIDER_KEY
52
- module_service = Puppet.lookup(:injector).lookup(nil, module_service_type, module_service_name)
53
- provider_name = module_service[module_name] || 'none'
54
-
55
- service_type = Puppet::Plugins::DataProviders.hash_of_module_data_providers
56
- service_name = Puppet::Plugins::DataProviders::MODULE_DATA_PROVIDERS_KEY
57
-
58
- # Get the service (registry of known implementations)
59
- service = Puppet.lookup(:injector).lookup(nil, service_type, service_name)
60
- provider = service[provider_name]
61
- unless provider
62
- raise Puppet::Error.new("Environment '#{@env.name}', cannot find module_data_provider '#{provider_name}'")
63
- end
64
- provider
65
- end
66
-
67
- def initialize_env_provider
68
- # Get the environment's configuration since we need to know which data provider
69
- # should be used (includes 'none' which gets a null implementation).
70
- #
71
- env_conf = Puppet.lookup(:environments).get_conf(@env.name)
72
-
73
- # Get the data provider and find the bound implementation
74
- # TODO: PUP-1640, drop the nil check when legacy env support is dropped
75
- provider_name = env_conf.nil? ? 'none' : env_conf.environment_data_provider
76
- service_type = Puppet::Plugins::DataProviders.hash_of_environment_data_providers
77
- service_name = Puppet::Plugins::DataProviders::ENV_DATA_PROVIDERS_KEY
78
-
79
- # Get the service (registry of known implementations)
80
- # Support running tests without an injector being configured == using a null implementation
81
- unless injector = Puppet.lookup(:injector) { nil }
82
- return Puppet::Plugins::DataProviders::EnvironmentDataProvider.new()
83
- end
84
- service = Puppet.lookup(:injector).lookup(nil, service_type, service_name)
85
- provider = service[provider_name]
86
- unless provider
87
- raise Puppet::Error.new("Environment '#{@env.name}', cannot find environment_data_provider '#{provider_name}'")
88
- end
89
- provider
90
- end
91
30
  end
@@ -1,30 +1,9 @@
1
1
  module Puppet::DataProviders::DataFunctionSupport
2
- # Gets the data from the compiler, or initializes it from a function call if not present in the compiler.
3
- # This means, that the function providing the data is called once per compilation, and the data is cached for
4
- # as long as the compiler lives (which is for one catalog production).
5
- # This makes it possible to return data that is tailored for the request.
6
- # The class including this module must implement `loader(scope)` to return the apropriate loader.
7
- #
8
- # If a block is given, it will be called to validate the data hash when it is retrieved from a function call. The
9
- # block must return the validated data or raise a {Puppet::Error} to indicate that the data is invalid.
10
- # The block is not called when the data is found in the compiler or in the cache.
11
- #
12
- # @param key [String] The data key such as the name of a module or the constant 'environment'
13
- # @param scope [Parser::Scope] The scope
14
- # @return [Hash] The data hash for the given _key_
15
- # @yield An optional block that can be used for validation of the data returned from the function
16
- # @yieldparam [Hash] data The data to validate
17
- # @yieldreturn [Hash] The validated data
18
- #
19
- def data(key, scope, &block)
20
- compiler = scope.compiler
21
- adapter = Puppet::DataProviders::DataAdapter.get(compiler) || Puppet::DataProviders::DataAdapter.adapt(compiler)
22
- adapter.data[key] ||= initialize_data_from_function("#{key}::data", key, scope, &block)
23
- end
24
-
25
- def initialize_data_from_function(name, key, scope)
2
+ def initialize_data(data_key, lookup_invocation)
3
+ name = "#{data_key}::data"
4
+ scope = lookup_invocation.scope
26
5
  Puppet::Util::Profiler.profile("Called #{name}", [ :functions, name ]) do
27
- loader = loader(key, scope)
6
+ loader = loader(data_key, scope)
28
7
  if loader && func = loader.load(:function, name)
29
8
  # function found, call without arguments, must return a Hash
30
9
  # TODO: Validate the function - to ensure it does not contain unwanted side effects
@@ -37,7 +16,7 @@ module Puppet::DataProviders::DataFunctionSupport
37
16
  # validate result if block given
38
17
  result = yield(result) if block_given?
39
18
  else
40
- raise Puppet::Error.new("Data from 'function' cannot find the required '#{name}' function")
19
+ raise Puppet::Error.new("Cannot find the function '#{name}' - required when using 'function' data provider scheme")
41
20
  end
42
21
  result
43
22
  end
@@ -11,16 +11,6 @@ module Puppet::DataProviders; end
11
11
  class Puppet::DataProviders::FunctionEnvDataProvider < Puppet::Plugins::DataProviders::EnvironmentDataProvider
12
12
  include Puppet::DataProviders::DataFunctionSupport
13
13
 
14
- def lookup(name, scope, merge)
15
- begin
16
- hash = data('environment', scope)
17
- throw :no_such_key unless hash.include?(name)
18
- hash[name]
19
- rescue *Puppet::Error => detail
20
- raise Puppet::DataBinding::LookupError.new(detail.message, detail)
21
- end
22
- end
23
-
24
14
  def loader(key, scope)
25
15
  # This loader allows the data function to be private or public in the environment
26
16
  scope.compiler.loaders.private_environment_loader
@@ -9,30 +9,8 @@ module Puppet::DataProviders; end
9
9
  # is only produced once per compilation.
10
10
  #
11
11
  class Puppet::DataProviders::FunctionModuleDataProvider < Puppet::Plugins::DataProviders::ModuleDataProvider
12
- MODULE_NAME = 'module_name'.freeze
13
12
  include Puppet::DataProviders::DataFunctionSupport
14
13
 
15
- def lookup(name, scope, merge)
16
- # Do not attempt to do a lookup in a module unless the name is qualified.
17
- qual_index = name.index('::')
18
- throw :no_such_key if qual_index.nil?
19
- module_name = name[0..qual_index-1]
20
- begin
21
- hash = data(module_name, scope) do | data |
22
- module_prefix = "#{module_name}::"
23
- data.each_pair do |k,v|
24
- unless k.is_a?(String) && k.start_with?(module_prefix)
25
- raise Puppet::Error, "Module data for module '#{module_name}' must use keys qualified with the name of the module"
26
- end
27
- end
28
- end
29
- throw :no_such_key unless hash.include?(name)
30
- hash[name]
31
- rescue *Puppet::Error => detail
32
- raise Puppet::DataBinding::LookupError.new(detail.message, detail)
33
- end
34
- end
35
-
36
14
  def loader(key, scope)
37
15
  scope.compiler.loaders.private_loader_for_module(key)
38
16
  end
@@ -0,0 +1,106 @@
1
+ require 'pathname'
2
+ require_relative 'hiera_interpolate'
3
+
4
+ module Puppet::DataProviders
5
+ class HieraConfig
6
+ include Puppet::Plugins::DataProviders
7
+ include HieraInterpolate
8
+
9
+ DEFAULT_CONFIG = {
10
+ 'version' => 4,
11
+ 'datadir' => 'data',
12
+ 'hierarchy' => [
13
+ {
14
+ 'name' => 'common',
15
+ 'backend' => 'yaml'
16
+ }
17
+ ]
18
+ }.freeze
19
+
20
+ def self.config_type
21
+ @@CONFIG_TYPE ||= create_config_type
22
+ end
23
+
24
+ def self.symkeys_to_string(struct)
25
+ case(struct)
26
+ when Hash
27
+ Hash[struct.map { |k,v| [k.to_s, symkeys_to_string(v)] }]
28
+ when Array
29
+ struct.map { |v| symkeys_to_string(v) }
30
+ else
31
+ struct
32
+ end
33
+ end
34
+
35
+ def self.create_config_type
36
+ hierarchy_elem_type_base = 'Struct[{'\
37
+ 'backend=>String[1],'\
38
+ 'name=>String[1],'\
39
+ 'datadir=>Optional[String[1]]'
40
+
41
+ hierarchy_elem_type_v1 = hierarchy_elem_type_base + ',path=>String[1]}]'
42
+ hierarchy_elem_type_v2 = hierarchy_elem_type_base + ',paths=>Array[String[1]]}]'
43
+ hierarchy_elem_type_v3 = hierarchy_elem_type_base + '}]'
44
+
45
+ Puppet::Pops::Types::TypeParser.new.parse('Struct[{'\
46
+ 'version=>Integer[4],'\
47
+ "hierarchy=>Optional[Array[Variant[#{hierarchy_elem_type_v1},#{hierarchy_elem_type_v2},#{hierarchy_elem_type_v3}]]],"\
48
+ 'datadir=>Optional[String[1]]}]')
49
+ end
50
+ private_class_method :create_config_type
51
+
52
+ attr_reader :config_path, :version
53
+
54
+ # Creates a new HieraConfig from the given _config_root_. This is where the 'hiera.yaml' is expected to be found
55
+ # and is also the base location used when resolving relative paths.
56
+ #
57
+ # @param config_root [Pathname] Absolute path to the configuration root
58
+ # @api public
59
+ def initialize(config_root)
60
+ @config_root = config_root
61
+ @config_path = config_root + 'hiera.yaml'
62
+ if @config_path.exist?
63
+ @config = validate_config(HieraConfig.symkeys_to_string(YAML.load_file(@config_path)))
64
+ @config['hierarchy'] ||= DEFAULT_CONFIG['hierarchy']
65
+ @config['datadir'] ||= DEFAULT_CONFIG['datadir']
66
+ else
67
+ @config = DEFAULT_CONFIG
68
+ end
69
+ @version = @config['version']
70
+ end
71
+
72
+ def create_data_providers(lookup_invocation)
73
+ injector = Puppet.lookup(:injector)
74
+ service_type = Registry.hash_of_path_based_data_provider_factories
75
+ default_datadir = @config['datadir']
76
+
77
+ # Hashes enumerate their values in the order that the corresponding keys were inserted so it's safe to use
78
+ # a hash for the data_providers.
79
+ data_providers = {}
80
+ @config['hierarchy'].each do |he|
81
+ name = he['name']
82
+ raise Puppet::DataBinding::LookupError, "#{path}: Name '#{name}' defined more than once" if data_providers.include?(name)
83
+ original_paths = he['paths']
84
+ if original_paths.nil?
85
+ single_path = he['path']
86
+ single_path = name if single_path.nil?
87
+ original_paths = [single_path]
88
+ end
89
+ paths = original_paths.map { |path| interpolate(path, lookup_invocation, false)}
90
+ provider_name = he['backend']
91
+ provider_factory = injector.lookup(nil, service_type, PATH_BASED_DATA_PROVIDER_FACTORIES_KEY)[provider_name]
92
+ raise Puppet::DataBinding::LookupError, "#{@config_path}: No data provider is registered for backend '#{provider_name}' " unless provider_factory
93
+
94
+ datadir = @config_root + (he['datadir'] || default_datadir)
95
+ resolved_paths = provider_factory.resolve_paths(datadir, original_paths, paths, lookup_invocation)
96
+ data_providers[name] = provider_factory.create(name, resolved_paths)
97
+ end
98
+ data_providers.values
99
+ end
100
+
101
+ def validate_config(hiera_config)
102
+ Puppet::Pops::Types::TypeAsserter.assert_instance_of(@config_path, self.class.config_type, hiera_config)
103
+ end
104
+ private :validate_config
105
+ end
106
+ end
@@ -0,0 +1,18 @@
1
+ # This file is loaded by the autoloader, and it does not find the hiera support unless required relative
2
+ require_relative 'hiera_support'
3
+
4
+ module Puppet::DataProviders
5
+ class HieraEnvDataProvider < Puppet::Plugins::DataProviders::EnvironmentDataProvider
6
+ include HieraSupport
7
+
8
+ # Return the root of the environment found in the given _scope_
9
+ #
10
+ # @param data_key [String] not used
11
+ # @param scope [Puppet::Parser::Scope] the parser scope where the environment is found
12
+ # @return [Pathname] Path to root of the environment
13
+ def provider_root(_, scope)
14
+ Pathname.new(scope.environment.configuration.path_to_env)
15
+ end
16
+ protected :provider_root
17
+ end
18
+ end