puppet 5.0.0 → 6.0.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 (1440) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +52 -42
  3. data/Gemfile +48 -81
  4. data/Gemfile.lock +156 -0
  5. data/MAINTAINERS +0 -19
  6. data/README.md +19 -17
  7. data/Rakefile +47 -36
  8. data/conf/auth.conf +7 -2
  9. data/conf/environment.conf +1 -1
  10. data/conf/fileserver.conf +1 -1
  11. data/conf/puppet.conf +4 -4
  12. data/ext/README.environment +1 -1
  13. data/ext/build_defaults.yaml +0 -2
  14. data/ext/cert_inspector +2 -2
  15. data/ext/debian/copyright +2 -24
  16. data/ext/debian/puppetmaster.README.debian +2 -2
  17. data/ext/envpuppet +1 -1
  18. data/ext/gentoo/init.d/puppetmaster +4 -4
  19. data/ext/hiera/hiera.yaml +1 -1
  20. data/ext/ips/puppet-agent +11 -11
  21. data/ext/ips/puppet-master +11 -11
  22. data/ext/project_data.yaml +9 -8
  23. data/ext/puppet-test +5 -5
  24. data/ext/redhat/client.init +2 -2
  25. data/ext/redhat/logrotate +1 -1
  26. data/ext/redhat/puppet.spec.erb +0 -4
  27. data/ext/regexp_nodes/regexp_nodes.rb +15 -16
  28. data/ext/solaris/smf/puppet +11 -11
  29. data/ext/solaris/smf/svc-puppetd +5 -5
  30. data/ext/solaris/smf/svc-puppetmasterd +5 -5
  31. data/ext/upload_facts.rb +2 -2
  32. data/ext/windows/service/daemon.rb +1 -1
  33. data/install.rb +2 -3
  34. data/lib/hiera/puppet_function.rb +5 -2
  35. data/lib/hiera/scope.rb +24 -2
  36. data/lib/hiera_puppet.rb +3 -3
  37. data/lib/puppet/agent/locker.rb +6 -5
  38. data/lib/puppet/agent.rb +24 -3
  39. data/lib/puppet/application/agent.rb +19 -14
  40. data/lib/puppet/application/apply.rb +30 -17
  41. data/lib/puppet/application/cert.rb +30 -174
  42. data/lib/puppet/application/config.rb +1 -0
  43. data/lib/puppet/application/describe.rb +6 -3
  44. data/lib/puppet/application/device.rb +165 -60
  45. data/lib/puppet/application/doc.rb +10 -4
  46. data/lib/puppet/application/face_base.rb +1 -1
  47. data/lib/puppet/application/facts.rb +5 -0
  48. data/lib/puppet/application/filebucket.rb +60 -18
  49. data/lib/puppet/application/help.rb +1 -0
  50. data/lib/puppet/application/lookup.rb +23 -11
  51. data/lib/puppet/application/resource.rb +8 -4
  52. data/lib/puppet/application/script.rb +261 -0
  53. data/lib/puppet/application/ssl.rb +133 -0
  54. data/lib/puppet/application.rb +42 -11
  55. data/lib/puppet/application_support.rb +7 -3
  56. data/lib/puppet/configurer/downloader.rb +1 -1
  57. data/lib/puppet/configurer/fact_handler.rb +5 -1
  58. data/lib/puppet/configurer/plugin_handler.rb +32 -9
  59. data/lib/puppet/configurer.rb +114 -76
  60. data/lib/puppet/confine.rb +4 -1
  61. data/lib/puppet/context.rb +1 -1
  62. data/lib/puppet/daemon.rb +3 -3
  63. data/lib/puppet/datatypes/error.rb +21 -0
  64. data/lib/puppet/datatypes/impl/error.rb +40 -0
  65. data/lib/puppet/datatypes.rb +213 -0
  66. data/lib/puppet/defaults.rb +279 -209
  67. data/lib/puppet/environments.rb +24 -11
  68. data/lib/puppet/error.rb +35 -18
  69. data/lib/puppet/etc.rb +6 -7
  70. data/lib/puppet/external/dot.rb +23 -24
  71. data/lib/puppet/external/pson/common.rb +2 -2
  72. data/lib/puppet/external/pson/pure/generator.rb +1 -1
  73. data/lib/puppet/external/pson/pure/parser.rb +1 -1
  74. data/lib/puppet/face/catalog.rb +2 -2
  75. data/lib/puppet/face/config.rb +157 -11
  76. data/lib/puppet/face/epp.rb +66 -37
  77. data/lib/puppet/face/facts.rb +49 -0
  78. data/lib/puppet/face/help/action.erb +4 -1
  79. data/lib/puppet/face/help/face.erb +1 -1
  80. data/lib/puppet/face/help/global.erb +2 -2
  81. data/lib/puppet/face/help/man.erb +1 -1
  82. data/lib/puppet/face/help.rb +78 -64
  83. data/lib/puppet/face/man.rb +56 -12
  84. data/lib/puppet/face/module/build.rb +5 -54
  85. data/lib/puppet/face/module/generate.rb +6 -243
  86. data/lib/puppet/face/module/install.rb +1 -4
  87. data/lib/puppet/face/module/list.rb +6 -22
  88. data/lib/puppet/face/module/search.rb +7 -3
  89. data/lib/puppet/face/module/uninstall.rb +15 -7
  90. data/lib/puppet/face/module/upgrade.rb +1 -4
  91. data/lib/puppet/face/node/clean.rb +14 -10
  92. data/lib/puppet/face/node.rb +1 -0
  93. data/lib/puppet/face/parser.rb +30 -4
  94. data/lib/puppet/face/plugin.rb +1 -3
  95. data/lib/puppet/face/status.rb +3 -2
  96. data/lib/puppet/feature/base.rb +8 -27
  97. data/lib/puppet/feature/bolt.rb +3 -0
  98. data/lib/puppet/feature/eventlog.rb +1 -1
  99. data/lib/puppet/file_bucket/dipper.rb +1 -2
  100. data/lib/puppet/file_bucket/file.rb +0 -2
  101. data/lib/puppet/file_serving/base.rb +18 -17
  102. data/lib/puppet/file_serving/configuration/parser.rb +25 -9
  103. data/lib/puppet/file_serving/configuration.rb +6 -0
  104. data/lib/puppet/file_serving/fileset.rb +1 -1
  105. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  106. data/lib/puppet/file_serving/metadata.rb +4 -3
  107. data/lib/puppet/file_serving/mount/locales.rb +35 -0
  108. data/lib/puppet/file_serving/mount/tasks.rb +21 -0
  109. data/lib/puppet/file_system/uniquefile.rb +2 -2
  110. data/lib/puppet/forge/errors.rb +27 -25
  111. data/lib/puppet/forge/repository.rb +1 -1
  112. data/lib/puppet/forge.rb +22 -9
  113. data/lib/puppet/functions/abs.rb +61 -0
  114. data/lib/puppet/functions/alert.rb +1 -1
  115. data/lib/puppet/functions/all.rb +104 -0
  116. data/lib/puppet/functions/annotate.rb +11 -11
  117. data/lib/puppet/functions/any.rb +109 -0
  118. data/lib/puppet/functions/assert_type.rb +7 -7
  119. data/lib/puppet/functions/binary_file.rb +15 -2
  120. data/lib/puppet/functions/break.rb +34 -9
  121. data/lib/puppet/functions/call.rb +41 -4
  122. data/lib/puppet/functions/camelcase.rb +62 -0
  123. data/lib/puppet/functions/capitalize.rb +61 -0
  124. data/lib/puppet/functions/ceiling.rb +37 -0
  125. data/lib/puppet/functions/chomp.rb +57 -0
  126. data/lib/puppet/functions/chop.rb +67 -0
  127. data/lib/puppet/functions/compare.rb +125 -0
  128. data/lib/puppet/functions/contain.rb +25 -3
  129. data/lib/puppet/functions/convert_to.rb +34 -0
  130. data/lib/puppet/functions/crit.rb +1 -1
  131. data/lib/puppet/functions/debug.rb +1 -1
  132. data/lib/puppet/functions/defined.rb +14 -15
  133. data/lib/puppet/functions/dig.rb +47 -3
  134. data/lib/puppet/functions/downcase.rb +89 -0
  135. data/lib/puppet/functions/each.rb +30 -20
  136. data/lib/puppet/functions/emerg.rb +1 -1
  137. data/lib/puppet/functions/empty.rb +77 -0
  138. data/lib/puppet/functions/epp.rb +3 -0
  139. data/lib/puppet/functions/err.rb +1 -1
  140. data/lib/puppet/functions/eyaml_lookup_key.rb +11 -8
  141. data/lib/puppet/functions/filter.rb +30 -23
  142. data/lib/puppet/functions/find_file.rb +15 -2
  143. data/lib/puppet/functions/flatten.rb +64 -0
  144. data/lib/puppet/functions/floor.rb +37 -0
  145. data/lib/puppet/functions/get.rb +150 -0
  146. data/lib/puppet/functions/getvar.rb +87 -0
  147. data/lib/puppet/functions/hiera.rb +11 -11
  148. data/lib/puppet/functions/hiera_array.rb +11 -11
  149. data/lib/puppet/functions/hiera_hash.rb +12 -12
  150. data/lib/puppet/functions/hiera_include.rb +15 -15
  151. data/lib/puppet/functions/hocon_data.rb +1 -1
  152. data/lib/puppet/functions/include.rb +34 -2
  153. data/lib/puppet/functions/info.rb +1 -1
  154. data/lib/puppet/functions/inline_epp.rb +2 -2
  155. data/lib/puppet/functions/join.rb +56 -0
  156. data/lib/puppet/functions/json_data.rb +3 -3
  157. data/lib/puppet/functions/keys.rb +25 -0
  158. data/lib/puppet/functions/length.rb +44 -0
  159. data/lib/puppet/functions/lest.rb +39 -1
  160. data/lib/puppet/functions/lookup.rb +7 -5
  161. data/lib/puppet/functions/lstrip.rb +58 -0
  162. data/lib/puppet/functions/map.rb +34 -20
  163. data/lib/puppet/functions/match.rb +17 -6
  164. data/lib/puppet/functions/max.rb +183 -0
  165. data/lib/puppet/functions/min.rb +182 -0
  166. data/lib/puppet/functions/module_directory.rb +41 -0
  167. data/lib/puppet/functions/new.rb +982 -7
  168. data/lib/puppet/functions/next.rb +2 -9
  169. data/lib/puppet/functions/notice.rb +1 -1
  170. data/lib/puppet/functions/reduce.rb +36 -5
  171. data/lib/puppet/functions/regsubst.rb +10 -4
  172. data/lib/puppet/functions/require.rb +42 -2
  173. data/lib/puppet/functions/return.rb +2 -9
  174. data/lib/puppet/functions/reverse_each.rb +71 -2
  175. data/lib/puppet/functions/round.rb +24 -0
  176. data/lib/puppet/functions/rstrip.rb +58 -0
  177. data/lib/puppet/functions/size.rb +15 -0
  178. data/lib/puppet/functions/slice.rb +25 -12
  179. data/lib/puppet/functions/sort.rb +74 -0
  180. data/lib/puppet/functions/split.rb +12 -10
  181. data/lib/puppet/functions/step.rb +73 -1
  182. data/lib/puppet/functions/strftime.rb +178 -10
  183. data/lib/puppet/functions/strip.rb +58 -0
  184. data/lib/puppet/functions/then.rb +65 -2
  185. data/lib/puppet/functions/tree_each.rb +200 -0
  186. data/lib/puppet/functions/type.rb +42 -1
  187. data/lib/puppet/functions/unique.rb +13 -13
  188. data/lib/puppet/functions/unwrap.rb +8 -4
  189. data/lib/puppet/functions/upcase.rb +89 -0
  190. data/lib/puppet/functions/values.rb +25 -0
  191. data/lib/puppet/functions/versioncmp.rb +1 -1
  192. data/lib/puppet/functions/warning.rb +1 -1
  193. data/lib/puppet/functions/with.rb +9 -7
  194. data/lib/puppet/functions/yaml_data.rb +8 -7
  195. data/lib/puppet/functions.rb +212 -95
  196. data/lib/puppet/generate/models/type/property.rb +1 -1
  197. data/lib/puppet/generate/type.rb +1 -1
  198. data/lib/puppet/gettext/config.rb +275 -0
  199. data/lib/puppet/gettext/module_translations.rb +42 -0
  200. data/lib/puppet/gettext/stubs.rb +11 -0
  201. data/lib/puppet/graph/relationship_graph.rb +7 -1
  202. data/lib/puppet/graph/simple_graph.rb +12 -8
  203. data/lib/puppet/graph.rb +0 -2
  204. data/lib/puppet/indirector/catalog/compiler.rb +48 -16
  205. data/lib/puppet/indirector/catalog/json.rb +14 -3
  206. data/lib/puppet/indirector/catalog/yaml.rb +0 -16
  207. data/lib/puppet/indirector/certificate/file.rb +0 -1
  208. data/lib/puppet/indirector/exec.rb +1 -1
  209. data/lib/puppet/indirector/facts/facter.rb +4 -6
  210. data/lib/puppet/indirector/facts/network_device.rb +2 -2
  211. data/lib/puppet/indirector/facts/rest.rb +21 -0
  212. data/lib/puppet/indirector/facts/yaml.rb +4 -6
  213. data/lib/puppet/indirector/file_bucket_file/file.rb +11 -4
  214. data/lib/puppet/indirector/file_content/http.rb +3 -1
  215. data/lib/puppet/indirector/file_server.rb +1 -1
  216. data/lib/puppet/indirector/indirection.rb +28 -24
  217. data/lib/puppet/indirector/key/file.rb +1 -6
  218. data/lib/puppet/indirector/node/exec.rb +2 -4
  219. data/lib/puppet/indirector/node/yaml.rb +0 -6
  220. data/lib/puppet/indirector/request.rb +19 -15
  221. data/lib/puppet/indirector/rest.rb +21 -68
  222. data/lib/puppet/indirector/ssl_file.rb +5 -46
  223. data/lib/puppet/indirector/terminus.rb +4 -4
  224. data/lib/puppet/indirector/yaml.rb +4 -4
  225. data/lib/puppet/info_service/class_information_service.rb +1 -1
  226. data/lib/puppet/info_service/task_information_service.rb +36 -0
  227. data/lib/puppet/info_service.rb +10 -0
  228. data/lib/puppet/interface/action.rb +54 -29
  229. data/lib/puppet/interface/action_builder.rb +22 -5
  230. data/lib/puppet/interface/action_manager.rb +1 -1
  231. data/lib/puppet/interface/documentation.rb +21 -10
  232. data/lib/puppet/interface/face_collection.rb +7 -3
  233. data/lib/puppet/interface/option.rb +36 -15
  234. data/lib/puppet/interface/option_builder.rb +23 -9
  235. data/lib/puppet/interface/option_manager.rb +9 -4
  236. data/lib/puppet/interface.rb +3 -2
  237. data/lib/puppet/loaders.rb +3 -0
  238. data/lib/puppet/metatype/manager.rb +9 -7
  239. data/lib/puppet/module/task.rb +267 -0
  240. data/lib/puppet/module.rb +70 -14
  241. data/lib/puppet/module_tool/applications/application.rb +5 -5
  242. data/lib/puppet/module_tool/applications/checksummer.rb +3 -3
  243. data/lib/puppet/module_tool/applications/installer.rb +9 -7
  244. data/lib/puppet/module_tool/applications/uninstaller.rb +4 -2
  245. data/lib/puppet/module_tool/applications/unpacker.rb +4 -4
  246. data/lib/puppet/module_tool/applications/upgrader.rb +8 -6
  247. data/lib/puppet/module_tool/applications.rb +0 -1
  248. data/lib/puppet/module_tool/dependency.rb +1 -1
  249. data/lib/puppet/module_tool/errors/installer.rb +18 -20
  250. data/lib/puppet/module_tool/errors/shared.rb +20 -15
  251. data/lib/puppet/module_tool/errors/uninstaller.rb +1 -0
  252. data/lib/puppet/module_tool/errors/upgrader.rb +1 -1
  253. data/lib/puppet/module_tool/installed_modules.rb +3 -3
  254. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  255. data/lib/puppet/module_tool/metadata.rb +3 -5
  256. data/lib/puppet/module_tool/shared_behaviors.rb +2 -2
  257. data/lib/puppet/module_tool/tar/mini.rb +57 -4
  258. data/lib/puppet/module_tool.rb +2 -5
  259. data/lib/puppet/network/auth_config_parser.rb +18 -13
  260. data/lib/puppet/network/authconfig.rb +1 -14
  261. data/lib/puppet/network/authstore.rb +3 -3
  262. data/lib/puppet/network/client_request.rb +1 -1
  263. data/lib/puppet/network/format.rb +3 -3
  264. data/lib/puppet/network/format_support.rb +14 -9
  265. data/lib/puppet/network/formats.rb +98 -9
  266. data/lib/puppet/network/http/api/indirected_routes.rb +11 -3
  267. data/lib/puppet/network/http/api/indirection_type.rb +1 -1
  268. data/lib/puppet/network/http/api/master/v3/environment.rb +7 -4
  269. data/lib/puppet/network/http/api/master/v3/environments.rb +2 -2
  270. data/lib/puppet/network/http/api.rb +1 -10
  271. data/lib/puppet/network/http/compression.rb +1 -1
  272. data/lib/puppet/network/http/connection.rb +105 -25
  273. data/lib/puppet/network/http/error.rb +10 -10
  274. data/lib/puppet/network/http/factory.rb +8 -0
  275. data/lib/puppet/network/http/handler.rb +59 -27
  276. data/lib/puppet/network/http.rb +0 -2
  277. data/lib/puppet/network/resolver.rb +139 -67
  278. data/lib/puppet/network/rights.rb +1 -1
  279. data/lib/puppet/node/environment.rb +23 -20
  280. data/lib/puppet/node/facts.rb +20 -1
  281. data/lib/puppet/node.rb +80 -8
  282. data/lib/puppet/parameter/boolean.rb +1 -1
  283. data/lib/puppet/parameter/value_collection.rb +9 -9
  284. data/lib/puppet/parameter.rb +15 -10
  285. data/lib/puppet/parser/abstract_compiler.rb +36 -0
  286. data/lib/puppet/parser/ast/branch.rb +4 -4
  287. data/lib/puppet/parser/ast/leaf.rb +7 -2
  288. data/lib/puppet/parser/ast/node.rb +2 -2
  289. data/lib/puppet/parser/ast/pops_bridge.rb +26 -52
  290. data/lib/puppet/parser/ast.rb +4 -8
  291. data/lib/puppet/parser/catalog_compiler.rb +32 -0
  292. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +1 -1
  293. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +9 -2
  294. data/lib/puppet/parser/compiler.rb +29 -61
  295. data/lib/puppet/parser/functions/assert_type.rb +4 -4
  296. data/lib/puppet/parser/functions/binary_file.rb +1 -1
  297. data/lib/puppet/parser/functions/break.rb +1 -1
  298. data/lib/puppet/parser/functions/create_resources.rb +7 -7
  299. data/lib/puppet/parser/functions/defined.rb +1 -1
  300. data/lib/puppet/parser/functions/dig.rb +12 -3
  301. data/lib/puppet/parser/functions/each.rb +3 -3
  302. data/lib/puppet/parser/functions/epp.rb +4 -1
  303. data/lib/puppet/parser/functions/filter.rb +3 -3
  304. data/lib/puppet/parser/functions/find_file.rb +1 -1
  305. data/lib/puppet/parser/functions/fqdn_rand.rb +16 -1
  306. data/lib/puppet/parser/functions/generate.rb +3 -5
  307. data/lib/puppet/parser/functions/hiera.rb +4 -4
  308. data/lib/puppet/parser/functions/hiera_array.rb +5 -5
  309. data/lib/puppet/parser/functions/hiera_hash.rb +6 -6
  310. data/lib/puppet/parser/functions/hiera_include.rb +10 -11
  311. data/lib/puppet/parser/functions/inline_epp.rb +1 -1
  312. data/lib/puppet/parser/functions/inline_template.rb +8 -3
  313. data/lib/puppet/parser/functions/lest.rb +2 -2
  314. data/lib/puppet/parser/functions/lookup.rb +1 -1
  315. data/lib/puppet/parser/functions/map.rb +2 -2
  316. data/lib/puppet/parser/functions/match.rb +1 -1
  317. data/lib/puppet/parser/functions/new.rb +106 -54
  318. data/lib/puppet/parser/functions/next.rb +1 -1
  319. data/lib/puppet/parser/functions/realize.rb +6 -0
  320. data/lib/puppet/parser/functions/reduce.rb +33 -2
  321. data/lib/puppet/parser/functions/return.rb +23 -2
  322. data/lib/puppet/parser/functions/reverse_each.rb +3 -3
  323. data/lib/puppet/parser/functions/scanf.rb +1 -1
  324. data/lib/puppet/parser/functions/sha256.rb +5 -0
  325. data/lib/puppet/parser/functions/slice.rb +1 -1
  326. data/lib/puppet/parser/functions/sprintf.rb +28 -3
  327. data/lib/puppet/parser/functions/step.rb +2 -2
  328. data/lib/puppet/parser/functions/strftime.rb +1 -1
  329. data/lib/puppet/parser/functions/tag.rb +6 -0
  330. data/lib/puppet/parser/functions/tagged.rb +6 -3
  331. data/lib/puppet/parser/functions/template.rb +11 -2
  332. data/lib/puppet/parser/functions/then.rb +2 -2
  333. data/lib/puppet/parser/functions/type.rb +1 -1
  334. data/lib/puppet/parser/functions/with.rb +5 -5
  335. data/lib/puppet/parser/functions.rb +40 -7
  336. data/lib/puppet/parser/parser_factory.rb +1 -1
  337. data/lib/puppet/parser/relationship.rb +2 -2
  338. data/lib/puppet/parser/resource/param.rb +12 -5
  339. data/lib/puppet/parser/resource.rb +39 -12
  340. data/lib/puppet/parser/scope.rb +55 -24
  341. data/lib/puppet/parser/script_compiler.rb +123 -0
  342. data/lib/puppet/parser/templatewrapper.rb +4 -3
  343. data/lib/puppet/parser/type_loader.rb +12 -12
  344. data/lib/puppet/parser.rb +1 -0
  345. data/lib/puppet/pops/adapters.rb +14 -0
  346. data/lib/puppet/pops/evaluator/access_operator.rb +49 -8
  347. data/lib/puppet/pops/evaluator/closure.rb +12 -4
  348. data/lib/puppet/pops/evaluator/collector_transformer.rb +4 -3
  349. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  350. data/lib/puppet/pops/evaluator/compare_operator.rb +7 -5
  351. data/lib/puppet/pops/evaluator/deferred_resolver.rb +127 -0
  352. data/lib/puppet/pops/evaluator/epp_evaluator.rb +36 -10
  353. data/lib/puppet/pops/evaluator/evaluator_impl.rb +61 -17
  354. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  355. data/lib/puppet/pops/evaluator/literal_evaluator.rb +1 -1
  356. data/lib/puppet/pops/evaluator/relationship_operator.rb +1 -1
  357. data/lib/puppet/pops/evaluator/runtime3_converter.rb +29 -8
  358. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +4 -4
  359. data/lib/puppet/pops/evaluator/runtime3_support.rb +17 -20
  360. data/lib/puppet/pops/functions/dispatch.rb +13 -6
  361. data/lib/puppet/pops/functions/function.rb +10 -4
  362. data/lib/puppet/pops/issue_reporter.rb +25 -3
  363. data/lib/puppet/pops/issues.rb +82 -15
  364. data/lib/puppet/pops/label_provider.rb +1 -1
  365. data/lib/puppet/pops/loader/base_loader.rb +10 -0
  366. data/lib/puppet/pops/loader/dependency_loader.rb +7 -0
  367. data/lib/puppet/pops/loader/loader.rb +22 -3
  368. data/lib/puppet/pops/loader/loader_paths.rb +183 -31
  369. data/lib/puppet/pops/loader/module_loaders.rb +239 -41
  370. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +84 -0
  371. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +10 -10
  372. data/lib/puppet/pops/loader/ruby_data_type_instantiator.rb +39 -0
  373. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +1 -2
  374. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +54 -0
  375. data/lib/puppet/pops/loader/runtime3_type_loader.rb +6 -1
  376. data/lib/puppet/pops/loader/static_loader.rb +23 -45
  377. data/lib/puppet/pops/loader/task_instantiator.rb +97 -0
  378. data/lib/puppet/pops/loader/type_definition_instantiator.rb +8 -1
  379. data/lib/puppet/pops/loaders.rb +158 -45
  380. data/lib/puppet/pops/lookup/context.rb +1 -1
  381. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +1 -1
  382. data/lib/puppet/pops/lookup/explainer.rb +2 -1
  383. data/lib/puppet/pops/lookup/global_data_provider.rb +1 -1
  384. data/lib/puppet/pops/lookup/hiera_config.rb +4 -4
  385. data/lib/puppet/pops/lookup/interpolation.rb +1 -1
  386. data/lib/puppet/pops/lookup/lookup_adapter.rb +61 -12
  387. data/lib/puppet/pops/merge_strategy.rb +7 -4
  388. data/lib/puppet/pops/migration/migration_checker.rb +8 -8
  389. data/lib/puppet/pops/model/ast.pp +19 -0
  390. data/lib/puppet/pops/model/ast.rb +567 -436
  391. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  392. data/lib/puppet/pops/model/factory.rb +232 -147
  393. data/lib/puppet/pops/model/model_label_provider.rb +9 -1
  394. data/lib/puppet/pops/model/model_tree_dumper.rb +17 -2
  395. data/lib/puppet/pops/model/pn_transformer.rb +400 -0
  396. data/lib/puppet/pops/model/tree_dumper.rb +1 -1
  397. data/lib/puppet/pops/parser/code_merger.rb +2 -2
  398. data/lib/puppet/pops/parser/egrammar.ra +85 -24
  399. data/lib/puppet/pops/parser/eparser.rb +1791 -1578
  400. data/lib/puppet/pops/parser/epp_parser.rb +1 -1
  401. data/lib/puppet/pops/parser/epp_support.rb +7 -5
  402. data/lib/puppet/pops/parser/evaluating_parser.rb +1 -1
  403. data/lib/puppet/pops/parser/heredoc_support.rb +2 -2
  404. data/lib/puppet/pops/parser/interpolation_support.rb +2 -2
  405. data/lib/puppet/pops/parser/lexer2.rb +5 -5
  406. data/lib/puppet/pops/parser/lexer_support.rb +5 -4
  407. data/lib/puppet/pops/parser/locatable.rb +1 -1
  408. data/lib/puppet/pops/parser/locator.rb +7 -15
  409. data/lib/puppet/pops/parser/parser_support.rb +3 -3
  410. data/lib/puppet/pops/parser/pn_parser.rb +316 -0
  411. data/lib/puppet/pops/parser/slurp_support.rb +0 -3
  412. data/lib/puppet/pops/patterns.rb +2 -1
  413. data/lib/puppet/pops/pcore.rb +67 -12
  414. data/lib/puppet/pops/pn.rb +236 -0
  415. data/lib/puppet/pops/puppet_stack.rb +15 -1
  416. data/lib/puppet/pops/resource/param.rb +2 -2
  417. data/lib/puppet/pops/resource/resource_type_impl.rb +4 -4
  418. data/lib/puppet/pops/serialization/abstract_reader.rb +4 -0
  419. data/lib/puppet/pops/serialization/abstract_writer.rb +8 -1
  420. data/lib/puppet/pops/serialization/extension.rb +1 -0
  421. data/lib/puppet/pops/serialization/from_data_converter.rb +69 -26
  422. data/lib/puppet/pops/serialization/json.rb +7 -7
  423. data/lib/puppet/pops/serialization/json_path.rb +3 -2
  424. data/lib/puppet/pops/serialization/object.rb +3 -4
  425. data/lib/puppet/pops/serialization/serializer.rb +2 -1
  426. data/lib/puppet/pops/serialization/to_data_converter.rb +27 -14
  427. data/lib/puppet/pops/serialization/to_stringified_converter.rb +226 -0
  428. data/lib/puppet/pops/serialization.rb +3 -2
  429. data/lib/puppet/pops/time/timespan.rb +1 -1
  430. data/lib/puppet/pops/time/timestamp.rb +31 -19
  431. data/lib/puppet/pops/types/annotatable.rb +2 -2
  432. data/lib/puppet/pops/types/annotation.rb +8 -8
  433. data/lib/puppet/pops/types/class_loader.rb +9 -6
  434. data/lib/puppet/pops/types/implementation_registry.rb +29 -36
  435. data/lib/puppet/pops/types/iterable.rb +42 -11
  436. data/lib/puppet/pops/types/p_binary_type.rb +12 -6
  437. data/lib/puppet/pops/types/p_init_type.rb +238 -0
  438. data/lib/puppet/pops/types/p_meta_type.rb +18 -11
  439. data/lib/puppet/pops/types/p_object_type.rb +240 -48
  440. data/lib/puppet/pops/types/p_object_type_extension.rb +218 -0
  441. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +5 -6
  442. data/lib/puppet/pops/types/p_sem_ver_type.rb +12 -4
  443. data/lib/puppet/pops/types/p_sensitive_type.rb +2 -2
  444. data/lib/puppet/pops/types/p_timespan_type.rb +9 -9
  445. data/lib/puppet/pops/types/p_timestamp_type.rb +7 -3
  446. data/lib/puppet/pops/types/p_type_set_type.rb +33 -10
  447. data/lib/puppet/pops/types/p_uri_type.rb +190 -0
  448. data/lib/puppet/pops/types/puppet_object.rb +16 -2
  449. data/lib/puppet/pops/types/ruby_generator.rb +111 -78
  450. data/lib/puppet/pops/types/ruby_method.rb +2 -2
  451. data/lib/puppet/pops/types/string_converter.rb +38 -14
  452. data/lib/puppet/pops/types/tree_iterators.rb +254 -0
  453. data/lib/puppet/pops/types/type_acceptor.rb +1 -1
  454. data/lib/puppet/pops/types/type_calculator.rb +31 -20
  455. data/lib/puppet/pops/types/type_factory.rb +82 -17
  456. data/lib/puppet/pops/types/type_formatter.rb +77 -9
  457. data/lib/puppet/pops/types/type_mismatch_describer.rb +106 -137
  458. data/lib/puppet/pops/types/type_parser.rb +130 -24
  459. data/lib/puppet/pops/types/type_set_reference.rb +2 -2
  460. data/lib/puppet/pops/types/type_with_members.rb +43 -0
  461. data/lib/puppet/pops/types/types.rb +456 -219
  462. data/lib/puppet/pops/utils.rb +2 -2
  463. data/lib/puppet/pops/validation/checker4_0.rb +145 -8
  464. data/lib/puppet/pops/validation/tasks_checker.rb +101 -0
  465. data/lib/puppet/pops/validation/validator_factory_4_0.rb +13 -8
  466. data/lib/puppet/pops/validation.rb +14 -12
  467. data/lib/puppet/pops.rb +2 -1
  468. data/lib/puppet/property/ensure.rb +2 -2
  469. data/lib/puppet/property/keyvalue.rb +70 -8
  470. data/lib/puppet/property.rb +15 -7
  471. data/lib/puppet/provider/aix_object.rb +483 -0
  472. data/lib/puppet/provider/exec.rb +0 -2
  473. data/lib/puppet/provider/file/windows.rb +1 -1
  474. data/lib/puppet/provider/group/aix.rb +51 -110
  475. data/lib/puppet/provider/group/groupadd.rb +27 -1
  476. data/lib/puppet/provider/group/windows_adsi.rb +4 -7
  477. data/lib/puppet/provider/ldap.rb +2 -2
  478. data/lib/puppet/provider/nameservice/directoryservice.rb +7 -6
  479. data/lib/puppet/provider/nameservice/objectadd.rb +13 -24
  480. data/lib/puppet/provider/nameservice/pw.rb +14 -14
  481. data/lib/puppet/provider/nameservice.rb +20 -10
  482. data/lib/puppet/provider/package/aix.rb +5 -5
  483. data/lib/puppet/provider/package/appdmg.rb +0 -1
  484. data/lib/puppet/provider/package/apple.rb +0 -1
  485. data/lib/puppet/provider/package/dnf.rb +2 -1
  486. data/lib/puppet/provider/package/gem.rb +13 -12
  487. data/lib/puppet/provider/package/macports.rb +2 -2
  488. data/lib/puppet/provider/package/nim.rb +7 -8
  489. data/lib/puppet/provider/package/opkg.rb +1 -1
  490. data/lib/puppet/provider/package/pacman.rb +4 -4
  491. data/lib/puppet/provider/package/pip.rb +15 -6
  492. data/lib/puppet/provider/package/pkg.rb +12 -6
  493. data/lib/puppet/provider/package/pkgdmg.rb +3 -4
  494. data/lib/puppet/provider/package/pkgutil.rb +5 -5
  495. data/lib/puppet/provider/package/portage.rb +9 -10
  496. data/lib/puppet/provider/package/puppet_gem.rb +1 -1
  497. data/lib/puppet/provider/package/rpm.rb +1 -1
  498. data/lib/puppet/provider/package/windows/package.rb +1 -1
  499. data/lib/puppet/provider/package/yum.rb +34 -10
  500. data/lib/puppet/provider/package/zypper.rb +5 -5
  501. data/lib/puppet/provider/parsedfile.rb +4 -4
  502. data/lib/puppet/provider/service/base.rb +23 -10
  503. data/lib/puppet/provider/service/debian.rb +1 -0
  504. data/lib/puppet/provider/service/init.rb +2 -1
  505. data/lib/puppet/provider/service/launchd.rb +7 -8
  506. data/lib/puppet/provider/service/redhat.rb +3 -2
  507. data/lib/puppet/provider/service/runit.rb +2 -1
  508. data/lib/puppet/provider/service/smf.rb +5 -3
  509. data/lib/puppet/provider/service/systemd.rb +6 -3
  510. data/lib/puppet/provider/service/upstart.rb +11 -1
  511. data/lib/puppet/provider/service/windows.rb +37 -40
  512. data/lib/puppet/provider/user/aix.rb +143 -247
  513. data/lib/puppet/provider/user/openbsd.rb +3 -2
  514. data/lib/puppet/provider/user/pw.rb +1 -1
  515. data/lib/puppet/provider/user/user_role_add.rb +7 -1
  516. data/lib/puppet/provider/user/useradd.rb +40 -6
  517. data/lib/puppet/provider/user/windows_adsi.rb +1 -1
  518. data/lib/puppet/provider.rb +34 -13
  519. data/lib/puppet/reference/configuration.rb +12 -2
  520. data/lib/puppet/reference/providers.rb +1 -1
  521. data/lib/puppet/reference/report.rb +1 -1
  522. data/lib/puppet/reference/type.rb +11 -12
  523. data/lib/puppet/relationship.rb +2 -1
  524. data/lib/puppet/reports/http.rb +4 -2
  525. data/lib/puppet/reports/store.rb +1 -1
  526. data/lib/puppet/reports.rb +2 -2
  527. data/lib/puppet/resource/capability_finder.rb +49 -27
  528. data/lib/puppet/resource/catalog.rb +42 -34
  529. data/lib/puppet/resource/status.rb +11 -3
  530. data/lib/puppet/resource/type.rb +16 -12
  531. data/lib/puppet/resource/type_collection.rb +2 -2
  532. data/lib/puppet/resource.rb +30 -12
  533. data/lib/puppet/rest/client.rb +83 -0
  534. data/lib/puppet/rest/errors.rb +14 -0
  535. data/lib/puppet/rest/response.rb +34 -0
  536. data/lib/puppet/rest/route.rb +84 -0
  537. data/lib/puppet/rest/routes.rb +154 -0
  538. data/lib/puppet/rest/ssl_context.rb +13 -0
  539. data/lib/puppet/settings/base_setting.rb +29 -9
  540. data/lib/puppet/settings/certificate_revocation_setting.rb +21 -0
  541. data/lib/puppet/settings/config_file.rb +16 -7
  542. data/lib/puppet/settings/environment_conf.rb +29 -11
  543. data/lib/puppet/settings/file_setting.rb +1 -1
  544. data/lib/puppet/settings/ini_file.rb +66 -12
  545. data/lib/puppet/settings/ttl_setting.rb +5 -0
  546. data/lib/puppet/settings.rb +68 -38
  547. data/lib/puppet/ssl/base.rb +10 -13
  548. data/lib/puppet/ssl/certificate.rb +6 -2
  549. data/lib/puppet/ssl/certificate_request.rb +19 -21
  550. data/lib/puppet/ssl/certificate_request_attributes.rb +1 -1
  551. data/lib/puppet/ssl/certificate_signer.rb +11 -0
  552. data/lib/puppet/ssl/host.rb +413 -174
  553. data/lib/puppet/ssl/key.rb +1 -5
  554. data/lib/puppet/ssl/oids.rb +10 -4
  555. data/lib/puppet/ssl/validator/default_validator.rb +33 -19
  556. data/lib/puppet/ssl.rb +0 -1
  557. data/lib/puppet/syntax_checkers/base64.rb +6 -7
  558. data/lib/puppet/syntax_checkers/json.rb +1 -1
  559. data/lib/puppet/test/test_helper.rb +2 -3
  560. data/lib/puppet/transaction/additional_resource_generator.rb +2 -2
  561. data/lib/puppet/transaction/event.rb +38 -15
  562. data/lib/puppet/transaction/event_manager.rb +3 -1
  563. data/lib/puppet/transaction/persistence.rb +17 -2
  564. data/lib/puppet/transaction/report.rb +33 -16
  565. data/lib/puppet/transaction.rb +43 -16
  566. data/lib/puppet/type/exec.rb +23 -20
  567. data/lib/puppet/type/file/checksum.rb +7 -1
  568. data/lib/puppet/type/file/checksum_value.rb +4 -3
  569. data/lib/puppet/type/file/content.rb +17 -5
  570. data/lib/puppet/type/file/data_sync.rb +2 -1
  571. data/lib/puppet/type/file/ensure.rb +1 -1
  572. data/lib/puppet/type/file/mode.rb +1 -1
  573. data/lib/puppet/type/file/source.rb +21 -8
  574. data/lib/puppet/type/file.rb +36 -25
  575. data/lib/puppet/type/group.rb +7 -6
  576. data/lib/puppet/type/notify.rb +1 -1
  577. data/lib/puppet/type/package.rb +5 -8
  578. data/lib/puppet/type/resources.rb +1 -1
  579. data/lib/puppet/type/schedule.rb +73 -112
  580. data/lib/puppet/type/service.rb +3 -6
  581. data/lib/puppet/type/stage.rb +1 -1
  582. data/lib/puppet/type/tidy.rb +21 -8
  583. data/lib/puppet/type/user.rb +98 -50
  584. data/lib/puppet/type.rb +76 -67
  585. data/lib/puppet/util/at_fork/solaris.rb +6 -4
  586. data/lib/puppet/util/autoload.rb +62 -54
  587. data/lib/puppet/util/backups.rb +1 -1
  588. data/lib/puppet/util/character_encoding.rb +2 -24
  589. data/lib/puppet/util/checksums.rb +82 -3
  590. data/lib/puppet/util/classgen.rb +0 -6
  591. data/lib/puppet/util/command_line/trollop.rb +6 -5
  592. data/lib/puppet/util/command_line.rb +5 -1
  593. data/lib/puppet/util/connection.rb +74 -0
  594. data/lib/puppet/util/errors.rb +59 -8
  595. data/lib/puppet/util/execution.rb +70 -17
  596. data/lib/puppet/util/feature.rb +63 -41
  597. data/lib/puppet/util/fileparsing.rb +30 -10
  598. data/lib/puppet/util/filetype.rb +2 -2
  599. data/lib/puppet/util/http_proxy.rb +18 -8
  600. data/lib/puppet/util/inifile.rb +3 -4
  601. data/lib/puppet/util/instance_loader.rb +4 -24
  602. data/lib/puppet/util/json.rb +69 -0
  603. data/lib/puppet/util/json_lockfile.rb +3 -3
  604. data/lib/puppet/util/ldap/connection.rb +7 -7
  605. data/lib/puppet/util/ldap/manager.rb +6 -3
  606. data/lib/puppet/util/log/destinations.rb +13 -4
  607. data/lib/puppet/util/log.rb +30 -33
  608. data/lib/puppet/util/logging.rb +26 -29
  609. data/lib/puppet/util/monkey_patches.rb +1 -1
  610. data/lib/puppet/util/network_device/base.rb +1 -1
  611. data/lib/puppet/util/network_device/config.rb +22 -15
  612. data/lib/puppet/util/platform.rb +16 -0
  613. data/lib/puppet/util/plist.rb +7 -5
  614. data/lib/puppet/util/posix.rb +1 -1
  615. data/lib/puppet/util/provider_features.rb +3 -6
  616. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +3 -3
  617. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
  618. data/lib/puppet/util/rdoc/parser/puppet_parser_rdoc2.rb +1 -1
  619. data/lib/puppet/util/rdoc.rb +1 -1
  620. data/lib/puppet/util/reference.rb +8 -15
  621. data/lib/puppet/util/rubygems.rb +1 -13
  622. data/lib/puppet/util/run_mode.rb +1 -1
  623. data/lib/puppet/util/selinux.rb +1 -1
  624. data/lib/puppet/util/ssl.rb +40 -1
  625. data/lib/puppet/util/storage.rb +3 -3
  626. data/lib/puppet/util/suidmanager.rb +8 -5
  627. data/lib/puppet/util/tag_set.rb +1 -1
  628. data/lib/puppet/util/tagging.rb +18 -5
  629. data/lib/puppet/util/warnings.rb +0 -2
  630. data/lib/puppet/util/windows/adsi.rb +160 -214
  631. data/lib/puppet/util/windows/api_types.rb +9 -5
  632. data/lib/puppet/util/windows/com.rb +2 -1
  633. data/lib/puppet/util/windows/eventlog.rb +10 -5
  634. data/lib/puppet/util/windows/file.rb +113 -12
  635. data/lib/puppet/util/windows/principal.rb +7 -6
  636. data/lib/puppet/util/windows/process.rb +10 -2
  637. data/lib/puppet/util/windows/registry.rb +2 -2
  638. data/lib/puppet/util/windows/security.rb +26 -14
  639. data/lib/puppet/util/windows/service.rb +770 -0
  640. data/lib/puppet/util/windows/sid.rb +60 -9
  641. data/lib/puppet/util/windows.rb +19 -2
  642. data/lib/puppet/util/yaml.rb +41 -5
  643. data/lib/puppet/util.rb +50 -50
  644. data/lib/puppet/vendor/deep_merge/README.md +2 -2
  645. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +18 -18
  646. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +1 -1
  647. data/lib/puppet/version.rb +1 -1
  648. data/lib/puppet.rb +12 -68
  649. data/lib/puppet_pal.rb +1102 -0
  650. data/locales/en/puppet.po +19 -0
  651. data/locales/ja/puppet.po +11128 -0
  652. data/locales/puppet.pot +3723 -2251
  653. data/man/man5/puppet.conf.5 +342 -187
  654. data/man/man8/puppet-agent.8 +36 -10
  655. data/man/man8/puppet-apply.8 +21 -6
  656. data/man/man8/puppet-catalog.8 +12 -15
  657. data/man/man8/puppet-config.8 +40 -6
  658. data/man/man8/puppet-describe.8 +3 -3
  659. data/man/man8/puppet-device.8 +48 -14
  660. data/man/man8/puppet-doc.8 +5 -5
  661. data/man/man8/puppet-epp.8 +49 -21
  662. data/man/man8/puppet-facts.8 +58 -9
  663. data/man/man8/puppet-filebucket.8 +76 -10
  664. data/man/man8/puppet-generate.8 +84 -0
  665. data/man/man8/puppet-help.8 +4 -4
  666. data/man/man8/puppet-key.8 +11 -17
  667. data/man/man8/puppet-lookup.8 +104 -0
  668. data/man/man8/puppet-man.8 +13 -7
  669. data/man/man8/puppet-module.8 +29 -98
  670. data/man/man8/puppet-node.8 +12 -15
  671. data/man/man8/puppet-parser.8 +34 -11
  672. data/man/man8/puppet-plugin.8 +4 -4
  673. data/man/man8/puppet-report.8 +9 -9
  674. data/man/man8/puppet-resource.8 +4 -8
  675. data/man/man8/puppet-script.8 +67 -0
  676. data/man/man8/puppet-ssl.8 +28 -0
  677. data/man/man8/puppet-status.8 +9 -9
  678. data/man/man8/puppet.8 +21 -3
  679. data/spec/fixtures/unit/application/environments/production/data/common.yaml +2 -0
  680. data/spec/fixtures/unit/functions/hiera/hiera/backend/hieraspec_backend.rb +22 -0
  681. data/spec/fixtures/unit/functions/lookup/hiera/backend/custom_backend.rb +18 -0
  682. data/spec/fixtures/unit/functions/lookup/hiera/backend/other_backend.rb +7 -0
  683. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome2/lib/puppet_x/awesome2/echo_scheme_handler.rb +1 -1
  684. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +6 -6
  685. data/spec/fixtures/unit/provider/aix_object/aix_colon_list_real_world_input.out +1 -0
  686. data/spec/fixtures/unit/provider/aix_object/aix_colon_list_real_world_output.out +1 -0
  687. data/spec/fixtures/unit/provider/package/pkgng/pkg.info +0 -1
  688. data/spec/fixtures/unit/provider/package/yum/yum-check-update-plugin-output.txt +36 -0
  689. data/spec/fixtures/unit/provider/package/yum/yum-check-update-simple.txt +1 -0
  690. data/spec/fixtures/unit/provider/service/base/ps_ef.mixed_encoding +3 -0
  691. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +32 -0
  692. data/spec/integration/agent/logging_spec.rb +4 -2
  693. data/spec/integration/application/apply_spec.rb +33 -26
  694. data/spec/integration/application/lookup_spec.rb +21 -0
  695. data/spec/integration/configurer_spec.rb +2 -5
  696. data/spec/integration/data_binding_spec.rb +1 -0
  697. data/spec/integration/defaults_spec.rb +5 -10
  698. data/spec/integration/faces/config_spec.rb +16 -4
  699. data/spec/integration/faces/plugin_spec.rb +3 -0
  700. data/spec/integration/file_bucket/file_spec.rb +20 -22
  701. data/spec/integration/file_system/uniquefile_spec.rb +26 -29
  702. data/spec/integration/indirector/facts/facter_spec.rb +4 -14
  703. data/spec/integration/indirector/file_content/file_server_spec.rb +17 -0
  704. data/spec/integration/indirector/file_metadata/file_server_spec.rb +10 -0
  705. data/spec/integration/network/authconfig_spec.rb +2 -2
  706. data/spec/integration/network/http/api/indirected_routes_spec.rb +9 -38
  707. data/spec/integration/node/environment_spec.rb +1 -1
  708. data/spec/integration/node_spec.rb +0 -4
  709. data/spec/integration/parser/catalog_spec.rb +10 -6
  710. data/spec/integration/parser/collection_spec.rb +42 -3
  711. data/spec/integration/parser/compiler_spec.rb +43 -24
  712. data/spec/integration/parser/pcore_resource_spec.rb +3 -3
  713. data/spec/integration/parser/scope_spec.rb +18 -5
  714. data/spec/integration/parser/script_compiler_spec.rb +113 -0
  715. data/spec/integration/provider/service/init_spec.rb +4 -2
  716. data/spec/integration/provider/service/systemd_spec.rb +8 -4
  717. data/spec/integration/provider/service/windows_spec.rb +5 -3
  718. data/spec/integration/reference/providers_spec.rb +6 -0
  719. data/spec/integration/ssl/certificate_request_spec.rb +0 -2
  720. data/spec/integration/ssl/host_spec.rb +16 -24
  721. data/spec/integration/ssl/key_spec.rb +3 -3
  722. data/spec/integration/test/test_helper_spec.rb +32 -32
  723. data/spec/integration/transaction/report_spec.rb +11 -6
  724. data/spec/integration/type/exec_spec.rb +1 -1
  725. data/spec/integration/type/file_spec.rb +72 -18
  726. data/spec/integration/type/package_spec.rb +1 -1
  727. data/spec/integration/type_spec.rb +1 -2
  728. data/spec/integration/util/autoload_spec.rb +9 -6
  729. data/spec/integration/util/execution_spec.rb +13 -5
  730. data/spec/integration/util/rdoc/parser_spec.rb +13 -23
  731. data/spec/integration/util/settings_spec.rb +2 -1
  732. data/spec/integration/util/windows/adsi_spec.rb +89 -4
  733. data/spec/integration/util/windows/principal_spec.rb +12 -3
  734. data/spec/integration/util/windows/process_spec.rb +48 -3
  735. data/spec/integration/util/windows/registry_spec.rb +1 -1
  736. data/spec/integration/util/windows/security_spec.rb +98 -8
  737. data/spec/integration/util/windows/user_spec.rb +1 -1
  738. data/spec/integration/util_spec.rb +3 -3
  739. data/spec/lib/matchers/json.rb +27 -32
  740. data/{lib/puppet/ssl → spec/lib/puppet}/certificate_factory.rb +5 -6
  741. data/spec/lib/puppet/test_ca.rb +109 -0
  742. data/spec/lib/puppet_spec/compiler.rb +27 -0
  743. data/spec/lib/puppet_spec/files.rb +28 -23
  744. data/spec/lib/puppet_spec/language.rb +34 -35
  745. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  746. data/spec/lib/puppet_spec/modules.rb +20 -0
  747. data/spec/lib/puppet_spec/ssl.rb +265 -0
  748. data/spec/lib/puppet_spec/validators.rb +37 -0
  749. data/spec/shared_behaviours/file_server_terminus.rb +0 -2
  750. data/spec/shared_behaviours/file_serving_model.rb +0 -19
  751. data/spec/shared_behaviours/path_parameters.rb +1 -1
  752. data/spec/shared_behaviours/things_that_declare_options.rb +2 -2
  753. data/spec/shared_contexts/checksum.rb +4 -1
  754. data/spec/shared_contexts/digests.rb +46 -1
  755. data/spec/shared_contexts/types_setup.rb +66 -7
  756. data/spec/shared_examples/rhel_package_provider.rb +2 -2
  757. data/spec/spec_helper.rb +7 -14
  758. data/spec/unit/agent_spec.rb +48 -4
  759. data/spec/unit/application/agent_spec.rb +5 -20
  760. data/spec/unit/application/apply_spec.rb +4 -12
  761. data/spec/unit/application/config_spec.rb +4 -0
  762. data/spec/unit/application/device_spec.rb +141 -10
  763. data/spec/unit/application/face_base_spec.rb +2 -2
  764. data/spec/unit/application/filebucket_spec.rb +18 -4
  765. data/spec/unit/application/lookup_spec.rb +46 -9
  766. data/spec/unit/application/ssl_spec.rb +322 -0
  767. data/spec/unit/application_spec.rb +46 -4
  768. data/spec/unit/capability_spec.rb +11 -9
  769. data/spec/unit/{ssl/certificate_factory_spec.rb → certificate_factory_spec.rb} +9 -18
  770. data/spec/unit/configurer/downloader_spec.rb +6 -1
  771. data/spec/unit/configurer/plugin_handler_spec.rb +46 -18
  772. data/spec/unit/configurer_spec.rb +90 -33
  773. data/spec/unit/confine_spec.rb +16 -0
  774. data/spec/unit/context/trusted_information_spec.rb +3 -2
  775. data/spec/unit/daemon_spec.rb +3 -2
  776. data/spec/unit/data_providers/hiera_data_provider_spec.rb +4 -4
  777. data/spec/unit/datatypes_spec.rb +353 -0
  778. data/spec/unit/defaults_spec.rb +108 -6
  779. data/spec/unit/environments_spec.rb +62 -0
  780. data/spec/unit/etc_spec.rb +1 -1
  781. data/spec/unit/face/config_spec.rb +185 -21
  782. data/spec/unit/face/epp_face_spec.rb +70 -6
  783. data/spec/unit/face/facts_spec.rb +53 -0
  784. data/spec/unit/face/help_spec.rb +64 -70
  785. data/spec/unit/face/man_spec.rb +26 -0
  786. data/spec/unit/face/module/list_spec.rb +0 -61
  787. data/spec/unit/face/module/search_spec.rb +12 -1
  788. data/spec/unit/face/node_spec.rb +9 -32
  789. data/spec/unit/face/parser_spec.rb +80 -2
  790. data/spec/unit/face/plugin_spec.rb +50 -4
  791. data/spec/unit/file_bucket/dipper_spec.rb +29 -13
  792. data/spec/unit/file_serving/base_spec.rb +6 -9
  793. data/spec/unit/file_serving/configuration/parser_spec.rb +2 -2
  794. data/spec/unit/file_serving/configuration_spec.rb +14 -4
  795. data/spec/unit/file_serving/content_spec.rb +0 -1
  796. data/spec/unit/file_serving/fileset_spec.rb +0 -1
  797. data/spec/unit/file_serving/metadata_spec.rb +4 -5
  798. data/spec/unit/file_serving/mount/locales_spec.rb +73 -0
  799. data/spec/unit/file_serving/mount/modules_spec.rb +1 -1
  800. data/spec/unit/file_serving/mount/tasks_spec.rb +72 -0
  801. data/spec/unit/file_serving/terminus_selector_spec.rb +0 -2
  802. data/spec/unit/file_system/path_pattern_spec.rb +1 -1
  803. data/spec/unit/file_system/uniquefile_spec.rb +2 -2
  804. data/spec/unit/file_system_spec.rb +7 -4
  805. data/spec/unit/forge/forge_spec.rb +2 -2
  806. data/spec/unit/forge/module_release_spec.rb +70 -0
  807. data/spec/unit/forge_spec.rb +106 -2
  808. data/spec/unit/functions/abs_spec.rb +70 -0
  809. data/spec/unit/functions/all_spec.rb +97 -0
  810. data/spec/unit/functions/any_spec.rb +109 -0
  811. data/spec/unit/functions/assert_type_spec.rb +1 -1
  812. data/spec/unit/functions/break_spec.rb +144 -54
  813. data/spec/unit/functions/call_spec.rb +59 -5
  814. data/spec/unit/functions/camelcase_spec.rb +34 -0
  815. data/spec/unit/functions/capitalize_spec.rb +34 -0
  816. data/spec/unit/functions/ceiling_spec.rb +65 -0
  817. data/spec/unit/functions/chomp_spec.rb +46 -0
  818. data/spec/unit/functions/chop_spec.rb +38 -0
  819. data/spec/unit/functions/compare_spec.rb +147 -0
  820. data/spec/unit/functions/contain_spec.rb +1 -0
  821. data/spec/unit/functions/convert_to_spec.rb +25 -0
  822. data/spec/unit/functions/defined_spec.rb +2 -2
  823. data/spec/unit/functions/downcase_spec.rb +34 -0
  824. data/spec/unit/functions/empty_spec.rb +77 -0
  825. data/spec/unit/functions/epp_spec.rb +21 -3
  826. data/spec/unit/functions/filter_spec.rb +4 -4
  827. data/spec/unit/functions/flatten_spec.rb +31 -0
  828. data/spec/unit/functions/floor_spec.rb +65 -0
  829. data/spec/unit/functions/get_spec.rb +135 -0
  830. data/spec/unit/functions/getvar_spec.rb +121 -0
  831. data/spec/unit/functions/hiera_spec.rb +19 -49
  832. data/spec/unit/functions/include_spec.rb +16 -1
  833. data/spec/unit/functions/inline_epp_spec.rb +1 -1
  834. data/spec/unit/functions/join_spec.rb +33 -0
  835. data/spec/unit/functions/keys_spec.rb +31 -0
  836. data/spec/unit/functions/length_spec.rb +50 -0
  837. data/spec/unit/functions/lookup_fixture_spec.rb +1 -1
  838. data/spec/unit/functions/lookup_spec.rb +198 -80
  839. data/spec/unit/functions/lstrip_spec.rb +30 -0
  840. data/spec/unit/functions/match_spec.rb +21 -4
  841. data/spec/unit/functions/max_spec.rb +129 -0
  842. data/spec/unit/functions/min_spec.rb +129 -0
  843. data/spec/unit/functions/module_directory_spec.rb +43 -0
  844. data/spec/unit/functions/new_spec.rb +81 -14
  845. data/spec/unit/functions/next_spec.rb +1 -1
  846. data/spec/unit/functions/regsubst_spec.rb +4 -5
  847. data/spec/unit/functions/require_spec.rb +2 -0
  848. data/spec/unit/functions/return_spec.rb +2 -2
  849. data/spec/unit/functions/round_spec.rb +41 -0
  850. data/spec/unit/functions/rstrip_spec.rb +30 -0
  851. data/spec/unit/functions/shared.rb +12 -0
  852. data/spec/unit/functions/size_spec.rb +50 -0
  853. data/spec/unit/functions/sort_spec.rb +79 -0
  854. data/spec/unit/functions/split_spec.rb +3 -4
  855. data/spec/unit/functions/step_spec.rb +1 -1
  856. data/spec/unit/functions/strftime_spec.rb +2 -2
  857. data/spec/unit/functions/strip_spec.rb +30 -0
  858. data/spec/unit/functions/tree_each_spec.rb +493 -0
  859. data/spec/unit/functions/upcase_spec.rb +34 -0
  860. data/spec/unit/functions/values_spec.rb +30 -0
  861. data/spec/unit/functions/versioncmp_spec.rb +3 -4
  862. data/spec/unit/functions4_spec.rb +146 -76
  863. data/spec/unit/gettext/config_spec.rb +144 -0
  864. data/spec/unit/gettext/module_loading_spec.rb +53 -0
  865. data/spec/unit/graph/relationship_graph_spec.rb +15 -0
  866. data/spec/unit/graph/simple_graph_spec.rb +43 -3
  867. data/spec/unit/indirector/catalog/compiler_spec.rb +3 -18
  868. data/spec/unit/indirector/certificate/file_spec.rb +0 -8
  869. data/spec/unit/indirector/direct_file_server_spec.rb +44 -46
  870. data/spec/unit/indirector/exec_spec.rb +29 -23
  871. data/spec/unit/indirector/facts/rest_spec.rb +45 -0
  872. data/spec/unit/indirector/facts/yaml_spec.rb +95 -78
  873. data/spec/unit/indirector/file_bucket_file/file_spec.rb +156 -99
  874. data/spec/unit/indirector/file_server_spec.rb +122 -116
  875. data/spec/unit/indirector/indirection_spec.rb +25 -10
  876. data/spec/unit/indirector/json_spec.rb +0 -11
  877. data/spec/unit/indirector/key/file_spec.rb +0 -17
  878. data/spec/unit/indirector/node/exec_spec.rb +43 -22
  879. data/spec/unit/indirector/request_spec.rb +47 -6
  880. data/spec/unit/indirector/resource/ral_spec.rb +1 -0
  881. data/spec/unit/indirector/rest_spec.rb +45 -2
  882. data/spec/unit/indirector/ssl_file_spec.rb +37 -59
  883. data/spec/unit/indirector/terminus_spec.rb +3 -3
  884. data/spec/unit/indirector/yaml_spec.rb +87 -64
  885. data/spec/unit/indirector_spec.rb +0 -1
  886. data/spec/unit/info_service_spec.rb +203 -3
  887. data/spec/unit/interface/action_manager_spec.rb +1 -1
  888. data/spec/unit/interface/action_spec.rb +34 -1
  889. data/spec/unit/interface_spec.rb +12 -0
  890. data/spec/unit/module_spec.rb +89 -4
  891. data/spec/unit/module_tool/applications/installer_spec.rb +10 -2
  892. data/spec/unit/module_tool/applications/uninstaller_spec.rb +8 -0
  893. data/spec/unit/module_tool/applications/unpacker_spec.rb +4 -4
  894. data/spec/unit/module_tool/applications/upgrader_spec.rb +7 -1
  895. data/spec/unit/module_tool/tar/mini_spec.rb +34 -5
  896. data/spec/unit/network/formats_spec.rb +31 -13
  897. data/spec/unit/network/http/api/indirected_routes_spec.rb +9 -5
  898. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +5 -7
  899. data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -1
  900. data/spec/unit/network/http/api_spec.rb +0 -26
  901. data/spec/unit/network/http/compression_spec.rb +6 -3
  902. data/spec/unit/network/http/connection_spec.rb +99 -47
  903. data/spec/unit/network/http/factory_spec.rb +32 -11
  904. data/spec/unit/network/http/handler_spec.rb +3 -2
  905. data/spec/unit/network/resolver_spec.rb +87 -12
  906. data/spec/unit/node/environment_spec.rb +38 -6
  907. data/spec/unit/node/facts_spec.rb +14 -1
  908. data/spec/unit/node_spec.rb +121 -23
  909. data/spec/unit/other/selinux_spec.rb +0 -71
  910. data/spec/unit/parser/ast/leaf_spec.rb +3 -4
  911. data/spec/unit/parser/compiler_spec.rb +9 -2
  912. data/spec/unit/parser/environment_compiler_spec.rb +55 -17
  913. data/spec/unit/parser/functions/create_resources_spec.rb +10 -1
  914. data/spec/unit/parser/functions/digest_spec.rb +1 -5
  915. data/spec/unit/parser/functions/fail_spec.rb +1 -5
  916. data/spec/unit/parser/functions/file_spec.rb +0 -4
  917. data/spec/unit/parser/functions/fqdn_rand_spec.rb +24 -0
  918. data/spec/unit/parser/functions/generate_spec.rb +29 -31
  919. data/spec/unit/parser/functions/inline_template_spec.rb +7 -4
  920. data/spec/unit/parser/functions/realize_spec.rb +9 -0
  921. data/spec/unit/parser/functions/regsubst_spec.rb +0 -4
  922. data/spec/unit/parser/functions/scanf_spec.rb +0 -4
  923. data/spec/unit/parser/functions/split_spec.rb +0 -4
  924. data/spec/unit/parser/functions/sprintf_spec.rb +26 -4
  925. data/spec/unit/parser/functions/tag_spec.rb +7 -4
  926. data/spec/unit/parser/functions/tagged_spec.rb +37 -0
  927. data/spec/unit/parser/functions/template_spec.rb +8 -4
  928. data/spec/unit/parser/functions/versioncmp_spec.rb +0 -4
  929. data/spec/unit/parser/functions_spec.rb +27 -2
  930. data/spec/unit/parser/resource/param_spec.rb +2 -2
  931. data/spec/unit/parser/resource_spec.rb +0 -1
  932. data/spec/unit/parser/scope_spec.rb +23 -4
  933. data/spec/unit/parser/type_loader_spec.rb +1 -1
  934. data/spec/unit/pops/adaptable_spec.rb +0 -1
  935. data/spec/unit/pops/evaluator/access_ops_spec.rb +5 -0
  936. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +10 -0
  937. data/spec/unit/pops/evaluator/conditionals_spec.rb +1 -1
  938. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +78 -16
  939. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +4 -8
  940. data/spec/unit/pops/factory_rspec_helper.rb +1 -1
  941. data/spec/unit/pops/factory_spec.rb +10 -6
  942. data/spec/unit/pops/issues_spec.rb +23 -8
  943. data/spec/unit/pops/loaders/dependency_loader_spec.rb +2 -2
  944. data/spec/unit/pops/loaders/loader_spec.rb +495 -0
  945. data/spec/unit/pops/loaders/loaders_spec.rb +64 -19
  946. data/spec/unit/pops/loaders/module_loaders_spec.rb +75 -0
  947. data/spec/unit/pops/loaders/static_loader_spec.rb +16 -44
  948. data/spec/unit/pops/lookup/interpolation_spec.rb +5 -0
  949. data/spec/unit/pops/lookup/lookup_spec.rb +56 -0
  950. data/spec/unit/pops/model/model_spec.rb +5 -0
  951. data/spec/unit/pops/model/pn_transformer_spec.rb +53 -0
  952. data/spec/unit/pops/parser/lexer2_spec.rb +119 -26
  953. data/spec/unit/pops/parser/locator_spec.rb +20 -0
  954. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +67 -4
  955. data/spec/unit/pops/parser/parse_calls_spec.rb +28 -0
  956. data/spec/unit/pops/parser/parse_conditionals_spec.rb +12 -0
  957. data/spec/unit/pops/parser/parse_containers_spec.rb +1 -1
  958. data/spec/unit/pops/parser/parse_functions_spec.rb +1 -1
  959. data/spec/unit/pops/parser/parse_heredoc_spec.rb +3 -3
  960. data/spec/unit/pops/parser/parse_lambda_spec.rb +1 -1
  961. data/spec/unit/pops/parser/parse_plan_spec.rb +48 -0
  962. data/spec/unit/pops/parser/parse_resource_spec.rb +35 -35
  963. data/spec/unit/pops/parser/parser_spec.rb +138 -0
  964. data/spec/unit/pops/parser/pn_parser_spec.rb +101 -0
  965. data/spec/unit/pops/pn_spec.rb +148 -0
  966. data/spec/unit/pops/puppet_stack_spec.rb +38 -9
  967. data/spec/unit/pops/serialization/packer_spec.rb +8 -0
  968. data/spec/unit/pops/serialization/serialization_spec.rb +38 -6
  969. data/spec/unit/pops/serialization/to_from_hr_spec.rb +134 -5
  970. data/spec/unit/pops/serialization/to_stringified_spec.rb +157 -0
  971. data/spec/unit/pops/types/deferred_spec.rb +87 -0
  972. data/spec/unit/pops/types/error_spec.rb +207 -0
  973. data/spec/unit/pops/types/iterable_spec.rb +10 -10
  974. data/spec/unit/pops/types/p_init_type_spec.rb +383 -0
  975. data/spec/unit/pops/types/p_object_type_spec.rb +531 -54
  976. data/spec/unit/pops/types/p_sensitive_type_spec.rb +4 -0
  977. data/spec/unit/pops/types/p_timespan_type_spec.rb +32 -4
  978. data/spec/unit/pops/types/p_timestamp_type_spec.rb +64 -3
  979. data/spec/unit/pops/types/p_type_set_type_spec.rb +108 -4
  980. data/spec/unit/pops/types/p_uri_type_spec.rb +191 -0
  981. data/spec/unit/pops/types/ruby_generator_spec.rb +285 -73
  982. data/spec/unit/pops/types/string_converter_spec.rb +63 -17
  983. data/spec/unit/pops/types/task_spec.rb +485 -0
  984. data/spec/unit/pops/types/type_acceptor_spec.rb +2 -2
  985. data/spec/unit/pops/types/type_calculator_spec.rb +224 -63
  986. data/spec/unit/pops/types/type_factory_spec.rb +6 -6
  987. data/spec/unit/pops/types/type_formatter_spec.rb +37 -19
  988. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +21 -0
  989. data/spec/unit/pops/types/type_parser_spec.rb +39 -2
  990. data/spec/unit/pops/types/types_spec.rb +88 -10
  991. data/spec/unit/pops/validator/validator_spec.rb +435 -7
  992. data/spec/unit/property/keyvalue_spec.rb +97 -6
  993. data/spec/unit/property_spec.rb +14 -5
  994. data/spec/unit/provider/aix_object_spec.rb +805 -0
  995. data/spec/unit/provider/exec/posix_spec.rb +8 -8
  996. data/spec/unit/provider/exec/shell_spec.rb +2 -1
  997. data/spec/unit/provider/exec/windows_spec.rb +2 -2
  998. data/spec/unit/provider/file/windows_spec.rb +2 -2
  999. data/spec/unit/provider/group/aix_spec.rb +76 -0
  1000. data/spec/unit/provider/group/groupadd_spec.rb +77 -1
  1001. data/spec/unit/provider/group/pw_spec.rb +4 -4
  1002. data/spec/unit/provider/group/windows_adsi_spec.rb +80 -23
  1003. data/spec/unit/provider/ldap_spec.rb +0 -1
  1004. data/spec/unit/provider/nameservice_spec.rb +11 -11
  1005. data/spec/unit/provider/package/aix_spec.rb +26 -1
  1006. data/spec/unit/provider/package/aptitude_spec.rb +1 -1
  1007. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  1008. data/spec/unit/provider/package/dnf_spec.rb +9 -2
  1009. data/spec/unit/provider/package/dpkg_spec.rb +2 -2
  1010. data/spec/unit/provider/package/gem_spec.rb +17 -7
  1011. data/spec/unit/provider/package/nim_spec.rb +2 -11
  1012. data/spec/unit/provider/package/opkg_spec.rb +2 -2
  1013. data/spec/unit/provider/package/pip_spec.rb +38 -41
  1014. data/spec/unit/provider/package/pkg_spec.rb +64 -24
  1015. data/spec/unit/provider/package/pkgng_spec.rb +1 -1
  1016. data/spec/unit/provider/package/puppet_gem_spec.rb +2 -2
  1017. data/spec/unit/provider/package/rpm_spec.rb +33 -14
  1018. data/spec/unit/provider/package/urpmi_spec.rb +9 -3
  1019. data/spec/unit/provider/package/windows/msi_package_spec.rb +1 -1
  1020. data/spec/unit/provider/package/windows/package_spec.rb +1 -1
  1021. data/spec/unit/provider/package/windows_spec.rb +3 -3
  1022. data/spec/unit/provider/package/yum_spec.rb +69 -0
  1023. data/spec/unit/provider/parsedfile_spec.rb +1 -1
  1024. data/spec/unit/provider/service/base_spec.rb +23 -5
  1025. data/spec/unit/provider/service/bsd_spec.rb +17 -16
  1026. data/spec/unit/provider/service/daemontools_spec.rb +2 -3
  1027. data/spec/unit/provider/service/debian_spec.rb +8 -4
  1028. data/spec/unit/provider/service/freebsd_spec.rb +2 -2
  1029. data/spec/unit/provider/service/gentoo_spec.rb +27 -26
  1030. data/spec/unit/provider/service/init_spec.rb +17 -16
  1031. data/spec/unit/provider/service/launchd_spec.rb +6 -3
  1032. data/spec/unit/provider/service/openbsd_spec.rb +43 -42
  1033. data/spec/unit/provider/service/openrc_spec.rb +35 -34
  1034. data/spec/unit/provider/service/openwrt_spec.rb +7 -5
  1035. data/spec/unit/provider/service/rcng_spec.rb +7 -6
  1036. data/spec/unit/provider/service/redhat_spec.rb +11 -6
  1037. data/spec/unit/provider/service/runit_spec.rb +2 -3
  1038. data/spec/unit/provider/service/smf_spec.rb +7 -7
  1039. data/spec/unit/provider/service/src_spec.rb +3 -4
  1040. data/spec/unit/provider/service/systemd_spec.rb +73 -51
  1041. data/spec/unit/provider/service/upstart_spec.rb +53 -14
  1042. data/spec/unit/provider/service/windows_spec.rb +49 -86
  1043. data/spec/unit/provider/user/aix_spec.rb +126 -121
  1044. data/spec/unit/provider/user/hpux_spec.rb +4 -3
  1045. data/spec/unit/provider/user/openbsd_spec.rb +2 -2
  1046. data/spec/unit/provider/user/pw_spec.rb +14 -14
  1047. data/spec/unit/provider/user/user_role_add_spec.rb +20 -3
  1048. data/spec/unit/provider/user/useradd_spec.rb +194 -22
  1049. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  1050. data/spec/unit/provider_spec.rb +210 -14
  1051. data/spec/unit/puppet_pal_2pec.rb +1020 -0
  1052. data/spec/unit/puppet_pal_catalog_spec.rb +801 -0
  1053. data/spec/unit/puppet_pal_spec.rb +4 -0
  1054. data/spec/unit/puppet_spec.rb +31 -19
  1055. data/spec/unit/resource/capability_finder_spec.rb +16 -18
  1056. data/spec/unit/resource/catalog_spec.rb +27 -12
  1057. data/spec/unit/resource/status_spec.rb +17 -4
  1058. data/spec/unit/resource/type_collection_spec.rb +4 -1
  1059. data/spec/unit/resource/type_spec.rb +24 -9
  1060. data/spec/unit/resource_spec.rb +46 -5
  1061. data/spec/unit/rest/client_spec.rb +135 -0
  1062. data/spec/unit/rest/route_spec.rb +132 -0
  1063. data/spec/unit/settings/autosign_setting_spec.rb +2 -2
  1064. data/spec/unit/settings/certificate_revocation_setting_spec.rb +37 -0
  1065. data/spec/unit/settings/config_file_spec.rb +10 -1
  1066. data/spec/unit/settings/file_setting_spec.rb +17 -9
  1067. data/spec/unit/settings/ini_file_spec.rb +314 -5
  1068. data/spec/unit/settings/path_setting_spec.rb +1 -1
  1069. data/spec/unit/settings_spec.rb +57 -7
  1070. data/spec/unit/ssl/certificate_request_attributes_spec.rb +21 -8
  1071. data/spec/unit/ssl/certificate_request_spec.rb +62 -41
  1072. data/spec/unit/ssl/certificate_spec.rb +4 -7
  1073. data/spec/unit/ssl/host_spec.rb +248 -579
  1074. data/spec/unit/ssl/key_spec.rb +0 -15
  1075. data/spec/unit/ssl/validator_spec.rb +36 -167
  1076. data/spec/unit/task_spec.rb +247 -0
  1077. data/spec/unit/transaction/additional_resource_generator_spec.rb +64 -62
  1078. data/spec/unit/transaction/event_manager_spec.rb +12 -0
  1079. data/spec/unit/transaction/persistence_spec.rb +43 -1
  1080. data/spec/unit/transaction/report_spec.rb +62 -19
  1081. data/spec/unit/transaction/resource_harness_spec.rb +2 -2
  1082. data/spec/unit/transaction_spec.rb +134 -16
  1083. data/spec/unit/type/exec_spec.rb +11 -13
  1084. data/spec/unit/type/file/checksum_spec.rb +21 -1
  1085. data/spec/unit/type/file/content_spec.rb +13 -1
  1086. data/spec/unit/type/file/selinux_spec.rb +0 -1
  1087. data/spec/unit/type/file/source_spec.rb +15 -9
  1088. data/spec/unit/type/file_spec.rb +37 -22
  1089. data/spec/unit/type/group_spec.rb +8 -0
  1090. data/spec/unit/type/package_spec.rb +10 -0
  1091. data/spec/unit/type/resources_spec.rb +26 -12
  1092. data/spec/unit/type/schedule_spec.rb +15 -1
  1093. data/spec/unit/type/service_spec.rb +36 -10
  1094. data/spec/unit/type/tidy_spec.rb +17 -1
  1095. data/spec/unit/type/user_spec.rb +24 -115
  1096. data/spec/unit/type_spec.rb +177 -98
  1097. data/spec/unit/util/autoload_spec.rb +71 -43
  1098. data/spec/unit/util/character_encoding_spec.rb +0 -43
  1099. data/spec/unit/util/checksums_spec.rb +3 -3
  1100. data/spec/unit/util/diff_spec.rb +11 -3
  1101. data/spec/unit/util/docs_spec.rb +1 -1
  1102. data/spec/unit/util/errors_spec.rb +1 -1
  1103. data/spec/unit/util/execution_spec.rb +229 -95
  1104. data/spec/unit/util/execution_stub_spec.rb +2 -2
  1105. data/spec/unit/util/feature_spec.rb +35 -17
  1106. data/spec/unit/util/filetype_spec.rb +8 -4
  1107. data/spec/unit/util/http_proxy_spec.rb +57 -0
  1108. data/spec/unit/util/inifile_spec.rb +35 -4
  1109. data/spec/unit/util/ldap/manager_spec.rb +1 -16
  1110. data/spec/unit/util/lockfile_spec.rb +1 -1
  1111. data/spec/unit/util/log/destinations_spec.rb +45 -15
  1112. data/spec/unit/util/log_spec.rb +42 -12
  1113. data/spec/unit/util/logging_spec.rb +37 -15
  1114. data/spec/unit/util/monkey_patches_spec.rb +6 -3
  1115. data/spec/unit/util/plist_spec.rb +12 -6
  1116. data/spec/unit/util/profiler/object_counts_spec.rb +2 -1
  1117. data/spec/unit/util/rubygems_spec.rb +0 -34
  1118. data/spec/unit/util/run_mode_spec.rb +7 -7
  1119. data/spec/unit/util/selinux_spec.rb +3 -3
  1120. data/spec/unit/util/storage_spec.rb +13 -1
  1121. data/spec/unit/util/suidmanager_spec.rb +5 -5
  1122. data/spec/unit/util/tag_set_spec.rb +8 -1
  1123. data/spec/unit/util/tagging_spec.rb +27 -8
  1124. data/spec/unit/util/windows/access_control_entry_spec.rb +1 -1
  1125. data/spec/unit/util/windows/access_control_list_spec.rb +1 -1
  1126. data/spec/unit/util/windows/adsi_spec.rb +39 -35
  1127. data/spec/unit/util/windows/api_types_spec.rb +52 -1
  1128. data/spec/unit/util/windows/eventlog_spec.rb +1 -1
  1129. data/spec/unit/util/windows/security_descriptor_spec.rb +1 -1
  1130. data/spec/unit/util/windows/service_spec.rb +424 -0
  1131. data/spec/unit/util/windows/sid_spec.rb +88 -17
  1132. data/spec/unit/util/windows/string_spec.rb +1 -1
  1133. data/spec/unit/util/yaml_spec.rb +162 -28
  1134. data/spec/unit/util_spec.rb +41 -76
  1135. data/spec/watchr.rb +0 -1
  1136. data/tasks/benchmark.rake +41 -0
  1137. data/tasks/ci.rake +0 -5
  1138. data/tasks/generate_ast_model.rake +55 -43
  1139. data/tasks/manpages.rake +19 -3
  1140. data/tasks/parallel.rake +12 -7
  1141. data/tasks/parser.rake +11 -3
  1142. metadata +3262 -3438
  1143. data/ext/rack/config.ru +0 -44
  1144. data/ext/rack/example-passenger-vhost.conf +0 -57
  1145. data/lib/puppet/application/ca.rb +0 -11
  1146. data/lib/puppet/application/certificate.rb +0 -17
  1147. data/lib/puppet/application/certificate_request.rb +0 -7
  1148. data/lib/puppet/application/certificate_revocation_list.rb +0 -7
  1149. data/lib/puppet/application/master.rb +0 -313
  1150. data/lib/puppet/bindings.rb +0 -147
  1151. data/lib/puppet/configurer/downloader_factory.rb +0 -34
  1152. data/lib/puppet/external/nagios/base.rb +0 -472
  1153. data/lib/puppet/external/nagios/grammar.ry +0 -248
  1154. data/lib/puppet/external/nagios/makefile +0 -9
  1155. data/lib/puppet/external/nagios/parser.rb +0 -400
  1156. data/lib/puppet/external/nagios.rb +0 -46
  1157. data/lib/puppet/face/ca.rb +0 -266
  1158. data/lib/puppet/face/certificate.rb +0 -165
  1159. data/lib/puppet/face/certificate_request.rb +0 -56
  1160. data/lib/puppet/face/certificate_revocation_list.rb +0 -56
  1161. data/lib/puppet/feature/rack.rb +0 -19
  1162. data/lib/puppet/graph/random_prioritizer.rb +0 -16
  1163. data/lib/puppet/graph/title_hash_prioritizer.rb +0 -16
  1164. data/lib/puppet/indirector/certificate/ca.rb +0 -9
  1165. data/lib/puppet/indirector/certificate/disabled_ca.rb +0 -22
  1166. data/lib/puppet/indirector/certificate_request/ca.rb +0 -22
  1167. data/lib/puppet/indirector/certificate_request/disabled_ca.rb +0 -22
  1168. data/lib/puppet/indirector/certificate_revocation_list/ca.rb +0 -8
  1169. data/lib/puppet/indirector/certificate_revocation_list/disabled_ca.rb +0 -22
  1170. data/lib/puppet/indirector/certificate_revocation_list/file.rb +0 -8
  1171. data/lib/puppet/indirector/certificate_revocation_list/rest.rb +0 -10
  1172. data/lib/puppet/indirector/certificate_status/file.rb +0 -91
  1173. data/lib/puppet/indirector/certificate_status/rest.rb +0 -11
  1174. data/lib/puppet/indirector/certificate_status.rb +0 -4
  1175. data/lib/puppet/indirector/key/ca.rb +0 -16
  1176. data/lib/puppet/indirector/key/disabled_ca.rb +0 -22
  1177. data/lib/puppet/indirector/ldap.rb +0 -80
  1178. data/lib/puppet/indirector/node/ldap.rb +0 -259
  1179. data/lib/puppet/indirector/node/write_only_yaml.rb +0 -37
  1180. data/lib/puppet/module_tool/applications/builder.rb +0 -148
  1181. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +0 -18
  1182. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +0 -89
  1183. data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +0 -32
  1184. data/lib/puppet/module_tool/skeleton/templates/generator/examples/init.pp.erb +0 -12
  1185. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +0 -48
  1186. data/lib/puppet/module_tool/skeleton/templates/generator/metadata.json.erb +0 -1
  1187. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +0 -6
  1188. data/lib/puppet/module_tool/skeleton/templates/generator/spec/spec_helper.rb +0 -1
  1189. data/lib/puppet/network/http/api/ca/v1.rb +0 -11
  1190. data/lib/puppet/network/http/api/ca.rb +0 -2
  1191. data/lib/puppet/network/http/rack/rest.rb +0 -162
  1192. data/lib/puppet/network/http/rack.rb +0 -33
  1193. data/lib/puppet/network/http/webrick/rest.rb +0 -114
  1194. data/lib/puppet/network/http/webrick.rb +0 -125
  1195. data/lib/puppet/network/server.rb +0 -39
  1196. data/lib/puppet/provider/aixobject.rb +0 -392
  1197. data/lib/puppet/provider/augeas/augeas.rb +0 -567
  1198. data/lib/puppet/provider/cisco.rb +0 -9
  1199. data/lib/puppet/provider/computer/computer.rb +0 -20
  1200. data/lib/puppet/provider/cron/crontab.rb +0 -297
  1201. data/lib/puppet/provider/host/parsed.rb +0 -46
  1202. data/lib/puppet/provider/interface/cisco.rb +0 -27
  1203. data/lib/puppet/provider/macauthorization/macauthorization.rb +0 -298
  1204. data/lib/puppet/provider/mailalias/aliases.rb +0 -50
  1205. data/lib/puppet/provider/maillist/mailman.rb +0 -108
  1206. data/lib/puppet/provider/mcx/mcxcontent.rb +0 -173
  1207. data/lib/puppet/provider/mount/parsed.rb +0 -282
  1208. data/lib/puppet/provider/mount.rb +0 -59
  1209. data/lib/puppet/provider/naginator.rb +0 -63
  1210. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +0 -590
  1211. data/lib/puppet/provider/selboolean/getsetsebool.rb +0 -47
  1212. data/lib/puppet/provider/selmodule/semodule.rb +0 -138
  1213. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +0 -105
  1214. data/lib/puppet/provider/sshkey/parsed.rb +0 -50
  1215. data/lib/puppet/provider/vlan/cisco.rb +0 -28
  1216. data/lib/puppet/provider/yumrepo/inifile.rb +0 -304
  1217. data/lib/puppet/provider/zfs/zfs.rb +0 -84
  1218. data/lib/puppet/provider/zone/solaris.rb +0 -364
  1219. data/lib/puppet/provider/zpool/zpool.rb +0 -125
  1220. data/lib/puppet/ssl/certificate_authority/autosign_command.rb +0 -45
  1221. data/lib/puppet/ssl/certificate_authority/interface.rb +0 -324
  1222. data/lib/puppet/ssl/certificate_authority.rb +0 -553
  1223. data/lib/puppet/ssl/certificate_revocation_list.rb +0 -110
  1224. data/lib/puppet/ssl/configuration.rb +0 -61
  1225. data/lib/puppet/ssl/inventory.rb +0 -55
  1226. data/lib/puppet/type/augeas.rb +0 -211
  1227. data/lib/puppet/type/computer.rb +0 -66
  1228. data/lib/puppet/type/cron.rb +0 -475
  1229. data/lib/puppet/type/host.rb +0 -95
  1230. data/lib/puppet/type/interface.rb +0 -121
  1231. data/lib/puppet/type/k5login.rb +0 -88
  1232. data/lib/puppet/type/macauthorization.rb +0 -167
  1233. data/lib/puppet/type/mailalias.rb +0 -46
  1234. data/lib/puppet/type/maillist.rb +0 -62
  1235. data/lib/puppet/type/mcx.rb +0 -98
  1236. data/lib/puppet/type/mount.rb +0 -310
  1237. data/lib/puppet/type/nagios_command.rb +0 -3
  1238. data/lib/puppet/type/nagios_contact.rb +0 -3
  1239. data/lib/puppet/type/nagios_contactgroup.rb +0 -3
  1240. data/lib/puppet/type/nagios_host.rb +0 -3
  1241. data/lib/puppet/type/nagios_hostdependency.rb +0 -3
  1242. data/lib/puppet/type/nagios_hostescalation.rb +0 -3
  1243. data/lib/puppet/type/nagios_hostextinfo.rb +0 -3
  1244. data/lib/puppet/type/nagios_hostgroup.rb +0 -3
  1245. data/lib/puppet/type/nagios_service.rb +0 -3
  1246. data/lib/puppet/type/nagios_servicedependency.rb +0 -3
  1247. data/lib/puppet/type/nagios_serviceescalation.rb +0 -3
  1248. data/lib/puppet/type/nagios_serviceextinfo.rb +0 -3
  1249. data/lib/puppet/type/nagios_servicegroup.rb +0 -3
  1250. data/lib/puppet/type/nagios_timeperiod.rb +0 -3
  1251. data/lib/puppet/type/router.rb +0 -17
  1252. data/lib/puppet/type/scheduled_task.rb +0 -184
  1253. data/lib/puppet/type/selboolean.rb +0 -26
  1254. data/lib/puppet/type/selmodule.rb +0 -59
  1255. data/lib/puppet/type/ssh_authorized_key.rb +0 -143
  1256. data/lib/puppet/type/sshkey.rb +0 -75
  1257. data/lib/puppet/type/vlan.rb +0 -26
  1258. data/lib/puppet/type/yumrepo.rb +0 -409
  1259. data/lib/puppet/type/zfs.rb +0 -150
  1260. data/lib/puppet/type/zone.rb +0 -382
  1261. data/lib/puppet/type/zpool.rb +0 -91
  1262. data/lib/puppet/util/methodhelper.rb +0 -32
  1263. data/lib/puppet/util/nagios_maker.rb +0 -85
  1264. data/lib/puppet/util/network_device/cisco/device.rb +0 -285
  1265. data/lib/puppet/util/network_device/cisco/facts.rb +0 -72
  1266. data/lib/puppet/util/network_device/cisco/interface.rb +0 -94
  1267. data/lib/puppet/util/network_device/cisco.rb +0 -4
  1268. data/lib/puppet/util/network_device/ipcalc.rb +0 -68
  1269. data/lib/puppet/util/network_device/transport/ssh.rb +0 -126
  1270. data/lib/puppet/util/network_device/transport/telnet.rb +0 -47
  1271. data/lib/puppet/util/windows/taskscheduler.rb +0 -1276
  1272. data/lib/puppet/vendor/load_semantic.rb +0 -1
  1273. data/lib/puppet/vendor/load_semantic_puppet.rb +0 -1
  1274. data/lib/puppet/vendor/semantic/lib/semantic.rb +0 -5
  1275. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/graph.rb +0 -60
  1276. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/graph_node.rb +0 -117
  1277. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +0 -58
  1278. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/source.rb +0 -25
  1279. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/unsatisfiable_graph.rb +0 -31
  1280. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency.rb +0 -181
  1281. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +0 -3
  1282. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/version.rb +0 -203
  1283. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/version_range.rb +0 -758
  1284. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +0 -9
  1285. data/lib/puppet/vendor/semantic_puppet/locales/config.yaml +0 -21
  1286. data/man/man8/puppet-ca.8 +0 -182
  1287. data/man/man8/puppet-cert.8 +0 -101
  1288. data/man/man8/puppet-certificate.8 +0 -224
  1289. data/man/man8/puppet-certificate_request.8 +0 -161
  1290. data/man/man8/puppet-certificate_revocation_list.8 +0 -139
  1291. data/man/man8/puppet-inspect.8 +0 -36
  1292. data/man/man8/puppet-master.8 +0 -85
  1293. data/spec/fixtures/integration/provider/cron/crontab/create_normal_entry +0 -19
  1294. data/spec/fixtures/integration/provider/cron/crontab/create_special_entry +0 -18
  1295. data/spec/fixtures/integration/provider/cron/crontab/crontab_user1 +0 -15
  1296. data/spec/fixtures/integration/provider/cron/crontab/crontab_user2 +0 -4
  1297. data/spec/fixtures/integration/provider/cron/crontab/modify_entry +0 -13
  1298. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input1 +0 -15
  1299. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input2 +0 -6
  1300. data/spec/fixtures/integration/provider/cron/crontab/purged +0 -8
  1301. data/spec/fixtures/integration/provider/cron/crontab/remove_named_resource +0 -12
  1302. data/spec/fixtures/integration/provider/cron/crontab/remove_unnamed_resource +0 -14
  1303. data/spec/fixtures/integration/provider/cron/crontab/unspecialized +0 -15
  1304. data/spec/fixtures/integration/provider/mailalias/aliases/test1 +0 -31
  1305. data/spec/fixtures/integration/provider/sshkey/sample +0 -21
  1306. data/spec/fixtures/unit/provider/augeas/augeas/augeas/lenses/test.aug +0 -13
  1307. data/spec/fixtures/unit/provider/augeas/augeas/etc/fstab +0 -10
  1308. data/spec/fixtures/unit/provider/augeas/augeas/etc/hosts +0 -6
  1309. data/spec/fixtures/unit/provider/augeas/augeas/etc/test +0 -3
  1310. data/spec/fixtures/unit/provider/augeas/augeas/test.aug +0 -13
  1311. data/spec/fixtures/unit/provider/host/parsed/valid_hosts +0 -19
  1312. data/spec/fixtures/unit/provider/mount/mount-output.aix.txt +0 -7
  1313. data/spec/fixtures/unit/provider/mount/parsed/aix.filesystems +0 -152
  1314. data/spec/fixtures/unit/provider/mount/parsed/aix.mount +0 -11
  1315. data/spec/fixtures/unit/provider/mount/parsed/darwin.mount +0 -6
  1316. data/spec/fixtures/unit/provider/mount/parsed/freebsd.fstab +0 -8
  1317. data/spec/fixtures/unit/provider/mount/parsed/freebsd.mount +0 -3
  1318. data/spec/fixtures/unit/provider/mount/parsed/hpux.mount +0 -17
  1319. data/spec/fixtures/unit/provider/mount/parsed/linux.fstab +0 -11
  1320. data/spec/fixtures/unit/provider/mount/parsed/linux.mount +0 -5
  1321. data/spec/fixtures/unit/provider/mount/parsed/netbsd.fstab +0 -9
  1322. data/spec/fixtures/unit/provider/mount/parsed/netbsd.mount +0 -8
  1323. data/spec/fixtures/unit/provider/mount/parsed/openbsd.fstab +0 -4
  1324. data/spec/fixtures/unit/provider/mount/parsed/openbsd.mount +0 -4
  1325. data/spec/fixtures/unit/provider/mount/parsed/solaris.fstab +0 -11
  1326. data/spec/fixtures/unit/provider/mount/parsed/solaris.mount +0 -6
  1327. data/spec/fixtures/unit/provider/naginator/define_empty_param +0 -6
  1328. data/spec/fixtures/unit/provider/ssh_authorized_key/parsed/authorized_keys +0 -7
  1329. data/spec/fixtures/unit/provider/ssh_authorized_key/parsed/authorized_keys1 +0 -3
  1330. data/spec/fixtures/unit/provider/ssh_authorized_key/parsed/authorized_keys2 +0 -1
  1331. data/spec/fixtures/unit/provider/sshkey/parsed/sample +0 -21
  1332. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +0 -8
  1333. data/spec/fixtures/unit/provider/zfs/zfs/zfs-list.out +0 -2
  1334. data/spec/fixtures/unit/provider/zpool/zpool/zpool-list.out +0 -2
  1335. data/spec/integration/faces/ca_spec.rb +0 -354
  1336. data/spec/integration/indirector/node/ldap_spec.rb +0 -14
  1337. data/spec/integration/provider/cron/crontab_spec.rb +0 -241
  1338. data/spec/integration/provider/mailalias/aliases_spec.rb +0 -10
  1339. data/spec/integration/provider/mount_spec.rb +0 -161
  1340. data/spec/integration/provider/ssh_authorized_key_spec.rb +0 -219
  1341. data/spec/integration/provider/sshkey_spec.rb +0 -159
  1342. data/spec/integration/provider/yumrepo_spec.rb +0 -130
  1343. data/spec/integration/ssl/autosign_spec.rb +0 -145
  1344. data/spec/integration/ssl/certificate_authority_spec.rb +0 -162
  1345. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -34
  1346. data/spec/integration/transaction_spec.rb +0 -522
  1347. data/spec/integration/type/nagios_spec.rb +0 -71
  1348. data/spec/integration/type/user_spec.rb +0 -64
  1349. data/spec/unit/application/cert_spec.rb +0 -240
  1350. data/spec/unit/application/certificate_spec.rb +0 -22
  1351. data/spec/unit/application/master_spec.rb +0 -404
  1352. data/spec/unit/configurer/downloader_factory_spec.rb +0 -96
  1353. data/spec/unit/face/ca_spec.rb +0 -10
  1354. data/spec/unit/face/certificate_request_spec.rb +0 -10
  1355. data/spec/unit/face/certificate_revocation_list_spec.rb +0 -10
  1356. data/spec/unit/face/certificate_spec.rb +0 -231
  1357. data/spec/unit/face/module/build_spec.rb +0 -69
  1358. data/spec/unit/graph/title_hash_prioritizer_spec.rb +0 -49
  1359. data/spec/unit/indirector/certificate/ca_spec.rb +0 -23
  1360. data/spec/unit/indirector/certificate/disabled_ca_spec.rb +0 -33
  1361. data/spec/unit/indirector/certificate_request/ca_spec.rb +0 -57
  1362. data/spec/unit/indirector/certificate_request/disabled_ca_spec.rb +0 -33
  1363. data/spec/unit/indirector/certificate_revocation_list/ca_spec.rb +0 -16
  1364. data/spec/unit/indirector/certificate_revocation_list/disabled_ca_spec.rb +0 -33
  1365. data/spec/unit/indirector/certificate_revocation_list/file_spec.rb +0 -17
  1366. data/spec/unit/indirector/certificate_revocation_list/rest_spec.rb +0 -26
  1367. data/spec/unit/indirector/certificate_status/file_spec.rb +0 -191
  1368. data/spec/unit/indirector/certificate_status/rest_spec.rb +0 -18
  1369. data/spec/unit/indirector/code_spec.rb +0 -31
  1370. data/spec/unit/indirector/key/ca_spec.rb +0 -23
  1371. data/spec/unit/indirector/key/disabled_ca_spec.rb +0 -33
  1372. data/spec/unit/indirector/ldap_spec.rb +0 -137
  1373. data/spec/unit/indirector/node/ldap_spec.rb +0 -462
  1374. data/spec/unit/indirector/node/write_only_yaml_spec.rb +0 -12
  1375. data/spec/unit/module_tool/applications/builder_spec.rb +0 -432
  1376. data/spec/unit/network/http/api/ca/v1_spec.rb +0 -26
  1377. data/spec/unit/network/http/rack/rest_spec.rb +0 -325
  1378. data/spec/unit/network/http/rack_spec.rb +0 -43
  1379. data/spec/unit/network/http/webrick/rest_spec.rb +0 -231
  1380. data/spec/unit/network/http/webrick_spec.rb +0 -279
  1381. data/spec/unit/network/server_spec.rb +0 -95
  1382. data/spec/unit/provider/aixobject_spec.rb +0 -101
  1383. data/spec/unit/provider/augeas/augeas_spec.rb +0 -1025
  1384. data/spec/unit/provider/cisco_spec.rb +0 -15
  1385. data/spec/unit/provider/cron/crontab_spec.rb +0 -207
  1386. data/spec/unit/provider/cron/parsed_spec.rb +0 -358
  1387. data/spec/unit/provider/host/parsed_spec.rb +0 -233
  1388. data/spec/unit/provider/interface/cisco_spec.rb +0 -57
  1389. data/spec/unit/provider/macauthorization_spec.rb +0 -155
  1390. data/spec/unit/provider/mcx/mcxcontent_spec.rb +0 -192
  1391. data/spec/unit/provider/mount/parsed_spec.rb +0 -317
  1392. data/spec/unit/provider/mount_spec.rb +0 -165
  1393. data/spec/unit/provider/naginator_spec.rb +0 -79
  1394. data/spec/unit/provider/network_device_spec.rb +0 -152
  1395. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +0 -2060
  1396. data/spec/unit/provider/selboolean_spec.rb +0 -36
  1397. data/spec/unit/provider/selmodule-example.pp +0 -0
  1398. data/spec/unit/provider/selmodule_spec.rb +0 -73
  1399. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +0 -277
  1400. data/spec/unit/provider/sshkey/parsed_spec.rb +0 -95
  1401. data/spec/unit/provider/vlan/cisco_spec.rb +0 -55
  1402. data/spec/unit/provider/yumrepo/inifile_spec.rb +0 -326
  1403. data/spec/unit/provider/zfs/zfs_spec.rb +0 -106
  1404. data/spec/unit/provider/zone/solaris_spec.rb +0 -247
  1405. data/spec/unit/provider/zpool/zpool_spec.rb +0 -251
  1406. data/spec/unit/ssl/certificate_authority/autosign_command_spec.rb +0 -30
  1407. data/spec/unit/ssl/certificate_authority/interface_spec.rb +0 -560
  1408. data/spec/unit/ssl/certificate_authority_spec.rb +0 -1184
  1409. data/spec/unit/ssl/certificate_revocation_list_spec.rb +0 -196
  1410. data/spec/unit/ssl/configuration_spec.rb +0 -141
  1411. data/spec/unit/ssl/inventory_spec.rb +0 -151
  1412. data/spec/unit/type/augeas_spec.rb +0 -119
  1413. data/spec/unit/type/computer_spec.rb +0 -80
  1414. data/spec/unit/type/cron_spec.rb +0 -543
  1415. data/spec/unit/type/host_spec.rb +0 -681
  1416. data/spec/unit/type/interface_spec.rb +0 -129
  1417. data/spec/unit/type/k5login_spec.rb +0 -115
  1418. data/spec/unit/type/macauthorization_spec.rb +0 -113
  1419. data/spec/unit/type/mailalias_spec.rb +0 -49
  1420. data/spec/unit/type/maillist_spec.rb +0 -41
  1421. data/spec/unit/type/mcx_spec.rb +0 -79
  1422. data/spec/unit/type/mount_spec.rb +0 -634
  1423. data/spec/unit/type/nagios_spec.rb +0 -293
  1424. data/spec/unit/type/scheduled_task_spec.rb +0 -103
  1425. data/spec/unit/type/selboolean_spec.rb +0 -44
  1426. data/spec/unit/type/selmodule_spec.rb +0 -17
  1427. data/spec/unit/type/ssh_authorized_key_spec.rb +0 -258
  1428. data/spec/unit/type/sshkey_spec.rb +0 -77
  1429. data/spec/unit/type/vlan_spec.rb +0 -44
  1430. data/spec/unit/type/yumrepo_spec.rb +0 -398
  1431. data/spec/unit/type/zfs_spec.rb +0 -46
  1432. data/spec/unit/type/zone_spec.rb +0 -172
  1433. data/spec/unit/type/zpool_spec.rb +0 -109
  1434. data/spec/unit/util/nagios_maker_spec.rb +0 -122
  1435. data/spec/unit/util/network_device/cisco/device_spec.rb +0 -482
  1436. data/spec/unit/util/network_device/cisco/facts_spec.rb +0 -64
  1437. data/spec/unit/util/network_device/cisco/interface_spec.rb +0 -88
  1438. data/spec/unit/util/network_device/ipcalc_spec.rb +0 -62
  1439. data/spec/unit/util/network_device/transport/ssh_spec.rb +0 -218
  1440. data/spec/unit/util/network_device/transport/telnet_spec.rb +0 -86
data/lib/puppet_pal.rb ADDED
@@ -0,0 +1,1102 @@
1
+ # Puppet as a Library "PAL"
2
+
3
+ # Yes, this requires all of puppet for now because 'settings' and many other things...
4
+ require 'puppet'
5
+ require 'puppet/parser/script_compiler'
6
+ require 'puppet/parser/catalog_compiler'
7
+
8
+ # This is the main entry point for "Puppet As a Library" PAL.
9
+ # This file should be required instead of "puppet"
10
+ # Initially, this will require ALL of puppet - over time this will change as the monolithical "puppet" is broken up
11
+ # into smaller components.
12
+ #
13
+ # @example Running a snippet of Puppet Language code
14
+ # require 'puppet_pal'
15
+ # result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: ['/tmp/testmodules']) do |pal|
16
+ # pal.evaluate_script_string('1+2+3')
17
+ # end
18
+ # # The result is the value 6
19
+ #
20
+ # @example Calling a function
21
+ # require 'puppet_pal'
22
+ # result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: ['/tmp/testmodules']) do |pal|
23
+ # pal.call_function('mymodule::myfunction', 10, 20)
24
+ # end
25
+ # # The result is what 'mymodule::myfunction' returns
26
+ #
27
+ module Puppet
28
+ module Pal
29
+
30
+ # A configured compiler as obtained in the callback from `with_script_compiler`.
31
+ # (Later, there may also be a catalog compiler available.)
32
+ #
33
+ class Compiler
34
+ attr_reader :internal_compiler
35
+ protected :internal_compiler
36
+
37
+ attr_reader :internal_evaluator
38
+ protected :internal_evaluator
39
+
40
+ def initialize(internal_compiler)
41
+ @internal_compiler = internal_compiler
42
+ @internal_evaluator = Puppet::Pops::Parser::EvaluatingParser.new
43
+ end
44
+
45
+ # Calls a function given by name with arguments specified in an `Array`, and optionally accepts a code block.
46
+ # @param function_name [String] the name of the function to call
47
+ # @param args [Object] the arguments to the function
48
+ # @param block [Proc] an optional callable block that is given to the called function
49
+ # @return [Object] what the called function returns
50
+ #
51
+ def call_function(function_name, *args, &block)
52
+ # TRANSLATORS: do not translate variable name strings in these assertions
53
+ Pal::assert_non_empty_string(function_name, 'function_name', false)
54
+ Pal::assert_type(Pal::T_ANY_ARRAY, args, 'args', false)
55
+ internal_evaluator.evaluator.external_call_function(function_name, args, topscope, &block)
56
+ end
57
+
58
+ # Returns a Puppet::Pal::FunctionSignature object or nil if function is not found
59
+ # The returned FunctionSignature has information about all overloaded signatures of the function
60
+ #
61
+ # @example using function_signature
62
+ # # returns true if 'myfunc' is callable with three integer arguments 1, 2, 3
63
+ # compiler.function_signature('myfunc').callable_with?([1,2,3])
64
+ #
65
+ # @param function_name [String] the name of the function to get a signature for
66
+ # @return [Puppet::Pal::FunctionSignature] a function signature, or nil if function not found
67
+ #
68
+ def function_signature(function_name)
69
+ loader = internal_compiler.loaders.private_environment_loader
70
+ if func = loader.load(:function, function_name)
71
+ return FunctionSignature.new(func.class)
72
+ end
73
+ # Could not find function
74
+ nil
75
+ end
76
+
77
+ # Returns an array of TypedName objects for all functions, optionally filtered by a regular expression.
78
+ # The returned array has more information than just the leaf name - the typical thing is to just get
79
+ # the name as showing the following example.
80
+ #
81
+ # Errors that occur during function discovery will either be logged as warnings or collected by the optional
82
+ # `error_collector` array. When provided, it will receive {Puppet::DataTypes::Error} instances describing
83
+ # each error in detail and no warnings will be logged.
84
+ #
85
+ # @example getting the names of all functions
86
+ # compiler.list_functions.map {|tn| tn.name }
87
+ #
88
+ # @param filter_regex [Regexp] an optional regexp that filters based on name (matching names are included in the result)
89
+ # @param error_collector [Array<Puppet::DataTypes::Error>] an optional array that will receive errors during load
90
+ # @return [Array<Puppet::Pops::Loader::TypedName>] an array of typed names
91
+ #
92
+ def list_functions(filter_regex = nil, error_collector = nil)
93
+ list_loadable_kind(:function, filter_regex, error_collector)
94
+ end
95
+
96
+ # Evaluates a string of puppet language code in top scope.
97
+ # A "source_file" reference to a source can be given - if not an actual file name, by convention the name should
98
+ # be bracketed with < > to indicate it is something symbolic; for example `<commandline>` if the string was given on the
99
+ # command line.
100
+ #
101
+ # If the given `puppet_code` is `nil` or an empty string, `nil` is returned, otherwise the result of evaluating the
102
+ # puppet language string. The given string must form a complete and valid expression/statement as an error is raised
103
+ # otherwise. That is, it is not possible to divide a compound expression by line and evaluate each line individually.
104
+ #
105
+ # @param puppet_code [String, nil] the puppet language code to evaluate, must be a complete expression/statement
106
+ # @param source_file [String, nil] an optional reference to a source (a file or symbolic name/location)
107
+ # @return [Object] what the `puppet_code` evaluates to
108
+ #
109
+ def evaluate_string(puppet_code, source_file = nil)
110
+ return nil if puppet_code.nil? || puppet_code == ''
111
+ unless puppet_code.is_a?(String)
112
+ raise ArgumentError, _("The argument 'puppet_code' must be a String, got %{type}") % { type: puppet_code.class }
113
+ end
114
+ evaluate(parse_string(puppet_code, source_file))
115
+ end
116
+
117
+ # Evaluates a puppet language file in top scope.
118
+ # The file must exist and contain valid puppet language code or an error is raised.
119
+ #
120
+ # @param file [Path, String] an absolute path to a file with puppet language code, must exist
121
+ # @return [Object] what the last evaluated expression in the file evaluated to
122
+ #
123
+ def evaluate_file(file)
124
+ evaluate(parse_file(file))
125
+ end
126
+
127
+ # Evaluates an AST obtained from `parse_string` or `parse_file` in topscope.
128
+ # If the ast is a `Puppet::Pops::Model::Program` (what is returned from the `parse` methods, any definitions
129
+ # in the program (that is, any function, plan, etc. that is defined will be made available for use).
130
+ #
131
+ # @param ast [Puppet::Pops::Model::PopsObject] typically the returned `Program` from the parse methods, but can be any `Expression`
132
+ # @returns [Object] whatever the ast evaluates to
133
+ #
134
+ def evaluate(ast)
135
+ if ast.is_a?(Puppet::Pops::Model::Program)
136
+ loaders = Puppet.lookup(:loaders)
137
+ loaders.instantiate_definitions(ast, loaders.public_environment_loader)
138
+ end
139
+ internal_evaluator.evaluate(topscope, ast)
140
+ end
141
+
142
+ # Produces a literal value if the AST obtained from `parse_string` or `parse_file` does not require any actual evaluation.
143
+ # This method is useful if obtaining an AST that represents literal values; string, integer, float, boolean, regexp, array, hash;
144
+ # for example from having read this from the command line or as values in some file.
145
+ #
146
+ # @param ast [Puppet::Pops::Model::PopsObject] typically the returned `Program` from the parse methods, but can be any `Expression`
147
+ # @returns [Object] whatever the literal value the ast evaluates to
148
+ #
149
+ def evaluate_literal(ast)
150
+ catch :not_literal do
151
+ return Puppet::Pops::Evaluator::LiteralEvaluator.new().literal(ast)
152
+ end
153
+ # TRANSLATORS, the 'ast' is the name of a parameter, do not translate
154
+ raise ArgumentError, _("The given 'ast' does not represent a literal value")
155
+ end
156
+
157
+ # Parses and validates a puppet language string and returns an instance of Puppet::Pops::Model::Program on success.
158
+ # If the content is not valid an error is raised.
159
+ #
160
+ # @param code_string [String] a puppet language string to parse and validate
161
+ # @param source_file [String] an optional reference to a file or other location in angled brackets
162
+ # @return [Puppet::Pops::Model::Program] returns a `Program` instance on success
163
+ #
164
+ def parse_string(code_string, source_file = nil)
165
+ unless code_string.is_a?(String)
166
+ raise ArgumentError, _("The argument 'code_string' must be a String, got %{type}") % { type: code_string.class }
167
+ end
168
+ internal_evaluator.parse_string(code_string, source_file)
169
+ end
170
+
171
+ # Parses and validates a puppet language file and returns an instance of Puppet::Pops::Model::Program on success.
172
+ # If the content is not valid an error is raised.
173
+ #
174
+ # @param file [String] a file with puppet language content to parse and validate
175
+ # @return [Puppet::Pops::Model::Program] returns a `Program` instance on success
176
+ #
177
+ def parse_file(file)
178
+ unless file.is_a?(String)
179
+ raise ArgumentError, _("The argument 'file' must be a String, got %{type}") % { type: file.class }
180
+ end
181
+ internal_evaluator.parse_file(file)
182
+ end
183
+
184
+ # Parses a puppet data type given in String format and returns that type, or raises an error.
185
+ # A type is needed in calls to `new` to create an instance of the data type, or to perform type checking
186
+ # of values - typically using `type.instance?(obj)` to check if `obj` is an instance of the type.
187
+ #
188
+ # @example Verify if obj is an instance of a data type
189
+ # # evaluates to true
190
+ # pal.type('Enum[red, blue]').instance?("blue")
191
+ #
192
+ # @example Create an instance of a data type
193
+ # # using an already create type
194
+ # t = pal.type('Car')
195
+ # pal.create(t, 'color' => 'black', 'make' => 't-ford')
196
+ #
197
+ # # letting 'new_object' parse the type from a string
198
+ # pal.create('Car', 'color' => 'black', 'make' => 't-ford')
199
+ #
200
+ # @param type_string [String] a puppet language data type
201
+ # @return [Puppet::Pops::Types::PAnyType] the data type
202
+ #
203
+ def type(type_string)
204
+ Puppet::Pops::Types::TypeParser.singleton.parse(type_string)
205
+ end
206
+
207
+ # Creates a new instance of a given data type.
208
+ # @param data_type [String, Puppet::Pops::Types::PAnyType] the data type as a data type or in String form.
209
+ # @param arguments [Object] one or more arguments to the called `new` function
210
+ # @return [Object] an instance of the given data type,
211
+ # or raises an error if it was not possible to parse data type or create an instance.
212
+ #
213
+ def create(data_type, *arguments)
214
+ t = data_type.is_a?(String) ? type(data_type) : data_type
215
+ unless t.is_a?(Puppet::Pops::Types::PAnyType)
216
+ raise ArgumentError, _("Given data_type value is not a data type, got '%{type}'") % {type: t.class}
217
+ end
218
+ call_function('new', t, *arguments)
219
+ end
220
+
221
+ # Returns true if this is a compiler that compiles a catalog.
222
+ # This implementation returns `false`
223
+ # @return Boolan false
224
+ def has_catalog?
225
+ false
226
+ end
227
+
228
+ protected
229
+
230
+ def list_loadable_kind(kind, filter_regex = nil, error_collector = nil)
231
+ loader = internal_compiler.loaders.private_environment_loader
232
+ if filter_regex.nil?
233
+ loader.discover(kind, error_collector)
234
+ else
235
+ loader.discover(kind, error_collector) {|f| f.name =~ filter_regex }
236
+ end
237
+ end
238
+
239
+ private
240
+
241
+ def topscope
242
+ internal_compiler.topscope
243
+ end
244
+ end
245
+
246
+ class ScriptCompiler < Compiler
247
+ # Returns the signature of the given plan name
248
+ # @param plan_name [String] the name of the plan to get the signature of
249
+ # @return [Puppet::Pal::PlanSignature, nil] returns a PlanSignature, or nil if plan is not found
250
+ #
251
+ def plan_signature(plan_name)
252
+ loader = internal_compiler.loaders.private_environment_loader
253
+ if func = loader.load(:plan, plan_name)
254
+ return PlanSignature.new(func)
255
+ end
256
+ # Could not find plan
257
+ nil
258
+ end
259
+
260
+ # Returns an array of TypedName objects for all plans, optionally filtered by a regular expression.
261
+ # The returned array has more information than just the leaf name - the typical thing is to just get
262
+ # the name as showing the following example.
263
+ #
264
+ # Errors that occur during plan discovery will either be logged as warnings or collected by the optional
265
+ # `error_collector` array. When provided, it will receive {Puppet::DataTypes::Error} instances describing
266
+ # each error in detail and no warnings will be logged.
267
+ #
268
+ # @example getting the names of all plans
269
+ # compiler.list_plans.map {|tn| tn.name }
270
+ #
271
+ # @param filter_regex [Regexp] an optional regexp that filters based on name (matching names are included in the result)
272
+ # @param error_collector [Array<Puppet::DataTypes::Error>] an optional array that will receive errors during load
273
+ # @return [Array<Puppet::Pops::Loader::TypedName>] an array of typed names
274
+ #
275
+ def list_plans(filter_regex = nil, error_collector = nil)
276
+ list_loadable_kind(:plan, filter_regex, error_collector)
277
+ end
278
+
279
+ # Returns the signature callable of the given task (the arguments it accepts, and the data type it returns)
280
+ # @param task_name [String] the name of the task to get the signature of
281
+ # @return [Puppet::Pal::TaskSignature, nil] returns a TaskSignature, or nil if task is not found
282
+ #
283
+ def task_signature(task_name)
284
+ loader = internal_compiler.loaders.private_environment_loader
285
+ if task = loader.load(:task, task_name)
286
+ return TaskSignature.new(task)
287
+ end
288
+ # Could not find task
289
+ nil
290
+ end
291
+
292
+ # Returns an array of TypedName objects for all tasks, optionally filtered by a regular expression.
293
+ # The returned array has more information than just the leaf name - the typical thing is to just get
294
+ # the name as showing the following example.
295
+ #
296
+ # @example getting the names of all tasks
297
+ # compiler.list_tasks.map {|tn| tn.name }
298
+ #
299
+ # Errors that occur during task discovery will either be logged as warnings or collected by the optional
300
+ # `error_collector` array. When provided, it will receive {Puppet::DataTypes::Error} instances describing
301
+ # each error in detail and no warnings will be logged.
302
+ #
303
+ # @param filter_regex [Regexp] an optional regexp that filters based on name (matching names are included in the result)
304
+ # @param error_collector [Array<Puppet::DataTypes::Error>] an optional array that will receive errors during load
305
+ # @return [Array<Puppet::Pops::Loader::TypedName>] an array of typed names
306
+ #
307
+ def list_tasks(filter_regex = nil, error_collector = nil)
308
+ list_loadable_kind(:task, filter_regex, error_collector)
309
+ end
310
+ end
311
+
312
+ # A CatalogCompiler is a compiler that builds a catalog of resources and dependencies as a side effect of
313
+ # evaluating puppet language code.
314
+ # When the compilation of the given input manifest(s)/code string/file is finished the catalog is complete
315
+ # for encoding and use. It is also possible to evaluate more strings within the same compilation context to
316
+ # add or remove things from the catalog.
317
+ #
318
+ # @api public
319
+ class CatalogCompiler < Compiler
320
+
321
+ # @api private
322
+ def catalog
323
+ internal_compiler.catalog
324
+ end
325
+ private :catalog
326
+
327
+ # Returns true if this is a compiler that compiles a catalog.
328
+ # This implementation returns `true`
329
+ # @return [Boolean] true
330
+ # @api public
331
+ def has_catalog?
332
+ true
333
+ end
334
+
335
+ # Calls a block of code and yields a configured `JsonCatalogEncoder` to the block.
336
+ # @example Get resulting catalog as pretty printed Json
337
+ # Puppet::Pal.in_environment(...) do |pal|
338
+ # pal.with_catalog_compiler(...) do |compiler|
339
+ # compiler.with_json_encoding {| encoder | encoder.encode
340
+ # end
341
+ # end
342
+ #
343
+ # @api public
344
+ #
345
+ def with_json_encoding(pretty: true, exclude_virtual: true)
346
+ yield JsonCatalogEncoder.new(catalog, pretty: pretty, exclude_virtual: exclude_virtual)
347
+ end
348
+
349
+ # Evaluates an AST obtained from `parse_string` or `parse_file` in topscope.
350
+ # If the ast is a `Puppet::Pops::Model::Program` (what is returned from the `parse` methods, any definitions
351
+ # in the program (that is, any function, plan, etc. that is defined will be made available for use).
352
+ #
353
+ # @param ast [Puppet::Pops::Model::PopsObject] typically the returned `Program` from the parse methods, but can be any `Expression`
354
+ # @returns [Object] whatever the ast evaluates to
355
+ #
356
+ def evaluate(ast)
357
+ if ast.is_a?(Puppet::Pops::Model::Program)
358
+ bridged = Puppet::Parser::AST::PopsBridge::Program.new(ast)
359
+ # define all catalog types
360
+ internal_compiler.environment.known_resource_types.import_ast(bridged, "")
361
+ bridged.evaluate(internal_compiler.topscope)
362
+ else
363
+ internal_evaluator.evaluate(topscope, ast)
364
+ end
365
+ end
366
+
367
+ end
368
+
369
+ # The JsonCatalogEncoder is a wrapper around a catalog produced by the Pal::CatalogCompiler.with_json_encoding
370
+ # method.
371
+ # It allows encoding the entire catalog or an individual resource as Rich Data Json.
372
+ #
373
+ # @api public
374
+ #
375
+ class JsonCatalogEncoder
376
+ # Is the resulting Json pretty printed or not.
377
+ attr_reader :pretty
378
+
379
+ # Should unrealized virtual resources be included in the result or not.
380
+ attr_reader :exclude_virtual
381
+
382
+ # The internal catalog being build - what this class wraps with a public API.
383
+ attr_reader :catalog
384
+ private :catalog
385
+
386
+ # Do not instantiate this class directly! Use the `Pal::CatalogCompiler#with_json_encoding` method
387
+ # instead.
388
+ #
389
+ # @param catalog [Puppet::Resource::Catalog] the internal catalog that this class wraps
390
+ # @param pretty [Boolean] (true), if the resulting JSON should be pretty printed or not
391
+ # @param exclude_virtual [Boolean] (true), if the resulting catalog should contain unrealzed virtual resources or not
392
+ #
393
+ # @api private
394
+ #
395
+ def initialize(catalog, pretty: true, exclude_virtual: true)
396
+ @catalog = catalog
397
+ @pretty = pretty
398
+ @exclude_virtual = exclude_virtual
399
+ end
400
+
401
+ # Encodes the entire catalog as a rich-data Json catalog.
402
+ # @return String The catalog in Json format using rich data format
403
+ # @api public
404
+ #
405
+ def encode
406
+ possibly_filtered_catalog.to_json(:pretty => pretty)
407
+ end
408
+
409
+ # Returns one particular resource as a Json string, or returns nil if resource was not found.
410
+ # @param type [String] the name of the puppet type (case independent)
411
+ # @param title [String] the title of the wanted resource
412
+ # @return [String] the resulting Json text
413
+ # @api public
414
+ #
415
+ def encode_resource(type, title)
416
+ # Ensure that both type and title are given since the underlying API will do mysterious things
417
+ # if 'title' is nil. (Other assertions are made by the catalog when looking up the resource).
418
+ #
419
+ # TRANSLATORS 'type' and 'title' are internal parameter names - do not translate
420
+ raise ArgumentError, _("Both type and title must be given") if type.nil? or title.nil?
421
+ r = possibly_filtered_catalog.resource(type, title)
422
+ return nil if r.nil?
423
+ r.to_data_hash.to_json(:pretty => pretty)
424
+ end
425
+
426
+ # Applies a filter for virtual resources and returns filtered catalog
427
+ # or the catalog itself if filtering was not needed.
428
+ # The result is cached.
429
+ # @api private
430
+ #
431
+ def possibly_filtered_catalog
432
+ @filtered ||= (exclude_virtual ? catalog.filter { |r| r.virtual? } : catalog)
433
+ end
434
+ private :possibly_filtered_catalog
435
+ end
436
+
437
+ # A FunctionSignature is returned from `function_signature`. Its purpose is to answer questions about the function's parameters
438
+ # and if it can be called with a set of parameters.
439
+ #
440
+ # It is also possible to get an array of puppet Callable data type where each callable describes one possible way
441
+ # the function can be called.
442
+ #
443
+ # @api public
444
+ #
445
+ class FunctionSignature
446
+ # @api private
447
+ def initialize(function_class)
448
+ @func = function_class
449
+ end
450
+
451
+ # Returns true if the function can be called with the given arguments and false otherwise.
452
+ # If the function is not callable, and a code block is given, it is given a formatted error message that describes
453
+ # the type mismatch. That error message can be quite complex if the function has multiple dispatch depending on
454
+ # given types.
455
+ #
456
+ # @param args [Array] The arguments as given to the function call
457
+ # @param callable [Proc, nil] An optional ruby Proc or puppet lambda given to the function
458
+ # @yield [String] a formatted error message describing a type mismatch if the function is not callable with given args + block
459
+ # @return [Boolean] true if the function can be called with given args + block, and false otherwise
460
+ # @api public
461
+ #
462
+ def callable_with?(args, callable=nil)
463
+ signatures = @func.dispatcher.to_type
464
+ callables = signatures.is_a?(Puppet::Pops::Types::PVariantType) ? signatures.types : [signatures]
465
+
466
+ return true if callables.any? {|t| t.callable_with?(args) }
467
+ return false unless block_given?
468
+ args_type = Puppet::Pops::Types::TypeCalculator.singleton.infer_set(callable.nil? ? args : args + [callable])
469
+ error_message = Puppet::Pops::Types::TypeMismatchDescriber.describe_signatures(@func.name, @func.signatures, args_type)
470
+ yield error_message
471
+ false
472
+ end
473
+
474
+ # Returns an array of Callable puppet data type
475
+ # @return [Array<Puppet::Pops::Types::PCallableType] one callable per way the function can be called
476
+ #
477
+ # @api public
478
+ #
479
+ def callables
480
+ signatures = @func.dispatcher.to_type
481
+ signatures.is_a?(Puppet::Pops::Types::PVariantType) ? signatures.types : [signatures]
482
+ end
483
+ end
484
+
485
+ # A TaskSignature is returned from `task_signature`. Its purpose is to answer questions about the task's parameters
486
+ # and if it can be run/called with a hash of named parameters.
487
+ #
488
+ class TaskSignature
489
+ def initialize(task)
490
+ @task = task
491
+ end
492
+
493
+ # Returns whether or not the given arguments are acceptable when running the task.
494
+ # In addition to returning the boolean outcome, if a block is given, it is called with a string of formatted
495
+ # error messages that describes the difference between what was given and what is expected. The error message may
496
+ # have multiple lines of text, and each line is indented one space.
497
+ #
498
+ # @param args_hash [Hash] a hash mapping parameter names to argument values
499
+ # @yieldparam [String] a formatted error message if a type mismatch occurs that explains the mismatch
500
+ # @return [Boolean] if the given arguments are acceptable when running the task
501
+ #
502
+ def runnable_with?(args_hash)
503
+ params = @task.parameters
504
+ params_type = if params.nil?
505
+ T_GENERIC_TASK_HASH
506
+ else
507
+ key_to_type = {}
508
+ @task.parameters.each_pair { |k, v| key_to_type[k] = v['type'] }
509
+ Puppet::Pops::Types::TypeFactory.struct(key_to_type)
510
+ end
511
+ return true if params_type.instance?(args_hash)
512
+
513
+ if block_given?
514
+ tm = Puppet::Pops::Types::TypeMismatchDescriber.singleton
515
+ error = if params.nil?
516
+ tm.describe_mismatch('', params_type, Puppet::Pops::Types::TypeCalculator.infer_set(args_hash))
517
+ else
518
+ tm.describe_struct_signature(params_type, args_hash).flatten.map {|e| e.format }.join("\n")
519
+ end
520
+ yield "Task #{@task.name}:\n#{error}"
521
+ end
522
+ false
523
+ end
524
+
525
+ # Returns the Task instance as a hash
526
+ #
527
+ # @return [Hash{String=>Object}] the hash representation of the task
528
+ def task_hash
529
+ @task._pcore_init_hash
530
+ end
531
+
532
+ # Returns the Task instance which can be further explored. It contains all meta-data defined for
533
+ # the task such as the description, parameters, output, etc.
534
+ #
535
+ # @return [Puppet::Pops::Types::PuppetObject] An instance of a dynamically created Task class
536
+ def task
537
+ @task
538
+ end
539
+ end
540
+
541
+ # A PlanSignature is returned from `plan_signature`. Its purpose is to answer questions about the plans's parameters
542
+ # and if it can be called with a hash of named parameters.
543
+ #
544
+ # @api public
545
+ #
546
+ class PlanSignature
547
+ def initialize(plan_function)
548
+ @plan_func = plan_function
549
+ end
550
+
551
+ # Returns true or false depending on if the given PlanSignature is callable with a set of named arguments or not
552
+ # In addition to returning the boolean outcome, if a block is given, it is called with a string of formatted
553
+ # error messages that describes the difference between what was given and what is expected. The error message may
554
+ # have multiple lines of text, and each line is indented one space.
555
+ #
556
+ # @example Checking if signature is acceptable
557
+ #
558
+ # signature = pal.plan_signature('myplan')
559
+ # signature.callable_with?({x => 10}) { |errors| raise ArgumentError("Ooops: given arguments does not match\n#{errors}") }
560
+ #
561
+ # @api public
562
+ #
563
+ def callable_with?(args_hash)
564
+ dispatcher = @plan_func.class.dispatcher.dispatchers[0]
565
+
566
+ param_scope = {}
567
+ # Assign all non-nil values, even those that represent non-existent parameters.
568
+ args_hash.each { |k, v| param_scope[k] = v unless v.nil? }
569
+ dispatcher.parameters.each do |p|
570
+ name = p.name
571
+ arg = args_hash[name]
572
+ if arg.nil?
573
+ # Arg either wasn't given, or it was undef
574
+ if p.value.nil?
575
+ # No default. Assign nil if the args_hash included it
576
+ param_scope[name] = nil if args_hash.include?(name)
577
+ else
578
+ # parameter does not have a default value, it will be assigned its default when being called
579
+ # we assume that the default value is of the correct type and therefore simply skip
580
+ # checking this
581
+ # param_scope[name] = param_scope.evaluate(name, p.value, closure_scope, @evaluator)
582
+ end
583
+ end
584
+ end
585
+
586
+ errors = Puppet::Pops::Types::TypeMismatchDescriber.singleton.describe_struct_signature(dispatcher.params_struct, param_scope).flatten
587
+ return true if errors.empty?
588
+ if block_given?
589
+ yield errors.map {|e| e.format }.join("\n")
590
+ end
591
+ false
592
+ end
593
+
594
+ # Returns a PStructType describing the parameters as a puppet Struct data type
595
+ # Note that a `to_s` on the returned structure will result in a human readable Struct datatype as a
596
+ # description of what a plan expects.
597
+ #
598
+ # @return [Puppet::Pops::Types::PStructType] a struct data type describing the parameters and their types
599
+ #
600
+ # @api public
601
+ #
602
+ def params_type
603
+ dispatcher = @plan_func.class.dispatcher.dispatchers[0]
604
+ dispatcher.params_struct
605
+ end
606
+ end
607
+
608
+ # Defines a context in which multiple operations in an env with a script compiler can be performed in a given block.
609
+ # The calls that takes place to PAL inside of the given block are all with the same instance of the compiler.
610
+ # The parameter `configured_by_env` makes it possible to either use the configuration in the environment, or specify
611
+ # `manifest_file` or `code_string` manually. If neither is given, an empty `code_string` is used.
612
+ #
613
+ # @example define a script compiler without any initial logic
614
+ # pal.with_script_compiler do | compiler |
615
+ # # do things with compiler
616
+ # end
617
+ #
618
+ # @example define a script compiler with a code_string containing initial logic
619
+ # pal.with_script_compiler(code_string: '$myglobal_var = 42') do | compiler |
620
+ # # do things with compiler
621
+ # end
622
+ #
623
+ # @param configured_by_env [Boolean] when true the environment's settings are used, otherwise the given `manifest_file` or `code_string`
624
+ # @param manifest_file [String] a Puppet Language file to load and evaluate before calling the given block, mutually exclusive with `code_string`
625
+ # @param code_string [String] a Puppet Language source string to load and evaluate before calling the given block, mutually exclusive with `manifest_file`
626
+ # @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
627
+ # If given at the environment level, the facts given here are merged with higher priority.
628
+ # @param variables [Hash] optional map of fully qualified variable name to value. If given at the environment level, the variables
629
+ # given here are merged with higher priority.
630
+ # @param block [Proc] the block performing operations on compiler
631
+ # @return [Object] what the block returns
632
+ # @yieldparam [Puppet::Pal::ScriptCompiler] compiler, a ScriptCompiler to perform operations on.
633
+ #
634
+ def self.with_script_compiler(
635
+ configured_by_env: false,
636
+ manifest_file: nil,
637
+ code_string: nil,
638
+ facts: nil,
639
+ variables: nil,
640
+ &block
641
+ )
642
+ # TRANSLATORS: do not translate variable name strings in these assertions
643
+ assert_mutually_exclusive(manifest_file, code_string, 'manifest_file', 'code_string')
644
+ assert_non_empty_string(manifest_file, 'manifest_file', true)
645
+ assert_non_empty_string(code_string, 'code_string', true)
646
+ assert_type(T_BOOLEAN, configured_by_env, "configured_by_env", false)
647
+
648
+ if configured_by_env
649
+ unless manifest_file.nil? && code_string.nil?
650
+ # TRANSLATORS: do not translate the variable names in this error message
651
+ raise ArgumentError, _("manifest_file or code_string cannot be given when configured_by_env is true")
652
+ end
653
+ # Use the manifest setting
654
+ manifest_file = Puppet[:manifest]
655
+ else
656
+ # An "undef" code_string is the only way to override Puppet[:manifest] & Puppet[:code] settings since an
657
+ # empty string is taken as Puppet[:code] not being set.
658
+ #
659
+ if manifest_file.nil? && code_string.nil?
660
+ code_string = 'undef'
661
+ end
662
+ end
663
+
664
+ Puppet[:tasks] = true
665
+ # After the assertions, if code_string is non nil - it has the highest precedence
666
+ Puppet[:code] = code_string unless code_string.nil?
667
+
668
+ # If manifest_file is nil, the #main method will use the env configured manifest
669
+ # to do things in the block while a Script Compiler is in effect
670
+ main(manifest_file, facts, variables, :script, &block)
671
+ end
672
+
673
+ # Evaluates a Puppet Language script string.
674
+ # @param code_string [String] a snippet of Puppet Language source code
675
+ # @return [Object] what the Puppet Language code_string evaluates to
676
+ # @deprecated Use {#with_script_compiler} and then evaluate_string on the given compiler - to be removed in 1.0 version
677
+ #
678
+ def self.evaluate_script_string(code_string)
679
+ # prevent the default loading of Puppet[:manifest] which is the environment's manifest-dir by default settings
680
+ # by setting code_string to 'undef'
681
+ with_script_compiler do |compiler|
682
+ compiler.evaluate_string(code_string)
683
+ end
684
+ end
685
+
686
+ # Evaluates a Puppet Language script (.pp) file.
687
+ # @param manifest_file [String] a file with Puppet Language source code
688
+ # @return [Object] what the Puppet Language manifest_file contents evaluates to
689
+ # @deprecated Use {#with_script_compiler} and then evaluate_file on the given compiler - to be removed in 1.0 version
690
+ #
691
+ def self.evaluate_script_manifest(manifest_file)
692
+ with_script_compiler do |compiler|
693
+ compiler.evaluate_file(manifest_file)
694
+ end
695
+ end
696
+
697
+ # Defines a context in which multiple operations in an env with a catalog producing compiler can be performed
698
+ # in a given block.
699
+ # The calls that takes place to PAL inside of the given block are all with the same instance of the compiler.
700
+ # The parameter `configured_by_env` makes it possible to either use the configuration in the environment, or specify
701
+ # `manifest_file` or `code_string` manually. If neither is given, an empty `code_string` is used.
702
+ #
703
+ # @example define a catalog compiler without any initial logic
704
+ # pal.with_catalog_compiler do | compiler |
705
+ # # do things with compiler
706
+ # end
707
+ #
708
+ # @example define a catalog compiler with a code_string containing initial logic
709
+ # pal.with_catalog_compiler(code_string: '$myglobal_var = 42') do | compiler |
710
+ # # do things with compiler
711
+ # end
712
+ #
713
+ # @param configured_by_env [Boolean] when true the environment's settings are used, otherwise the
714
+ # given `manifest_file` or `code_string`
715
+ # @param manifest_file [String] a Puppet Language file to load and evaluate before calling the given block, mutually exclusive
716
+ # with `code_string`
717
+ # @param code_string [String] a Puppet Language source string to load and evaluate before calling the given block, mutually
718
+ # exclusive with `manifest_file`
719
+ # @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
720
+ # If given at the environment level, the facts given here are merged with higher priority.
721
+ # @param variables [Hash] optional map of fully qualified variable name to value. If given at the environment level, the variables
722
+ # given here are merged with higher priority.
723
+ # @param block [Proc] the block performing operations on compiler
724
+ # @return [Object] what the block returns
725
+ # @yieldparam [Puppet::Pal::CatalogCompiler] compiler, a CatalogCompiler to perform operations on.
726
+ #
727
+ def self.with_catalog_compiler(
728
+ configured_by_env: false,
729
+ manifest_file: nil,
730
+ code_string: nil,
731
+ facts: nil,
732
+ variables: nil,
733
+ &block
734
+ )
735
+ # TRANSLATORS: do not translate variable name strings in these assertions
736
+ assert_mutually_exclusive(manifest_file, code_string, 'manifest_file', 'code_string')
737
+ assert_non_empty_string(manifest_file, 'manifest_file', true)
738
+ assert_non_empty_string(code_string, 'code_string', true)
739
+ assert_type(T_BOOLEAN, configured_by_env, "configured_by_env", false)
740
+
741
+ if configured_by_env
742
+ unless manifest_file.nil? && code_string.nil?
743
+ # TRANSLATORS: do not translate the variable names in this error message
744
+ raise ArgumentError, _("manifest_file or code_string cannot be given when configured_by_env is true")
745
+ end
746
+ # Use the manifest setting
747
+ manifest_file = Puppet[:manifest]
748
+ else
749
+ # An "undef" code_string is the only way to override Puppet[:manifest] & Puppet[:code] settings since an
750
+ # empty string is taken as Puppet[:code] not being set.
751
+ #
752
+ if manifest_file.nil? && code_string.nil?
753
+ code_string = 'undef'
754
+ end
755
+ end
756
+
757
+ Puppet[:tasks] = false
758
+ # After the assertions, if code_string is non nil - it has the highest precedence
759
+ Puppet[:code] = code_string unless code_string.nil?
760
+
761
+ # If manifest_file is nil, the #main method will use the env configured manifest
762
+ # to do things in the block while a Script Compiler is in effect
763
+ main(manifest_file, facts, variables, :catalog, &block)
764
+ end
765
+
766
+ # Defines the context in which to perform puppet operations (evaluation, etc)
767
+ # The code to evaluate in this context is given in a block.
768
+ #
769
+ # @param env_name [String] a name to use for the temporary environment - this only shows up in errors
770
+ # @param modulepath [Array<String>] an array of directory paths containing Puppet modules, may be empty, defaults to empty array
771
+ # @param settings_hash [Hash] a hash of settings - currently not used for anything, defaults to empty hash
772
+ # @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
773
+ # @param variables [Hash] optional map of fully qualified variable name to value
774
+ # @return [Object] returns what the given block returns
775
+ # @yieldparam [Puppet::Pal] context, a context that responds to Puppet::Pal methods
776
+ #
777
+ def self.in_tmp_environment(env_name,
778
+ modulepath: [],
779
+ settings_hash: {},
780
+ facts: nil,
781
+ variables: {},
782
+ &block
783
+ )
784
+ assert_non_empty_string(env_name, _("temporary environment name"))
785
+ # TRANSLATORS: do not translate variable name string in these assertions
786
+ assert_optionally_empty_array(modulepath, 'modulepath')
787
+
788
+ unless block_given?
789
+ raise ArgumentError, _("A block must be given to 'in_tmp_environment'") # TRANSLATORS 'in_tmp_environment' is a name, do not translate
790
+ end
791
+
792
+ env = Puppet::Node::Environment.create(env_name, modulepath)
793
+
794
+ in_environment_context(
795
+ Puppet::Environments::Static.new(env), # The tmp env is the only known env
796
+ env, facts, variables, &block
797
+ )
798
+ end
799
+
800
+ # Defines the context in which to perform puppet operations (evaluation, etc)
801
+ # The code to evaluate in this context is given in a block.
802
+ #
803
+ # The name of an environment (env_name) is always given. The location of that environment on disk
804
+ # is then either constructed by:
805
+ # * searching a given envpath where name is a child of a directory on that path, or
806
+ # * it is the directory given in env_dir (which must exist).
807
+ #
808
+ # The env_dir and envpath options are mutually exclusive.
809
+ #
810
+ # @param env_name [String] the name of an existing environment
811
+ # @param modulepath [Array<String>] an array of directory paths containing Puppet modules, overrides the modulepath of an existing env.
812
+ # Defaults to `{env_dir}/modules` if `env_dir` is given,
813
+ # @param pre_modulepath [Array<String>] like modulepath, but is prepended to the modulepath
814
+ # @param post_modulepath [Array<String>] like modulepath, but is appended to the modulepath
815
+ # @param settings_hash [Hash] a hash of settings - currently not used for anything, defaults to empty hash
816
+ # @param env_dir [String] a reference to a directory being the named environment (mutually exclusive with `envpath`)
817
+ # @param envpath [String] a path of directories in which there are environments to search for `env_name` (mutually exclusive with `env_dir`).
818
+ # Should be a single directory, or several directories separated with platform specific `File::PATH_SEPARATOR` character.
819
+ # @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
820
+ # @param variables [Hash] optional map of fully qualified variable name to value
821
+ # @return [Object] returns what the given block returns
822
+ # @yieldparam [Puppet::Pal] context, a context that responds to Puppet::Pal methods
823
+ #
824
+ def self.in_environment(env_name,
825
+ modulepath: nil,
826
+ pre_modulepath: [],
827
+ post_modulepath: [],
828
+ settings_hash: {},
829
+ env_dir: nil,
830
+ envpath: nil,
831
+ facts: nil,
832
+ variables: {},
833
+ &block
834
+ )
835
+ # TRANSLATORS terms in the assertions below are names of terms in code
836
+ assert_non_empty_string(env_name, 'env_name')
837
+ assert_optionally_empty_array(modulepath, 'modulepath', true)
838
+ assert_optionally_empty_array(pre_modulepath, 'pre_modulepath', false)
839
+ assert_optionally_empty_array(post_modulepath, 'post_modulepath', false)
840
+ assert_mutually_exclusive(env_dir, envpath, 'env_dir', 'envpath')
841
+
842
+ unless block_given?
843
+ raise ArgumentError, _("A block must be given to 'in_environment'") # TRANSLATORS 'in_environment' is a name, do not translate
844
+ end
845
+
846
+ if env_dir
847
+ unless Puppet::FileSystem.exist?(env_dir)
848
+ raise ArgumentError, _("The environment directory '%{env_dir}' does not exist") % { env_dir: env_dir }
849
+ end
850
+
851
+ # a nil modulepath for env_dir means it should use its ./modules directory
852
+ mid_modulepath = modulepath.nil? ? [Puppet::FileSystem.expand_path(File.join(env_dir, 'modules'))] : modulepath
853
+
854
+ env = Puppet::Node::Environment.create(env_name, pre_modulepath + mid_modulepath + post_modulepath)
855
+ environments = Puppet::Environments::StaticDirectory.new(env_name, env_dir, env) # The env being used is the only one...
856
+ else
857
+ assert_non_empty_string(envpath, 'envpath')
858
+
859
+ # The environment is resolved against the envpath. This is setup without a basemodulepath
860
+ # The modulepath defaults to the 'modulepath' in the found env when "Directories" is used
861
+ #
862
+ if envpath.is_a?(String) && envpath.include?(File::PATH_SEPARATOR)
863
+ # potentially more than one directory to search
864
+ env_loaders = Puppet::Environments::Directories.from_path(envpath, [])
865
+ environments = Puppet::Environments::Combined.new(*env_loaders)
866
+ else
867
+ environments = Puppet::Environments::Directories.new(envpath, [])
868
+ end
869
+ env = environments.get(env_name)
870
+ if env.nil?
871
+ raise ArgumentError, _("No directory found for the environment '%{env_name}' on the path '%{envpath}'") % { env_name: env_name, envpath: envpath }
872
+ end
873
+ # A given modulepath should override the default
874
+ mid_modulepath = modulepath.nil? ? env.modulepath : modulepath
875
+ env_path = env.configuration.path_to_env
876
+ env = env.override_with(:modulepath => pre_modulepath + mid_modulepath + post_modulepath)
877
+ # must configure this in case logic looks up the env by name again (otherwise the looked up env does
878
+ # not have the same effective modulepath).
879
+ environments = Puppet::Environments::StaticDirectory.new(env_name, env_path, env) # The env being used is the only one...
880
+ end
881
+ in_environment_context(environments, env, facts, variables, &block)
882
+ end
883
+
884
+ # Prepares the puppet context with pal information - and delegates to the block
885
+ # No set up is performed at this step - it is delayed until it is known what the
886
+ # operation is going to be (for example - using a ScriptCompiler).
887
+ #
888
+ def self.in_environment_context(environments, env, facts, variables, &block)
889
+ # Create a default node to use (may be overridden later)
890
+ node = Puppet::Node.new(Puppet[:node_name_value], :environment => env)
891
+
892
+ Puppet.override(
893
+ environments: environments, # The env being used is the only one...
894
+ pal_env: env, # provide as convenience
895
+ pal_current_node: node, # to allow it to be picked up instead of created
896
+ pal_variables: variables, # common set of variables across several inner contexts
897
+ pal_facts: facts # common set of facts across several inner contexts (or nil)
898
+ ) do
899
+ # DELAY: prepare_node_facts(node, facts)
900
+ return block.call(self)
901
+ end
902
+ end
903
+ private_class_method :in_environment_context
904
+
905
+ # Prepares the node for use by giving it node_facts (if given)
906
+ # If a hash of facts values is given, then the operation of creating a node with facts is much
907
+ # speeded up (as getting a fresh set of facts is avoided in a later step).
908
+ #
909
+ def self.prepare_node_facts(node, facts)
910
+ # Prepare the node with facts if it does not already have them
911
+ if node.facts.nil?
912
+ node_facts = facts.nil? ? nil : Puppet::Node::Facts.new(Puppet[:node_name_value], facts)
913
+ node.fact_merge(node_facts)
914
+ # Add server facts so $server_facts[environment] exists when doing a puppet script
915
+ # SCRIPT TODO: May be needed when running scripts under orchestrator. Leave it for now.
916
+ #
917
+ node.add_server_facts({})
918
+ end
919
+ end
920
+ private_class_method :prepare_node_facts
921
+
922
+ def self.add_variables(scope, variables)
923
+ return if variables.nil?
924
+ unless variables.is_a?(Hash)
925
+ raise ArgumentError, _("Given variables must be a hash, got %{type}") % { type: variables.class }
926
+ end
927
+
928
+ rich_data_t = Puppet::Pops::Types::TypeFactory.rich_data
929
+ variables.each_pair do |k,v|
930
+ unless k =~ Puppet::Pops::Patterns::VAR_NAME
931
+ raise ArgumentError, _("Given variable '%{varname}' has illegal name") % { varname: k }
932
+ end
933
+
934
+ unless rich_data_t.instance?(v)
935
+ raise ArgumentError, _("Given value for '%{varname}' has illegal type - got: %{type}") % { varname: k, type: v.class }
936
+ end
937
+
938
+ scope.setvar(k, v)
939
+ end
940
+ end
941
+ private_class_method :add_variables
942
+
943
+ # The main routine for script compiler
944
+ # Picks up information from the puppet context and configures a script compiler which is given to
945
+ # the provided block
946
+ #
947
+ def self.main(manifest, facts, variables, internal_compiler_class)
948
+ # Configure the load path
949
+ env = Puppet.lookup(:pal_env)
950
+ env.each_plugin_directory do |dir|
951
+ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir)
952
+ end
953
+
954
+ # Puppet requires Facter, which initializes its lookup paths. Reset Facter to
955
+ # pickup the new $LOAD_PATH.
956
+ Facter.reset
957
+
958
+ node = Puppet.lookup(:pal_current_node)
959
+ pal_facts = Puppet.lookup(:pal_facts)
960
+ pal_variables = Puppet.lookup(:pal_variables)
961
+
962
+ overrides = {}
963
+ unless facts.nil? || facts.empty?
964
+ pal_facts = pal_facts.merge(facts)
965
+ overrides[:pal_facts] = pal_facts
966
+ end
967
+ unless variables.nil? || variables.empty?
968
+ pal_variables = pal_variables.merge(variables)
969
+ overrides[:pal_variables] = pal_variables
970
+ end
971
+
972
+ prepare_node_facts(node, pal_facts)
973
+
974
+ configured_environment = node.environment || Puppet.lookup(:current_environment)
975
+
976
+ apply_environment = manifest ?
977
+ configured_environment.override_with(:manifest => manifest) :
978
+ configured_environment
979
+
980
+ # Modify the node descriptor to use the special apply_environment.
981
+ # It is based on the actual environment from the node, or the locally
982
+ # configured environment if the node does not specify one.
983
+ # If a manifest file is passed on the command line, it overrides
984
+ # the :manifest setting of the apply_environment.
985
+ node.environment = apply_environment
986
+
987
+ # TRANSLATORS, the string "For puppet PAL" is not user facing
988
+ Puppet.override({:current_environment => apply_environment}, "For puppet PAL") do
989
+ begin
990
+ # support the following features when evaluating puppet code
991
+ # * $facts with facts from host running the script
992
+ # * $settings with 'settings::*' namespace populated, and '$settings::all_local' hash
993
+ # * $trusted as setup when using puppet apply
994
+ # * an environment
995
+ #
996
+
997
+ # fixup trusted information
998
+ node.sanitize()
999
+
1000
+ compiler = create_internal_compiler(internal_compiler_class, node)
1001
+ # compiler = Puppet::Parser::ScriptCompiler.new(node.environment, node.name)
1002
+ topscope = compiler.topscope
1003
+
1004
+ # When scripting the trusted data are always local, but set them anyway
1005
+ # When compiling for a catalog, the catalog compiler does this
1006
+ unless internal_compiler_class == :catalog
1007
+ topscope.set_trusted(node.trusted_data)
1008
+
1009
+ # Server facts are always about the local node's version etc.
1010
+ topscope.set_server_facts(node.server_facts)
1011
+
1012
+ # Set $facts for the node running the script
1013
+ facts_hash = node.facts.nil? ? {} : node.facts.values
1014
+ topscope.set_facts(facts_hash)
1015
+
1016
+ # create the $settings:: variables
1017
+ topscope.merge_settings(node.environment.name, false)
1018
+ end
1019
+
1020
+ add_variables(topscope, pal_variables)
1021
+
1022
+ case internal_compiler_class
1023
+ when :script
1024
+ pal_compiler = ScriptCompiler.new(compiler)
1025
+ overrides[:pal_script_compiler] = overrides[:pal_compiler] = pal_compiler
1026
+ when :catalog
1027
+ pal_compiler = CatalogCompiler.new(compiler)
1028
+ overrides[:pal_catalog_compiler] = overrides[:pal_compiler] = pal_compiler
1029
+ end
1030
+
1031
+ # Make compiler available to Puppet#lookup and injection in functions
1032
+ # TODO: The compiler instances should be available under non PAL use as well!
1033
+ # TRANSLATORS: Do not translate, symbolic name
1034
+ Puppet.override(overrides, "PAL::with_#{internal_compiler_class}_compiler") do
1035
+ compiler.compile do | compiler_yield |
1036
+ # wrap the internal compiler to prevent it from leaking in the PAL API
1037
+ if block_given?
1038
+ yield(pal_compiler)
1039
+ end
1040
+ end
1041
+ end
1042
+
1043
+ rescue Puppet::ParseErrorWithIssue, Puppet::Error
1044
+ # already logged and handled by the compiler for these two cases
1045
+ raise
1046
+
1047
+ rescue => detail
1048
+ Puppet.log_exception(detail)
1049
+ raise
1050
+ end
1051
+ end
1052
+ end
1053
+ private_class_method :main
1054
+
1055
+ def self.create_internal_compiler(compiler_class_reference, node)
1056
+ case compiler_class_reference
1057
+ when :script
1058
+ Puppet::Parser::ScriptCompiler.new(node.environment, node.name)
1059
+ when :catalog
1060
+ Puppet::Parser::CatalogCompiler.new(node)
1061
+ else
1062
+ raise ArgumentError, "Internal Error: Invalid compiler type requested."
1063
+ end
1064
+ end
1065
+
1066
+ T_STRING = Puppet::Pops::Types::PStringType::NON_EMPTY
1067
+ T_STRING_ARRAY = Puppet::Pops::Types::TypeFactory.array_of(T_STRING)
1068
+ T_ANY_ARRAY = Puppet::Pops::Types::TypeFactory.array_of_any
1069
+ T_BOOLEAN = Puppet::Pops::Types::PBooleanType::DEFAULT
1070
+
1071
+ T_GENERIC_TASK_HASH = Puppet::Pops::Types::TypeFactory.hash_kv(
1072
+ Puppet::Pops::Types::TypeFactory.pattern(/\A[a-z][a-z0-9_]*\z/), Puppet::Pops::Types::TypeFactory.data)
1073
+
1074
+ def self.assert_type(type, value, what, allow_nil=false)
1075
+ Puppet::Pops::Types::TypeAsserter.assert_instance_of(nil, type, value, allow_nil) { _('Puppet Pal: %{what}') % {what: what} }
1076
+ end
1077
+
1078
+ def self.assert_non_empty_string(s, what, allow_nil=false)
1079
+ assert_type(T_STRING, s, what, allow_nil)
1080
+ end
1081
+
1082
+ def self.assert_optionally_empty_array(a, what, allow_nil=false)
1083
+ assert_type(T_STRING_ARRAY, a, what, allow_nil)
1084
+ end
1085
+ private_class_method :assert_optionally_empty_array
1086
+
1087
+ def self.assert_mutually_exclusive(a, b, a_term, b_term)
1088
+ if a && b
1089
+ raise ArgumentError, _("Cannot use '%{a_term}' and '%{b_term}' at the same time") % { a_term: a_term, b_term: b_term }
1090
+ end
1091
+ end
1092
+ private_class_method :assert_mutually_exclusive
1093
+
1094
+ def self.assert_block_given(block)
1095
+ if block.nil?
1096
+ raise ArgumentError, _("A block must be given")
1097
+ end
1098
+ end
1099
+ private_class_method :assert_block_given
1100
+ end
1101
+ end
1102
+