puppet 6.0.10-x64-mingw32 → 6.1.0-x64-mingw32

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

Potentially problematic release.


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

Files changed (748) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/Gemfile.lock +31 -27
  4. data/Guardfile.example +76 -0
  5. data/LICENSE +189 -4
  6. data/MAINTAINERS +47 -0
  7. data/README.md +3 -3
  8. data/lib/hiera/scope.rb +0 -7
  9. data/lib/puppet.rb +6 -5
  10. data/lib/puppet/application.rb +3 -3
  11. data/lib/puppet/application/cert.rb +2 -2
  12. data/lib/puppet/application/device.rb +83 -109
  13. data/lib/puppet/application/filebucket.rb +1 -10
  14. data/lib/puppet/application/ssl.rb +0 -2
  15. data/lib/puppet/configurer.rb +9 -10
  16. data/lib/puppet/confine/false.rb +1 -7
  17. data/lib/puppet/confine/true.rb +1 -7
  18. data/lib/puppet/defaults.rb +39 -51
  19. data/lib/puppet/forge.rb +1 -4
  20. data/lib/puppet/functions/abs.rb +1 -1
  21. data/lib/puppet/functions/call.rb +1 -2
  22. data/lib/puppet/functions/new.rb +1 -1
  23. data/lib/puppet/indirector/request.rb +15 -26
  24. data/lib/puppet/network/http/connection.rb +12 -32
  25. data/lib/puppet/network/http/factory.rb +0 -5
  26. data/lib/puppet/pal/catalog_compiler.rb +96 -0
  27. data/lib/puppet/pal/compiler.rb +221 -0
  28. data/lib/puppet/pal/function_signature.rb +52 -0
  29. data/lib/puppet/pal/json_catalog_encoder.rb +67 -0
  30. data/lib/puppet/pal/pal_api.rb +15 -0
  31. data/lib/puppet/pal/pal_impl.rb +523 -0
  32. data/lib/puppet/pal/plan_signature.rb +71 -0
  33. data/lib/puppet/pal/script_compiler.rb +71 -0
  34. data/lib/puppet/pal/task_signature.rb +58 -0
  35. data/lib/puppet/parser/functions/generate.rb +7 -6
  36. data/lib/puppet/plugins/configuration.rb +5 -1
  37. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -1
  38. data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -3
  39. data/lib/puppet/pops/issues.rb +0 -4
  40. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +4 -60
  41. data/lib/puppet/pops/model/factory.rb +4 -38
  42. data/lib/puppet/pops/model/pn_transformer.rb +0 -5
  43. data/lib/puppet/pops/parser/egrammar.ra +2 -2
  44. data/lib/puppet/pops/parser/heredoc_support.rb +7 -17
  45. data/lib/puppet/pops/parser/lexer2.rb +1 -6
  46. data/lib/puppet/pops/parser/locator.rb +86 -106
  47. data/lib/puppet/pops/parser/parser_support.rb +2 -11
  48. data/lib/puppet/pops/types/string_converter.rb +7 -2
  49. data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
  50. data/lib/puppet/pops/types/types.rb +3 -5
  51. data/lib/puppet/pops/validation/checker4_0.rb +13 -0
  52. data/lib/puppet/provider.rb +2 -1
  53. data/lib/puppet/provider/exec.rb +6 -1
  54. data/lib/puppet/provider/file/windows.rb +1 -49
  55. data/lib/puppet/provider/group/windows_adsi.rb +1 -4
  56. data/lib/puppet/provider/package.rb +0 -2
  57. data/lib/puppet/provider/package/dpkg.rb +2 -15
  58. data/lib/puppet/provider/package/gem.rb +42 -102
  59. data/lib/puppet/provider/package/pip.rb +111 -135
  60. data/lib/puppet/provider/package/pip3.rb +1 -1
  61. data/lib/puppet/provider/package/pkgng.rb +37 -21
  62. data/lib/puppet/provider/package/puppet_gem.rb +1 -1
  63. data/lib/puppet/provider/package/rpm.rb +16 -27
  64. data/lib/puppet/provider/package/windows.rb +1 -5
  65. data/lib/puppet/provider/package/yum.rb +1 -2
  66. data/lib/puppet/provider/service/systemd.rb +17 -0
  67. data/lib/puppet/provider/service/upstart.rb +5 -17
  68. data/lib/puppet/provider/service/windows.rb +8 -3
  69. data/lib/puppet/provider/user/directoryservice.rb +4 -16
  70. data/lib/puppet/provider/user/useradd.rb +13 -16
  71. data/lib/puppet/resource.rb +3 -1
  72. data/lib/puppet/rest/client.rb +83 -0
  73. data/lib/puppet/rest/route.rb +1 -1
  74. data/lib/puppet/settings.rb +5 -10
  75. data/lib/puppet/settings/server_list_setting.rb +0 -9
  76. data/lib/puppet/ssl/host.rb +11 -0
  77. data/lib/puppet/ssl/validator/default_validator.rb +0 -31
  78. data/lib/puppet/syntax_checkers/epp.rb +34 -0
  79. data/lib/puppet/syntax_checkers/pp.rb +34 -0
  80. data/lib/puppet/transaction.rb +7 -12
  81. data/lib/puppet/transaction/event_manager.rb +5 -1
  82. data/lib/puppet/transaction/resource_harness.rb +0 -1
  83. data/lib/puppet/type.rb +6 -0
  84. data/lib/puppet/type/exec.rb +5 -27
  85. data/lib/puppet/type/file/mode.rb +1 -6
  86. data/lib/puppet/type/file/source.rb +1 -0
  87. data/lib/puppet/type/filebucket.rb +8 -12
  88. data/lib/puppet/type/package.rb +11 -44
  89. data/lib/puppet/type/schedule.rb +0 -4
  90. data/lib/puppet/type/service.rb +12 -0
  91. data/lib/puppet/type/user.rb +1 -1
  92. data/lib/puppet/util/command_line.rb +1 -5
  93. data/lib/puppet/util/connection.rb +6 -15
  94. data/lib/puppet/util/http_proxy.rb +2 -3
  95. data/lib/puppet/util/log.rb +2 -7
  96. data/lib/puppet/util/pidlock.rb +1 -15
  97. data/lib/puppet/util/windows/process.rb +5 -73
  98. data/lib/puppet/util/windows/registry.rb +1 -7
  99. data/lib/puppet/util/windows/security.rb +8 -29
  100. data/lib/puppet/util/windows/service.rb +33 -27
  101. data/lib/puppet/util/windows/user.rb +4 -14
  102. data/lib/puppet/version.rb +1 -1
  103. data/lib/puppet_pal.rb +5 -1132
  104. data/locales/ja/puppet.po +297 -363
  105. data/locales/puppet.pot +445 -517
  106. data/man/man5/puppet.conf.5 +12 -20
  107. data/man/man8/puppet-agent.8 +1 -1
  108. data/man/man8/puppet-apply.8 +1 -1
  109. data/man/man8/puppet-catalog.8 +1 -1
  110. data/man/man8/puppet-config.8 +1 -1
  111. data/man/man8/puppet-describe.8 +1 -1
  112. data/man/man8/puppet-device.8 +1 -1
  113. data/man/man8/puppet-doc.8 +1 -1
  114. data/man/man8/puppet-epp.8 +1 -1
  115. data/man/man8/puppet-facts.8 +1 -1
  116. data/man/man8/puppet-filebucket.8 +2 -6
  117. data/man/man8/puppet-generate.8 +1 -1
  118. data/man/man8/puppet-help.8 +1 -1
  119. data/man/man8/puppet-key.8 +1 -1
  120. data/man/man8/puppet-lookup.8 +1 -1
  121. data/man/man8/puppet-man.8 +1 -1
  122. data/man/man8/puppet-module.8 +1 -1
  123. data/man/man8/puppet-node.8 +1 -1
  124. data/man/man8/puppet-parser.8 +1 -1
  125. data/man/man8/puppet-plugin.8 +1 -1
  126. data/man/man8/puppet-report.8 +1 -1
  127. data/man/man8/puppet-resource.8 +1 -1
  128. data/man/man8/puppet-script.8 +1 -1
  129. data/man/man8/puppet-ssl.8 +1 -1
  130. data/man/man8/puppet-status.8 +1 -1
  131. data/man/man8/puppet.8 +2 -2
  132. data/spec/fixtures/unit/provider/package/pkgng/pkg.query +7 -1
  133. data/spec/fixtures/unit/provider/package/pkgng/pkg.query.zsh +1 -0
  134. data/spec/integration/agent/logging_spec.rb +7 -5
  135. data/spec/integration/application/apply_spec.rb +16 -18
  136. data/spec/integration/application/doc_spec.rb +2 -1
  137. data/spec/integration/application/lookup_spec.rb +5 -5
  138. data/spec/integration/configurer_spec.rb +6 -5
  139. data/spec/integration/defaults_spec.rb +6 -5
  140. data/spec/integration/directory_environments_spec.rb +1 -1
  141. data/spec/integration/faces/config_spec.rb +4 -3
  142. data/spec/integration/faces/documentation_spec.rb +1 -0
  143. data/spec/integration/faces/plugin_spec.rb +1 -1
  144. data/spec/integration/file_bucket/file_spec.rb +4 -2
  145. data/spec/integration/file_serving/content_spec.rb +1 -0
  146. data/spec/integration/file_serving/fileset_spec.rb +1 -0
  147. data/spec/integration/file_serving/metadata_spec.rb +1 -0
  148. data/spec/integration/file_serving/terminus_helper_spec.rb +1 -0
  149. data/spec/integration/indirector/catalog/compiler_spec.rb +11 -10
  150. data/spec/integration/indirector/direct_file_server_spec.rb +1 -1
  151. data/spec/integration/indirector/facts/facter_spec.rb +5 -4
  152. data/spec/integration/indirector/file_content/file_server_spec.rb +8 -7
  153. data/spec/integration/indirector/file_metadata/file_server_spec.rb +8 -7
  154. data/spec/integration/network/authconfig_spec.rb +24 -23
  155. data/spec/integration/network/formats_spec.rb +1 -0
  156. data/spec/integration/node/environment_spec.rb +1 -0
  157. data/spec/integration/node/facts_spec.rb +10 -9
  158. data/spec/integration/node_spec.rb +7 -6
  159. data/spec/integration/parser/catalog_spec.rb +5 -1
  160. data/spec/integration/parser/collection_spec.rb +2 -1
  161. data/spec/integration/parser/compiler_spec.rb +6 -6
  162. data/spec/integration/parser/scope_spec.rb +1 -1
  163. data/spec/integration/parser/undef_param_spec.rb +1 -1
  164. data/spec/integration/provider/service/init_spec.rb +5 -4
  165. data/spec/integration/provider/service/systemd_spec.rb +2 -0
  166. data/spec/integration/provider/service/windows_spec.rb +2 -1
  167. data/spec/integration/reference/providers_spec.rb +2 -1
  168. data/spec/integration/reports_spec.rb +2 -1
  169. data/spec/integration/resource/catalog_spec.rb +17 -14
  170. data/spec/integration/resource/type_collection_spec.rb +5 -4
  171. data/spec/integration/ssl/certificate_request_spec.rb +1 -0
  172. data/spec/integration/ssl/host_spec.rb +2 -1
  173. data/spec/integration/ssl/key_spec.rb +1 -0
  174. data/spec/integration/test/test_helper_spec.rb +1 -0
  175. data/spec/integration/transaction/report_spec.rb +11 -6
  176. data/spec/integration/transaction_spec.rb +19 -18
  177. data/spec/integration/type/exec_spec.rb +1 -0
  178. data/spec/integration/type/file_spec.rb +33 -13
  179. data/spec/integration/type/package_spec.rb +24 -20
  180. data/spec/integration/type/tidy_spec.rb +2 -1
  181. data/spec/integration/type_spec.rb +1 -0
  182. data/spec/integration/util/autoload_spec.rb +2 -1
  183. data/spec/integration/util/rdoc/parser_spec.rb +1 -0
  184. data/spec/integration/util/settings_spec.rb +1 -0
  185. data/spec/integration/util/windows/adsi_spec.rb +5 -3
  186. data/spec/integration/util/windows/principal_spec.rb +1 -0
  187. data/spec/integration/util/windows/process_spec.rb +6 -4
  188. data/spec/integration/util/windows/registry_spec.rb +51 -93
  189. data/spec/integration/util/windows/security_spec.rb +4 -2
  190. data/spec/integration/util/windows/user_spec.rb +20 -37
  191. data/spec/integration/util_spec.rb +7 -4
  192. data/spec/lib/puppet_spec/compiler.rb +1 -1
  193. data/spec/lib/puppet_spec/files.rb +1 -0
  194. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +1 -1
  195. data/spec/lib/puppet_spec/scope.rb +2 -1
  196. data/spec/shared_behaviours/all_parsedfile_providers.rb +1 -1
  197. data/spec/shared_behaviours/file_server_terminus.rb +9 -8
  198. data/spec/shared_behaviours/file_serving.rb +8 -6
  199. data/spec/shared_behaviours/file_serving_model.rb +5 -3
  200. data/spec/shared_behaviours/hiera_indirections.rb +4 -3
  201. data/spec/shared_behaviours/iterative_functions.rb +1 -0
  202. data/spec/shared_behaviours/memory_terminus.rb +2 -2
  203. data/spec/shared_examples/rhel_package_provider.rb +70 -112
  204. data/spec/spec_helper.rb +2 -11
  205. data/spec/unit/agent/disabler_spec.rb +5 -4
  206. data/spec/unit/agent/locker_spec.rb +13 -12
  207. data/spec/unit/agent_spec.rb +85 -80
  208. data/spec/unit/application/agent_spec.rb +93 -88
  209. data/spec/unit/application/apply_spec.rb +83 -82
  210. data/spec/unit/application/config_spec.rb +1 -0
  211. data/spec/unit/application/describe_spec.rb +7 -6
  212. data/spec/unit/application/device_spec.rb +419 -395
  213. data/spec/unit/application/doc_spec.rb +46 -44
  214. data/spec/unit/application/face_base_spec.rb +62 -61
  215. data/spec/unit/application/facts_spec.rb +4 -3
  216. data/spec/unit/application/filebucket_spec.rb +74 -66
  217. data/spec/unit/application/indirection_base_spec.rb +6 -8
  218. data/spec/unit/application/lookup_spec.rb +26 -26
  219. data/spec/unit/application/resource_spec.rb +48 -42
  220. data/spec/unit/application/ssl_spec.rb +3 -8
  221. data/spec/unit/application_spec.rb +98 -86
  222. data/spec/unit/capability_spec.rb +6 -6
  223. data/spec/unit/certificate_factory_spec.rb +5 -3
  224. data/spec/unit/configurer/downloader_spec.rb +21 -20
  225. data/spec/unit/configurer/fact_handler_spec.rb +3 -2
  226. data/spec/unit/configurer/plugin_handler_spec.rb +8 -41
  227. data/spec/unit/configurer_spec.rb +198 -194
  228. data/spec/unit/confine/exists_spec.rb +15 -17
  229. data/spec/unit/confine/false_spec.rb +6 -32
  230. data/spec/unit/confine/feature_spec.rb +5 -7
  231. data/spec/unit/confine/true_spec.rb +6 -32
  232. data/spec/unit/confine/variable_spec.rb +15 -14
  233. data/spec/unit/confine_collection_spec.rb +29 -28
  234. data/spec/unit/confine_spec.rb +14 -13
  235. data/spec/unit/confiner_spec.rb +11 -10
  236. data/spec/unit/context/trusted_information_spec.rb +1 -1
  237. data/spec/unit/daemon_spec.rb +36 -35
  238. data/spec/unit/data_providers/function_data_provider_spec.rb +1 -0
  239. data/spec/unit/data_providers/hiera_data_provider_spec.rb +1 -0
  240. data/spec/unit/datatypes_spec.rb +4 -3
  241. data/spec/unit/defaults_spec.rb +27 -18
  242. data/spec/unit/environments_spec.rb +7 -7
  243. data/spec/unit/etc_spec.rb +32 -30
  244. data/spec/unit/external/pson_spec.rb +1 -0
  245. data/spec/unit/face/catalog_spec.rb +1 -0
  246. data/spec/unit/face/config_spec.rb +35 -31
  247. data/spec/unit/face/epp_face_spec.rb +4 -3
  248. data/spec/unit/face/facts_spec.rb +6 -5
  249. data/spec/unit/face/generate_spec.rb +5 -4
  250. data/spec/unit/face/help_spec.rb +8 -7
  251. data/spec/unit/face/key_spec.rb +1 -0
  252. data/spec/unit/face/man_spec.rb +2 -1
  253. data/spec/unit/face/module/install_spec.rb +5 -3
  254. data/spec/unit/face/module/list_spec.rb +12 -2
  255. data/spec/unit/face/module/search_spec.rb +9 -11
  256. data/spec/unit/face/module/uninstall_spec.rb +8 -4
  257. data/spec/unit/face/node_spec.rb +24 -23
  258. data/spec/unit/face/parser_spec.rb +18 -3
  259. data/spec/unit/face/plugin_spec.rb +9 -36
  260. data/spec/unit/face/status_spec.rb +1 -0
  261. data/spec/unit/file_bucket/dipper_spec.rb +20 -24
  262. data/spec/unit/file_bucket/file_spec.rb +2 -0
  263. data/spec/unit/file_serving/base_spec.rb +15 -14
  264. data/spec/unit/file_serving/configuration/parser_spec.rb +28 -27
  265. data/spec/unit/file_serving/configuration_spec.rb +66 -63
  266. data/spec/unit/file_serving/content_spec.rb +11 -10
  267. data/spec/unit/file_serving/fileset_spec.rb +58 -63
  268. data/spec/unit/file_serving/http_metadata_spec.rb +7 -8
  269. data/spec/unit/file_serving/metadata_spec.rb +36 -36
  270. data/spec/unit/file_serving/mount/file_spec.rb +32 -31
  271. data/spec/unit/file_serving/mount/locales_spec.rb +24 -23
  272. data/spec/unit/file_serving/mount/modules_spec.rb +15 -14
  273. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +24 -23
  274. data/spec/unit/file_serving/mount/plugins_spec.rb +24 -23
  275. data/spec/unit/file_serving/mount/tasks_spec.rb +15 -14
  276. data/spec/unit/file_serving/mount_spec.rb +1 -0
  277. data/spec/unit/file_serving/terminus_helper_spec.rb +42 -37
  278. data/spec/unit/file_serving/terminus_selector_spec.rb +13 -12
  279. data/spec/unit/file_system/uniquefile_spec.rb +4 -4
  280. data/spec/unit/file_system_spec.rb +2 -2
  281. data/spec/unit/forge/errors_spec.rb +1 -1
  282. data/spec/unit/forge/forge_spec.rb +16 -17
  283. data/spec/unit/forge/module_release_spec.rb +18 -18
  284. data/spec/unit/forge/repository_spec.rb +30 -29
  285. data/spec/unit/forge_spec.rb +11 -15
  286. data/spec/unit/functions/binary_file_spec.rb +3 -3
  287. data/spec/unit/functions/contain_spec.rb +2 -0
  288. data/spec/unit/functions/defined_spec.rb +1 -0
  289. data/spec/unit/functions/epp_spec.rb +2 -2
  290. data/spec/unit/functions/find_file_spec.rb +7 -7
  291. data/spec/unit/functions/include_spec.rb +4 -0
  292. data/spec/unit/functions/lookup_fixture_spec.rb +1 -0
  293. data/spec/unit/functions/lookup_spec.rb +2 -1
  294. data/spec/unit/functions/module_directory_spec.rb +12 -12
  295. data/spec/unit/functions/new_spec.rb +0 -15
  296. data/spec/unit/functions/require_spec.rb +3 -0
  297. data/spec/unit/functions/shared.rb +8 -5
  298. data/spec/unit/functions/versioncmp_spec.rb +2 -1
  299. data/spec/unit/functions4_spec.rb +10 -9
  300. data/spec/unit/gettext/config_spec.rb +4 -4
  301. data/spec/unit/gettext/module_loading_spec.rb +7 -7
  302. data/spec/unit/graph/rb_tree_map_spec.rb +2 -0
  303. data/spec/unit/graph/relationship_graph_spec.rb +2 -1
  304. data/spec/unit/graph/simple_graph_spec.rb +10 -9
  305. data/spec/unit/hiera/scope_spec.rb +0 -7
  306. data/spec/unit/hiera_puppet_spec.rb +20 -20
  307. data/spec/unit/indirector/catalog/compiler_spec.rb +149 -147
  308. data/spec/unit/indirector/catalog/json_spec.rb +2 -1
  309. data/spec/unit/indirector/catalog/msgpack_spec.rb +1 -0
  310. data/spec/unit/indirector/catalog/rest_spec.rb +1 -0
  311. data/spec/unit/indirector/catalog/store_configs_spec.rb +1 -0
  312. data/spec/unit/indirector/catalog/yaml_spec.rb +1 -0
  313. data/spec/unit/indirector/certificate/file_spec.rb +1 -0
  314. data/spec/unit/indirector/certificate/rest_spec.rb +10 -8
  315. data/spec/unit/indirector/certificate_request/file_spec.rb +1 -0
  316. data/spec/unit/indirector/certificate_request/rest_spec.rb +1 -0
  317. data/spec/unit/indirector/direct_file_server_spec.rb +18 -17
  318. data/spec/unit/indirector/envelope_spec.rb +2 -1
  319. data/spec/unit/indirector/exec_spec.rb +5 -4
  320. data/spec/unit/indirector/face_spec.rb +9 -9
  321. data/spec/unit/indirector/facts/facter_spec.rb +43 -37
  322. data/spec/unit/indirector/facts/network_device_spec.rb +9 -8
  323. data/spec/unit/indirector/facts/rest_spec.rb +8 -7
  324. data/spec/unit/indirector/facts/store_configs_spec.rb +1 -0
  325. data/spec/unit/indirector/facts/yaml_spec.rb +1 -0
  326. data/spec/unit/indirector/file_bucket_file/file_spec.rb +4 -3
  327. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +1 -0
  328. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +5 -4
  329. data/spec/unit/indirector/file_content/file_server_spec.rb +1 -0
  330. data/spec/unit/indirector/file_content/file_spec.rb +1 -0
  331. data/spec/unit/indirector/file_content/rest_spec.rb +1 -0
  332. data/spec/unit/indirector/file_content/selector_spec.rb +1 -0
  333. data/spec/unit/indirector/file_metadata/file_server_spec.rb +1 -0
  334. data/spec/unit/indirector/file_metadata/file_spec.rb +13 -12
  335. data/spec/unit/indirector/file_metadata/rest_spec.rb +1 -0
  336. data/spec/unit/indirector/file_metadata/selector_spec.rb +1 -0
  337. data/spec/unit/indirector/file_server_spec.rb +87 -87
  338. data/spec/unit/indirector/indirection_spec.rb +226 -242
  339. data/spec/unit/indirector/json_spec.rb +9 -7
  340. data/spec/unit/indirector/key/file_spec.rb +22 -21
  341. data/spec/unit/indirector/memory_spec.rb +7 -6
  342. data/spec/unit/indirector/msgpack_spec.rb +9 -7
  343. data/spec/unit/indirector/node/exec_spec.rb +3 -2
  344. data/spec/unit/indirector/node/memory_spec.rb +4 -2
  345. data/spec/unit/indirector/node/msgpack_spec.rb +1 -0
  346. data/spec/unit/indirector/node/plain_spec.rb +4 -2
  347. data/spec/unit/indirector/node/rest_spec.rb +1 -0
  348. data/spec/unit/indirector/node/store_configs_spec.rb +1 -0
  349. data/spec/unit/indirector/node/yaml_spec.rb +1 -0
  350. data/spec/unit/indirector/none_spec.rb +5 -5
  351. data/spec/unit/indirector/plain_spec.rb +8 -7
  352. data/spec/unit/indirector/report/msgpack_spec.rb +1 -0
  353. data/spec/unit/indirector/report/processor_spec.rb +22 -21
  354. data/spec/unit/indirector/report/rest_spec.rb +12 -11
  355. data/spec/unit/indirector/report/yaml_spec.rb +1 -0
  356. data/spec/unit/indirector/request_spec.rb +12 -11
  357. data/spec/unit/indirector/resource/ral_spec.rb +54 -47
  358. data/spec/unit/indirector/resource/store_configs_spec.rb +1 -0
  359. data/spec/unit/indirector/rest_spec.rb +110 -113
  360. data/spec/unit/indirector/ssl_file_spec.rb +65 -64
  361. data/spec/unit/indirector/status/local_spec.rb +1 -0
  362. data/spec/unit/indirector/status/rest_spec.rb +1 -0
  363. data/spec/unit/indirector/store_configs_spec.rb +1 -0
  364. data/spec/unit/indirector/terminus_spec.rb +27 -27
  365. data/spec/unit/indirector/yaml_spec.rb +6 -5
  366. data/spec/unit/indirector_spec.rb +2 -1
  367. data/spec/unit/info_service_spec.rb +1 -1
  368. data/spec/unit/interface/action_builder_spec.rb +1 -0
  369. data/spec/unit/interface/action_manager_spec.rb +1 -0
  370. data/spec/unit/interface/action_spec.rb +3 -2
  371. data/spec/unit/interface/documentation_spec.rb +1 -0
  372. data/spec/unit/interface/face_collection_spec.rb +12 -19
  373. data/spec/unit/interface_spec.rb +3 -3
  374. data/spec/unit/man_spec.rb +4 -3
  375. data/spec/unit/module_spec.rb +51 -46
  376. data/spec/unit/module_tool/applications/installer_spec.rb +11 -10
  377. data/spec/unit/module_tool/applications/searcher_spec.rb +3 -3
  378. data/spec/unit/module_tool/applications/uninstaller_spec.rb +2 -1
  379. data/spec/unit/module_tool/applications/unpacker_spec.rb +13 -13
  380. data/spec/unit/module_tool/applications/upgrader_spec.rb +5 -5
  381. data/spec/unit/module_tool/install_directory_spec.rb +8 -8
  382. data/spec/unit/module_tool/installed_modules_spec.rb +3 -3
  383. data/spec/unit/module_tool/tar/gnu_spec.rb +6 -6
  384. data/spec/unit/module_tool/tar/mini_spec.rb +12 -12
  385. data/spec/unit/module_tool/tar_spec.rb +13 -12
  386. data/spec/unit/module_tool_spec.rb +12 -7
  387. data/spec/unit/network/auth_config_parser_spec.rb +13 -11
  388. data/spec/unit/network/authconfig_spec.rb +18 -17
  389. data/spec/unit/network/authorization_spec.rb +5 -4
  390. data/spec/unit/network/authstore_spec.rb +1 -0
  391. data/spec/unit/network/format_handler_spec.rb +1 -0
  392. data/spec/unit/network/format_spec.rb +10 -9
  393. data/spec/unit/network/format_support_spec.rb +29 -28
  394. data/spec/unit/network/formats_spec.rb +5 -4
  395. data/spec/unit/network/http/api/indirected_routes_spec.rb +29 -24
  396. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +2 -2
  397. data/spec/unit/network/http/api/master/v3/environment_spec.rb +1 -1
  398. data/spec/unit/network/http/api/master/v3/environments_spec.rb +7 -6
  399. data/spec/unit/network/http/api_spec.rb +2 -0
  400. data/spec/unit/network/http/compression_spec.rb +22 -21
  401. data/spec/unit/network/http/connection_spec.rb +121 -30
  402. data/spec/unit/network/http/factory_spec.rb +6 -11
  403. data/spec/unit/network/http/handler_spec.rb +18 -9
  404. data/spec/unit/network/http/nocache_pool_spec.rb +7 -6
  405. data/spec/unit/network/http/pool_spec.rb +29 -28
  406. data/spec/unit/network/http/request_spec.rb +2 -0
  407. data/spec/unit/network/http/response_spec.rb +13 -11
  408. data/spec/unit/network/http/route_spec.rb +1 -0
  409. data/spec/unit/network/http/session_spec.rb +2 -1
  410. data/spec/unit/network/http/site_spec.rb +1 -0
  411. data/spec/unit/network/http_pool_spec.rb +9 -18
  412. data/spec/unit/network/http_spec.rb +1 -0
  413. data/spec/unit/network/resolver_spec.rb +26 -25
  414. data/spec/unit/network/rights_spec.rb +53 -52
  415. data/spec/unit/node/environment_spec.rb +15 -14
  416. data/spec/unit/node/facts_spec.rb +7 -5
  417. data/spec/unit/node_spec.rb +10 -4
  418. data/spec/unit/other/selinux_spec.rb +1 -0
  419. data/spec/unit/parameter/boolean_spec.rb +2 -1
  420. data/spec/unit/parameter/package_options_spec.rb +2 -1
  421. data/spec/unit/parameter/path_spec.rb +1 -0
  422. data/spec/unit/parameter/value_collection_spec.rb +1 -0
  423. data/spec/unit/parameter/value_spec.rb +1 -0
  424. data/spec/unit/parameter_spec.rb +9 -9
  425. data/spec/unit/parser/ast/block_expression_spec.rb +8 -6
  426. data/spec/unit/parser/ast/leaf_spec.rb +21 -20
  427. data/spec/unit/parser/compiler_spec.rb +96 -84
  428. data/spec/unit/parser/environment_compiler_spec.rb +8 -7
  429. data/spec/unit/parser/files_spec.rb +1 -0
  430. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  431. data/spec/unit/parser/functions/digest_spec.rb +1 -0
  432. data/spec/unit/parser/functions/fail_spec.rb +2 -1
  433. data/spec/unit/parser/functions/file_spec.rb +14 -13
  434. data/spec/unit/parser/functions/fqdn_rand_spec.rb +6 -5
  435. data/spec/unit/parser/functions/generate_spec.rb +8 -7
  436. data/spec/unit/parser/functions/inline_template_spec.rb +1 -0
  437. data/spec/unit/parser/functions/regsubst_spec.rb +1 -0
  438. data/spec/unit/parser/functions/scanf_spec.rb +1 -0
  439. data/spec/unit/parser/functions/shellquote_spec.rb +1 -0
  440. data/spec/unit/parser/functions/split_spec.rb +1 -0
  441. data/spec/unit/parser/functions/sprintf_spec.rb +1 -0
  442. data/spec/unit/parser/functions/tag_spec.rb +2 -1
  443. data/spec/unit/parser/functions/tagged_spec.rb +3 -2
  444. data/spec/unit/parser/functions/template_spec.rb +13 -13
  445. data/spec/unit/parser/functions/versioncmp_spec.rb +2 -1
  446. data/spec/unit/parser/functions_spec.rb +7 -6
  447. data/spec/unit/parser/relationship_spec.rb +1 -0
  448. data/spec/unit/parser/resource_spec.rb +42 -42
  449. data/spec/unit/parser/scope_spec.rb +35 -39
  450. data/spec/unit/parser/templatewrapper_spec.rb +12 -11
  451. data/spec/unit/parser/type_loader_spec.rb +19 -17
  452. data/spec/unit/pops/adaptable_spec.rb +1 -0
  453. data/spec/unit/pops/benchmark_spec.rb +1 -0
  454. data/spec/unit/pops/evaluator/access_ops_spec.rb +1 -0
  455. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +1 -0
  456. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -0
  457. data/spec/unit/pops/evaluator/collections_ops_spec.rb +1 -0
  458. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +1 -0
  459. data/spec/unit/pops/evaluator/conditionals_spec.rb +1 -0
  460. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +47 -10
  461. data/spec/unit/pops/evaluator/logical_ops_spec.rb +1 -0
  462. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +1 -0
  463. data/spec/unit/pops/evaluator/string_interpolation_spec.rb +1 -0
  464. data/spec/unit/pops/evaluator/variables_spec.rb +1 -0
  465. data/spec/unit/pops/factory_spec.rb +4 -3
  466. data/spec/unit/pops/issues_spec.rb +20 -19
  467. data/spec/unit/pops/loaders/loader_spec.rb +4 -8
  468. data/spec/unit/pops/loaders/loaders_spec.rb +31 -101
  469. data/spec/unit/pops/lookup/context_spec.rb +1 -0
  470. data/spec/unit/pops/lookup/interpolation_spec.rb +3 -2
  471. data/spec/unit/pops/merge_strategy_spec.rb +1 -0
  472. data/spec/unit/pops/migration_spec.rb +5 -3
  473. data/spec/unit/pops/model/model_spec.rb +1 -0
  474. data/spec/unit/pops/model/pn_transformer_spec.rb +1 -4
  475. data/spec/unit/pops/parser/locator_spec.rb +6 -48
  476. data/spec/unit/pops/parser/parse_application_spec.rb +1 -0
  477. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +1 -0
  478. data/spec/unit/pops/parser/parse_calls_spec.rb +1 -0
  479. data/spec/unit/pops/parser/parse_capabilities_spec.rb +1 -0
  480. data/spec/unit/pops/parser/parse_conditionals_spec.rb +1 -0
  481. data/spec/unit/pops/parser/parse_containers_spec.rb +1 -0
  482. data/spec/unit/pops/parser/parse_heredoc_spec.rb +15 -111
  483. data/spec/unit/pops/parser/parse_plan_spec.rb +1 -0
  484. data/spec/unit/pops/parser/parse_resource_spec.rb +1 -0
  485. data/spec/unit/pops/parser/parse_site_spec.rb +1 -0
  486. data/spec/unit/pops/parser/pn_parser_spec.rb +1 -0
  487. data/spec/unit/pops/pn_spec.rb +1 -0
  488. data/spec/unit/pops/resource/resource_type_impl_spec.rb +1 -0
  489. data/spec/unit/pops/serialization/serialization_spec.rb +1 -1
  490. data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
  491. data/spec/unit/pops/types/recursion_guard_spec.rb +10 -10
  492. data/spec/unit/pops/types/ruby_generator_spec.rb +2 -2
  493. data/spec/unit/pops/types/string_converter_spec.rb +5 -1
  494. data/spec/unit/pops/types/type_asserter_spec.rb +2 -2
  495. data/spec/unit/pops/types/type_calculator_spec.rb +30 -30
  496. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +0 -9
  497. data/spec/unit/pops/types/type_parser_spec.rb +13 -13
  498. data/spec/unit/pops/validator/validator_spec.rb +2 -1
  499. data/spec/unit/pops/visitor_spec.rb +1 -0
  500. data/spec/unit/property/boolean_spec.rb +1 -1
  501. data/spec/unit/property/ensure_spec.rb +1 -0
  502. data/spec/unit/property/keyvalue_spec.rb +34 -32
  503. data/spec/unit/property/list_spec.rb +27 -26
  504. data/spec/unit/property/ordered_list_spec.rb +14 -10
  505. data/spec/unit/property_spec.rb +43 -42
  506. data/spec/unit/provider/aix_object_spec.rb +45 -47
  507. data/spec/unit/provider/command_spec.rb +9 -9
  508. data/spec/unit/provider/exec/posix_spec.rb +31 -6
  509. data/spec/unit/provider/exec/shell_spec.rb +1 -0
  510. data/spec/unit/provider/exec/windows_spec.rb +4 -2
  511. data/spec/unit/provider/exec_spec.rb +1 -0
  512. data/spec/unit/provider/file/posix_spec.rb +24 -22
  513. data/spec/unit/provider/file/windows_spec.rb +17 -15
  514. data/spec/unit/provider/group/aix_spec.rb +2 -3
  515. data/spec/unit/provider/group/groupadd_spec.rb +26 -30
  516. data/spec/unit/provider/group/ldap_spec.rb +18 -18
  517. data/spec/unit/provider/group/pw_spec.rb +11 -11
  518. data/spec/unit/provider/group/windows_adsi_spec.rb +53 -59
  519. data/spec/unit/provider/ldap_spec.rb +62 -61
  520. data/spec/unit/provider/nameservice/directoryservice_spec.rb +36 -35
  521. data/spec/unit/provider/nameservice_spec.rb +40 -38
  522. data/spec/unit/provider/package/aix_spec.rb +15 -15
  523. data/spec/unit/provider/package/appdmg_spec.rb +13 -13
  524. data/spec/unit/provider/package/apt_spec.rb +27 -44
  525. data/spec/unit/provider/package/aptitude_spec.rb +7 -6
  526. data/spec/unit/provider/package/aptrpm_spec.rb +12 -7
  527. data/spec/unit/provider/package/base_spec.rb +4 -4
  528. data/spec/unit/provider/package/dnf_spec.rb +20 -18
  529. data/spec/unit/provider/package/dpkg_spec.rb +53 -70
  530. data/spec/unit/provider/package/freebsd_spec.rb +11 -11
  531. data/spec/unit/provider/package/gem_spec.rb +55 -132
  532. data/spec/unit/provider/package/hpux_spec.rb +8 -8
  533. data/spec/unit/provider/package/macports_spec.rb +42 -46
  534. data/spec/unit/provider/package/nim_spec.rb +39 -30
  535. data/spec/unit/provider/package/openbsd_spec.rb +39 -36
  536. data/spec/unit/provider/package/opkg_spec.rb +26 -23
  537. data/spec/unit/provider/package/pacman_spec.rb +118 -97
  538. data/spec/unit/provider/package/pip3_spec.rb +0 -17
  539. data/spec/unit/provider/package/pip_spec.rb +106 -95
  540. data/spec/unit/provider/package/pkg_spec.rb +109 -109
  541. data/spec/unit/provider/package/pkgdmg_spec.rb +63 -65
  542. data/spec/unit/provider/package/pkgin_spec.rb +8 -10
  543. data/spec/unit/provider/package/pkgng_spec.rb +31 -22
  544. data/spec/unit/provider/package/pkgutil_spec.rb +49 -45
  545. data/spec/unit/provider/package/portage_spec.rb +74 -70
  546. data/spec/unit/provider/package/puppet_gem_spec.rb +13 -37
  547. data/spec/unit/provider/package/rpm_spec.rb +76 -154
  548. data/spec/unit/provider/package/sun_spec.rb +18 -16
  549. data/spec/unit/provider/package/tdnf_spec.rb +2 -2
  550. data/spec/unit/provider/package/up2date_spec.rb +4 -2
  551. data/spec/unit/provider/package/urpmi_spec.rb +17 -15
  552. data/spec/unit/provider/package/windows/exe_package_spec.rb +15 -12
  553. data/spec/unit/provider/package/windows/msi_package_spec.rb +22 -19
  554. data/spec/unit/provider/package/windows/package_spec.rb +42 -37
  555. data/spec/unit/provider/package/windows_spec.rb +32 -47
  556. data/spec/unit/provider/package/yum_spec.rb +7 -7
  557. data/spec/unit/provider/package/zypper_spec.rb +87 -87
  558. data/spec/unit/provider/parsedfile_spec.rb +45 -44
  559. data/spec/unit/provider/service/base_spec.rb +5 -4
  560. data/spec/unit/provider/service/bsd_spec.rb +29 -27
  561. data/spec/unit/provider/service/daemontools_spec.rb +35 -35
  562. data/spec/unit/provider/service/debian_spec.rb +38 -38
  563. data/spec/unit/provider/service/freebsd_spec.rb +18 -18
  564. data/spec/unit/provider/service/gentoo_spec.rb +55 -50
  565. data/spec/unit/provider/service/init_spec.rb +52 -53
  566. data/spec/unit/provider/service/launchd_spec.rb +116 -138
  567. data/spec/unit/provider/service/openbsd_spec.rb +50 -50
  568. data/spec/unit/provider/service/openrc_spec.rb +45 -43
  569. data/spec/unit/provider/service/openwrt_spec.rb +31 -26
  570. data/spec/unit/provider/service/rcng_spec.rb +14 -14
  571. data/spec/unit/provider/service/redhat_spec.rb +43 -45
  572. data/spec/unit/provider/service/runit_spec.rb +27 -29
  573. data/spec/unit/provider/service/smf_spec.rb +66 -74
  574. data/spec/unit/provider/service/src_spec.rb +47 -46
  575. data/spec/unit/provider/service/systemd_spec.rb +136 -109
  576. data/spec/unit/provider/service/upstart_spec.rb +93 -77
  577. data/spec/unit/provider/service/windows_spec.rb +41 -33
  578. data/spec/unit/provider/user/aix_spec.rb +31 -31
  579. data/spec/unit/provider/user/directoryservice_spec.rb +114 -146
  580. data/spec/unit/provider/user/hpux_spec.rb +16 -16
  581. data/spec/unit/provider/user/ldap_spec.rb +57 -57
  582. data/spec/unit/provider/user/openbsd_spec.rb +12 -10
  583. data/spec/unit/provider/user/pw_spec.rb +35 -37
  584. data/spec/unit/provider/user/user_role_add_spec.rb +93 -93
  585. data/spec/unit/provider/user/useradd_spec.rb +92 -93
  586. data/spec/unit/provider/user/windows_adsi_spec.rb +60 -59
  587. data/spec/unit/provider_spec.rb +35 -35
  588. data/spec/unit/puppet_pal_2pec.rb +5 -4
  589. data/spec/unit/puppet_pal_spec.rb +1 -0
  590. data/spec/unit/puppet_spec.rb +7 -6
  591. data/spec/unit/relationship_spec.rb +1 -0
  592. data/spec/unit/reports/http_spec.rb +23 -21
  593. data/spec/unit/reports/store_spec.rb +4 -3
  594. data/spec/unit/reports_spec.rb +14 -12
  595. data/spec/unit/resource/capability_finder_spec.rb +17 -15
  596. data/spec/unit/resource/catalog_spec.rb +68 -72
  597. data/spec/unit/resource/status_spec.rb +8 -6
  598. data/spec/unit/resource/type_collection_spec.rb +18 -17
  599. data/spec/unit/resource/type_spec.rb +35 -34
  600. data/spec/unit/resource_spec.rb +63 -36
  601. data/spec/unit/rest/client_spec.rb +135 -0
  602. data/spec/unit/rest/route_spec.rb +6 -6
  603. data/spec/unit/scheduler/job_spec.rb +1 -0
  604. data/spec/unit/scheduler/scheduler_spec.rb +1 -0
  605. data/spec/unit/scheduler/splay_job_spec.rb +2 -1
  606. data/spec/unit/settings/array_setting_spec.rb +1 -1
  607. data/spec/unit/settings/autosign_setting_spec.rb +9 -9
  608. data/spec/unit/settings/certificate_revocation_setting_spec.rb +1 -1
  609. data/spec/unit/settings/config_file_spec.rb +1 -0
  610. data/spec/unit/settings/directory_setting_spec.rb +7 -2
  611. data/spec/unit/settings/duration_setting_spec.rb +2 -1
  612. data/spec/unit/settings/enum_setting_spec.rb +1 -1
  613. data/spec/unit/settings/environment_conf_spec.rb +6 -4
  614. data/spec/unit/settings/file_setting_spec.rb +46 -44
  615. data/spec/unit/settings/path_setting_spec.rb +2 -1
  616. data/spec/unit/settings/priority_setting_spec.rb +2 -1
  617. data/spec/unit/settings/string_setting_spec.rb +15 -14
  618. data/spec/unit/settings/terminus_setting_spec.rb +2 -1
  619. data/spec/unit/settings/value_translator_spec.rb +1 -0
  620. data/spec/unit/settings_spec.rb +224 -253
  621. data/spec/unit/ssl/base_spec.rb +15 -14
  622. data/spec/unit/ssl/certificate_request_spec.rb +58 -62
  623. data/spec/unit/ssl/certificate_spec.rb +25 -23
  624. data/spec/unit/ssl/digest_spec.rb +1 -0
  625. data/spec/unit/ssl/host_spec.rb +149 -166
  626. data/spec/unit/ssl/key_spec.rb +31 -30
  627. data/spec/unit/ssl/validator_spec.rb +39 -40
  628. data/spec/unit/task_spec.rb +45 -44
  629. data/spec/unit/transaction/additional_resource_generator_spec.rb +5 -3
  630. data/spec/unit/transaction/event_manager_spec.rb +88 -87
  631. data/spec/unit/transaction/event_spec.rb +15 -16
  632. data/spec/unit/transaction/persistence_spec.rb +17 -16
  633. data/spec/unit/transaction/report_spec.rb +12 -11
  634. data/spec/unit/transaction/resource_harness_spec.rb +31 -52
  635. data/spec/unit/transaction_spec.rb +87 -140
  636. data/spec/unit/type/component_spec.rb +1 -0
  637. data/spec/unit/type/exec_spec.rb +50 -101
  638. data/spec/unit/type/file/checksum_spec.rb +10 -9
  639. data/spec/unit/type/file/checksum_value_spec.rb +32 -31
  640. data/spec/unit/type/file/content_spec.rb +61 -58
  641. data/spec/unit/type/file/ctime_spec.rb +1 -0
  642. data/spec/unit/type/file/ensure_spec.rb +13 -12
  643. data/spec/unit/type/file/group_spec.rb +7 -5
  644. data/spec/unit/type/file/mode_spec.rb +6 -4
  645. data/spec/unit/type/file/mtime_spec.rb +1 -0
  646. data/spec/unit/type/file/owner_spec.rb +8 -6
  647. data/spec/unit/type/file/selinux_spec.rb +19 -17
  648. data/spec/unit/type/file/source_spec.rb +101 -104
  649. data/spec/unit/type/file/type_spec.rb +1 -0
  650. data/spec/unit/type/file_spec.rb +185 -195
  651. data/spec/unit/type/filebucket_spec.rb +10 -11
  652. data/spec/unit/type/group_spec.rb +8 -6
  653. data/spec/unit/type/noop_metaparam_spec.rb +2 -1
  654. data/spec/unit/type/package/package_settings_spec.rb +23 -44
  655. data/spec/unit/type/package_spec.rb +57 -56
  656. data/spec/unit/type/resources_spec.rb +74 -72
  657. data/spec/unit/type/schedule_spec.rb +26 -24
  658. data/spec/unit/type/service_spec.rb +75 -49
  659. data/spec/unit/type/stage_spec.rb +1 -0
  660. data/spec/unit/type/tidy_spec.rb +62 -61
  661. data/spec/unit/type/user_spec.rb +25 -24
  662. data/spec/unit/type/whit_spec.rb +1 -0
  663. data/spec/unit/type_spec.rb +54 -55
  664. data/spec/unit/util/at_fork_spec.rb +19 -18
  665. data/spec/unit/util/autoload_spec.rb +56 -55
  666. data/spec/unit/util/backups_spec.rb +35 -34
  667. data/spec/unit/util/character_encoding_spec.rb +5 -5
  668. data/spec/unit/util/checksums_spec.rb +39 -38
  669. data/spec/unit/util/colors_spec.rb +2 -1
  670. data/spec/unit/util/command_line_spec.rb +20 -40
  671. data/spec/unit/util/constant_inflector_spec.rb +1 -0
  672. data/spec/unit/util/diff_spec.rb +8 -7
  673. data/spec/unit/util/errors_spec.rb +1 -0
  674. data/spec/unit/util/execution_spec.rb +163 -187
  675. data/spec/unit/util/execution_stub_spec.rb +1 -0
  676. data/spec/unit/util/feature_spec.rb +14 -21
  677. data/spec/unit/util/filetype_spec.rb +49 -49
  678. data/spec/unit/util/http_proxy_spec.rb +12 -12
  679. data/spec/unit/util/inifile_spec.rb +31 -26
  680. data/spec/unit/util/json_lockfile_spec.rb +5 -3
  681. data/spec/unit/util/ldap/connection_spec.rb +25 -26
  682. data/spec/unit/util/ldap/generator_spec.rb +1 -0
  683. data/spec/unit/util/ldap/manager_spec.rb +101 -102
  684. data/spec/unit/util/lockfile_spec.rb +1 -0
  685. data/spec/unit/util/log/destinations_spec.rb +33 -30
  686. data/spec/unit/util/log_spec.rb +34 -48
  687. data/spec/unit/util/logging_spec.rb +72 -58
  688. data/spec/unit/util/metric_spec.rb +1 -0
  689. data/spec/unit/util/monkey_patches_spec.rb +9 -7
  690. data/spec/unit/util/multi_match_spec.rb +1 -0
  691. data/spec/unit/util/network_device/config_spec.rb +1 -0
  692. data/spec/unit/util/network_device/transport/base_spec.rb +6 -5
  693. data/spec/unit/util/network_device_spec.rb +9 -7
  694. data/spec/unit/util/package_spec.rb +1 -0
  695. data/spec/unit/util/pidlock_spec.rb +15 -60
  696. data/spec/unit/util/plist_spec.rb +33 -40
  697. data/spec/unit/util/posix_spec.rb +51 -54
  698. data/spec/unit/util/rdoc_spec.rb +10 -9
  699. data/spec/unit/util/reference_spec.rb +1 -0
  700. data/spec/unit/util/resource_template_spec.rb +20 -20
  701. data/spec/unit/util/retry_action_spec.rb +8 -7
  702. data/spec/unit/util/rubygems_spec.rb +8 -7
  703. data/spec/unit/util/run_mode_spec.rb +4 -3
  704. data/spec/unit/util/selinux_spec.rb +72 -79
  705. data/spec/unit/util/splayer_spec.rb +9 -8
  706. data/spec/unit/util/ssl_spec.rb +1 -0
  707. data/spec/unit/util/storage_spec.rb +23 -22
  708. data/spec/unit/util/suidmanager_spec.rb +54 -45
  709. data/spec/unit/util/symbolic_file_mode_spec.rb +1 -0
  710. data/spec/unit/util/tag_set_spec.rb +1 -0
  711. data/spec/unit/util/tagging_spec.rb +1 -0
  712. data/spec/unit/util/terminal_spec.rb +10 -9
  713. data/spec/unit/util/user_attr_spec.rb +2 -1
  714. data/spec/unit/util/warnings_spec.rb +4 -3
  715. data/spec/unit/util/watcher/periodic_watcher_spec.rb +2 -2
  716. data/spec/unit/util/watcher_spec.rb +21 -51
  717. data/spec/unit/util/windows/access_control_entry_spec.rb +1 -0
  718. data/spec/unit/util/windows/access_control_list_spec.rb +1 -0
  719. data/spec/unit/util/windows/adsi_spec.rb +138 -136
  720. data/spec/unit/util/windows/api_types_spec.rb +1 -0
  721. data/spec/unit/util/windows/eventlog_spec.rb +12 -9
  722. data/spec/unit/util/windows/file_spec.rb +1 -0
  723. data/spec/unit/util/windows/root_certs_spec.rb +1 -0
  724. data/spec/unit/util/windows/security_descriptor_spec.rb +2 -0
  725. data/spec/unit/util/windows/service_spec.rb +103 -100
  726. data/spec/unit/util/windows/sid_spec.rb +13 -11
  727. data/spec/unit/util/windows/string_spec.rb +1 -0
  728. data/spec/unit/util_spec.rb +57 -55
  729. data/spec/unit/version_spec.rb +6 -6
  730. metadata +20 -32
  731. data/CODEOWNERS +0 -30
  732. data/ext/autotest/Rakefile +0 -8
  733. data/ext/autotest/config +0 -43
  734. data/ext/autotest/readme.rst +0 -16
  735. data/lib/puppet/confine/boolean.rb +0 -45
  736. data/lib/puppet/provider/package_targetable.rb +0 -68
  737. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/usee/lib/puppet/parser/functions/bad_func_load2.rb +0 -11
  738. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/usee/lib/puppet/parser/functions/bad_func_load3.rb +0 -11
  739. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/usee/lib/puppet/parser/functions/bad_func_load4.rb +0 -11
  740. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/usee/lib/puppet/parser/functions/bad_func_load5.rb +0 -12
  741. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/usee/lib/puppet/parser/functions/good_func_load.rb +0 -9
  742. data/spec/fixtures/unit/provider/package/pkgng/pkg.info +0 -7
  743. data/spec/fixtures/unit/provider/package/pkgng/pkg.query_absent +0 -1
  744. data/spec/integration/network/http_pool_spec.rb +0 -120
  745. data/spec/integration/provider/file/windows_spec.rb +0 -162
  746. data/spec/lib/puppet_spec/https.rb +0 -166
  747. data/spec/unit/settings/server_list_setting_spec.rb +0 -21
  748. data/spec/watchr.rb +0 -137
@@ -274,7 +274,7 @@ module Puppet::Util::Windows::Security
274
274
  # mode. Only a user with the SE_BACKUP_NAME and SE_RESTORE_NAME
275
275
  # privileges in their process token can change the mode for objects
276
276
  # that they do not have read and write access to.
277
- def set_mode(mode, path, protected = true, managing_owner = false, managing_group = false)
277
+ def set_mode(mode, path, protected = true)
278
278
  sd = get_security_descriptor(path)
279
279
  well_known_world_sid = Puppet::Util::Windows::SID::Everyone
280
280
  well_known_nobody_sid = Puppet::Util::Windows::SID::Nobody
@@ -319,8 +319,6 @@ module Puppet::Util::Windows::Security
319
319
  nobody_allow |= FILE::FILE_APPEND_DATA;
320
320
  end
321
321
 
322
- isownergroup = sd.owner == sd.group
323
-
324
322
  # caller is NOT managing SYSTEM by using group or owner, so set to FULL
325
323
  if ! [sd.owner, sd.group].include? well_known_system_sid
326
324
  # we don't check S_ISYSTEM_MISSING bit, but automatically carry over existing SYSTEM perms
@@ -330,35 +328,15 @@ module Puppet::Util::Windows::Security
330
328
  # It is possible to set SYSTEM with a mode other than Full Control (7) however this makes no sense and in practical terms
331
329
  # should not be done. We can trap these instances and correct them before being applied.
332
330
  if (sd.owner == well_known_system_sid) && (owner_allow != FILE::FILE_ALL_ACCESS)
333
- # If owner and group are both SYSTEM but group is unmanaged the control rights of system will be set to FullControl by
334
- # the unmanaged group, so there is no need for the warning
335
- if managing_owner && (!isownergroup || managing_group)
336
- #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
337
- Puppet.warning _("Setting control rights for %{path} owner SYSTEM to less than Full Control rights. Setting SYSTEM rights to less than Full Control may have unintented consequences for operations on this file") % { path: path }
338
- elsif managing_owner && isownergroup
339
- #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
340
- Puppet.debug _("%{path} owner and group both set to user SYSTEM, but group is not managed directly: SYSTEM user rights will be set to FullControl by group") % { path: path }
341
- else
342
- #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
343
- Puppet.debug _("An attempt to set mode %{mode} on item %{path} would result in the owner, SYSTEM, to have less than Full Control rights. This attempt has been corrected to Full Control") % { mode: mode.to_s(8), path: path }
344
- owner_allow = FILE::FILE_ALL_ACCESS
345
- end
331
+ #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
332
+ Puppet.debug _("An attempt to set mode %{mode} on item %{path} would result in the owner, SYSTEM, to have less than Full Control rights. This attempt has been corrected to Full Control") % { mode: mode.to_s(8), path: path }
333
+ owner_allow = FILE::FILE_ALL_ACCESS
346
334
  end
347
335
 
348
336
  if (sd.group == well_known_system_sid) && (group_allow != FILE::FILE_ALL_ACCESS)
349
- # If owner and group are both SYSTEM but owner is unmanaged the control rights of system will be set to FullControl by
350
- # the unmanaged owner, so there is no need for the warning.
351
- if managing_group && (!isownergroup || managing_owner)
352
- #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
353
- Puppet.warning _("Setting control rights for %{path} group SYSTEM to less than Full Control rights. Setting SYSTEM rights to less than Full Control may have unintented consequences for operations on this file") % { path: path }
354
- elsif managing_group && isownergroup
355
- #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
356
- Puppet.debug _("%{path} owner and group both set to user SYSTEM, but owner is not managed directly: SYSTEM user rights will be set to FullControl by owner") % { path: path }
357
- else
358
- #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
359
- Puppet.debug _("An attempt to set mode %{mode} on item %{path} would result in the group, SYSTEM, to have less than Full Control rights. This attempt has been corrected to Full Control") % { mode: mode.to_s(8), path: path }
360
- group_allow = FILE::FILE_ALL_ACCESS
361
- end
337
+ #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
338
+ Puppet.debug _("An attempt to set mode %{mode} on item %{path} would result in the group, SYSTEM, to have less than Full Control rights. This attempt has been corrected to Full Control") % { mode: mode.to_s(8), path: path }
339
+ group_allow = FILE::FILE_ALL_ACCESS
362
340
  end
363
341
  end
364
342
 
@@ -375,6 +353,7 @@ module Puppet::Util::Windows::Security
375
353
  end
376
354
 
377
355
  # if owner and group the same, then map group permissions to the one owner ACE
356
+ isownergroup = sd.owner == sd.group
378
357
  if isownergroup
379
358
  owner_allow |= group_allow
380
359
  end
@@ -282,7 +282,7 @@ module Puppet::Util::Windows
282
282
 
283
283
  # Returns true if the service exists, false otherwise.
284
284
  #
285
- # @param [:string] service_name name of the service
285
+ # @param [String] service_name name of the service
286
286
  def exists?(service_name)
287
287
  open_service(service_name, SC_MANAGER_CONNECT, SERVICE_QUERY_STATUS) do |_|
288
288
  true
@@ -295,9 +295,10 @@ module Puppet::Util::Windows
295
295
 
296
296
  # Start a windows service
297
297
  #
298
- # @param [:string] service_name name of the service to start
299
- def start(service_name)
300
- Puppet.debug _("Starting the %{service_name} service") % { service_name: service_name }
298
+ # @param [String] service_name name of the service to start
299
+ # @param optional [Integer] timeout the minumum number of seconds to wait before timing out
300
+ def start(service_name, timeout: DEFAULT_TIMEOUT)
301
+ Puppet.debug _("Starting the %{service_name} service. Timeout set to: %{timeout} seconds") % { service_name: service_name, timeout: timeout }
301
302
 
302
303
  valid_initial_states = [
303
304
  SERVICE_STOP_PENDING,
@@ -305,7 +306,7 @@ module Puppet::Util::Windows
305
306
  SERVICE_START_PENDING
306
307
  ]
307
308
 
308
- transition_service_state(service_name, valid_initial_states, SERVICE_RUNNING) do |service|
309
+ transition_service_state(service_name, valid_initial_states, SERVICE_RUNNING, timeout) do |service|
309
310
  if StartServiceW(service, 0, FFI::Pointer::NULL) == FFI::WIN32_FALSE
310
311
  raise Puppet::Util::Windows::Error, _("Failed to start the service")
311
312
  end
@@ -317,13 +318,14 @@ module Puppet::Util::Windows
317
318
 
318
319
  # Stop a windows service
319
320
  #
320
- # @param [:string] service_name name of the service to stop
321
- def stop(service_name)
322
- Puppet.debug _("Stopping the %{service_name} service") % { service_name: service_name }
321
+ # @param [String] service_name name of the service to stop
322
+ # @param optional [Integer] timeout the minumum number of seconds to wait before timing out
323
+ def stop(service_name, timeout: DEFAULT_TIMEOUT)
324
+ Puppet.debug _("Stopping the %{service_name} service. Timeout set to: %{timeout} seconds") % { service_name: service_name, timeout: timeout }
323
325
 
324
326
  valid_initial_states = SERVICE_STATES.keys - [SERVICE_STOPPED]
325
327
 
326
- transition_service_state(service_name, valid_initial_states, SERVICE_STOPPED) do |service|
328
+ transition_service_state(service_name, valid_initial_states, SERVICE_STOPPED, timeout) do |service|
327
329
  send_service_control_signal(service, SERVICE_CONTROL_STOP)
328
330
  end
329
331
 
@@ -333,9 +335,10 @@ module Puppet::Util::Windows
333
335
 
334
336
  # Resume a paused windows service
335
337
  #
336
- # @param [:string] service_name name of the service to resume
337
- def resume(service_name)
338
- Puppet.debug _("Resuming the %{service_name} service") % { service_name: service_name }
338
+ # @param [String] service_name name of the service to resume
339
+ # @param optional [Integer] :timeout the minumum number of seconds to wait before timing out
340
+ def resume(service_name, timeout: DEFAULT_TIMEOUT)
341
+ Puppet.debug _("Resuming the %{service_name} service. Timeout set to: %{timeout} seconds") % { service_name: service_name, timeout: timeout }
339
342
 
340
343
  valid_initial_states = [
341
344
  SERVICE_PAUSE_PENDING,
@@ -343,10 +346,10 @@ module Puppet::Util::Windows
343
346
  SERVICE_CONTINUE_PENDING
344
347
  ]
345
348
 
346
- transition_service_state(service_name, valid_initial_states, SERVICE_RUNNING) do |service|
349
+ transition_service_state(service_name, valid_initial_states, SERVICE_RUNNING, timeout) do |service|
347
350
  # The SERVICE_CONTROL_CONTINUE signal can only be sent when
348
351
  # the service is in the SERVICE_PAUSED state
349
- wait_on_pending_state(service, SERVICE_PAUSE_PENDING)
352
+ wait_on_pending_state(service, SERVICE_PAUSE_PENDING, timeout)
350
353
 
351
354
  send_service_control_signal(service, SERVICE_CONTROL_CONTINUE)
352
355
  end
@@ -357,7 +360,7 @@ module Puppet::Util::Windows
357
360
 
358
361
  # Query the state of a service using QueryServiceStatusEx
359
362
  #
360
- # @param [:string] service_name name of the service to query
363
+ # @param [string] service_name name of the service to query
361
364
  # @return [string] the status of the service
362
365
  def service_state(service_name)
363
366
  state = nil
@@ -375,7 +378,7 @@ module Puppet::Util::Windows
375
378
 
376
379
  # Query the configuration of a service using QueryServiceConfigW
377
380
  #
378
- # @param [:string] service_name name of the service to query
381
+ # @param [String] service_name name of the service to query
379
382
  # @return [QUERY_SERVICE_CONFIGW.struct] the configuration of the service
380
383
  def service_start_type(service_name)
381
384
  start_type = nil
@@ -560,8 +563,9 @@ module Puppet::Util::Windows
560
563
  #
561
564
  # @param [String] service_name the name of the service to transition
562
565
  # @param [[Integer]] valid_initial_states an array of valid states that the service can transition from
563
- # @param [:Integer] final_state the state that the service will transition to
564
- def transition_service_state(service_name, valid_initial_states, final_state, &block)
566
+ # @param [Integer] final_state the state that the service will transition to
567
+ # @param [Integer] timeout the minumum number of seconds to wait before timing out
568
+ def transition_service_state(service_name, valid_initial_states, final_state, timeout, &block)
565
569
  service_access = SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_QUERY_STATUS
566
570
  open_service(service_name, SC_MANAGER_CONNECT, service_access) do |service|
567
571
  query_status(service) do |status|
@@ -593,7 +597,7 @@ module Puppet::Util::Windows
593
597
  end
594
598
  if possible_pending_states.include?(initial_state)
595
599
  Puppet.debug _("There is already a pending transition to the %{final_state} state for the %{service_name} service.") % { final_state: SERVICE_STATES[final_state], service_name: service_name }
596
- wait_on_pending_state(service, initial_state)
600
+ wait_on_pending_state(service, initial_state, timeout)
597
601
 
598
602
  next
599
603
  end
@@ -609,7 +613,7 @@ module Puppet::Util::Windows
609
613
  # to perform the state transition (it may not even exist).
610
614
  if UNSAFE_PENDING_STATES.include?(initial_state)
611
615
  Puppet.debug _("The service is in the %{pending_state} state, which is an unsafe pending state.") % { pending_state: SERVICE_STATES[initial_state] }
612
- wait_on_pending_state(service, initial_state)
616
+ wait_on_pending_state(service, initial_state, timeout)
613
617
  initial_state = FINAL_STATES[initial_state]
614
618
  end
615
619
 
@@ -618,7 +622,7 @@ module Puppet::Util::Windows
618
622
  yield service
619
623
 
620
624
  Puppet.debug _("Waiting for the transition to finish")
621
- wait_on_state_transition(service, initial_state, final_state)
625
+ wait_on_state_transition(service, initial_state, final_state, timeout)
622
626
  end
623
627
  end
624
628
  rescue => detail
@@ -726,7 +730,8 @@ module Puppet::Util::Windows
726
730
  # @param [:handle] service handle to the service to wait on
727
731
  # @param [Integer] initial_state the state that the service is transitioning from.
728
732
  # @param [Integer] final_state the state that the service is transitioning to
729
- def wait_on_state_transition(service, initial_state, final_state)
733
+ # @param [Integer] timeout the minumum number of seconds to wait before timing out
734
+ def wait_on_state_transition(service, initial_state, final_state, timeout)
730
735
  # Get the pending state for this transition. Note that SERVICE_RUNNING
731
736
  # has two possible pending states, which is why we need this logic.
732
737
  if final_state != SERVICE_RUNNING
@@ -742,14 +747,14 @@ module Puppet::Util::Windows
742
747
  # Wait for the transition to finish
743
748
  state = nil
744
749
  elapsed_time = 0
745
- while elapsed_time <= DEFAULT_TIMEOUT
750
+ while elapsed_time <= timeout
746
751
 
747
752
  query_status(service) do |status|
748
753
  state = status[:dwCurrentState]
749
754
  return if state == final_state
750
755
  if state == pending_state
751
756
  Puppet.debug _("The service transitioned to the %{pending_state} state.") % { pending_state: SERVICE_STATES[pending_state] }
752
- wait_on_pending_state(service, pending_state)
757
+ wait_on_pending_state(service, pending_state, timeout)
753
758
  return
754
759
  end
755
760
  sleep(1)
@@ -773,7 +778,8 @@ module Puppet::Util::Windows
773
778
  #
774
779
  # @param [:handle] service handle to the service to wait on
775
780
  # @param [Integer] pending_state the pending state
776
- def wait_on_pending_state(service, pending_state)
781
+ # @param [Integer] timeout the minumum number of seconds to wait before timing out
782
+ def wait_on_pending_state(service, pending_state, timeout)
777
783
  final_state = FINAL_STATES[pending_state]
778
784
 
779
785
  Puppet.debug _("Waiting for the pending transition to the %{final_state} state to finish.") % { final_state: SERVICE_STATES[final_state] }
@@ -800,8 +806,8 @@ module Puppet::Util::Windows
800
806
  elapsed_time = 0
801
807
  last_checkpoint = checkpoint
802
808
  else
803
- wait_hint_in_seconds = milliseconds_to_seconds(wait_hint)
804
- timeout = wait_hint_in_seconds < DEFAULT_TIMEOUT ? DEFAULT_TIMEOUT : wait_hint_in_seconds
809
+ wait_hint = milliseconds_to_seconds(status[:dwWaitHint])
810
+ timeout = wait_hint < timeout ? timeout : wait_hint
805
811
 
806
812
  if elapsed_time >= timeout
807
813
  raise Puppet::Error, _("Timed out while waiting for the pending transition from %{pending_state} to %{final_state} to finish. The current state is %{current_state}.") % { pending_state: SERVICE_STATES[pending_state], final_state: SERVICE_STATES[final_state], current_state: SERVICE_STATES[state] }
@@ -75,18 +75,15 @@ module Puppet::Util::Windows::User
75
75
  module_function :password_is?
76
76
 
77
77
  def logon_user(name, password, &block)
78
- fLOGON32_PROVIDER_DEFAULT = 0
79
- fLOGON32_LOGON_INTERACTIVE = 2
80
78
  fLOGON32_LOGON_NETWORK = 3
79
+ fLOGON32_PROVIDER_DEFAULT = 0
81
80
 
82
81
  token = nil
83
82
  begin
84
83
  FFI::MemoryPointer.new(:handle, 1) do |token_pointer|
85
- #try logon using network else try logon using interactive mode
86
- if logon_user_by_logon_type(name, password, fLOGON32_LOGON_NETWORK, fLOGON32_PROVIDER_DEFAULT, token_pointer) == FFI::WIN32_FALSE
87
- if logon_user_by_logon_type(name, password, fLOGON32_LOGON_INTERACTIVE, fLOGON32_PROVIDER_DEFAULT, token_pointer) == FFI::WIN32_FALSE
88
- raise Puppet::Util::Windows::Error.new(_("Failed to logon user %{name}") % {name: name.inspect})
89
- end
84
+ if LogonUserW(wide_string(name), wide_string('.'), password.nil? ? FFI::Pointer::NULL : wide_string(password),
85
+ fLOGON32_LOGON_NETWORK, fLOGON32_PROVIDER_DEFAULT, token_pointer) == FFI::WIN32_FALSE
86
+ raise Puppet::Util::Windows::Error.new(_("Failed to logon user %{name}") % { name: name.inspect })
90
87
  end
91
88
 
92
89
  yield token = token_pointer.read_handle
@@ -98,15 +95,8 @@ module Puppet::Util::Windows::User
98
95
  # token has been closed by this point
99
96
  true
100
97
  end
101
-
102
98
  module_function :logon_user
103
99
 
104
- def self.logon_user_by_logon_type(name, password, logon_type, logon_provider, token)
105
- LogonUserW(wide_string(name), wide_string('.'), password.nil? ? FFI::Pointer::NULL : wide_string(password), logon_type, logon_provider, token)
106
- end
107
-
108
- private_class_method :logon_user_by_logon_type
109
-
110
100
  def load_profile(user, password)
111
101
  logon_user(user, password) do |token|
112
102
  FFI::MemoryPointer.from_string_to_wide_string(user) do |lpUserName|
@@ -6,7 +6,7 @@
6
6
  # Raketasks and such to set the version based on the output of `git describe`
7
7
 
8
8
  module Puppet
9
- PUPPETVERSION = '6.0.10'
9
+ PUPPETVERSION = '6.1.0'
10
10
 
11
11
  ##
12
12
  # version is a public API method intended to always provide a fast and
@@ -1,1135 +1,8 @@
1
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
2
+ # This is the entry point when using PAL as a standalone library.
19
3
  #
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
4
+ # This requires all of puppet because 'settings' and many other things are still required in PAL.
5
+ # Eventually that will not be the case.
26
6
  #
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
-
368
- # Compiles the result of additional evaluation taking place in a PAL catalog compilation.
369
- # This will evaluate all lazy constructs until all have been evaluated, and will the validate
370
- # the result.
371
- #
372
- # This should be called if evaluating string or files of puppet logic after the initial
373
- # compilation taking place by giving PAL a manifest or code-string.
374
- # This method should be called when a series of evaluation should have reached a
375
- # valid state (there should be no dangling relationships (to resources that does not
376
- # exist).
377
- #
378
- # As an alternative the methods `evaluate_additions` can be called without any
379
- # requirements on consistency and then calling `validate` at the end.
380
- #
381
- # Can be called multiple times.
382
- #
383
- # @return [Void]
384
- def compile_additions
385
- internal_compiler.compile_additions
386
- end
387
-
388
- # Validates the state of the catalog (without performing evaluation of any elements
389
- # requiring lazy evaluation. Can be called multiple times.
390
- #
391
- def validate
392
- internal_compiler.validate
393
- end
394
-
395
- # Evaluates all lazy constructs that were produced as a side effect of evaluating puppet logic.
396
- # Can be called multiple times.
397
- #
398
- def evaluate_additions
399
- internal_compiler.evaluate_additions
400
- end
401
-
402
- end
403
-
404
- # The JsonCatalogEncoder is a wrapper around a catalog produced by the Pal::CatalogCompiler.with_json_encoding
405
- # method.
406
- # It allows encoding the entire catalog or an individual resource as Rich Data Json.
407
- #
408
- # @api public
409
- #
410
- class JsonCatalogEncoder
411
- # Is the resulting Json pretty printed or not.
412
- attr_reader :pretty
413
-
414
- # Should unrealized virtual resources be included in the result or not.
415
- attr_reader :exclude_virtual
416
-
417
- # The internal catalog being build - what this class wraps with a public API.
418
- attr_reader :catalog
419
- private :catalog
420
-
421
- # Do not instantiate this class directly! Use the `Pal::CatalogCompiler#with_json_encoding` method
422
- # instead.
423
- #
424
- # @param catalog [Puppet::Resource::Catalog] the internal catalog that this class wraps
425
- # @param pretty [Boolean] (true), if the resulting JSON should be pretty printed or not
426
- # @param exclude_virtual [Boolean] (true), if the resulting catalog should contain unrealzed virtual resources or not
427
- #
428
- # @api private
429
- #
430
- def initialize(catalog, pretty: true, exclude_virtual: true)
431
- @catalog = catalog
432
- @pretty = pretty
433
- @exclude_virtual = exclude_virtual
434
- end
435
-
436
- # Encodes the entire catalog as a rich-data Json catalog.
437
- # @return String The catalog in Json format using rich data format
438
- # @api public
439
- #
440
- def encode
441
- possibly_filtered_catalog.to_json(:pretty => pretty)
442
- end
443
-
444
- # Returns one particular resource as a Json string, or returns nil if resource was not found.
445
- # @param type [String] the name of the puppet type (case independent)
446
- # @param title [String] the title of the wanted resource
447
- # @return [String] the resulting Json text
448
- # @api public
449
- #
450
- def encode_resource(type, title)
451
- # Ensure that both type and title are given since the underlying API will do mysterious things
452
- # if 'title' is nil. (Other assertions are made by the catalog when looking up the resource).
453
- #
454
- # TRANSLATORS 'type' and 'title' are internal parameter names - do not translate
455
- raise ArgumentError, _("Both type and title must be given") if type.nil? or title.nil?
456
- r = possibly_filtered_catalog.resource(type, title)
457
- return nil if r.nil?
458
- r.to_data_hash.to_json(:pretty => pretty)
459
- end
460
-
461
- # Applies a filter for virtual resources and returns filtered catalog
462
- # or the catalog itself if filtering was not needed.
463
- # The result is cached.
464
- # @api private
465
- #
466
- def possibly_filtered_catalog
467
- @filtered ||= (exclude_virtual ? catalog.filter { |r| r.virtual? } : catalog)
468
- end
469
- private :possibly_filtered_catalog
470
- end
471
-
472
- # A FunctionSignature is returned from `function_signature`. Its purpose is to answer questions about the function's parameters
473
- # and if it can be called with a set of parameters.
474
- #
475
- # It is also possible to get an array of puppet Callable data type where each callable describes one possible way
476
- # the function can be called.
477
- #
478
- # @api public
479
- #
480
- class FunctionSignature
481
- # @api private
482
- def initialize(function_class)
483
- @func = function_class
484
- end
485
-
486
- # Returns true if the function can be called with the given arguments and false otherwise.
487
- # If the function is not callable, and a code block is given, it is given a formatted error message that describes
488
- # the type mismatch. That error message can be quite complex if the function has multiple dispatch depending on
489
- # given types.
490
- #
491
- # @param args [Array] The arguments as given to the function call
492
- # @param callable [Proc, nil] An optional ruby Proc or puppet lambda given to the function
493
- # @yield [String] a formatted error message describing a type mismatch if the function is not callable with given args + block
494
- # @return [Boolean] true if the function can be called with given args + block, and false otherwise
495
- # @api public
496
- #
497
- def callable_with?(args, callable=nil)
498
- signatures = @func.dispatcher.to_type
499
- callables = signatures.is_a?(Puppet::Pops::Types::PVariantType) ? signatures.types : [signatures]
500
-
501
- return true if callables.any? {|t| t.callable_with?(args) }
502
- return false unless block_given?
503
- args_type = Puppet::Pops::Types::TypeCalculator.singleton.infer_set(callable.nil? ? args : args + [callable])
504
- error_message = Puppet::Pops::Types::TypeMismatchDescriber.describe_signatures(@func.name, @func.signatures, args_type)
505
- yield error_message
506
- false
507
- end
508
-
509
- # Returns an array of Callable puppet data type
510
- # @return [Array<Puppet::Pops::Types::PCallableType] one callable per way the function can be called
511
- #
512
- # @api public
513
- #
514
- def callables
515
- signatures = @func.dispatcher.to_type
516
- signatures.is_a?(Puppet::Pops::Types::PVariantType) ? signatures.types : [signatures]
517
- end
518
- end
519
-
520
- # A TaskSignature is returned from `task_signature`. Its purpose is to answer questions about the task's parameters
521
- # and if it can be run/called with a hash of named parameters.
522
- #
523
- class TaskSignature
524
- def initialize(task)
525
- @task = task
526
- end
527
-
528
- # Returns whether or not the given arguments are acceptable when running the task.
529
- # In addition to returning the boolean outcome, if a block is given, it is called with a string of formatted
530
- # error messages that describes the difference between what was given and what is expected. The error message may
531
- # have multiple lines of text, and each line is indented one space.
532
- #
533
- # @param args_hash [Hash] a hash mapping parameter names to argument values
534
- # @yieldparam [String] a formatted error message if a type mismatch occurs that explains the mismatch
535
- # @return [Boolean] if the given arguments are acceptable when running the task
536
- #
537
- def runnable_with?(args_hash)
538
- params = @task.parameters
539
- params_type = if params.nil?
540
- T_GENERIC_TASK_HASH
541
- else
542
- Puppet::Pops::Types::TypeFactory.struct(params)
543
- end
544
- return true if params_type.instance?(args_hash)
545
-
546
- if block_given?
547
- tm = Puppet::Pops::Types::TypeMismatchDescriber.singleton
548
- error = if params.nil?
549
- tm.describe_mismatch('', params_type, Puppet::Pops::Types::TypeCalculator.infer_set(args_hash))
550
- else
551
- tm.describe_struct_signature(params_type, args_hash).flatten.map {|e| e.format }.join("\n")
552
- end
553
- yield "Task #{@task.name}:\n#{error}"
554
- end
555
- false
556
- end
557
-
558
- # Returns the Task instance as a hash
559
- #
560
- # @return [Hash{String=>Object}] the hash representation of the task
561
- def task_hash
562
- @task._pcore_init_hash
563
- end
564
-
565
- # Returns the Task instance which can be further explored. It contains all meta-data defined for
566
- # the task such as the description, parameters, output, etc.
567
- #
568
- # @return [Puppet::Pops::Types::PuppetObject] An instance of a dynamically created Task class
569
- def task
570
- @task
571
- end
572
- end
573
-
574
- # A PlanSignature is returned from `plan_signature`. Its purpose is to answer questions about the plans's parameters
575
- # and if it can be called with a hash of named parameters.
576
- #
577
- # @api public
578
- #
579
- class PlanSignature
580
- def initialize(plan_function)
581
- @plan_func = plan_function
582
- end
583
-
584
- # Returns true or false depending on if the given PlanSignature is callable with a set of named arguments or not
585
- # In addition to returning the boolean outcome, if a block is given, it is called with a string of formatted
586
- # error messages that describes the difference between what was given and what is expected. The error message may
587
- # have multiple lines of text, and each line is indented one space.
588
- #
589
- # @example Checking if signature is acceptable
590
- #
591
- # signature = pal.plan_signature('myplan')
592
- # signature.callable_with?({x => 10}) { |errors| raise ArgumentError("Ooops: given arguments does not match\n#{errors}") }
593
- #
594
- # @api public
595
- #
596
- def callable_with?(args_hash)
597
- dispatcher = @plan_func.class.dispatcher.dispatchers[0]
598
-
599
- param_scope = {}
600
- # Assign all non-nil values, even those that represent non-existent parameters.
601
- args_hash.each { |k, v| param_scope[k] = v unless v.nil? }
602
- dispatcher.parameters.each do |p|
603
- name = p.name
604
- arg = args_hash[name]
605
- if arg.nil?
606
- # Arg either wasn't given, or it was undef
607
- if p.value.nil?
608
- # No default. Assign nil if the args_hash included it
609
- param_scope[name] = nil if args_hash.include?(name)
610
- else
611
- # parameter does not have a default value, it will be assigned its default when being called
612
- # we assume that the default value is of the correct type and therefore simply skip
613
- # checking this
614
- # param_scope[name] = param_scope.evaluate(name, p.value, closure_scope, @evaluator)
615
- end
616
- end
617
- end
618
-
619
- errors = Puppet::Pops::Types::TypeMismatchDescriber.singleton.describe_struct_signature(dispatcher.params_struct, param_scope).flatten
620
- return true if errors.empty?
621
- if block_given?
622
- yield errors.map {|e| e.format }.join("\n")
623
- end
624
- false
625
- end
626
-
627
- # Returns a PStructType describing the parameters as a puppet Struct data type
628
- # Note that a `to_s` on the returned structure will result in a human readable Struct datatype as a
629
- # description of what a plan expects.
630
- #
631
- # @return [Puppet::Pops::Types::PStructType] a struct data type describing the parameters and their types
632
- #
633
- # @api public
634
- #
635
- def params_type
636
- dispatcher = @plan_func.class.dispatcher.dispatchers[0]
637
- dispatcher.params_struct
638
- end
639
- end
640
-
641
- # Defines a context in which multiple operations in an env with a script compiler can be performed in a given block.
642
- # The calls that takes place to PAL inside of the given block are all with the same instance of the compiler.
643
- # The parameter `configured_by_env` makes it possible to either use the configuration in the environment, or specify
644
- # `manifest_file` or `code_string` manually. If neither is given, an empty `code_string` is used.
645
- #
646
- # @example define a script compiler without any initial logic
647
- # pal.with_script_compiler do | compiler |
648
- # # do things with compiler
649
- # end
650
- #
651
- # @example define a script compiler with a code_string containing initial logic
652
- # pal.with_script_compiler(code_string: '$myglobal_var = 42') do | compiler |
653
- # # do things with compiler
654
- # end
655
- #
656
- # @param configured_by_env [Boolean] when true the environment's settings are used, otherwise the given `manifest_file` or `code_string`
657
- # @param manifest_file [String] a Puppet Language file to load and evaluate before calling the given block, mutually exclusive with `code_string`
658
- # @param code_string [String] a Puppet Language source string to load and evaluate before calling the given block, mutually exclusive with `manifest_file`
659
- # @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
660
- # If given at the environment level, the facts given here are merged with higher priority.
661
- # @param variables [Hash] optional map of fully qualified variable name to value. If given at the environment level, the variables
662
- # given here are merged with higher priority.
663
- # @param block [Proc] the block performing operations on compiler
664
- # @return [Object] what the block returns
665
- # @yieldparam [Puppet::Pal::ScriptCompiler] compiler, a ScriptCompiler to perform operations on.
666
- #
667
- def self.with_script_compiler(
668
- configured_by_env: false,
669
- manifest_file: nil,
670
- code_string: nil,
671
- facts: nil,
672
- variables: nil,
673
- &block
674
- )
675
- # TRANSLATORS: do not translate variable name strings in these assertions
676
- assert_mutually_exclusive(manifest_file, code_string, 'manifest_file', 'code_string')
677
- assert_non_empty_string(manifest_file, 'manifest_file', true)
678
- assert_non_empty_string(code_string, 'code_string', true)
679
- assert_type(T_BOOLEAN, configured_by_env, "configured_by_env", false)
680
-
681
- if configured_by_env
682
- unless manifest_file.nil? && code_string.nil?
683
- # TRANSLATORS: do not translate the variable names in this error message
684
- raise ArgumentError, _("manifest_file or code_string cannot be given when configured_by_env is true")
685
- end
686
- # Use the manifest setting
687
- manifest_file = Puppet[:manifest]
688
- else
689
- # An "undef" code_string is the only way to override Puppet[:manifest] & Puppet[:code] settings since an
690
- # empty string is taken as Puppet[:code] not being set.
691
- #
692
- if manifest_file.nil? && code_string.nil?
693
- code_string = 'undef'
694
- end
695
- end
696
-
697
- Puppet[:tasks] = true
698
- # After the assertions, if code_string is non nil - it has the highest precedence
699
- Puppet[:code] = code_string unless code_string.nil?
700
-
701
- # If manifest_file is nil, the #main method will use the env configured manifest
702
- # to do things in the block while a Script Compiler is in effect
703
- main(manifest_file, facts, variables, :script, &block)
704
- end
705
-
706
- # Evaluates a Puppet Language script string.
707
- # @param code_string [String] a snippet of Puppet Language source code
708
- # @return [Object] what the Puppet Language code_string evaluates to
709
- # @deprecated Use {#with_script_compiler} and then evaluate_string on the given compiler - to be removed in 1.0 version
710
- #
711
- def self.evaluate_script_string(code_string)
712
- # prevent the default loading of Puppet[:manifest] which is the environment's manifest-dir by default settings
713
- # by setting code_string to 'undef'
714
- with_script_compiler do |compiler|
715
- compiler.evaluate_string(code_string)
716
- end
717
- end
718
-
719
- # Evaluates a Puppet Language script (.pp) file.
720
- # @param manifest_file [String] a file with Puppet Language source code
721
- # @return [Object] what the Puppet Language manifest_file contents evaluates to
722
- # @deprecated Use {#with_script_compiler} and then evaluate_file on the given compiler - to be removed in 1.0 version
723
- #
724
- def self.evaluate_script_manifest(manifest_file)
725
- with_script_compiler do |compiler|
726
- compiler.evaluate_file(manifest_file)
727
- end
728
- end
729
-
730
- # Defines a context in which multiple operations in an env with a catalog producing compiler can be performed
731
- # in a given block.
732
- # The calls that takes place to PAL inside of the given block are all with the same instance of the compiler.
733
- # The parameter `configured_by_env` makes it possible to either use the configuration in the environment, or specify
734
- # `manifest_file` or `code_string` manually. If neither is given, an empty `code_string` is used.
735
- #
736
- # @example define a catalog compiler without any initial logic
737
- # pal.with_catalog_compiler do | compiler |
738
- # # do things with compiler
739
- # end
740
- #
741
- # @example define a catalog compiler with a code_string containing initial logic
742
- # pal.with_catalog_compiler(code_string: '$myglobal_var = 42') do | compiler |
743
- # # do things with compiler
744
- # end
745
- #
746
- # @param configured_by_env [Boolean] when true the environment's settings are used, otherwise the
747
- # given `manifest_file` or `code_string`
748
- # @param manifest_file [String] a Puppet Language file to load and evaluate before calling the given block, mutually exclusive
749
- # with `code_string`
750
- # @param code_string [String] a Puppet Language source string to load and evaluate before calling the given block, mutually
751
- # exclusive with `manifest_file`
752
- # @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
753
- # If given at the environment level, the facts given here are merged with higher priority.
754
- # @param variables [Hash] optional map of fully qualified variable name to value. If given at the environment level, the variables
755
- # given here are merged with higher priority.
756
- # @param block [Proc] the block performing operations on compiler
757
- # @return [Object] what the block returns
758
- # @yieldparam [Puppet::Pal::CatalogCompiler] compiler, a CatalogCompiler to perform operations on.
759
- #
760
- def self.with_catalog_compiler(
761
- configured_by_env: false,
762
- manifest_file: nil,
763
- code_string: nil,
764
- facts: nil,
765
- variables: nil,
766
- &block
767
- )
768
- # TRANSLATORS: do not translate variable name strings in these assertions
769
- assert_mutually_exclusive(manifest_file, code_string, 'manifest_file', 'code_string')
770
- assert_non_empty_string(manifest_file, 'manifest_file', true)
771
- assert_non_empty_string(code_string, 'code_string', true)
772
- assert_type(T_BOOLEAN, configured_by_env, "configured_by_env", false)
773
-
774
- if configured_by_env
775
- unless manifest_file.nil? && code_string.nil?
776
- # TRANSLATORS: do not translate the variable names in this error message
777
- raise ArgumentError, _("manifest_file or code_string cannot be given when configured_by_env is true")
778
- end
779
- # Use the manifest setting
780
- manifest_file = Puppet[:manifest]
781
- else
782
- # An "undef" code_string is the only way to override Puppet[:manifest] & Puppet[:code] settings since an
783
- # empty string is taken as Puppet[:code] not being set.
784
- #
785
- if manifest_file.nil? && code_string.nil?
786
- code_string = 'undef'
787
- end
788
- end
789
-
790
- Puppet[:tasks] = false
791
- # After the assertions, if code_string is non nil - it has the highest precedence
792
- Puppet[:code] = code_string unless code_string.nil?
793
-
794
- # If manifest_file is nil, the #main method will use the env configured manifest
795
- # to do things in the block while a Script Compiler is in effect
796
- main(manifest_file, facts, variables, :catalog, &block)
797
- end
798
-
799
- # Defines the context in which to perform puppet operations (evaluation, etc)
800
- # The code to evaluate in this context is given in a block.
801
- #
802
- # @param env_name [String] a name to use for the temporary environment - this only shows up in errors
803
- # @param modulepath [Array<String>] an array of directory paths containing Puppet modules, may be empty, defaults to empty array
804
- # @param settings_hash [Hash] a hash of settings - currently not used for anything, defaults to empty hash
805
- # @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
806
- # @param variables [Hash] optional map of fully qualified variable name to value
807
- # @return [Object] returns what the given block returns
808
- # @yieldparam [Puppet::Pal] context, a context that responds to Puppet::Pal methods
809
- #
810
- def self.in_tmp_environment(env_name,
811
- modulepath: [],
812
- settings_hash: {},
813
- facts: nil,
814
- variables: {},
815
- &block
816
- )
817
- assert_non_empty_string(env_name, _("temporary environment name"))
818
- # TRANSLATORS: do not translate variable name string in these assertions
819
- assert_optionally_empty_array(modulepath, 'modulepath')
820
-
821
- unless block_given?
822
- raise ArgumentError, _("A block must be given to 'in_tmp_environment'") # TRANSLATORS 'in_tmp_environment' is a name, do not translate
823
- end
824
-
825
- env = Puppet::Node::Environment.create(env_name, modulepath)
826
-
827
- in_environment_context(
828
- Puppet::Environments::Static.new(env), # The tmp env is the only known env
829
- env, facts, variables, &block
830
- )
831
- end
832
-
833
- # Defines the context in which to perform puppet operations (evaluation, etc)
834
- # The code to evaluate in this context is given in a block.
835
- #
836
- # The name of an environment (env_name) is always given. The location of that environment on disk
837
- # is then either constructed by:
838
- # * searching a given envpath where name is a child of a directory on that path, or
839
- # * it is the directory given in env_dir (which must exist).
840
- #
841
- # The env_dir and envpath options are mutually exclusive.
842
- #
843
- # @param env_name [String] the name of an existing environment
844
- # @param modulepath [Array<String>] an array of directory paths containing Puppet modules, overrides the modulepath of an existing env.
845
- # Defaults to `{env_dir}/modules` if `env_dir` is given,
846
- # @param pre_modulepath [Array<String>] like modulepath, but is prepended to the modulepath
847
- # @param post_modulepath [Array<String>] like modulepath, but is appended to the modulepath
848
- # @param settings_hash [Hash] a hash of settings - currently not used for anything, defaults to empty hash
849
- # @param env_dir [String] a reference to a directory being the named environment (mutually exclusive with `envpath`)
850
- # @param envpath [String] a path of directories in which there are environments to search for `env_name` (mutually exclusive with `env_dir`).
851
- # Should be a single directory, or several directories separated with platform specific `File::PATH_SEPARATOR` character.
852
- # @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
853
- # @param variables [Hash] optional map of fully qualified variable name to value
854
- # @return [Object] returns what the given block returns
855
- # @yieldparam [Puppet::Pal] context, a context that responds to Puppet::Pal methods
856
- #
857
- def self.in_environment(env_name,
858
- modulepath: nil,
859
- pre_modulepath: [],
860
- post_modulepath: [],
861
- settings_hash: {},
862
- env_dir: nil,
863
- envpath: nil,
864
- facts: nil,
865
- variables: {},
866
- &block
867
- )
868
- # TRANSLATORS terms in the assertions below are names of terms in code
869
- assert_non_empty_string(env_name, 'env_name')
870
- assert_optionally_empty_array(modulepath, 'modulepath', true)
871
- assert_optionally_empty_array(pre_modulepath, 'pre_modulepath', false)
872
- assert_optionally_empty_array(post_modulepath, 'post_modulepath', false)
873
- assert_mutually_exclusive(env_dir, envpath, 'env_dir', 'envpath')
874
-
875
- unless block_given?
876
- raise ArgumentError, _("A block must be given to 'in_environment'") # TRANSLATORS 'in_environment' is a name, do not translate
877
- end
878
-
879
- if env_dir
880
- unless Puppet::FileSystem.exist?(env_dir)
881
- raise ArgumentError, _("The environment directory '%{env_dir}' does not exist") % { env_dir: env_dir }
882
- end
883
-
884
- # a nil modulepath for env_dir means it should use its ./modules directory
885
- mid_modulepath = modulepath.nil? ? [Puppet::FileSystem.expand_path(File.join(env_dir, 'modules'))] : modulepath
886
-
887
- env = Puppet::Node::Environment.create(env_name, pre_modulepath + mid_modulepath + post_modulepath)
888
- environments = Puppet::Environments::StaticDirectory.new(env_name, env_dir, env) # The env being used is the only one...
889
- else
890
- assert_non_empty_string(envpath, 'envpath')
891
-
892
- # The environment is resolved against the envpath. This is setup without a basemodulepath
893
- # The modulepath defaults to the 'modulepath' in the found env when "Directories" is used
894
- #
895
- if envpath.is_a?(String) && envpath.include?(File::PATH_SEPARATOR)
896
- # potentially more than one directory to search
897
- env_loaders = Puppet::Environments::Directories.from_path(envpath, [])
898
- environments = Puppet::Environments::Combined.new(*env_loaders)
899
- else
900
- environments = Puppet::Environments::Directories.new(envpath, [])
901
- end
902
- env = environments.get(env_name)
903
- if env.nil?
904
- raise ArgumentError, _("No directory found for the environment '%{env_name}' on the path '%{envpath}'") % { env_name: env_name, envpath: envpath }
905
- end
906
- # A given modulepath should override the default
907
- mid_modulepath = modulepath.nil? ? env.modulepath : modulepath
908
- env_path = env.configuration.path_to_env
909
- env = env.override_with(:modulepath => pre_modulepath + mid_modulepath + post_modulepath)
910
- # must configure this in case logic looks up the env by name again (otherwise the looked up env does
911
- # not have the same effective modulepath).
912
- environments = Puppet::Environments::StaticDirectory.new(env_name, env_path, env) # The env being used is the only one...
913
- end
914
- in_environment_context(environments, env, facts, variables, &block)
915
- end
916
-
917
- # Prepares the puppet context with pal information - and delegates to the block
918
- # No set up is performed at this step - it is delayed until it is known what the
919
- # operation is going to be (for example - using a ScriptCompiler).
920
- #
921
- def self.in_environment_context(environments, env, facts, variables, &block)
922
- # Create a default node to use (may be overridden later)
923
- node = Puppet::Node.new(Puppet[:node_name_value], :environment => env)
924
-
925
- Puppet.override(
926
- environments: environments, # The env being used is the only one...
927
- pal_env: env, # provide as convenience
928
- pal_current_node: node, # to allow it to be picked up instead of created
929
- pal_variables: variables, # common set of variables across several inner contexts
930
- pal_facts: facts # common set of facts across several inner contexts (or nil)
931
- ) do
932
- # DELAY: prepare_node_facts(node, facts)
933
- return block.call(self)
934
- end
935
- end
936
- private_class_method :in_environment_context
937
-
938
- # Prepares the node for use by giving it node_facts (if given)
939
- # If a hash of facts values is given, then the operation of creating a node with facts is much
940
- # speeded up (as getting a fresh set of facts is avoided in a later step).
941
- #
942
- def self.prepare_node_facts(node, facts)
943
- # Prepare the node with facts if it does not already have them
944
- if node.facts.nil?
945
- node_facts = facts.nil? ? nil : Puppet::Node::Facts.new(Puppet[:node_name_value], facts)
946
- node.fact_merge(node_facts)
947
- # Add server facts so $server_facts[environment] exists when doing a puppet script
948
- # SCRIPT TODO: May be needed when running scripts under orchestrator. Leave it for now.
949
- #
950
- node.add_server_facts({})
951
- end
952
- end
953
- private_class_method :prepare_node_facts
954
-
955
- def self.add_variables(scope, variables)
956
- return if variables.nil?
957
- unless variables.is_a?(Hash)
958
- raise ArgumentError, _("Given variables must be a hash, got %{type}") % { type: variables.class }
959
- end
960
-
961
- rich_data_t = Puppet::Pops::Types::TypeFactory.rich_data
962
- variables.each_pair do |k,v|
963
- unless k =~ Puppet::Pops::Patterns::VAR_NAME
964
- raise ArgumentError, _("Given variable '%{varname}' has illegal name") % { varname: k }
965
- end
966
-
967
- unless rich_data_t.instance?(v)
968
- raise ArgumentError, _("Given value for '%{varname}' has illegal type - got: %{type}") % { varname: k, type: v.class }
969
- end
970
-
971
- scope.setvar(k, v)
972
- end
973
- end
974
- private_class_method :add_variables
975
-
976
- # The main routine for script compiler
977
- # Picks up information from the puppet context and configures a script compiler which is given to
978
- # the provided block
979
- #
980
- def self.main(manifest, facts, variables, internal_compiler_class)
981
- # Configure the load path
982
- env = Puppet.lookup(:pal_env)
983
- env.each_plugin_directory do |dir|
984
- $LOAD_PATH << dir unless $LOAD_PATH.include?(dir)
985
- end
986
-
987
- # Puppet requires Facter, which initializes its lookup paths. Reset Facter to
988
- # pickup the new $LOAD_PATH.
989
- Facter.reset
990
-
991
- node = Puppet.lookup(:pal_current_node)
992
- pal_facts = Puppet.lookup(:pal_facts)
993
- pal_variables = Puppet.lookup(:pal_variables)
994
-
995
- overrides = {}
996
- unless facts.nil? || facts.empty?
997
- pal_facts = pal_facts.merge(facts)
998
- overrides[:pal_facts] = pal_facts
999
- end
1000
- unless variables.nil? || variables.empty?
1001
- pal_variables = pal_variables.merge(variables)
1002
- overrides[:pal_variables] = pal_variables
1003
- end
1004
-
1005
- prepare_node_facts(node, pal_facts)
1006
-
1007
- configured_environment = node.environment || Puppet.lookup(:current_environment)
1008
-
1009
- apply_environment = manifest ?
1010
- configured_environment.override_with(:manifest => manifest) :
1011
- configured_environment
1012
-
1013
- # Modify the node descriptor to use the special apply_environment.
1014
- # It is based on the actual environment from the node, or the locally
1015
- # configured environment if the node does not specify one.
1016
- # If a manifest file is passed on the command line, it overrides
1017
- # the :manifest setting of the apply_environment.
1018
- node.environment = apply_environment
1019
-
1020
- # TRANSLATORS, the string "For puppet PAL" is not user facing
1021
- Puppet.override({:current_environment => apply_environment}, "For puppet PAL") do
1022
- begin
1023
- # support the following features when evaluating puppet code
1024
- # * $facts with facts from host running the script
1025
- # * $settings with 'settings::*' namespace populated, and '$settings::all_local' hash
1026
- # * $trusted as setup when using puppet apply
1027
- # * an environment
1028
- #
1029
-
1030
- # fixup trusted information
1031
- node.sanitize()
1032
-
1033
- compiler = create_internal_compiler(internal_compiler_class, node)
1034
- # compiler = Puppet::Parser::ScriptCompiler.new(node.environment, node.name)
1035
- topscope = compiler.topscope
1036
-
1037
- # When scripting the trusted data are always local, but set them anyway
1038
- # When compiling for a catalog, the catalog compiler does this
1039
- unless internal_compiler_class == :catalog
1040
- topscope.set_trusted(node.trusted_data)
1041
-
1042
- # Server facts are always about the local node's version etc.
1043
- topscope.set_server_facts(node.server_facts)
1044
-
1045
- # Set $facts for the node running the script
1046
- facts_hash = node.facts.nil? ? {} : node.facts.values
1047
- topscope.set_facts(facts_hash)
1048
-
1049
- # create the $settings:: variables
1050
- topscope.merge_settings(node.environment.name, false)
1051
- end
1052
-
1053
- add_variables(topscope, pal_variables)
1054
-
1055
- case internal_compiler_class
1056
- when :script
1057
- pal_compiler = ScriptCompiler.new(compiler)
1058
- overrides[:pal_script_compiler] = overrides[:pal_compiler] = pal_compiler
1059
- when :catalog
1060
- pal_compiler = CatalogCompiler.new(compiler)
1061
- overrides[:pal_catalog_compiler] = overrides[:pal_compiler] = pal_compiler
1062
- end
1063
-
1064
- # Make compiler available to Puppet#lookup and injection in functions
1065
- # TODO: The compiler instances should be available under non PAL use as well!
1066
- # TRANSLATORS: Do not translate, symbolic name
1067
- Puppet.override(overrides, "PAL::with_#{internal_compiler_class}_compiler") do
1068
- compiler.compile do | compiler_yield |
1069
- # wrap the internal compiler to prevent it from leaking in the PAL API
1070
- if block_given?
1071
- yield(pal_compiler)
1072
- end
1073
- end
1074
- end
1075
-
1076
- rescue Puppet::ParseErrorWithIssue, Puppet::Error
1077
- # already logged and handled by the compiler for these two cases
1078
- raise
1079
-
1080
- rescue => detail
1081
- Puppet.log_exception(detail)
1082
- raise
1083
- end
1084
- end
1085
- end
1086
- private_class_method :main
1087
-
1088
- def self.create_internal_compiler(compiler_class_reference, node)
1089
- case compiler_class_reference
1090
- when :script
1091
- Puppet::Parser::ScriptCompiler.new(node.environment, node.name)
1092
- when :catalog
1093
- Puppet::Parser::CatalogCompiler.new(node)
1094
- else
1095
- raise ArgumentError, "Internal Error: Invalid compiler type requested."
1096
- end
1097
- end
1098
-
1099
- T_STRING = Puppet::Pops::Types::PStringType::NON_EMPTY
1100
- T_STRING_ARRAY = Puppet::Pops::Types::TypeFactory.array_of(T_STRING)
1101
- T_ANY_ARRAY = Puppet::Pops::Types::TypeFactory.array_of_any
1102
- T_BOOLEAN = Puppet::Pops::Types::PBooleanType::DEFAULT
1103
-
1104
- T_GENERIC_TASK_HASH = Puppet::Pops::Types::TypeFactory.hash_kv(
1105
- Puppet::Pops::Types::TypeFactory.pattern(/\A[a-z][a-z0-9_]*\z/), Puppet::Pops::Types::TypeFactory.data)
1106
-
1107
- def self.assert_type(type, value, what, allow_nil=false)
1108
- Puppet::Pops::Types::TypeAsserter.assert_instance_of(nil, type, value, allow_nil) { _('Puppet Pal: %{what}') % {what: what} }
1109
- end
1110
-
1111
- def self.assert_non_empty_string(s, what, allow_nil=false)
1112
- assert_type(T_STRING, s, what, allow_nil)
1113
- end
1114
-
1115
- def self.assert_optionally_empty_array(a, what, allow_nil=false)
1116
- assert_type(T_STRING_ARRAY, a, what, allow_nil)
1117
- end
1118
- private_class_method :assert_optionally_empty_array
1119
-
1120
- def self.assert_mutually_exclusive(a, b, a_term, b_term)
1121
- if a && b
1122
- raise ArgumentError, _("Cannot use '%{a_term}' and '%{b_term}' at the same time") % { a_term: a_term, b_term: b_term }
1123
- end
1124
- end
1125
- private_class_method :assert_mutually_exclusive
1126
-
1127
- def self.assert_block_given(block)
1128
- if block.nil?
1129
- raise ArgumentError, _("A block must be given")
1130
- end
1131
- end
1132
- private_class_method :assert_block_given
1133
- end
1134
- end
1135
-
7
+ require 'puppet'
8
+ require 'puppet/pal/pal_api'