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
@@ -46,7 +46,7 @@ describe Puppet::Resource::Catalog::Compiler do
46
46
 
47
47
  it "should directly use provided nodes for a local request" do
48
48
  Puppet::Node.indirection.expects(:find).never
49
- @compiler.expects(:compile).with(@node)
49
+ @compiler.expects(:compile).with(@node, nil)
50
50
  @request.stubs(:options).returns(:use_node => @node)
51
51
  @request.stubs(:remote?).returns(false)
52
52
  @compiler.find(@request)
@@ -63,7 +63,7 @@ describe Puppet::Resource::Catalog::Compiler do
63
63
  it "should use the authenticated node name if no request key is provided" do
64
64
  @request.stubs(:key).returns(nil)
65
65
  Puppet::Node.indirection.expects(:find).with(@name, anything).returns(@node)
66
- @compiler.expects(:compile).with(@node)
66
+ @compiler.expects(:compile).with(@node, nil)
67
67
  @compiler.find(@request)
68
68
  end
69
69
 
@@ -71,7 +71,7 @@ describe Puppet::Resource::Catalog::Compiler do
71
71
  @request.expects(:key).returns "my_node"
72
72
 
73
73
  Puppet::Node.indirection.expects(:find).with("my_node", anything).returns @node
74
- @compiler.expects(:compile).with(@node)
74
+ @compiler.expects(:compile).with(@node, nil)
75
75
  @compiler.find(@request)
76
76
  end
77
77
 
@@ -88,7 +88,7 @@ describe Puppet::Resource::Catalog::Compiler do
88
88
  it "should pass the found node to the compiler for compiling" do
89
89
  Puppet::Node.indirection.expects(:find).with(@name, anything).returns(@node)
90
90
  config = mock 'config'
91
- Puppet::Parser::Compiler.expects(:compile).with(@node)
91
+ Puppet::Parser::Compiler.expects(:compile).with(@node, nil)
92
92
  @compiler.find(@request)
93
93
  end
94
94
 
@@ -119,11 +119,31 @@ describe Puppet::Resource::Catalog::Compiler do
119
119
 
120
120
  it "should return the results of compiling as the catalog" do
121
121
  Puppet::Node.indirection.stubs(:find).returns(@node)
122
- config = mock 'config'
123
- result = mock 'result'
122
+ catalog = Puppet::Resource::Catalog.new(@node.name)
123
+ Puppet::Parser::Compiler.stubs(:compile).returns catalog
124
+
125
+ expect(@compiler.find(@request)).to equal(catalog)
126
+ end
127
+
128
+ it "passes the code_id from the request to the compiler" do
129
+ Puppet::Node.indirection.stubs(:find).returns(@node)
130
+ code_id = 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
131
+ @request.options[:code_id] = code_id
132
+
133
+ Puppet::Parser::Compiler.expects(:compile).with(anything, code_id)
134
+
135
+ @compiler.find(@request)
136
+ end
137
+
138
+ it "returns a catalog with the code_id from the request" do
139
+ Puppet::Node.indirection.stubs(:find).returns(@node)
140
+ code_id = 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
141
+ @request.options[:code_id] = code_id
142
+
143
+ catalog = Puppet::Resource::Catalog.new(@node.name, @node.environment, code_id)
144
+ Puppet::Parser::Compiler.stubs(:compile).returns catalog
124
145
 
125
- Puppet::Parser::Compiler.expects(:compile).returns result
126
- expect(@compiler.find(@request)).to equal(result)
146
+ expect(@compiler.find(@request).code_id).to eq(code_id)
127
147
  end
128
148
  end
129
149
 
@@ -34,6 +34,10 @@ describe Puppet::Resource::Catalog::StaticCompiler do
34
34
  end
35
35
 
36
36
  describe "#find" do
37
+ before :each do
38
+ subject.stubs(:store_content)
39
+ end
40
+
37
41
  it "returns a catalog" do
38
42
  expect(subject.find(request)).to be_a_kind_of(Puppet::Resource::Catalog)
39
43
  end
@@ -45,7 +49,8 @@ describe Puppet::Resource::Catalog::StaticCompiler do
45
49
 
46
50
  describe "a catalog with file resources containing source parameters with puppet:// URIs" do
47
51
  it "filters file resource source URI's to checksums" do
48
- stub_the_compiler
52
+ subject.stubs(:compile).returns(build_catalog)
53
+
49
54
  resource_catalog = subject.find(request)
50
55
  resource_catalog.resources.each do |resource|
51
56
  next unless resource.type == "File"
@@ -56,7 +61,8 @@ describe Puppet::Resource::Catalog::StaticCompiler do
56
61
 
57
62
  it "does not modify file resources with non-puppet:// URI's" do
58
63
  uri = "/this/is/not/a/puppet/uri.txt"
59
- stub_the_compiler(:source => uri)
64
+ subject.stubs(:compile).returns(build_catalog(:source => uri))
65
+
60
66
  resource_catalog = subject.find(request)
61
67
  resource_catalog.resources.each do |resource|
62
68
  next unless resource.type == "File"
@@ -65,16 +71,41 @@ describe Puppet::Resource::Catalog::StaticCompiler do
65
71
  end
66
72
  end
67
73
 
68
- it "copies the owner, group and mode from the fileserer" do
69
- stub_the_compiler
74
+ it "copies the owner, group and mode from the fileserver" do
75
+ subject.stubs(:compile).returns(build_catalog)
76
+
70
77
  resource_catalog = subject.find(request)
71
78
  resource_catalog.resources.each do |resource|
72
79
  next unless resource.type == "File"
73
- expect(resource[:owner]).to eq(0)
74
- expect(resource[:group]).to eq(0)
75
- expect(resource[:mode]).to eq(420)
80
+ expect(resource[:owner]).to eq("0")
81
+ expect(resource[:group]).to eq("0")
82
+ expect(resource[:mode]).to eq("644")
76
83
  end
77
84
  end
85
+
86
+ it "ignores recurse when source refers to a file" do
87
+ path = File.expand_path('/tmp/foo')
88
+ metadata = fileserver_metadata(:path => path)
89
+ metadata.relative_path = '.'
90
+
91
+ Puppet::FileServing::Metadata.indirection.stubs(:search).returns([metadata])
92
+ Puppet::FileServing::Metadata.indirection.stubs(:find).returns(metadata)
93
+
94
+ catalog = Puppet::Resource::Catalog.new(request)
95
+ catalog.add_resource(
96
+ Puppet::Resource.new('file', path,
97
+ :parameters => {
98
+ :recurse => true,
99
+ :source => 'puppet:///modules/mymodule/foo'
100
+ }
101
+ )
102
+ )
103
+ subject.stubs(:compile).returns(catalog)
104
+
105
+ resource = subject.find(request).resources.first
106
+ expect(resource[:ensure]).to eq('file')
107
+ expect(resource.title).to eq(path)
108
+ end
78
109
  end
79
110
  end
80
111
 
@@ -120,19 +151,6 @@ describe Puppet::Resource::Catalog::StaticCompiler do
120
151
 
121
152
  # Spec helper methods
122
153
 
123
- def stub_the_compiler(options = {:stub_methods => [:store_content]})
124
- # Build a resource catalog suitable for specifying the behavior of the
125
- # static compiler.
126
- compiler = mock('indirection terminus compiler')
127
- compiler.stubs(:find).returns(build_catalog(options))
128
- subject.stubs(:compiler).returns(compiler)
129
- # Mock the store content method to prevent copying the contents to the
130
- # file bucket.
131
- (options[:stub_methods] || []).each do |mthd|
132
- subject.stubs(mthd)
133
- end
134
- end
135
-
136
154
  def build_catalog(options = {})
137
155
  options = options.dup
138
156
  options[:source] ||= 'puppet:///modules/mymodule/config_file.txt'
@@ -20,9 +20,9 @@ describe Puppet::DataBinding::None do
20
20
  end
21
21
 
22
22
  describe "the behavior of the find method" do
23
- it "should just return nil" do
23
+ it "should just throw :no_such_key" do
24
24
  data_binding = Puppet::DataBinding::None.new
25
- expect(data_binding.find('fake_request')).to be_nil
25
+ expect { data_binding.find('fake_request') }.to throw_symbol(:no_such_key)
26
26
  end
27
27
  end
28
28
  end
@@ -109,6 +109,57 @@ describe Puppet::FileBucketFile::File, :uses_checksums => true do
109
109
  let(:not_bucketed_plaintext) { "other stuff" }
110
110
  let(:not_bucketed_checksum) { digest(not_bucketed_plaintext) }
111
111
 
112
+ describe "when listing the filebucket" do
113
+ it "should return false/nil when the bucket is empty" do
114
+ expect(Puppet::FileBucket::File.indirection.find("#{digest_algorithm}/#{not_bucketed_checksum}/foo/bar", :list_all => true)).to eq(nil)
115
+ end
116
+
117
+ it "raises when the request is remote" do
118
+ Puppet[:bucketdir] = tmpdir('bucket')
119
+
120
+ request = Puppet::Indirector::Request.new(:file_bucket_file, :find, "#{digest_algorithm}/#{checksum}/foo/bar", nil, :list_all => true)
121
+ request.node = 'client.example.com'
122
+
123
+ expect {
124
+ Puppet::FileBucketFile::File.new.find(request)
125
+ }.to raise_error(Puppet::Error, "Listing remote file buckets is not allowed")
126
+ end
127
+
128
+ it "should return the list of bucketed files in a human readable way" do
129
+ checksum1 = save_bucket_file("I'm the contents of a file", '/foo/bar1')
130
+ checksum2 = save_bucket_file("I'm the contents of another file", '/foo/bar2')
131
+ checksum3 = save_bucket_file("I'm the modified content of a existing file", '/foo/bar1')
132
+
133
+ # Use the first checksum as we know it's stored in the bucket
134
+ find_result = Puppet::FileBucket::File.indirection.find("#{digest_algorithm}/#{checksum1}/foo/bar1", :list_all => true)
135
+
136
+ # The list is sort order from date and file name, so first and third checksums come before the second
137
+ date_pattern = '\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'
138
+ expect(find_result.to_s).to match(Regexp.new("^#{checksum1} #{date_pattern} foo/bar1\\n#{checksum3} #{date_pattern} foo/bar1\\n#{checksum2} #{date_pattern} foo/bar2\\n$"))
139
+ end
140
+
141
+ it "should fail in an informative way when provided dates are not in the right format" do
142
+ contents = "I'm the contents of a file"
143
+ save_bucket_file(contents, '/foo/bar1')
144
+ expect {
145
+ Puppet::FileBucket::File.indirection.find(
146
+ "#{digest_algorithm}/#{not_bucketed_checksum}/foo/bar",
147
+ :list_all => true,
148
+ :todate => "0:0:0 1-1-1970",
149
+ :fromdate => "WEIRD"
150
+ )
151
+ }.to raise_error(Puppet::Error, /fromdate/)
152
+ expect {
153
+ Puppet::FileBucket::File.indirection.find(
154
+ "#{digest_algorithm}/#{not_bucketed_checksum}/foo/bar",
155
+ :list_all => true,
156
+ :todate => "WEIRD",
157
+ :fromdate => Time.now
158
+ )
159
+ }.to raise_error(Puppet::Error, /todate/)
160
+ end
161
+ end
162
+
112
163
  describe "when supplying a path" do
113
164
  it "should return false/nil if the file isn't bucketed" do
114
165
  expect(Puppet::FileBucket::File.indirection.head("#{digest_algorithm}/#{not_bucketed_checksum}/foo/bar")).to eq(false)
@@ -177,7 +228,7 @@ describe Puppet::FileBucketFile::File, :uses_checksums => true do
177
228
  checksum2 = save_bucket_file("foo\nbiz\nbaz")
178
229
 
179
230
  diff = Puppet::FileBucket::File.indirection.find("#{digest_algorithm}/#{checksum1}", :diff_with => checksum2)
180
- expect(diff).to eq("2c2\n< bar\n---\n> biz\n")
231
+ expect(diff).to include("-bar\n+biz\n")
181
232
  end
182
233
 
183
234
  it "should raise an exception if the hash to diff against isn't found" do
@@ -115,7 +115,7 @@ describe Puppet::Indirector::Indirection do
115
115
  describe "when initializing" do
116
116
  # (LAK) I've no idea how to test this, really.
117
117
  it "should store a reference to itself before it consumes its options" do
118
- expect { @indirection = Puppet::Indirector::Indirection.new(Object.new, :testingness, :not_valid_option) }.to raise_error
118
+ expect { @indirection = Puppet::Indirector::Indirection.new(Object.new, :testingness, :not_valid_option) }.to raise_error(NoMethodError, /undefined method/)
119
119
  expect(Puppet::Indirector::Indirection.instance(:testingness)).to be_instance_of(Puppet::Indirector::Indirection)
120
120
  Puppet::Indirector::Indirection.instance(:testingness).delete
121
121
  end
@@ -393,6 +393,17 @@ describe Puppet::Indirector::Indirection do
393
393
 
394
394
  @indirection.find("/my/key")
395
395
  end
396
+
397
+ it "should fail if saving to the cache fails but log the exception" do
398
+ @cache.stubs(:find).returns nil
399
+
400
+ @terminus.stubs(:find).returns(@instance)
401
+ @cache.stubs(:save).raises RuntimeError
402
+
403
+ Puppet.expects(:log_exception)
404
+
405
+ expect { @indirection.find("/my/key") }.to raise_error
406
+ end
396
407
  end
397
408
  end
398
409
 
@@ -509,7 +520,7 @@ describe Puppet::Indirector::Indirection do
509
520
 
510
521
  @cache.expects(:save).never
511
522
  @terminus.expects(:save).raises "eh"
512
- expect { @indirection.save(@instance) }.to raise_error
523
+ expect { @indirection.save(@instance) }.to raise_error(RuntimeError, /eh/)
513
524
  end
514
525
  end
515
526
  end
@@ -116,32 +116,32 @@ describe Puppet::Indirector::Request do
116
116
  end
117
117
 
118
118
  it "should set the protocol to the URI scheme" do
119
- expect(Puppet::Indirector::Request.new(:ind, :method, "http://host/an_environment", nil).protocol).to eq("http")
119
+ expect(Puppet::Indirector::Request.new(:ind, :method, "http://host/", nil).protocol).to eq("http")
120
120
  end
121
121
 
122
122
  it "should set the server if a server is provided" do
123
- expect(Puppet::Indirector::Request.new(:ind, :method, "http://host/an_environment", nil).server).to eq("host")
123
+ expect(Puppet::Indirector::Request.new(:ind, :method, "http://host/", nil).server).to eq("host")
124
124
  end
125
125
 
126
126
  it "should set the server and port if both are provided" do
127
- expect(Puppet::Indirector::Request.new(:ind, :method, "http://host:543/an_environment", nil).port).to eq(543)
127
+ expect(Puppet::Indirector::Request.new(:ind, :method, "http://host:543/", nil).port).to eq(543)
128
128
  end
129
129
 
130
130
  it "should default to the masterport if the URI scheme is 'puppet'" do
131
131
  Puppet[:masterport] = "321"
132
- expect(Puppet::Indirector::Request.new(:ind, :method, "puppet://host/an_environment", nil).port).to eq(321)
132
+ expect(Puppet::Indirector::Request.new(:ind, :method, "puppet://host/", nil).port).to eq(321)
133
133
  end
134
134
 
135
135
  it "should use the provided port if the URI scheme is not 'puppet'" do
136
- expect(Puppet::Indirector::Request.new(:ind, :method, "http://host/an_environment", nil).port).to eq(80)
136
+ expect(Puppet::Indirector::Request.new(:ind, :method, "http://host/", nil).port).to eq(80)
137
137
  end
138
138
 
139
- it "should set the request key to the unescaped key part path from the URI" do
140
- expect(Puppet::Indirector::Request.new(:ind, :method, "http://host/an_environment/terminus/stuff with spaces", nil).key).to eq("stuff with spaces")
139
+ it "should set the request key to the unescaped path from the URI" do
140
+ expect(Puppet::Indirector::Request.new(:ind, :method, "http://host/stuff with spaces", nil).key).to eq("stuff with spaces")
141
141
  end
142
142
 
143
143
  it "should set the :uri attribute to the full URI" do
144
- expect(Puppet::Indirector::Request.new(:ind, :method, "http:///an_environment/stu ff", nil).uri).to eq('http:///an_environment/stu ff')
144
+ expect(Puppet::Indirector::Request.new(:ind, :method, "http:///a/path/stu ff", nil).uri).to eq('http:///a/path/stu ff')
145
145
  end
146
146
 
147
147
  it "should not parse relative URI" do
@@ -108,7 +108,7 @@ describe Puppet::Indirector::SslFile do
108
108
  "//?/c:/foo",
109
109
  ].each do |input|
110
110
  it "should resist directory traversal attacks (#{input.inspect})" do
111
- expect { @searcher.path(input) }.to raise_error
111
+ expect { @searcher.path(input) }.to raise_error(ArgumentError, /invalid key/)
112
112
  end
113
113
  end
114
114
 
@@ -82,7 +82,7 @@ describe Puppet::Indirector::Yaml do
82
82
  "//?/c:/foo",
83
83
  ].each do |input|
84
84
  it "should resist directory traversal attacks (#{input.inspect})" do
85
- expect { @store.path(input) }.to raise_error
85
+ expect { @store.path(input) }.to raise_error(ArgumentError)
86
86
  end
87
87
  end
88
88
  end
@@ -0,0 +1,236 @@
1
+ require 'spec_helper'
2
+ require 'puppet_spec/files'
3
+
4
+ require 'puppet/pops'
5
+ require 'puppet/info_service'
6
+ require 'puppet/pops/evaluator/literal_evaluator'
7
+
8
+ describe "Puppet::InfoService" do
9
+ context 'classes_per_environment service' do
10
+ include PuppetSpec::Files
11
+
12
+ let(:code_dir) do
13
+ dir_containing('manifests', {
14
+ 'foo.pp' => <<-CODE,
15
+ class foo($foo_a, Integer $foo_b, String $foo_c = 'c default value') { }
16
+ class foo2($foo2_a, Integer $foo2_b, String $foo2_c = 'c default value') { }
17
+ CODE
18
+ 'bar.pp' => <<-CODE,
19
+ class bar($bar_a, Integer $bar_b, String $bar_c = 'c default value') { }
20
+ class bar2($bar2_a, Integer $bar2_b, String $bar2_c = 'c default value') { }
21
+ CODE
22
+ 'fee.pp' => <<-CODE,
23
+ class fee(Integer $fee_a = 1+1) { }
24
+ CODE
25
+ 'fum.pp' => <<-CODE,
26
+ class fum($fum_a) { }
27
+ CODE
28
+ 'nothing.pp' => <<-CODE,
29
+ # not much to see here, move along
30
+ CODE
31
+ 'borked.pp' => <<-CODE,
32
+ class Borked($Herp+$Derp) {}
33
+ CODE
34
+ })
35
+ end
36
+
37
+ it "errors if not given a hash" do
38
+ expect{ Puppet::InfoService.classes_per_environment("you wassup?")}.to raise_error(ArgumentError, 'Given argument must be a Hash')
39
+ end
40
+
41
+ it "returns empty hash if given nothing" do
42
+ expect(Puppet::InfoService.classes_per_environment({})).to eq({})
43
+ end
44
+
45
+ it "produces classes and parameters from a given file" do
46
+ files = ['foo.pp'].map {|f| File.join(code_dir, f) }
47
+ result = Puppet::InfoService.classes_per_environment({'production' => files })
48
+ expect(result).to eq({
49
+ "production"=>{
50
+ "#{code_dir}/foo.pp"=>[
51
+ {:name=>"foo",
52
+ :params=>[
53
+ {:name=>"foo_a"},
54
+ {:name=>"foo_b", :type=>"Integer"},
55
+ {:name=>"foo_c", :type=>"String", :default_literal=>"c default value"}
56
+ ]},
57
+ {:name=>"foo2",
58
+ :params=>[
59
+ {:name=>"foo2_a"},
60
+ {:name=>"foo2_b", :type=>"Integer"},
61
+ {:name=>"foo2_c", :type=>"String", :default_literal=>"c default value"}
62
+ ]
63
+ }
64
+ ]} # end production env
65
+ })
66
+ end
67
+
68
+ it "produces classes and parameters from multiple files in same environment" do
69
+ files = ['foo.pp', 'bar.pp'].map {|f| File.join(code_dir, f) }
70
+ result = Puppet::InfoService.classes_per_environment({'production' => files })
71
+ expect(result).to eq({
72
+ "production"=>{
73
+ "#{code_dir}/foo.pp"=>[
74
+ {:name=>"foo",
75
+ :params=>[
76
+ {:name=>"foo_a"},
77
+ {:name=>"foo_b", :type=>"Integer"},
78
+ {:name=>"foo_c", :type=>"String", :default_literal=>"c default value"}
79
+ ]},
80
+ {:name=>"foo2",
81
+ :params=>[
82
+ {:name=>"foo2_a"},
83
+ {:name=>"foo2_b", :type=>"Integer"},
84
+ {:name=>"foo2_c", :type=>"String", :default_literal=>"c default value"}
85
+ ]
86
+ }
87
+ ],
88
+ "#{code_dir}/bar.pp"=>[
89
+ {:name=>"bar",
90
+ :params=>[
91
+ {:name=>"bar_a"},
92
+ {:name=>"bar_b", :type=>"Integer"},
93
+ {:name=>"bar_c", :type=>"String", :default_literal=>"c default value"}
94
+ ]},
95
+ {:name=>"bar2",
96
+ :params=>[
97
+ {:name=>"bar2_a"},
98
+ {:name=>"bar2_b", :type=>"Integer"},
99
+ {:name=>"bar2_c", :type=>"String", :default_literal=>"c default value"}
100
+ ]
101
+ }
102
+ ],
103
+
104
+ } # end production env
105
+ }
106
+ )
107
+ end
108
+
109
+ it "produces classes and parameters from multiple files in multiple environments" do
110
+ files_production = ['foo.pp', 'bar.pp'].map {|f| File.join(code_dir, f) }
111
+ files_test = ['fee.pp', 'fum.pp'].map {|f| File.join(code_dir, f) }
112
+ result = Puppet::InfoService.classes_per_environment({
113
+ 'production' => files_production,
114
+ 'test' => files_test
115
+ })
116
+
117
+ expect(result).to eq({
118
+ "production"=>{
119
+ "#{code_dir}/foo.pp"=>[
120
+ {:name=>"foo",
121
+ :params=>[
122
+ {:name=>"foo_a"},
123
+ {:name=>"foo_b", :type=>"Integer"},
124
+ {:name=>"foo_c", :type=>"String", :default_literal=>"c default value"}
125
+ ]},
126
+ {:name=>"foo2",
127
+ :params=>[
128
+ {:name=>"foo2_a"},
129
+ {:name=>"foo2_b", :type=>"Integer"},
130
+ {:name=>"foo2_c", :type=>"String", :default_literal=>"c default value"}
131
+ ]
132
+ }
133
+ ],
134
+ "#{code_dir}/bar.pp"=>[
135
+ {:name=>"bar",
136
+ :params=>[
137
+ {:name=>"bar_a"},
138
+ {:name=>"bar_b", :type=>"Integer"},
139
+ {:name=>"bar_c", :type=>"String", :default_literal=>"c default value"}
140
+ ]},
141
+ {:name=>"bar2",
142
+ :params=>[
143
+ {:name=>"bar2_a"},
144
+ {:name=>"bar2_b", :type=>"Integer"},
145
+ {:name=>"bar2_c", :type=>"String", :default_literal=>"c default value"}
146
+ ]
147
+ }
148
+ ],
149
+ }, # end production env
150
+ "test"=>{
151
+ "#{code_dir}/fee.pp"=>[
152
+ {:name=>"fee",
153
+ :params=>[
154
+ {:name=>"fee_a", :type=>"Integer", :default_source=>"1+1"}
155
+ ]},
156
+ ],
157
+ "#{code_dir}/fum.pp"=>[
158
+ {:name=>"fum",
159
+ :params=>[
160
+ {:name=>"fum_a"}
161
+ ]},
162
+ ],
163
+ } # end test env
164
+ }
165
+ )
166
+ end
167
+
168
+ it "avoids parsing file more than once when environments have same feature flag set" do
169
+ # in this version of puppet, all environments are equal in this respect
170
+ result = Puppet::Pops::Parser::EvaluatingParser.new.parse_file("#{code_dir}/fum.pp")
171
+ Puppet::Pops::Parser::EvaluatingParser.any_instance.expects(:parse_file).with("#{code_dir}/fum.pp").returns(result).once
172
+ files_production = ['fum.pp'].map {|f| File.join(code_dir, f) }
173
+ files_test = files_production
174
+
175
+ result = Puppet::InfoService.classes_per_environment({
176
+ 'production' => files_production,
177
+ 'test' => files_test
178
+ })
179
+ expect(result).to eq({
180
+ "production"=>{ "#{code_dir}/fum.pp"=>[ {:name=>"fum", :params=>[ {:name=>"fum_a"}]}]},
181
+ "test" =>{ "#{code_dir}/fum.pp"=>[ {:name=>"fum", :params=>[ {:name=>"fum_a"}]}]}
182
+ }
183
+ )
184
+ end
185
+
186
+ it "produces expression string if a default value is not literal" do
187
+ files = ['fee.pp'].map {|f| File.join(code_dir, f) }
188
+ result = Puppet::InfoService.classes_per_environment({'production' => files })
189
+ expect(result).to eq({
190
+ "production"=>{
191
+ "#{code_dir}/fee.pp"=>[
192
+ {:name=>"fee",
193
+ :params=>[
194
+ {:name=>"fee_a", :type=>"Integer", :default_source=>"1+1"}
195
+ ]},
196
+ ]} # end production env
197
+ })
198
+ end
199
+
200
+ it "produces no type entry if type is not given" do
201
+ files = ['fum.pp'].map {|f| File.join(code_dir, f) }
202
+ result = Puppet::InfoService.classes_per_environment({'production' => files })
203
+ expect(result).to eq({
204
+ "production"=>{
205
+ "#{code_dir}/fum.pp"=>[
206
+ {:name=>"fum",
207
+ :params=>[
208
+ {:name=>"fum_a" }
209
+ ]},
210
+ ]} # end production env
211
+ })
212
+ end
213
+
214
+ it "produces error entry if file is broken" do
215
+ files = ['borked.pp'].map {|f| File.join(code_dir, f) }
216
+ result = Puppet::InfoService.classes_per_environment({'production' => files })
217
+ expect(result).to eq({
218
+ "production"=>{
219
+ "#{code_dir}/borked.pp"=>
220
+ {:error=>"Syntax error at '+' at #{code_dir}/borked.pp:1:30",
221
+ },
222
+ } # end production env
223
+ })
224
+ end
225
+
226
+ it "produces empty {} if parsed result has no classes" do
227
+ files = ['nothing.pp'].map {|f| File.join(code_dir, f) }
228
+ result = Puppet::InfoService.classes_per_environment({'production' => files })
229
+ expect(result).to eq({
230
+ "production"=>{
231
+ "#{code_dir}/nothing.pp"=> []
232
+ },
233
+ })
234
+ end
235
+ end
236
+ end
@@ -18,7 +18,7 @@ describe Puppet::ModuleTool::Applications::Application do
18
18
 
19
19
  bad_versions.each do |ver|
20
20
  it "should not accept version string #{ver}" do
21
- expect { app.parse_filename("puppetlabs-ntp-#{ver}") }.to raise_error
21
+ expect { app.parse_filename("puppetlabs-ntp-#{ver}") }.to raise_error(ArgumentError, /(Invalid version format|Could not parse filename)/)
22
22
  end
23
23
  end
24
24
  end
@@ -319,7 +319,7 @@ symlinkfile
319
319
  end
320
320
 
321
321
  it "give an error about symlinks" do
322
- expect { builder.run }.to raise_error
322
+ expect { builder.run }.to raise_error(Puppet::ModuleTool::Errors::ModuleToolError, /Found symlinks/)
323
323
  end
324
324
  end
325
325
 
@@ -9,7 +9,7 @@ describe Puppet::ModuleTool::Metadata do
9
9
  subject { metadata }
10
10
 
11
11
  %w[ name version author summary license source project_page issues_url
12
- dependencies dashed_name release_name description ].each do |prop|
12
+ dependencies dashed_name release_name description data_provider].each do |prop|
13
13
  describe "##{prop}" do
14
14
  it "responds to the property" do
15
15
  subject.send(prop)
@@ -224,6 +224,35 @@ describe Puppet::ModuleTool::Metadata do
224
224
  expect(subject.dependencies.size).to eq(1)
225
225
  end
226
226
  end
227
+
228
+ context 'with valid data_provider' do
229
+ let(:data) { {'data_provider' => 'the_name'} }
230
+
231
+ it 'validates the provider correctly' do
232
+ expect { subject }.not_to raise_error
233
+ end
234
+
235
+ it 'returns the provider' do
236
+ expect(subject.data_provider).to eq('the_name')
237
+ end
238
+ end
239
+
240
+ context 'with invalid data_provider' do
241
+ let(:data) { }
242
+
243
+ it "raises exception unless argument starts with a letter" do
244
+ expect { metadata.update('data_provider' => '_the_name') }.to raise_error(ArgumentError, /field 'data_provider' must begin with a letter/)
245
+ expect { metadata.update('data_provider' => '') }.to raise_error(ArgumentError, /field 'data_provider' must begin with a letter/)
246
+ end
247
+
248
+ it "raises exception if argument contains non-alphanumeric characters" do
249
+ expect { metadata.update('data_provider' => 'the::name') }.to raise_error(ArgumentError, /field 'data_provider' contains non-alphanumeric characters/)
250
+ end
251
+
252
+ it "raises exception unless argument is a string" do
253
+ expect { metadata.update('data_provider' => 23) }.to raise_error(ArgumentError, /field 'data_provider' must be a string/)
254
+ end
255
+ end
227
256
  end
228
257
 
229
258
  describe '#dashed_name' do
@@ -271,7 +300,7 @@ describe Puppet::ModuleTool::Metadata do
271
300
  subject { metadata.to_hash }
272
301
 
273
302
  it "contains the default set of keys" do
274
- expect(subject.keys.sort).to eq(%w[ name version author summary license source issues_url project_page dependencies ].sort)
303
+ expect(subject.keys.sort).to eq(%w[ name version author summary license source issues_url project_page dependencies data_provider].sort)
275
304
  end
276
305
 
277
306
  describe "['license']" do