puppet 4.2.0 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. data/CONTRIBUTING.md +1 -1
  2. data/Gemfile +5 -7
  3. data/README.md +1 -1
  4. data/Rakefile +20 -0
  5. data/ext/debian/puppet.init +0 -1
  6. data/ext/debian/puppet.logrotate +14 -5
  7. data/ext/osx/puppet.plist +2 -4
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/redhat/client.init +65 -12
  10. data/ext/redhat/logrotate +15 -3
  11. data/ext/redhat/puppet.spec.erb +5 -1
  12. data/ext/redhat/server.init +1 -1
  13. data/ext/solaris/smf/puppet +44 -0
  14. data/ext/solaris/smf/puppet.xml +44 -0
  15. data/ext/suse/client.init +27 -27
  16. data/ext/suse/server.init +2 -2
  17. data/ext/systemd/puppet.service +1 -0
  18. data/install.rb +21 -39
  19. data/lib/hiera/puppet_function.rb +5 -5
  20. data/lib/puppet/agent/locker.rb +11 -2
  21. data/lib/puppet/agent.rb +4 -4
  22. data/lib/puppet/application/agent.rb +28 -14
  23. data/lib/puppet/application/apply.rb +17 -4
  24. data/lib/puppet/application/cert.rb +16 -0
  25. data/lib/puppet/application/filebucket.rb +78 -4
  26. data/lib/puppet/application/lookup.rb +356 -0
  27. data/lib/puppet/application/master.rb +5 -1
  28. data/lib/puppet/configurer.rb +9 -5
  29. data/lib/puppet/context/trusted_information.rb +21 -1
  30. data/lib/puppet/context.rb +16 -1
  31. data/lib/puppet/daemon.rb +17 -13
  32. data/lib/puppet/data_binding.rb +4 -2
  33. data/lib/puppet/data_providers/data_adapter.rb +7 -68
  34. data/lib/puppet/data_providers/data_function_support.rb +5 -26
  35. data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
  36. data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
  37. data/lib/puppet/data_providers/hiera_config.rb +106 -0
  38. data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
  39. data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
  40. data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
  41. data/lib/puppet/data_providers/hiera_support.rb +37 -0
  42. data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
  43. data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
  44. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
  45. data/lib/puppet/data_providers.rb +12 -13
  46. data/lib/puppet/defaults.rb +14 -3
  47. data/lib/puppet/environments.rb +94 -6
  48. data/lib/puppet/error.rb +4 -0
  49. data/lib/puppet/face/module/changes.rb +2 -1
  50. data/lib/puppet/feature/cfacter.rb +1 -0
  51. data/lib/puppet/file_bucket/dipper.rb +58 -2
  52. data/lib/puppet/file_system/windows.rb +3 -1
  53. data/lib/puppet/functions/assert_type.rb +48 -12
  54. data/lib/puppet/functions/defined.rb +79 -48
  55. data/lib/puppet/functions/each.rb +85 -27
  56. data/lib/puppet/functions/epp.rb +29 -37
  57. data/lib/puppet/functions/filter.rb +60 -25
  58. data/lib/puppet/functions/hiera.rb +76 -3
  59. data/lib/puppet/functions/hiera_array.rb +65 -3
  60. data/lib/puppet/functions/hiera_hash.rb +74 -2
  61. data/lib/puppet/functions/hiera_include.rb +77 -4
  62. data/lib/puppet/functions/inline_epp.rb +44 -71
  63. data/lib/puppet/functions/lookup.rb +19 -17
  64. data/lib/puppet/functions/map.rb +56 -21
  65. data/lib/puppet/functions/match.rb +29 -12
  66. data/lib/puppet/functions/reduce.rb +95 -58
  67. data/lib/puppet/functions/versioncmp.rb +36 -0
  68. data/lib/puppet/functions/with.rb +15 -7
  69. data/lib/puppet/functions.rb +2 -4
  70. data/lib/puppet/indirector/catalog/compiler.rb +3 -3
  71. data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
  72. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  73. data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
  74. data/lib/puppet/indirector/hiera.rb +4 -0
  75. data/lib/puppet/indirector/indirection.rb +6 -1
  76. data/lib/puppet/indirector/json.rb +1 -1
  77. data/lib/puppet/indirector/msgpack.rb +1 -1
  78. data/lib/puppet/indirector/request.rb +7 -8
  79. data/lib/puppet/indirector/resource_type/parser.rb +5 -3
  80. data/lib/puppet/info_service/class_information_service.rb +111 -0
  81. data/lib/puppet/info_service.rb +7 -0
  82. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  83. data/lib/puppet/module_tool/metadata.rb +32 -9
  84. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  85. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
  86. data/lib/puppet/network/authconfig.rb +21 -1
  87. data/lib/puppet/network/authorization.rb +8 -1
  88. data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
  89. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  90. data/lib/puppet/node/environment.rb +9 -2
  91. data/lib/puppet/node.rb +11 -5
  92. data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
  93. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  94. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
  95. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  96. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  97. data/lib/puppet/parser/compiler.rb +300 -12
  98. data/lib/puppet/parser/environment_compiler.rb +165 -0
  99. data/lib/puppet/parser/functions/assert_type.rb +46 -16
  100. data/lib/puppet/parser/functions/defined.rb +105 -68
  101. data/lib/puppet/parser/functions/each.rb +85 -27
  102. data/lib/puppet/parser/functions/epp.rb +29 -37
  103. data/lib/puppet/parser/functions/filter.rb +59 -23
  104. data/lib/puppet/parser/functions/hiera.rb +83 -27
  105. data/lib/puppet/parser/functions/hiera_array.rb +71 -28
  106. data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
  107. data/lib/puppet/parser/functions/hiera_include.rb +81 -40
  108. data/lib/puppet/parser/functions/inline_epp.rb +35 -60
  109. data/lib/puppet/parser/functions/inline_template.rb +2 -2
  110. data/lib/puppet/parser/functions/map.rb +55 -20
  111. data/lib/puppet/parser/functions/match.rb +27 -12
  112. data/lib/puppet/parser/functions/reduce.rb +97 -60
  113. data/lib/puppet/parser/functions/with.rb +16 -8
  114. data/lib/puppet/parser/resource.rb +103 -21
  115. data/lib/puppet/parser.rb +3 -0
  116. data/lib/puppet/plugins/configuration.rb +3 -2
  117. data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
  118. data/lib/puppet/plugins/data_providers/registry.rb +84 -0
  119. data/lib/puppet/plugins/data_providers.rb +12 -60
  120. data/lib/puppet/pops/adapters.rb +12 -0
  121. data/lib/puppet/pops/binder/binder.rb +2 -2
  122. data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
  123. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  124. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  125. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  126. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  127. data/lib/puppet/pops/binder/injector.rb +4 -4
  128. data/lib/puppet/pops/binder/key_factory.rb +3 -9
  129. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  130. data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
  131. data/lib/puppet/pops/evaluator/closure.rb +8 -8
  132. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  133. data/lib/puppet/pops/evaluator/evaluator_impl.rb +10 -6
  134. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  135. data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
  136. data/lib/puppet/pops/functions/dispatcher.rb +3 -3
  137. data/lib/puppet/pops/issues.rb +11 -3
  138. data/lib/puppet/pops/label_provider.rb +1 -1
  139. data/lib/puppet/pops/lookup/explainer.rb +402 -0
  140. data/lib/puppet/pops/lookup/invocation.rb +117 -0
  141. data/lib/puppet/pops/lookup.rb +25 -47
  142. data/lib/puppet/pops/merge_strategy.rb +73 -5
  143. data/lib/puppet/pops/model/factory.rb +38 -3
  144. data/lib/puppet/pops/model/model_label_provider.rb +10 -1
  145. data/lib/puppet/pops/model/model_meta.rb +19 -1
  146. data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
  147. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  148. data/lib/puppet/pops/parser/egrammar.ra +65 -2
  149. data/lib/puppet/pops/parser/eparser.rb +1569 -1241
  150. data/lib/puppet/pops/parser/lexer2.rb +32 -1
  151. data/lib/puppet/pops/parser/locator.rb +1 -1
  152. data/lib/puppet/pops/parser/parser_support.rb +25 -13
  153. data/lib/puppet/pops/patterns.rb +3 -0
  154. data/lib/puppet/pops/types/enumeration.rb +1 -2
  155. data/lib/puppet/pops/types/type_asserter.rb +16 -15
  156. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  157. data/lib/puppet/pops/types/type_calculator.rb +171 -1020
  158. data/lib/puppet/pops/types/type_factory.rb +87 -148
  159. data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
  160. data/lib/puppet/pops/types/type_parser.rb +118 -129
  161. data/lib/puppet/pops/types/types.rb +1394 -255
  162. data/lib/puppet/pops/types/types_meta.rb +0 -234
  163. data/lib/puppet/pops/validation/checker4_0.rb +49 -1
  164. data/lib/puppet/pops/validation/validator_factory_4_0.rb +3 -1
  165. data/lib/puppet/pops/validation.rb +7 -2
  166. data/lib/puppet/pops.rb +19 -17
  167. data/lib/puppet/provider/augeas/augeas.rb +50 -0
  168. data/lib/puppet/provider/exec.rb +6 -1
  169. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  170. data/lib/puppet/provider/package/dnf.rb +41 -0
  171. data/lib/puppet/provider/package/gem.rb +7 -2
  172. data/lib/puppet/provider/package/nim.rb +1 -1
  173. data/lib/puppet/provider/package/rpm.rb +1 -0
  174. data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
  175. data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
  176. data/lib/puppet/provider/package/windows/package.rb +9 -1
  177. data/lib/puppet/provider/package/yum.rb +20 -9
  178. data/lib/puppet/provider/service/bsd.rb +1 -1
  179. data/lib/puppet/provider/service/debian.rb +21 -0
  180. data/lib/puppet/provider/service/init.rb +6 -0
  181. data/lib/puppet/provider/service/launchd.rb +36 -7
  182. data/lib/puppet/provider/service/rcng.rb +51 -0
  183. data/lib/puppet/provider/service/redhat.rb +2 -1
  184. data/lib/puppet/provider/service/smf.rb +43 -2
  185. data/lib/puppet/provider/service/src.rb +27 -0
  186. data/lib/puppet/provider/service/systemd.rb +25 -5
  187. data/lib/puppet/provider/sshkey/parsed.rb +19 -9
  188. data/lib/puppet/provider/zone/solaris.rb +2 -2
  189. data/lib/puppet/reference/configuration.rb +10 -4
  190. data/lib/puppet/reference/report.rb +9 -12
  191. data/lib/puppet/reports.rb +5 -1
  192. data/lib/puppet/resource/capability_finder.rb +95 -0
  193. data/lib/puppet/resource/catalog.rb +47 -7
  194. data/lib/puppet/resource/status.rb +0 -2
  195. data/lib/puppet/resource/type.rb +238 -44
  196. data/lib/puppet/resource/type_collection.rb +60 -2
  197. data/lib/puppet/resource.rb +50 -73
  198. data/lib/puppet/settings/file_setting.rb +10 -9
  199. data/lib/puppet/settings.rb +2 -2
  200. data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
  201. data/lib/puppet/ssl/oids.rb +9 -1
  202. data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
  203. data/lib/puppet/transaction/resource_harness.rb +9 -4
  204. data/lib/puppet/transaction.rb +8 -1
  205. data/lib/puppet/type/augeas.rb +8 -0
  206. data/lib/puppet/type/file/source.rb +14 -12
  207. data/lib/puppet/type/package.rb +9 -6
  208. data/lib/puppet/type/user.rb +4 -2
  209. data/lib/puppet/type.rb +78 -7
  210. data/lib/puppet/util/command_line.rb +4 -0
  211. data/lib/puppet/util/execution.rb +18 -2
  212. data/lib/puppet/util/tagging.rb +7 -1
  213. data/lib/puppet/util/windows/adsi.rb +5 -2
  214. data/lib/puppet/util/windows/security.rb +4 -1
  215. data/lib/puppet/util/windows/taskscheduler.rb +1 -1
  216. data/lib/puppet/util.rb +9 -1
  217. data/lib/puppet/version.rb +1 -1
  218. data/lib/puppet.rb +12 -0
  219. data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
  220. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  221. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  222. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  223. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  224. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  225. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  226. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  227. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  228. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  229. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  230. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  231. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  232. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  233. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  234. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  235. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  236. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  237. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  238. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  239. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  240. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  241. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
  242. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  243. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
  244. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  245. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  246. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  247. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  248. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  249. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  250. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  251. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  252. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
  253. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  254. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  255. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  256. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
  257. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  258. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  259. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  260. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  261. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
  262. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  263. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  264. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
  265. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  266. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
  267. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
  268. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  269. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  270. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
  271. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
  272. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  273. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  274. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  275. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  276. data/spec/integration/data_binding_spec.rb +229 -0
  277. data/spec/integration/file_bucket/file_spec.rb +2 -2
  278. data/spec/integration/parser/compiler_spec.rb +30 -24
  279. data/spec/integration/parser/resource_expressions_spec.rb +4 -4
  280. data/spec/integration/parser/undef_param_spec.rb +1 -1
  281. data/spec/integration/provider/package_spec.rb +3 -1
  282. data/spec/integration/resource/catalog_spec.rb +1 -1
  283. data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
  284. data/spec/integration/ssl/certificate_request_spec.rb +0 -1
  285. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
  286. data/spec/integration/ssl/host_spec.rb +0 -1
  287. data/spec/integration/type/package_spec.rb +2 -0
  288. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  289. data/spec/integration/util/windows/security_spec.rb +18 -0
  290. data/spec/lib/matchers/include_in_order.rb +2 -2
  291. data/spec/shared_behaviours/iterative_functions.rb +8 -8
  292. data/spec/spec_helper.rb +7 -0
  293. data/spec/unit/agent/locker_spec.rb +4 -4
  294. data/spec/unit/agent_spec.rb +0 -8
  295. data/spec/unit/application/agent_spec.rb +5 -0
  296. data/spec/unit/application/apply_spec.rb +9 -1
  297. data/spec/unit/application/filebucket_spec.rb +88 -2
  298. data/spec/unit/application/lookup_spec.rb +195 -0
  299. data/spec/unit/application/master_spec.rb +2 -2
  300. data/spec/unit/application_spec.rb +3 -3
  301. data/spec/unit/appmgmt_spec.rb +657 -0
  302. data/spec/unit/capability_spec.rb +414 -0
  303. data/spec/unit/configurer_spec.rb +7 -1
  304. data/spec/unit/context/trusted_information_spec.rb +24 -1
  305. data/spec/unit/daemon_spec.rb +18 -8
  306. data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
  307. data/spec/unit/environments_spec.rb +2 -0
  308. data/spec/unit/face/node_spec.rb +1 -1
  309. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  310. data/spec/unit/file_serving/configuration_spec.rb +1 -1
  311. data/spec/unit/file_system_spec.rb +20 -0
  312. data/spec/unit/functions/assert_type_spec.rb +5 -7
  313. data/spec/unit/functions/defined_spec.rb +2 -2
  314. data/spec/unit/functions/epp_spec.rb +2 -2
  315. data/spec/unit/functions/filter_spec.rb +18 -0
  316. data/spec/unit/functions/hiera_spec.rb +2 -2
  317. data/spec/unit/functions/lookup_spec.rb +200 -9
  318. data/spec/unit/functions/regsubst_spec.rb +17 -8
  319. data/spec/unit/functions/scanf_spec.rb +1 -1
  320. data/spec/unit/functions/split_spec.rb +2 -2
  321. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  322. data/spec/unit/functions4_spec.rb +58 -72
  323. data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
  324. data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
  325. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  326. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  327. data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
  328. data/spec/unit/indirector/indirection_spec.rb +13 -2
  329. data/spec/unit/indirector/request_spec.rb +8 -8
  330. data/spec/unit/indirector/ssl_file_spec.rb +1 -1
  331. data/spec/unit/indirector/yaml_spec.rb +1 -1
  332. data/spec/unit/info_service_spec.rb +236 -0
  333. data/spec/unit/module_tool/application_spec.rb +1 -1
  334. data/spec/unit/module_tool/applications/builder_spec.rb +1 -1
  335. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  336. data/spec/unit/network/authconfig_spec.rb +62 -32
  337. data/spec/unit/network/authorization_spec.rb +30 -2
  338. data/spec/unit/network/authstore_spec.rb +1 -1
  339. data/spec/unit/network/http/compression_spec.rb +1 -1
  340. data/spec/unit/network/http/connection_spec.rb +14 -19
  341. data/spec/unit/network/http/handler_spec.rb +0 -5
  342. data/spec/unit/network/rights_spec.rb +3 -3
  343. data/spec/unit/node_spec.rb +27 -0
  344. data/spec/unit/parser/ast/leaf_spec.rb +1 -1
  345. data/spec/unit/parser/compiler_spec.rb +86 -2
  346. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  347. data/spec/unit/parser/resource_spec.rb +2 -20
  348. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  349. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  350. data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
  351. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  352. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +20 -11
  353. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  354. data/spec/unit/pops/label_provider_spec.rb +5 -1
  355. data/spec/unit/pops/parser/lexer2_spec.rb +39 -0
  356. data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
  357. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
  358. data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
  359. data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
  360. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  361. data/spec/unit/pops/parser/parser_spec.rb +18 -0
  362. data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
  363. data/spec/unit/pops/types/type_factory_spec.rb +12 -12
  364. data/spec/unit/pops/types/type_parser_spec.rb +15 -12
  365. data/spec/unit/pops/validator/validator_spec.rb +68 -0
  366. data/spec/unit/property_spec.rb +1 -1
  367. data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
  368. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  369. data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
  370. data/spec/unit/provider/package/dnf_spec.rb +92 -0
  371. data/spec/unit/provider/package/gem_spec.rb +7 -0
  372. data/spec/unit/provider/package/nim_spec.rb +6 -6
  373. data/spec/unit/provider/package/rpm_spec.rb +25 -2
  374. data/spec/unit/provider/package/windows/package_spec.rb +41 -0
  375. data/spec/unit/provider/package/yum_spec.rb +35 -12
  376. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
  377. data/spec/unit/provider/service/debian_spec.rb +28 -0
  378. data/spec/unit/provider/service/gentoo_spec.rb +1 -0
  379. data/spec/unit/provider/service/init_spec.rb +6 -0
  380. data/spec/unit/provider/service/launchd_spec.rb +85 -10
  381. data/spec/unit/provider/service/openrc_spec.rb +1 -0
  382. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  383. data/spec/unit/provider/service/redhat_spec.rb +8 -1
  384. data/spec/unit/provider/service/smf_spec.rb +30 -5
  385. data/spec/unit/provider/service/src_spec.rb +20 -4
  386. data/spec/unit/provider/service/systemd_spec.rb +79 -29
  387. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +1 -1
  388. data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
  389. data/spec/unit/provider/user/windows_adsi_spec.rb +2 -1
  390. data/spec/unit/provider/zone/solaris_spec.rb +19 -0
  391. data/spec/unit/reports_spec.rb +10 -0
  392. data/spec/unit/resource/capability_finder_spec.rb +56 -0
  393. data/spec/unit/resource/catalog_spec.rb +31 -8
  394. data/spec/unit/resource/type_collection_spec.rb +23 -2
  395. data/spec/unit/resource/type_spec.rb +1 -1
  396. data/spec/unit/resource_spec.rb +23 -5
  397. data/spec/unit/settings/file_setting_spec.rb +31 -0
  398. data/spec/unit/settings_spec.rb +91 -2
  399. data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
  400. data/spec/unit/ssl/certificate_authority_spec.rb +5 -3
  401. data/spec/unit/ssl/host_spec.rb +2 -2
  402. data/spec/unit/ssl/oids_spec.rb +8 -0
  403. data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
  404. data/spec/unit/transaction/report_spec.rb +24 -1
  405. data/spec/unit/transaction_spec.rb +7 -0
  406. data/spec/unit/type/exec_spec.rb +16 -8
  407. data/spec/unit/type/host_spec.rb +4 -4
  408. data/spec/unit/type/package_spec.rb +1 -0
  409. data/spec/unit/type/tidy_spec.rb +4 -4
  410. data/spec/unit/type/user_spec.rb +14 -7
  411. data/spec/unit/type/vlan_spec.rb +1 -1
  412. data/spec/unit/type_spec.rb +1 -1
  413. data/spec/unit/util/ldap/generator_spec.rb +1 -1
  414. data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
  415. data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
  416. data/spec/unit/util/network_device_spec.rb +1 -1
  417. data/spec/unit/util/storage_spec.rb +5 -1
  418. data/spec/unit/util/windows/adsi_spec.rb +13 -0
  419. data/spec/unit/util_spec.rb +21 -2
  420. metadata +173 -7
  421. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  422. data/spec/integration/data_binding.rb +0 -104
@@ -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
@@ -1,5 +1,8 @@
1
1
  require 'puppet/indirector/none'
2
2
 
3
3
  class Puppet::DataBinding::None < Puppet::Indirector::None
4
- desc "A Dummy terminus that always returns nil for data lookups."
4
+ desc "A Dummy terminus that always throws :no_such_key for data lookups."
5
+ def find(request)
6
+ throw :no_such_key
7
+ end
5
8
  end
@@ -1,15 +1,23 @@
1
1
  require 'puppet/indirector/code'
2
2
  require 'puppet/file_bucket/file'
3
3
  require 'puppet/util/checksums'
4
+ require 'puppet/util/diff'
4
5
  require 'fileutils'
5
6
 
6
7
  module Puppet::FileBucketFile
7
8
  class File < Puppet::Indirector::Code
8
9
  include Puppet::Util::Checksums
10
+ include Puppet::Util::Diff
9
11
 
10
12
  desc "Store files in a directory set based on their checksums."
11
13
 
12
14
  def find(request)
15
+ request.options[:bucket_path] ||= Puppet[:bucketdir]
16
+ # If filebucket mode is 'list'
17
+ if request.options[:list_all]
18
+ return nil unless ::File.exists?(request.options[:bucket_path])
19
+ return list(request)
20
+ end
13
21
  checksum, files_original_path = request_to_checksum_and_path(request)
14
22
  contents_file = path_for(request.options[:bucket_path], checksum, 'contents')
15
23
  paths_file = path_for(request.options[:bucket_path], checksum, 'paths')
@@ -18,7 +26,8 @@ module Puppet::FileBucketFile
18
26
  if request.options[:diff_with]
19
27
  other_contents_file = path_for(request.options[:bucket_path], request.options[:diff_with], 'contents')
20
28
  raise "could not find diff_with #{request.options[:diff_with]}" unless Puppet::FileSystem.exist?(other_contents_file)
21
- return `diff #{Puppet::FileSystem.path_string(contents_file).inspect} #{Puppet::FileSystem.path_string(other_contents_file).inspect}`
29
+ raise "Unable to diff on this platform" unless Puppet[:diff] != ""
30
+ return diff(Puppet::FileSystem.path_string(contents_file), Puppet::FileSystem.path_string(other_contents_file))
22
31
  else
23
32
  Puppet.info "FileBucket read #{checksum}"
24
33
  model.new(Puppet::FileSystem.binread(contents_file))
@@ -28,6 +37,54 @@ module Puppet::FileBucketFile
28
37
  end
29
38
  end
30
39
 
40
+ def list(request)
41
+ if request.remote?
42
+ raise Puppet::Error, "Listing remote file buckets is not allowed"
43
+ end
44
+
45
+ fromdate = request.options[:fromdate] || "0:0:0 1-1-1970"
46
+ todate = request.options[:todate] || Time.now.strftime("%F %T")
47
+ begin
48
+ to = Time.parse(todate)
49
+ rescue ArgumentError
50
+ raise Puppet::Error, "Error while parsing 'todate'"
51
+ end
52
+ begin
53
+ from = Time.parse(fromdate)
54
+ rescue ArgumentError
55
+ raise Puppet::Error, "Error while parsing 'fromdate'"
56
+ end
57
+ # Setting hash's default value to [], needed by the following loop
58
+ bucket = Hash.new {[]}
59
+ msg = ""
60
+ # Get all files with mtime between 'from' and 'to'
61
+ Pathname.new(request.options[:bucket_path]).find { |item|
62
+ if item.file? and item.basename.to_s == "paths"
63
+ filenames = item.read.strip.split("\n")
64
+ filestat = Time.parse(item.stat.mtime.to_s)
65
+ if from <= filestat and filestat <= to
66
+ filenames.each do |filename|
67
+ bucket[filename] += [[ item.stat.mtime , item.parent.basename ]]
68
+ end
69
+ end
70
+ end
71
+ }
72
+ # Sort the results
73
+ bucket.each { |filename, contents|
74
+ contents.sort_by! do |item|
75
+ item[0]
76
+ end
77
+ }
78
+ # Build the output message. Sorted by names then by dates
79
+ bucket.sort.each { |filename,contents|
80
+ contents.each { |mtime, chksum|
81
+ date = mtime.strftime("%F %T")
82
+ msg += "#{chksum} #{date} #{filename}\n"
83
+ }
84
+ }
85
+ return model.new(msg)
86
+ end
87
+
31
88
  def head(request)
32
89
  checksum, files_original_path = request_to_checksum_and_path(request)
33
90
  contents_file = path_for(request.options[:bucket_path], checksum, 'contents')
@@ -18,6 +18,7 @@ class Puppet::Indirector::Hiera < Puppet::Indirector::Terminus
18
18
  def find(request)
19
19
  not_found = Object.new
20
20
  options = request.options
21
+ Puppet.debug { "Performing a hiera indirector lookup of #{request.key} with options #{options.inspect}" }
21
22
  value = hiera.lookup(request.key, not_found, Hiera::Scope.new(options[:variables]), nil, convert_merge(options[:merge]))
22
23
  throw :no_such_key if value.equal?(not_found)
23
24
  value
@@ -34,8 +35,11 @@ class Puppet::Indirector::Hiera < Puppet::Indirector::Terminus
34
35
  def convert_merge(merge)
35
36
  case merge
36
37
  when nil
38
+ when 'first'
37
39
  # Nil is OK. Defaults to Hiera :priority
38
40
  nil
41
+ when Puppet::Pops::MergeStrategy
42
+ convert_merge(merge.configuration)
39
43
  when 'unique'
40
44
  # Equivalent to Hiera :array
41
45
  :array
@@ -196,7 +196,12 @@ class Puppet::Indirector::Indirection
196
196
  result.expiration ||= self.expiration if result.respond_to?(:expiration)
197
197
  if cache?
198
198
  Puppet.info "Caching #{self.name} for #{request.key}"
199
- cache.save request(:save, key, result, options)
199
+ begin
200
+ cache.save request(:save, key, result, options)
201
+ rescue => detail
202
+ Puppet.log_exception(detail)
203
+ raise detail
204
+ end
200
205
  end
201
206
 
202
207
  filtered = result
@@ -17,7 +17,7 @@ class Puppet::Indirector::JSON < Puppet::Indirector::Terminus
17
17
 
18
18
  Puppet::Util.replace_file(filename, 0660) {|f| f.print to_json(request.instance) }
19
19
  rescue TypeError => detail
20
- Puppet.log_exception "Could not save #{self.name} #{request.key}: #{detail}"
20
+ Puppet.log_exception(detail, "Could not save #{self.name} #{request.key}: #{detail}")
21
21
  end
22
22
 
23
23
  def destroy(request)
@@ -23,7 +23,7 @@ class Puppet::Indirector::Msgpack < Puppet::Indirector::Terminus
23
23
 
24
24
  Puppet::Util.replace_file(filename, 0660) {|f| f.print to_msgpack(request.instance) }
25
25
  rescue TypeError => detail
26
- Puppet.log_exception "Could not save #{self.name} #{request.key}: #{detail}"
26
+ Puppet.log_exception(detail, "Could not save #{self.name} #{request.key}: #{detail}")
27
27
  end
28
28
 
29
29
  def destroy(request)
@@ -243,15 +243,14 @@ class Puppet::Indirector::Request
243
243
  @port = uri.port.to_i
244
244
  end
245
245
 
246
- @protocol = uri.scheme
247
-
248
- if uri.scheme == 'puppet'
249
- @key = URI.unescape(uri.path.sub(/^\//, ''))
250
- return
246
+ # filebucket:// is only used internally to pass request details
247
+ # from Dipper objects to the indirector. The wire always uses HTTPS.
248
+ if uri.scheme == 'filebucket'
249
+ @protocol = 'https'
250
+ else
251
+ @protocol = uri.scheme
251
252
  end
252
253
 
253
- env, indirector, @key = URI.unescape(uri.path.sub(/^\//, '')).split('/',3)
254
- @key ||= ''
255
- self.environment = env unless env == ''
254
+ @key = URI.unescape(uri.path.sub(/^\//, ''))
256
255
  end
257
256
  end
@@ -27,7 +27,7 @@ class Puppet::Indirector::ResourceType::Parser < Puppet::Indirector::Code
27
27
  krt = resource_types_in(request.environment)
28
28
 
29
29
  # This is a bit ugly.
30
- [:hostclass, :definition, :node].each do |type|
30
+ [:hostclass, :definition, :application, :node].each do |type|
31
31
  # We have to us 'find_<type>' here because it will
32
32
  # load any missing types from disk, whereas the plain
33
33
  # '<type>' method only returns from memory.
@@ -66,14 +66,16 @@ class Puppet::Indirector::ResourceType::Parser < Puppet::Indirector::Code
66
66
  krt.hostclasses.values
67
67
  when "defined_type"
68
68
  krt.definitions.values
69
+ when "application"
70
+ krt.applications.values
69
71
  when "node"
70
72
  krt.nodes.values
71
73
  when nil
72
- result_candidates = [krt.hostclasses.values, krt.definitions.values, krt.nodes.values]
74
+ result_candidates = [krt.hostclasses.values, krt.definitions.values, krt.applications.values, krt.nodes.values]
73
75
  else
74
76
  raise ArgumentError, "Unrecognized kind filter: " +
75
77
  "'#{request.options[:kind]}', expected one " +
76
- " of 'class', 'defined_type', or 'node'."
78
+ " of 'class', 'defined_type', 'application', or 'node'."
77
79
  end
78
80
 
79
81
  result = result_candidates.flatten.reject { |t| t.name == "" }
@@ -0,0 +1,111 @@
1
+ require 'puppet'
2
+ require 'puppet/pops'
3
+ require 'puppet/pops/evaluator/literal_evaluator'
4
+
5
+ class Puppet::InfoService::ClassInformationService
6
+
7
+ def initialize
8
+ @file_to_result = {}
9
+ @parser = Puppet::Pops::Parser::EvaluatingParser.new()
10
+ end
11
+
12
+ def classes_per_environment(env_file_hash)
13
+ # In this version of puppet there is only one way to parse manifests, as feature switches per environment
14
+ # are added or removed, this logic needs to change to compute the result per environment with the correct
15
+ # feature flags in effect.
16
+
17
+ unless env_file_hash.is_a?(Hash)
18
+ raise ArgumentError, 'Given argument must be a Hash'
19
+ end
20
+
21
+ result = {}
22
+
23
+ # for each environment
24
+ # for each file
25
+ # if file already processed, use last result or error
26
+ #
27
+ env_file_hash.each do |env, files|
28
+ env_result = result[env] = {}
29
+ files.each do |f|
30
+ env_result[f] = result_of(f)
31
+ end
32
+ end
33
+ result
34
+ end
35
+
36
+ private
37
+
38
+ def type_parser
39
+ # Safe to cache this as it would otherwise constantly build up the visitor cache
40
+ @@type_parser ||= Puppet::Pops::Types::TypeParser.new
41
+ end
42
+
43
+ def literal_evaluator
44
+ @@literal_evaluator ||= Puppet::Pops::Evaluator::LiteralEvaluator.new
45
+ end
46
+
47
+ def result_of(f)
48
+ entry = @file_to_result[f]
49
+ if entry.nil?
50
+ @file_to_result[f] = entry = parse_file(f)
51
+ end
52
+ entry
53
+ end
54
+
55
+ def parse_file(f)
56
+ begin
57
+ parse_result = @parser.parse_file(f)
58
+ parse_result.definitions.select {|d| d.is_a?(Puppet::Pops::Model::HostClassDefinition)}.map do |d|
59
+ {:name => d.name,
60
+ :params => params = d.parameters.map {|p| extract_param(p) }
61
+ }
62
+ end
63
+ rescue StandardError => e
64
+ {:error => e.message }
65
+ end
66
+ end
67
+
68
+ def extract_param(p)
69
+ extract_default(extract_type({:name => p.name}, p), p)
70
+ end
71
+
72
+ def extract_type(structure, p)
73
+ return structure if p.type_expr.nil?
74
+ structure[:type] = typeexpr_to_string(p.type_expr)
75
+ structure
76
+ end
77
+
78
+ def extract_default(structure, p)
79
+ value_expr = p.value
80
+ return structure if value_expr.nil?
81
+ default_value = value_as_literal(value_expr)
82
+ if !default_value.nil?
83
+ structure[:default_literal] = default_value
84
+ return structure
85
+ end
86
+ structure[:default_source] = extract_value_source(value_expr)
87
+ structure
88
+ end
89
+
90
+ def typeexpr_to_string(type_expr)
91
+ begin
92
+ type_parser.interpret_any(type_expr).to_s
93
+ rescue Puppet::ParseError
94
+ # type is to complex - contains expressions that are not literal
95
+ nil
96
+ end
97
+ end
98
+
99
+ def value_as_literal(value_expr)
100
+ catch(:not_literal) do
101
+ return literal_evaluator.literal(value_expr)
102
+ end
103
+ nil
104
+ end
105
+
106
+ # Extracts the source for the expression
107
+ def extract_value_source(value_expr)
108
+ position = Puppet::Pops::Adapters::SourcePosAdapter.adapt(value_expr)
109
+ position.extract_tree_text
110
+ end
111
+ end
@@ -0,0 +1,7 @@
1
+
2
+ module Puppet::InfoService
3
+ require 'puppet/info_service/class_information_service'
4
+ def self.classes_per_environment(env_file_hash)
5
+ Puppet::InfoService::ClassInformationService.new.classes_per_environment(env_file_hash)
6
+ end
7
+ end
@@ -93,7 +93,7 @@ module Puppet::ModuleTool
93
93
  # @api private
94
94
  # @return [String] path to temporary unpacking location
95
95
  def tmpdir
96
- @dir ||= Dir.mktmpdir('tmp-unpacker', Puppet::Forge::Cache.base_path)
96
+ @dir ||= Dir.mktmpdir('tmp', Puppet::Forge::Cache.base_path)
97
97
  end
98
98
  end
99
99
  end
@@ -15,15 +15,16 @@ module Puppet::ModuleTool
15
15
  attr_accessor :module_name
16
16
 
17
17
  DEFAULTS = {
18
- 'name' => nil,
19
- 'version' => nil,
20
- 'author' => nil,
21
- 'summary' => nil,
22
- 'license' => 'Apache-2.0',
23
- 'source' => '',
24
- 'project_page' => nil,
25
- 'issues_url' => nil,
26
- 'dependencies' => Set.new.freeze,
18
+ 'name' => nil,
19
+ 'version' => nil,
20
+ 'author' => nil,
21
+ 'summary' => nil,
22
+ 'license' => 'Apache-2.0',
23
+ 'source' => '',
24
+ 'project_page' => nil,
25
+ 'issues_url' => nil,
26
+ 'dependencies' => Set.new.freeze,
27
+ 'data_provider' => nil,
27
28
  }
28
29
 
29
30
  def initialize
@@ -52,6 +53,7 @@ module Puppet::ModuleTool
52
53
  process_name(data) if data['name']
53
54
  process_version(data) if data['version']
54
55
  process_source(data) if data['source']
56
+ process_data_provider(data) if data['data_provider']
55
57
  merge_dependencies(data) if data['dependencies']
56
58
 
57
59
  @data.merge!(data)
@@ -128,6 +130,10 @@ module Puppet::ModuleTool
128
130
  validate_version(data['version'])
129
131
  end
130
132
 
133
+ def process_data_provider(data)
134
+ validate_data_provider(data['data_provider'])
135
+ end
136
+
131
137
  # Do basic parsing of the source parameter. If the source is hosted on
132
138
  # GitHub, we can predict sensible defaults for both project_page and
133
139
  # issues_url.
@@ -188,6 +194,23 @@ module Puppet::ModuleTool
188
194
  raise ArgumentError, "Invalid 'version' field in metadata.json: #{err}"
189
195
  end
190
196
 
197
+ # Validates that the given _value_ is a symbolic name that starts with a letter
198
+ # and then contains only letters, digits, or underscore. Will raise an ArgumentError
199
+ # if that's not the case.
200
+ #
201
+ # @param value [Object] The value to be tested
202
+ def validate_data_provider(value)
203
+ err = nil
204
+ if value.is_a?(String)
205
+ unless value =~ /^[a-zA-Z][a-zA-Z0-9_]*$/
206
+ err = value =~ /^[a-zA-Z]/ ? 'contains non-alphanumeric characters' : 'must begin with a letter'
207
+ end
208
+ else
209
+ err = 'must be a string'
210
+ end
211
+ raise ArgumentError, "field 'data_provider' #{err}" if err
212
+ end
213
+
191
214
  # Validates that the version range can be parsed by Semantic.
192
215
  def validate_version_range(version_range)
193
216
  Semantic::VersionRange.parse(version_range)