puppet 4.5.3-universal-darwin → 4.6.1-universal-darwin

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 (422) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -1
  3. data/ext/debian/control +2 -4
  4. data/ext/project_data.yaml +4 -4
  5. data/install.rb +6 -2
  6. data/lib/puppet.rb +3 -1
  7. data/lib/puppet/agent/locker.rb +1 -1
  8. data/lib/puppet/application.rb +6 -4
  9. data/lib/puppet/application/agent.rb +2 -1
  10. data/lib/puppet/application/cert.rb +35 -2
  11. data/lib/puppet/application/device.rb +1 -1
  12. data/lib/puppet/application/generate.rb +5 -0
  13. data/lib/puppet/application/lookup.rb +3 -3
  14. data/lib/puppet/application_support.rb +1 -1
  15. data/lib/puppet/compilable_resource_type.rb +15 -0
  16. data/lib/puppet/configurer.rb +67 -10
  17. data/lib/puppet/configurer/plugin_handler.rb +2 -4
  18. data/lib/puppet/data_providers/hiera_config.rb +1 -1
  19. data/lib/puppet/defaults.rb +34 -7
  20. data/lib/puppet/environments.rb +4 -2
  21. data/lib/puppet/error.rb +1 -1
  22. data/lib/puppet/external/dot.rb +1 -1
  23. data/lib/puppet/face/ca.rb +4 -1
  24. data/lib/puppet/face/certificate.rb +7 -1
  25. data/lib/puppet/face/epp.rb +5 -5
  26. data/lib/puppet/face/generate.rb +64 -0
  27. data/lib/puppet/face/help.rb +19 -13
  28. data/lib/puppet/face/man.rb +1 -1
  29. data/lib/puppet/feature/external_facts.rb +1 -1
  30. data/lib/puppet/file_system.rb +16 -0
  31. data/lib/puppet/file_system/file_impl.rb +5 -0
  32. data/lib/puppet/file_system/memory_impl.rb +4 -0
  33. data/lib/puppet/file_system/path_pattern.rb +1 -0
  34. data/lib/puppet/file_system/windows.rb +19 -0
  35. data/lib/puppet/functions.rb +3 -5
  36. data/lib/puppet/functions/assert_type.rb +1 -1
  37. data/lib/puppet/functions/defined.rb +7 -5
  38. data/lib/puppet/functions/dig.rb +2 -18
  39. data/lib/puppet/functions/hiera.rb +1 -1
  40. data/lib/puppet/functions/lest.rb +1 -37
  41. data/lib/puppet/functions/new.rb +2 -473
  42. data/lib/puppet/functions/reverse_each.rb +2 -59
  43. data/lib/puppet/functions/scanf.rb +4 -4
  44. data/lib/puppet/functions/step.rb +1 -63
  45. data/lib/puppet/functions/then.rb +1 -61
  46. data/lib/puppet/functions/type.rb +1 -40
  47. data/lib/puppet/functions/unwrap.rb +40 -0
  48. data/lib/puppet/generate/models/type/property.rb +70 -0
  49. data/lib/puppet/generate/models/type/type.rb +57 -0
  50. data/lib/puppet/generate/templates/type/pcore.erb +41 -0
  51. data/lib/puppet/generate/type.rb +239 -0
  52. data/lib/puppet/graph/simple_graph.rb +2 -6
  53. data/lib/puppet/indirector/catalog/static_compiler.rb +5 -2
  54. data/lib/puppet/indirector/facts/facter.rb +1 -1
  55. data/lib/puppet/indirector/key/ca.rb +2 -2
  56. data/lib/puppet/indirector/request.rb +25 -4
  57. data/lib/puppet/indirector/rest.rb +73 -3
  58. data/lib/puppet/info_service/class_information_service.rb +1 -2
  59. data/lib/puppet/interface/documentation.rb +1 -1
  60. data/lib/puppet/loaders.rb +2 -0
  61. data/lib/puppet/metatype/manager.rb +6 -6
  62. data/lib/puppet/module.rb +8 -1
  63. data/lib/puppet/module_tool.rb +2 -2
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +2 -2
  66. data/lib/puppet/module_tool/metadata.rb +1 -1
  67. data/lib/puppet/network/http/api/indirected_routes.rb +23 -32
  68. data/lib/puppet/network/http/rack/rest.rb +15 -1
  69. data/lib/puppet/network/rights.rb +1 -11
  70. data/lib/puppet/node/environment.rb +7 -3
  71. data/lib/puppet/node/facts.rb +1 -1
  72. data/lib/puppet/parameter.rb +23 -3
  73. data/lib/puppet/parameter/boolean.rb +1 -1
  74. data/lib/puppet/parameter/value.rb +1 -1
  75. data/lib/puppet/parser.rb +0 -1
  76. data/lib/puppet/parser/ast/pops_bridge.rb +1 -1
  77. data/lib/puppet/parser/ast/resource.rb +5 -0
  78. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  79. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  80. data/lib/puppet/parser/compiler.rb +14 -17
  81. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +1 -1
  82. data/lib/puppet/parser/environment_compiler.rb +10 -0
  83. data/lib/puppet/parser/functions/create_resources.rb +39 -24
  84. data/lib/puppet/parser/functions/defined.rb +2 -26
  85. data/lib/puppet/parser/functions/dig.rb +29 -0
  86. data/lib/puppet/parser/functions/lest.rb +49 -0
  87. data/lib/puppet/parser/functions/new.rb +530 -0
  88. data/lib/puppet/parser/functions/require.rb +1 -1
  89. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  90. data/lib/puppet/parser/functions/scanf.rb +4 -4
  91. data/lib/puppet/parser/functions/step.rb +84 -0
  92. data/lib/puppet/parser/functions/then.rb +73 -0
  93. data/lib/puppet/parser/functions/type.rb +53 -0
  94. data/lib/puppet/parser/resource.rb +16 -7
  95. data/lib/puppet/parser/scope.rb +36 -28
  96. data/lib/puppet/parser/type_loader.rb +1 -1
  97. data/lib/puppet/plugins/data_providers/data_provider.rb +1 -1
  98. data/lib/puppet/pops.rb +13 -0
  99. data/lib/puppet/pops/adapters.rb +49 -49
  100. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
  101. data/lib/puppet/pops/evaluator/access_operator.rb +39 -2
  102. data/lib/puppet/pops/evaluator/closure.rb +39 -13
  103. data/lib/puppet/pops/evaluator/collector_transformer.rb +10 -1
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +16 -11
  105. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  106. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +0 -1
  107. data/lib/puppet/pops/evaluator/literal_evaluator.rb +0 -1
  108. data/lib/puppet/pops/evaluator/relationship_operator.rb +1 -2
  109. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  110. data/lib/puppet/pops/evaluator/runtime3_support.rb +19 -45
  111. data/lib/puppet/pops/functions/function.rb +5 -0
  112. data/lib/puppet/pops/issues.rb +1 -1
  113. data/lib/puppet/pops/label_provider.rb +2 -2
  114. data/lib/puppet/pops/loader/base_loader.rb +12 -15
  115. data/lib/puppet/pops/loader/loader.rb +15 -50
  116. data/lib/puppet/pops/loader/loader_paths.rb +28 -2
  117. data/lib/puppet/pops/loader/module_loaders.rb +16 -1
  118. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  119. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +12 -11
  120. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  121. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +2 -3
  122. data/lib/puppet/pops/loader/runtime3_type_loader.rb +52 -13
  123. data/lib/puppet/pops/loader/static_loader.rb +55 -0
  124. data/lib/puppet/pops/loader/type_definition_instantiator.rb +30 -14
  125. data/lib/puppet/pops/loader/typed_name.rb +50 -0
  126. data/lib/puppet/pops/loaders.rb +64 -19
  127. data/lib/puppet/pops/merge_strategy.rb +7 -7
  128. data/lib/puppet/pops/migration/migration_checker.rb +4 -0
  129. data/lib/puppet/pops/model/model_label_provider.rb +2 -0
  130. data/lib/puppet/pops/parser/egrammar.ra +8 -5
  131. data/lib/puppet/pops/parser/eparser.rb +1550 -1498
  132. data/lib/puppet/pops/parser/evaluating_parser.rb +1 -1
  133. data/lib/puppet/pops/parser/interpolation_support.rb +7 -0
  134. data/lib/puppet/pops/parser/lexer2.rb +14 -1
  135. data/lib/puppet/pops/parser/locator.rb +30 -1
  136. data/lib/puppet/pops/parser/parser_support.rb +0 -3
  137. data/lib/puppet/pops/parser/slurp_support.rb +3 -3
  138. data/lib/puppet/pops/patterns.rb +9 -1
  139. data/lib/puppet/pops/pcore.rb +67 -11
  140. data/lib/puppet/pops/puppet_stack.rb +43 -0
  141. data/lib/puppet/pops/resource/param.rb +51 -0
  142. data/lib/puppet/pops/resource/resource_type_impl.rb +301 -0
  143. data/lib/puppet/pops/resource/resource_type_set.pcore +21 -0
  144. data/lib/puppet/pops/serialization.rb +17 -0
  145. data/lib/puppet/pops/serialization/abstract_reader.rb +149 -0
  146. data/lib/puppet/pops/serialization/abstract_writer.rb +179 -0
  147. data/lib/puppet/pops/serialization/deserializer.rb +60 -0
  148. data/lib/puppet/pops/serialization/extension.rb +126 -0
  149. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  150. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  151. data/lib/puppet/pops/serialization/json.rb +247 -0
  152. data/lib/puppet/pops/serialization/object.rb +63 -0
  153. data/lib/puppet/pops/serialization/rgen.rb +151 -0
  154. data/lib/puppet/pops/serialization/serializer.rb +91 -0
  155. data/lib/puppet/pops/serialization/time_factory.rb +66 -0
  156. data/lib/puppet/pops/types/annotatable.rb +36 -0
  157. data/lib/puppet/pops/types/implementation_registry.rb +3 -8
  158. data/lib/puppet/pops/types/p_meta_type.rb +83 -0
  159. data/lib/puppet/pops/types/p_object_type.rb +110 -117
  160. data/lib/puppet/pops/types/p_runtime_type.rb +13 -0
  161. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +23 -0
  162. data/lib/puppet/pops/types/p_sem_ver_type.rb +30 -2
  163. data/lib/puppet/pops/types/p_sensitive_type.rb +69 -0
  164. data/lib/puppet/pops/types/p_type_set_type.rb +361 -0
  165. data/lib/puppet/pops/types/puppet_object.rb +0 -5
  166. data/lib/puppet/pops/types/ruby_generator.rb +9 -2
  167. data/lib/puppet/pops/types/type_calculator.rb +6 -1
  168. data/lib/puppet/pops/types/type_factory.rb +14 -12
  169. data/lib/puppet/pops/types/type_formatter.rb +78 -33
  170. data/lib/puppet/pops/types/type_mismatch_describer.rb +0 -2
  171. data/lib/puppet/pops/types/type_parser.rb +27 -2
  172. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  173. data/lib/puppet/pops/types/types.rb +366 -13
  174. data/lib/puppet/pops/validation.rb +4 -4
  175. data/lib/puppet/pops/validation/checker4_0.rb +5 -2
  176. data/lib/puppet/pops/visitor.rb +2 -2
  177. data/lib/puppet/property.rb +64 -5
  178. data/lib/puppet/provider.rb +1 -1
  179. data/lib/puppet/provider/aixobject.rb +3 -3
  180. data/lib/puppet/provider/group/aix.rb +4 -4
  181. data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
  182. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  183. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -2
  184. data/lib/puppet/provider/mount/parsed.rb +1 -1
  185. data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
  186. data/lib/puppet/provider/package/appdmg.rb +3 -3
  187. data/lib/puppet/provider/package/apple.rb +1 -1
  188. data/lib/puppet/provider/package/dnf.rb +5 -0
  189. data/lib/puppet/provider/package/nim.rb +1 -1
  190. data/lib/puppet/provider/package/pacman.rb +2 -2
  191. data/lib/puppet/provider/package/pip.rb +5 -3
  192. data/lib/puppet/provider/package/pip3.rb +1 -1
  193. data/lib/puppet/provider/package/pkg.rb +5 -5
  194. data/lib/puppet/provider/package/pkgdmg.rb +4 -4
  195. data/lib/puppet/provider/package/pkgin.rb +1 -1
  196. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  197. data/lib/puppet/provider/package/portage.rb +48 -8
  198. data/lib/puppet/provider/package/sun.rb +1 -1
  199. data/lib/puppet/provider/package/tdnf.rb +28 -0
  200. data/lib/puppet/provider/package/yum.rb +22 -4
  201. data/lib/puppet/provider/parsedfile.rb +2 -2
  202. data/lib/puppet/provider/service/base.rb +1 -1
  203. data/lib/puppet/provider/service/bsd.rb +1 -1
  204. data/lib/puppet/provider/service/daemontools.rb +2 -2
  205. data/lib/puppet/provider/service/debian.rb +3 -3
  206. data/lib/puppet/provider/service/init.rb +5 -3
  207. data/lib/puppet/provider/service/launchd.rb +16 -2
  208. data/lib/puppet/provider/service/runit.rb +1 -1
  209. data/lib/puppet/provider/service/smf.rb +8 -1
  210. data/lib/puppet/provider/service/systemd.rb +39 -6
  211. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +3 -2
  213. data/lib/puppet/provider/user/directoryservice.rb +4 -3
  214. data/lib/puppet/provider/user/hpux.rb +1 -1
  215. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  216. data/lib/puppet/provider/user/windows_adsi.rb +3 -0
  217. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  218. data/lib/puppet/reference/type.rb +1 -1
  219. data/lib/puppet/resource.rb +33 -7
  220. data/lib/puppet/resource/capability_finder.rb +74 -54
  221. data/lib/puppet/resource/status.rb +11 -2
  222. data/lib/puppet/settings.rb +17 -6
  223. data/lib/puppet/settings/environment_conf.rb +1 -1
  224. data/lib/puppet/settings/server_list_setting.rb +20 -0
  225. data/lib/puppet/ssl/certificate_authority.rb +32 -9
  226. data/lib/puppet/ssl/certificate_authority/interface.rb +164 -24
  227. data/lib/puppet/ssl/host.rb +3 -3
  228. data/lib/puppet/ssl/oids.rb +10 -0
  229. data/lib/puppet/ssl/validator/default_validator.rb +2 -2
  230. data/lib/puppet/test/test_helper.rb +2 -2
  231. data/lib/puppet/transaction.rb +12 -0
  232. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  233. data/lib/puppet/transaction/event.rb +29 -2
  234. data/lib/puppet/transaction/event_manager.rb +1 -1
  235. data/lib/puppet/transaction/persistence.rb +84 -0
  236. data/lib/puppet/transaction/report.rb +49 -2
  237. data/lib/puppet/transaction/resource_harness.rb +98 -18
  238. data/lib/puppet/type.rb +63 -21
  239. data/lib/puppet/type/augeas.rb +3 -3
  240. data/lib/puppet/type/cron.rb +1 -1
  241. data/lib/puppet/type/file.rb +39 -2
  242. data/lib/puppet/type/file/data_sync.rb +13 -5
  243. data/lib/puppet/type/host.rb +1 -1
  244. data/lib/puppet/type/mount.rb +2 -6
  245. data/lib/puppet/type/notify.rb +1 -1
  246. data/lib/puppet/type/package.rb +1 -1
  247. data/lib/puppet/type/resources.rb +1 -1
  248. data/lib/puppet/type/scheduled_task.rb +1 -1
  249. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  250. data/lib/puppet/type/tidy.rb +1 -1
  251. data/lib/puppet/type/yumrepo.rb +3 -3
  252. data/lib/puppet/type/zone.rb +1 -1
  253. data/lib/puppet/util.rb +2 -2
  254. data/lib/puppet/util/classgen.rb +1 -1
  255. data/lib/puppet/util/command_line.rb +6 -2
  256. data/lib/puppet/util/command_line/trollop.rb +1 -1
  257. data/lib/puppet/util/execution.rb +2 -2
  258. data/lib/puppet/util/http_proxy.rb +1 -1
  259. data/lib/puppet/util/inifile.rb +1 -1
  260. data/lib/puppet/util/instance_loader.rb +1 -1
  261. data/lib/puppet/util/logging.rb +1 -1
  262. data/lib/puppet/util/multi_match.rb +1 -1
  263. data/lib/puppet/util/plist.rb +15 -5
  264. data/lib/puppet/util/profiler.rb +1 -1
  265. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  266. data/lib/puppet/util/psych_support.rb +1 -1
  267. data/lib/puppet/util/rdoc.rb +2 -2
  268. data/lib/puppet/util/rubygems.rb +1 -1
  269. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  270. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  271. data/lib/puppet/util/windows/adsi.rb +30 -8
  272. data/lib/puppet/util/windows/api_types.rb +1 -1
  273. data/lib/puppet/util/windows/file.rb +59 -0
  274. data/lib/puppet/util/windows/process.rb +10 -0
  275. data/lib/puppet/util/windows/security.rb +1 -1
  276. data/lib/puppet/util/windows/user.rb +22 -4
  277. data/lib/puppet/util/yaml.rb +15 -3
  278. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  279. data/lib/puppet/vendor/rgen_patch.rb +1 -1
  280. data/lib/puppet/version.rb +2 -2
  281. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  282. data/spec/integration/agent/logging_spec.rb +15 -14
  283. data/spec/integration/application/apply_spec.rb +1 -0
  284. data/spec/integration/directory_environments_spec.rb +16 -0
  285. data/spec/integration/environments/settings_spec.rb +32 -4
  286. data/spec/integration/faces/documentation_spec.rb +1 -1
  287. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  288. data/spec/integration/node/environment_spec.rb +21 -0
  289. data/spec/integration/parser/collection_spec.rb +10 -0
  290. data/spec/integration/parser/compiler_spec.rb +76 -840
  291. data/spec/integration/parser/functions/require_spec.rb +3 -3
  292. data/spec/integration/parser/parameter_defaults_spec.rb +6 -2
  293. data/spec/integration/parser/pcore_resource_spec.rb +208 -0
  294. data/spec/integration/parser/resource_expressions_spec.rb +4 -2
  295. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  296. data/spec/integration/transaction/report_spec.rb +666 -0
  297. data/spec/integration/type/file_spec.rb +11 -12
  298. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  299. data/spec/integration/util/windows/principal_spec.rb +109 -60
  300. data/spec/integration/util/windows/process_spec.rb +4 -2
  301. data/spec/integration/util/windows/security_spec.rb +34 -8
  302. data/spec/integration/util/windows/user_spec.rb +26 -4
  303. data/spec/lib/puppet_spec/files.rb +2 -2
  304. data/spec/lib/puppet_spec/network.rb +12 -8
  305. data/spec/shared_examples/rhel_package_provider.rb +341 -0
  306. data/spec/spec_helper.rb +8 -2
  307. data/spec/unit/application/cert_spec.rb +20 -0
  308. data/spec/unit/configurer/plugin_handler_spec.rb +0 -26
  309. data/spec/unit/configurer_spec.rb +46 -0
  310. data/spec/unit/defaults_spec.rb +14 -0
  311. data/spec/unit/face/generate_spec.rb +230 -0
  312. data/spec/unit/face/help_spec.rb +53 -0
  313. data/spec/unit/face/parser_spec.rb +6 -0
  314. data/spec/unit/face/plugin_spec.rb +0 -4
  315. data/spec/unit/file_system_spec.rb +85 -0
  316. data/spec/unit/functions/lookup_spec.rb +4 -4
  317. data/spec/unit/functions/match_spec.rb +2 -2
  318. data/spec/unit/functions/regsubst_spec.rb +1 -1
  319. data/spec/unit/functions/split_spec.rb +1 -1
  320. data/spec/unit/functions/unwrap_spec.rb +29 -0
  321. data/spec/unit/functions/versioncmp_spec.rb +1 -1
  322. data/spec/unit/functions4_spec.rb +8 -8
  323. data/spec/unit/indirector/facts/facter_spec.rb +1 -9
  324. data/spec/unit/indirector/rest_spec.rb +95 -9
  325. data/spec/unit/module_spec.rb +43 -7
  326. data/spec/unit/module_tool/applications/installer_spec.rb +10 -1
  327. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  328. data/spec/unit/module_tool/applications/upgrader_spec.rb +8 -0
  329. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  330. data/spec/unit/network/http/api/indirected_routes_spec.rb +49 -58
  331. data/spec/unit/network/http/api/master/v3_spec.rb +7 -4
  332. data/spec/unit/network/rights_spec.rb +1 -1
  333. data/spec/unit/parameter_spec.rb +11 -0
  334. data/spec/unit/parser/compiler_spec.rb +19 -33
  335. data/spec/unit/{appmgmt_spec.rb → parser/environment_compiler_spec.rb} +12 -1
  336. data/spec/unit/parser/functions/create_resources_spec.rb +76 -4
  337. data/spec/unit/parser/functions/require_spec.rb +2 -2
  338. data/spec/unit/parser/resource_spec.rb +21 -11
  339. data/spec/unit/parser/scope_spec.rb +1 -5
  340. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1 -1
  341. data/spec/unit/pops/loaders/dependency_loader_spec.rb +1 -1
  342. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  343. data/spec/unit/pops/loaders/loaders_spec.rb +63 -5
  344. data/spec/unit/pops/loaders/module_loaders_spec.rb +2 -2
  345. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  346. data/spec/unit/pops/parser/lexer2_spec.rb +27 -3
  347. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +8 -0
  348. data/spec/unit/pops/parser/parse_calls_spec.rb +9 -0
  349. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  350. data/spec/unit/pops/resource/resource_type_impl_spec.rb +37 -0
  351. data/spec/unit/pops/serialization/packer_spec.rb +153 -0
  352. data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
  353. data/spec/unit/pops/serialization/serialization_spec.rb +228 -0
  354. data/spec/unit/pops/types/p_object_type_spec.rb +44 -2
  355. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +42 -0
  356. data/spec/unit/pops/types/p_sensitive_type_spec.rb +139 -0
  357. data/spec/unit/pops/types/p_type_set_type_spec.rb +424 -0
  358. data/spec/unit/pops/types/ruby_generator_spec.rb +497 -181
  359. data/spec/unit/pops/types/type_calculator_spec.rb +10 -4
  360. data/spec/unit/pops/types/type_formatter_spec.rb +1 -1
  361. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
  362. data/spec/unit/pops/types/type_parser_spec.rb +1 -1
  363. data/spec/unit/pops/types/types_spec.rb +1 -1
  364. data/spec/unit/pops/validator/validator_spec.rb +18 -1
  365. data/spec/unit/property_spec.rb +48 -11
  366. data/spec/unit/provider/group/windows_adsi_spec.rb +11 -1
  367. data/spec/unit/provider/package/dnf_spec.rb +1 -99
  368. data/spec/unit/provider/package/pacman_spec.rb +4 -4
  369. data/spec/unit/provider/package/pip_spec.rb +14 -0
  370. data/spec/unit/provider/package/pkg_spec.rb +6 -0
  371. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -3
  372. data/spec/unit/provider/package/portage_spec.rb +64 -8
  373. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  374. data/spec/unit/provider/package/windows/package_spec.rb +4 -1
  375. data/spec/unit/provider/package/windows_spec.rb +8 -2
  376. data/spec/unit/provider/package/yum_spec.rb +6 -377
  377. data/spec/unit/provider/service/base_spec.rb +6 -0
  378. data/spec/unit/provider/service/debian_spec.rb +16 -7
  379. data/spec/unit/provider/service/gentoo_spec.rb +6 -0
  380. data/spec/unit/provider/service/init_spec.rb +7 -0
  381. data/spec/unit/provider/service/launchd_spec.rb +35 -4
  382. data/spec/unit/provider/service/openrc_spec.rb +6 -0
  383. data/spec/unit/provider/service/smf_spec.rb +31 -6
  384. data/spec/unit/provider/service/src_spec.rb +6 -0
  385. data/spec/unit/provider/service/systemd_spec.rb +70 -20
  386. data/spec/unit/provider/service/upstart_spec.rb +6 -0
  387. data/spec/unit/provider/user/aix_spec.rb +7 -0
  388. data/spec/unit/provider/user/directoryservice_spec.rb +30 -1
  389. data/spec/unit/provider/user/windows_adsi_spec.rb +19 -0
  390. data/spec/unit/resource/capability_finder_spec.rb +51 -3
  391. data/spec/unit/resource/catalog_spec.rb +5 -0
  392. data/spec/unit/resource/type_spec.rb +2 -2
  393. data/spec/unit/resource_spec.rb +19 -0
  394. data/spec/unit/settings_spec.rb +13 -0
  395. data/spec/unit/ssl/certificate_authority/interface_spec.rb +176 -10
  396. data/spec/unit/ssl/certificate_authority_spec.rb +63 -22
  397. data/spec/unit/ssl/host_spec.rb +1 -1
  398. data/spec/unit/ssl/oids_spec.rb +24 -21
  399. data/spec/unit/transaction/event_spec.rb +3 -1
  400. data/spec/unit/transaction/persistence_spec.rb +173 -0
  401. data/spec/unit/transaction/report_spec.rb +64 -1
  402. data/spec/unit/transaction/resource_harness_spec.rb +91 -0
  403. data/spec/unit/type/file/content_spec.rb +47 -15
  404. data/spec/unit/type/file_spec.rb +28 -0
  405. data/spec/unit/type/mount_spec.rb +5 -12
  406. data/spec/unit/type/yumrepo_spec.rb +1 -5
  407. data/spec/unit/type_spec.rb +32 -0
  408. data/spec/unit/util/command_line_spec.rb +11 -0
  409. data/spec/unit/util/execution_spec.rb +1 -1
  410. data/spec/unit/util/plist_spec.rb +16 -3
  411. data/spec/unit/util/storage_spec.rb +4 -1
  412. data/spec/unit/util/windows/adsi_spec.rb +23 -2
  413. data/spec/unit/util/windows/file_spec.rb +56 -1
  414. data/spec/unit/util/windows/sid_spec.rb +31 -7
  415. data/spec/unit/util/yaml_spec.rb +12 -0
  416. data/spec/unit/util_spec.rb +87 -20
  417. metadata +89 -34
  418. data/ext/puppetlisten/puppetlisten.rb +0 -77
  419. data/ext/puppetlisten/puppetrun.rb +0 -38
  420. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  421. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  422. data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
@@ -55,7 +55,7 @@ class EvaluatingParser
55
55
 
56
56
  # Create a closure that can be called in the given scope
57
57
  def closure(model, scope)
58
- Evaluator::Closure.new(evaluator, model, scope)
58
+ Evaluator::Closure::Dynamic.new(evaluator, model, scope)
59
59
  end
60
60
 
61
61
  def evaluate(scope, model)
@@ -185,11 +185,18 @@ module Puppet::Pops::Parser::InterpolationSupport
185
185
  scn = @scanner
186
186
  ctx = @lexing_context
187
187
  queue = @token_queue
188
+ queue_base = @token_queue[0]
188
189
 
189
190
  scn.skip(self.class::PATTERN_WS)
190
191
  queue_size = queue.size
191
192
  until scn.eos? do
192
193
  if token = lex_token
194
+ if token.equal?(queue_base)
195
+ # A nested #interpolate_dq call shifted the queue_base token from the @token_queue. It must
196
+ # be put back since it is intended for the top level #interpolate_dq call only.
197
+ queue.insert(0, token)
198
+ next # all relevant tokens are already on the queue
199
+ end
193
200
  token_name = token[0]
194
201
  ctx[:after] = token_name
195
202
  if token_name == :RBRACE && ctx[:brace_count] == brace_count
@@ -37,6 +37,7 @@ class Lexer2
37
37
  TOKEN_RBRACE = [:RBRACE, '}'.freeze, 1].freeze
38
38
  TOKEN_SELBRACE = [:SELBRACE, '{'.freeze, 1].freeze
39
39
  TOKEN_LPAREN = [:LPAREN, '('.freeze, 1].freeze
40
+ TOKEN_WSLPAREN = [:WSLPAREN, '('.freeze, 1].freeze
40
41
  TOKEN_RPAREN = [:RPAREN, ')'.freeze, 1].freeze
41
42
 
42
43
  TOKEN_EQUALS = [:EQUALS, '='.freeze, 1].freeze
@@ -219,7 +220,17 @@ class Lexer2
219
220
  end
220
221
  end,
221
222
  ']' => lambda { emit(TOKEN_RBRACK, @scanner.pos) },
222
- '(' => lambda { emit(TOKEN_LPAREN, @scanner.pos) },
223
+ '(' => lambda do
224
+ before = @scanner.pos
225
+ # If first on a line, or only whitespace between start of line and '('
226
+ # then the token is special to avoid being taken as start of a call.
227
+ line_start = @lexing_context[:line_lexical_start]
228
+ if before == line_start || @scanner.string.byteslice(line_start, before - line_start) =~ /\A[[:blank:]\r]+\Z/
229
+ emit(TOKEN_WSLPAREN, before)
230
+ else
231
+ emit(TOKEN_LPAREN, before)
232
+ end
233
+ end,
223
234
  ')' => lambda { emit(TOKEN_RPAREN, @scanner.pos) },
224
235
  ';' => lambda { emit(TOKEN_SEMIC, @scanner.pos) },
225
236
  '?' => lambda { emit(TOKEN_QMARK, @scanner.pos) },
@@ -489,6 +500,7 @@ class Lexer2
489
500
  else
490
501
  @scanner.pos += 1
491
502
  end
503
+ ctx[:line_lexical_start] = @scanner.pos
492
504
  nil
493
505
  end,
494
506
  '' => lambda { nil } # when the peek(1) returns empty
@@ -656,6 +668,7 @@ class Lexer2
656
668
  @lexing_context = {
657
669
  :brace_count => 0,
658
670
  :after => nil,
671
+ :line_lexical_start => 0
659
672
  }
660
673
  appm_mode = Puppet[:app_management] ? :with_appm : :without_appm
661
674
  @appm_keywords = APP_MANAGEMENT_TOKENS[appm_mode]
@@ -8,7 +8,7 @@ class Locator
8
8
  #
9
9
  def self.locator(string, file, index = nil, char_offsets = false)
10
10
  if char_offsets
11
- LocatorForChars.new(string, file, index);
11
+ LocatorForChars.new(string, file, index)
12
12
  else
13
13
  Locator19.new(string, file, index)
14
14
  end
@@ -205,6 +205,15 @@ class Locator
205
205
  return low
206
206
  end
207
207
 
208
+ def hash
209
+ [string, file, line_index].hash
210
+ end
211
+
212
+ # Equal method needed by serializer to perform tabulation
213
+ def eql?(o)
214
+ self.class == o.class && string == o.string && file == o.file && line_index == o.line_index
215
+ end
216
+
208
217
  # Common impl for 18 and 19 since scanner is byte based
209
218
  def compute_line_index
210
219
  scanner = StringScanner.new(string)
@@ -262,6 +271,26 @@ class Locator
262
271
  # strings are frozen).
263
272
  #
264
273
  class Locator19 < AbstractLocator
274
+ include Types::PuppetObject
275
+
276
+ def self._ptype
277
+ @type
278
+ end
279
+
280
+ # The Locator is not part of the Ecore model so no ObjectType is automatically inferred. Instead the
281
+ # type is explicitly added here.
282
+ # TODO: LocatorForChars is never added. It looks like it could be removed (remnant from Ruby 1.8 compatibility?)
283
+ # @api private
284
+ def self.register_ptype(loader, ir)
285
+ @type = Pcore::create_object_type(loader, ir, self, 'Puppet::AST::Locator', 'Any',
286
+ 'string' => Types::PStringType::DEFAULT,
287
+ 'file' => Types::PStringType::DEFAULT,
288
+ 'line_index' => {
289
+ Types::KEY_TYPE => Types::POptionalType.new(Types::PArrayType.new(Types::PIntegerType::DEFAULT)),
290
+ Types::KEY_VALUE => nil
291
+ }
292
+ ).resolve(Types::TypeParser.singleton, loader)
293
+ end
265
294
 
266
295
  # Returns the offset on line (first offset on a line is 0).
267
296
  # Ruby 19 is multibyte but has no character position methods, must use byteslice
@@ -1,7 +1,6 @@
1
1
  require 'puppet/parser/functions'
2
2
  require 'puppet/parser/files'
3
3
  require 'puppet/resource/type_collection'
4
- require 'puppet/resource/type_collection_helper'
5
4
  require 'puppet/resource/type'
6
5
  require 'monitor'
7
6
 
@@ -22,8 +21,6 @@ class Parser
22
21
  #
23
22
  Factory = Model::Factory
24
23
 
25
- include Puppet::Resource::TypeCollectionHelper
26
-
27
24
  attr_accessor :lexer
28
25
  attr_reader :definitions
29
26
 
@@ -11,9 +11,9 @@ module Parser
11
11
  module SlurpSupport
12
12
  include LexerSupport
13
13
 
14
- SLURP_SQ_PATTERN = /(?:[^\\]|^|[^\\])(?:[\\]{2})*[']/
15
- SLURP_DQ_PATTERN = /(?:[^\\]|^|[^\\])(?:[\\]{2})*(["]|[$]\{?)/
16
- SLURP_UQ_PATTERN = /(?:[^\\]|^|[^\\])(?:[\\]{2})*([$]\{?|\z)/
14
+ SLURP_SQ_PATTERN = /(?:[^\\]|^)(?:[\\]{2})*[']/
15
+ SLURP_DQ_PATTERN = /(?:[^\\]|^)(?:[\\]{2})*(["]|[$]\{?)/
16
+ SLURP_UQ_PATTERN = /(?:[^\\]|^)(?:[\\]{2})*([$]\{?|\z)/
17
17
  # unquoted, no escapes
18
18
  SLURP_UQNE_PATTERN = /(\$\{?|\z)/m
19
19
  SLURP_ALL_PATTERN = /.*(\z)/m
@@ -30,17 +30,25 @@ module Puppet::Pops::Patterns
30
30
  #
31
31
  CLASSREF_EXT = %r{\A((::){0,1}[A-Z][\w]*)+\z}
32
32
 
33
+ # Same as CLASSREF_EXT but cannot start with '::'
34
+ #
35
+ CLASSREF_EXT_DECL = %r{\A[A-Z][\w]*(?:::[A-Z][\w]*)*\z}
36
+
33
37
  # CLASSREF matches a class reference the way it is represented internally in the
34
38
  # model (i.e. in lower case).
35
39
  #
36
40
  CLASSREF = %r{\A((::){0,1}[a-z][\w]*)+\z}
37
41
 
42
+ # Same as CLASSREF but cannot start with '::'
43
+ #
44
+ CLASSREF_DECL = %r{\A[a-z][\w]*(?:::[a-z][\w]*)*\z}
45
+
38
46
  # DOLLAR_VAR matches a variable name including the initial $ character
39
47
  DOLLAR_VAR = %r{\$(::)?(\w+::)*\w+}
40
48
 
41
49
  # VAR_NAME matches the name part of a variable (The $ character is not included)
42
50
  # Note, that only the final segment may start with an underscore.
43
- VAR_NAME = %r{\A(:?(::)?[a-z]\w*)*(:?(::)?[a-z_]\w*)\z}
51
+ VAR_NAME = %r{\A(?:(::)?[a-z]\w*)*(?:(::)?[a-z_]\w*)\z}
44
52
 
45
53
  # PARAM_NAME matches the name part of a parameter (The $ character is not included)
46
54
  PARAM_NAME = %r{\A[a-z_]\w*\z}
@@ -2,29 +2,85 @@ require 'uri'
2
2
 
3
3
  module Puppet::Pops
4
4
  module Pcore
5
- TYPE_QUALIFIED_REFERENCE = Types::TypeFactory.pattern(Types::TypeFactory.regexp(Patterns::CLASSREF_EXT))
5
+ TYPE_URI_RX = Types::TypeFactory.regexp(URI.regexp)
6
+ TYPE_URI = Types::TypeFactory.pattern(TYPE_URI_RX)
7
+ TYPE_SIMPLE_TYPE_NAME = Types::TypeFactory.pattern(/\A[A-Z]\w*\z/)
8
+ TYPE_QUALIFIED_REFERENCE = Types::TypeFactory.pattern(/\A[A-Z][\w]*(?:::[A-Z][\w]*)*\z/)
9
+
10
+ KEY_PCORE_URI = 'pcore_uri'.freeze
11
+ KEY_PCORE_VERSION = 'pcore_version'.freeze
12
+
13
+ PCORE_URI = 'http://puppet.com/2016.1/pcore'
14
+ PCORE_VERSION = Semantic::Version.new(1,0,0)
15
+ PARSABLE_PCORE_VERSIONS = Semantic::VersionRange.parse('1.x')
16
+
17
+ RUNTIME_NAME_AUTHORITY = 'http://puppet.com/2016.1/runtime'
6
18
 
7
19
  def self.init(loader, ir)
8
- add_alias('Puppet::Pcore::QualifiedReference', TYPE_QUALIFIED_REFERENCE, loader)
20
+ add_alias('Pcore::URI_RX', TYPE_URI_RX, loader)
21
+ add_alias('Pcore::URI', TYPE_URI, loader)
22
+ add_alias('Pcore::SimpleTypeName', TYPE_SIMPLE_TYPE_NAME, loader)
23
+ add_alias('Pcore::TypeName', TYPE_QUALIFIED_REFERENCE, loader)
24
+ add_alias('Pcore::QRef', TYPE_QUALIFIED_REFERENCE, loader)
25
+ Types::TypedModelObject.register_ptypes(loader, ir)
26
+
27
+ ir.register_implementation_namespace('Pcore', 'Puppet::Pops::Pcore', loader)
28
+ ir.register_implementation_namespace('Puppet::AST', 'Puppet::Pops::Model', loader)
29
+ ast_type_set = Serialization::RGen::TypeGenerator.new.generate_type_set('Puppet::AST', Puppet::Pops::Model, loader)
30
+
31
+ # Extend the Puppet::AST type set with the Locator (it's not an RGen class, but nevertheless, used in the model)
32
+ ast_ts_i12n = ast_type_set.i12n_hash
33
+ ast_ts_i12n['types'] = ast_ts_i12n['types'].merge('Locator' => Parser::Locator::Locator19.register_ptype(loader, ir))
34
+ add_type(Types::PTypeSetType.new(ast_ts_i12n), loader)
35
+
36
+ Resource.register_ptypes(loader, ir)
37
+ end
38
+
39
+ # Create and register a new `Object` type in the Puppet Type System and map it to an implementation class
40
+ #
41
+ # @param loader [Loader::Loader] The loader where the new type will be registered
42
+ # @param ir [ImplementationRegistry] The implementation registry that maps this class to the new type
43
+ # @param impl_class [Class] The class that is the implementation of the type
44
+ # @param type_name [String] The fully qualified name of the new type
45
+ # @param parent_name [String,nil] The fully qualified name of the parent type
46
+ # @param attributes_hash [Hash{String => Object}] A hash of attribute definitions for the new type
47
+ # @param functions_hash [Hash{String => Object}] A hash of function definitions for the new type
48
+ # @param equality [Array<String>] An array with names of attributes that participate in equality comparison
49
+ # @return [PObjectType] the created type. Not yet resolved
50
+ #
51
+ # @api private
52
+ def self.create_object_type(loader, ir, impl_class, type_name, parent_name, attributes_hash = EMPTY_HASH, functions_hash = EMPTY_HASH, equality = nil)
53
+ i12n_hash = {}
54
+ i12n_hash[Types::KEY_PARENT] = Types::PTypeReferenceType.new(parent_name) unless parent_name.nil?
55
+ i12n_hash[Types::KEY_ATTRIBUTES] = attributes_hash unless attributes_hash.empty?
56
+ i12n_hash[Types::KEY_FUNCTIONS] = functions_hash unless functions_hash.empty?
57
+ i12n_hash[Types::KEY_EQUALITY] = equality unless equality.nil?
58
+ ir.register_implementation(type_name, impl_class, loader)
59
+ add_type(Types::PObjectType.new(type_name, i12n_hash), loader)
60
+ end
9
61
 
10
- ir.register_implementation_namespace('Puppet::Pcore', 'Puppet::Pops::Pcore', loader)
62
+ def self.add_object_type(name, body, loader)
63
+ add_type(Types::PObjectType.new(name, Parser::EvaluatingParser.new.parse_string(body).current.body), loader)
11
64
  end
12
65
 
13
- def self.add_alias(name, type, loader)
14
- add_type(Types::PTypeAliasType.new(name, nil, type), loader)
66
+ def self.add_alias(name, type, loader, name_authority = RUNTIME_NAME_AUTHORITY)
67
+ add_type(Types::PTypeAliasType.new(name, nil, type), loader, name_authority)
15
68
  end
16
69
 
17
- def self.add_type(type, loader)
18
- loader.set_entry(Loader::Loader::TypedName.new(:type, type.name.downcase), type)
70
+ def self.add_type(type, loader, name_authority = RUNTIME_NAME_AUTHORITY)
71
+ loader.set_entry(Loader::TypedName.new(:type, type.name.downcase, name_authority), type)
72
+ type
19
73
  end
20
74
 
21
- def self.register_implementations(*impls)
22
- Loaders.loaders.register_implementations(*impls)
75
+ def self.register_implementations(impls, name_authority = RUNTIME_NAME_AUTHORITY)
76
+ Loaders.loaders.register_implementations(impls, name_authority = RUNTIME_NAME_AUTHORITY)
23
77
  end
24
78
 
25
- def self.register_aliases(aliases)
79
+ def self.register_aliases(aliases, name_authority = RUNTIME_NAME_AUTHORITY)
26
80
  loader = Loaders.loaders.private_environment_loader
27
- aliases.each { |name, type_string| add_type(Types::PTypeAliasType.new(name, Types::TypeFactory.type_reference(type_string), nil), loader) }
81
+ aliases.each do |name, type_string|
82
+ add_type(Types::PTypeAliasType.new(name, Types::TypeFactory.type_reference(type_string), nil), loader, name_authority)
83
+ end
28
84
  end
29
85
  end
30
86
  end
@@ -0,0 +1,43 @@
1
+ module Puppet::Pops
2
+ # Module for making a call such that there is an identifiable entry on
3
+ # the ruby call stack enabling getting a puppet call stack
4
+ # To use this make a call with:
5
+ # ```
6
+ # Puppet::Pops::PuppetStack.stack(file, line, receiver, message, args)
7
+ # ```
8
+ # To get the stack call:
9
+ # ```
10
+ # Puppet::Pops::PuppetStack.stacktrace
11
+ #
12
+ # When getting a backtrace in Ruby, the puppet stack frames are
13
+ # identified as coming from "in 'stack'" and having a ".pp" file
14
+ # name.
15
+ # To support testing, a given file that is an empty string, or nil
16
+ # as well as a nil line number are supported. Such stack frames
17
+ # will be represented with the text `unknown` and `0´ respectively.
18
+ #
19
+ module PuppetStack
20
+ # Sends a message to an obj such that it appears to come from
21
+ # file, line when calling stacktrace.
22
+ #
23
+ def self.stack(file, line, obj, message, args, &block)
24
+ file = '' if file.nil?
25
+ line = 0 if line.nil?
26
+
27
+ if block_given?
28
+ Kernel.eval("obj.send(message, *args, &block)", Kernel.binding(), file, line)
29
+ else
30
+ Kernel.eval("obj.send(message, *args)", Kernel.binding(), file, line)
31
+ end
32
+ end
33
+
34
+ def self.stacktrace
35
+ result = caller().reduce([]) do |memo, loc|
36
+ if loc =~ /^(.*\.pp)?:([0-9]+):in `stack'/
37
+ memo << [$1.nil? ? 'unknown' : $1, $2.to_i]
38
+ end
39
+ memo
40
+ end.reverse
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,51 @@
1
+ # An implementation of the interface Puppet::Resource
2
+ # that adapts the 3.x compiler and catalog expectations on
3
+ # a resource instance. This instance is backed by a
4
+ # pcore representation of the resource type an instance of this
5
+ # ruby class.
6
+ #
7
+ # This class must inherit from Puppet::Resource because of the
8
+ # class expectations in existing logic.
9
+ #
10
+ # This implementation does not support
11
+ # * setting 'strict' - strictness (must refer to an existing type) is always true
12
+ # * does not support the indirector
13
+ #
14
+ #
15
+ module Puppet::Pops
16
+ module Resource
17
+ class Param
18
+ # This make this class instantiateable from Puppet
19
+ include Puppet::Pops::Types::PuppetObject
20
+
21
+ def self.register_ptype(loader, ir)
22
+ @ptype = Pcore::create_object_type(loader, ir, self, 'Puppet::Resource::Param', nil,
23
+ {
24
+ Types::KEY_TYPE => Types::PType::DEFAULT,
25
+ Types::KEY_NAME => Types::PStringType::NON_EMPTY,
26
+ 'name_var' => {
27
+ Types::KEY_TYPE => Types::PBooleanType::DEFAULT,
28
+ Types::KEY_VALUE => false
29
+ }
30
+ },
31
+ EMPTY_HASH,
32
+ [Types::KEY_NAME]
33
+ )
34
+ end
35
+
36
+ attr_reader :name
37
+ attr_reader :type
38
+ attr_reader :name_var
39
+
40
+ def initialize(type, name, name_var = false)
41
+ @type = type
42
+ @name = name
43
+ @name_var = name_var
44
+ end
45
+
46
+ def self._ptype
47
+ @ptype
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,301 @@
1
+ require_relative 'param'
2
+
3
+ module Puppet::Pops
4
+ module Resource
5
+
6
+ def self.register_ptypes(loader, ir)
7
+ types = [Param, ResourceTypeImpl].map do |c|
8
+ c.register_ptype(loader, ir)
9
+ end
10
+ types.each {|t| t.resolve(Types::TypeParser.singleton, loader) }
11
+ end
12
+
13
+ class ResourceTypeImpl
14
+ # Make instances of this class directly createable from the Puppet Language
15
+ # as object.
16
+ #
17
+ include Puppet::Pops::Types::PuppetObject
18
+
19
+ # Instances of ResourceTypeImpl can be used as the type of a Puppet::Parser::Resource/Puppet::Resource when compiling
20
+ #
21
+ include Puppet::CompilableResourceType
22
+
23
+ # Returns the Puppet Type for this instance.
24
+ def self._ptype
25
+ @ptype
26
+ end
27
+
28
+ def self.register_ptype(loader, ir)
29
+ param_ref = Types::PTypeReferenceType.new('Puppet::Resource::Param')
30
+ @ptype = Pcore::create_object_type(loader, ir, self, 'Puppet::Resource::ResourceType3', nil,
31
+ {
32
+ Types::KEY_NAME => Types::PStringType::NON_EMPTY,
33
+ 'properties' => {
34
+ Types::KEY_TYPE => Types::PArrayType.new(param_ref),
35
+ Types::KEY_VALUE => EMPTY_ARRAY
36
+ },
37
+ 'parameters' => {
38
+ Types::KEY_TYPE => Types::PArrayType.new(param_ref),
39
+ Types::KEY_VALUE => EMPTY_ARRAY
40
+ },
41
+ 'title_patterns_hash' => {
42
+ Types::KEY_TYPE => Types::POptionalType.new(
43
+ Types::PHashType.new(Types::PRegexpType::DEFAULT, Types::PArrayType.new(Types::PStringType::NON_EMPTY))),
44
+ Types::KEY_VALUE => nil
45
+ },
46
+ 'isomorphic' => {
47
+ Types::KEY_TYPE => Types::PBooleanType::DEFAULT,
48
+ Types::KEY_VALUE => true
49
+ },
50
+ },
51
+ EMPTY_HASH,
52
+ [Types::KEY_NAME]
53
+ )
54
+ end
55
+
56
+ # Compares this type against the given _other_ (type) and returns -1, 0, or +1 depending on the order.
57
+ # @param other [Object] the object to compare against (produces nil, if not kind of Type}
58
+ # @return [-1, 0, +1, nil] produces -1 if this type is before the given _other_ type, 0 if equals, and 1 if after.
59
+ # Returns nil, if the given _other_ is not a kind of Type.
60
+ # @see Comparable
61
+ #
62
+ def <=>(other)
63
+ # Order is only maintained against other types, not arbitrary objects.
64
+ # The natural order is based on the reference name used when comparing
65
+ return nil unless other.is_a?(Puppet::CompilableResourceType)
66
+ # against other type instances.
67
+ self.ref <=> other.ref
68
+ end
69
+
70
+ METAPARAMS = [
71
+ :noop,
72
+ :schedule,
73
+ :audit,
74
+ :loglevel,
75
+ :alias,
76
+ :tag,
77
+ :require,
78
+ :subscribe,
79
+ :before,
80
+ :notify,
81
+ :stage,
82
+ :export,
83
+ :consume
84
+ ].freeze
85
+
86
+ # Speed up lookup
87
+ METAPARAMSET = Set.new(METAPARAMS).freeze
88
+
89
+ attr_reader :name
90
+ attr_reader :properties
91
+ attr_reader :parameters
92
+ attr_reader :title_patterns_hash
93
+ attr_reader :title_patterns
94
+ attr_reader :isomorphic
95
+
96
+ def initialize(name, properties = EMPTY_ARRAY, parameters = EMPTY_ARRAY, title_patterns_hash = nil, isomorphic = true)
97
+ @name = name
98
+ @properties = properties
99
+ @parameters = parameters
100
+ @title_patterns_hash = title_patterns_hash
101
+ @isomorphic = isomorphic
102
+
103
+ # Compute attributes hash
104
+ # Compute key_names (possibly compound key if there are multiple name vars).
105
+ @attributes = {}
106
+ @key_attributes = []
107
+
108
+ # Name to kind of attribute
109
+ @attr_types = {}
110
+
111
+ # Add all meta params
112
+ METAPARAMS.each {|p| @attr_types[p] = :meta }
113
+
114
+ @property_set = Set.new(properties.map do |p|
115
+ symname = p.name.to_sym
116
+ @attributes[symname] = p
117
+ @key_attributes << symname if p.name_var
118
+ @attr_types[symname] = :property
119
+ symname
120
+ end).freeze
121
+
122
+ @param_set = Set.new(parameters.map do |p|
123
+ symname = p.name.to_sym
124
+ @attributes[symname] = p
125
+ @key_attributes << symname if p.name_var
126
+ @attr_types[symname] = :param
127
+ symname
128
+ end).freeze
129
+
130
+ # API for title patterns is [ [regexp, [ [ [sym, <lambda>], [sym, <lambda>] ] ] ] ]
131
+ # Where lambdas are optional. This resource type impl does not support lambdas
132
+ # Note that the pcore file has a simpler hashmap that is post processed here
133
+ # since the structure must have Symbol instances for names which the .pp representation
134
+ # does not deliver.
135
+ #
136
+ @title_patterns =
137
+ case @key_attributes.length
138
+ when 0
139
+ # TechDebt: The case of specifying title patterns when having no name vars is unspecified behavior in puppet
140
+ # Here it is silently ignored.
141
+ []
142
+ when 1
143
+ if @title_pattners_hash.nil?
144
+ [ [ /(.*)/m, [ [@key_attributes.first] ] ] ]
145
+ else
146
+ # TechDebt: The case of having one namevar and an empty title patterns is unspecified behavior in puppet.
147
+ # Here, it may lead to an empty map which may or may not trigger the wanted/expected behavior.
148
+ #
149
+ @title_patterns_hash.map {|k,v| [ k, [ v.map {|n| n.to_sym } ] ] }
150
+ end
151
+ else
152
+ if @title_patterns_hash.nil? || @title_patterns_hash.empty?
153
+ # TechDebt: While title patterns must be specified when more than one is used, they do not have
154
+ # to match/set them all since some namevars can be omitted (to support the use case in
155
+ # the 'package' type where 'provider' attribute is handled as part of the key without being
156
+ # set from the title.
157
+ #
158
+ raise Puppet::DevError,"you must specify title patterns when there are two or more key attributes"
159
+ end
160
+ @title_patterns_hash.nil? ? [] : @title_patterns_hash.map {|k,v| [ k, [ v.map {|n| n.to_sym } ] ] }
161
+ end
162
+ end
163
+
164
+ # Override CompilableResource inclusion
165
+ def is_3x_ruby_plugin?
166
+ false
167
+ end
168
+
169
+ # Answers if the parameter name is a parameter/attribute of this type
170
+ # This is part of the Puppet::Type API
171
+ # Check if used when compiling (it is triggered in an apply)
172
+ #
173
+ def valid_parameter?(name)
174
+ @attributes.include?(name) || METAPARAMSET.include?(name)
175
+ end
176
+
177
+ # The type implementation of finish does a lot of things
178
+ # * iterates over all parameters and calls post_compile on them if the parameter impl responds to post_compile
179
+ # * validates the relationship parameters
180
+ #
181
+ # This implementation does nothing - it is assumed that the catalog is already validated
182
+ # via the relationship validator (done late in the game).
183
+ def finish()
184
+ # Do nothing.
185
+ end
186
+
187
+ # This is called on a resource type
188
+ # it performs tagging if it is a Class or Node.
189
+ # It also ensure the parent type is in the catalog, but that is weird since
190
+ # resource types cannot really inherit
191
+ def instantiate_resource(scope, resource)
192
+ # Do nothing because nothing is needed when compiling.
193
+
194
+ # This is what the Puppet::Type implementation does
195
+ # None of this should be needed
196
+
197
+ # # Make sure our parent class has been evaluated, if we have one.
198
+ # if parent && !scope.catalog.resource(resource.type, parent)
199
+ # parent_type(scope).ensure_in_catalog(scope)
200
+ # end
201
+
202
+ # This will never happen
203
+
204
+ # if ['Class', 'Node'].include? resource.type
205
+ # scope.catalog.tag(*resource.tags)
206
+ # end
207
+ end
208
+
209
+ # Being isomorphic in puppet means that the resource is managing a state
210
+ # (as opposed to a resource like Exec that is a function, possibly with side effect.
211
+ # In a Ruby implementation of a resource type, @isomorphic = false is used to turn
212
+ # off isomorphism, it is true by default.
213
+ # This is part of the Puppet::Type API.
214
+ #
215
+ def isomorphic?
216
+ @isomorphic
217
+ end
218
+
219
+ # Produces the names of the attributes that make out the unique id of a resource
220
+ #
221
+ def key_attributes
222
+ @key_attributes
223
+ end
224
+
225
+ # Gives a type a chance to issue deprecations for parameters.
226
+ # @param title [String] the title of the resource of this type
227
+ # @param attributes [Array<Param>] the set parameters in the resource instance
228
+ def deprecate_params(title, attributes)
229
+ # TODO: Current API somewhat unclear, if done at type level, or per
230
+ # Param.
231
+ end
232
+
233
+ #######################
234
+ # UNSUPPORTED STUFF
235
+ #######################
236
+
237
+ # Applications are not supported
238
+ def application?
239
+ false
240
+ end
241
+
242
+ ############################
243
+ # DON'T KNOW YET
244
+ ############################
245
+
246
+
247
+ ##################################################
248
+ # NEVER CALLED COMPILE SIDE FOR A COMPILATION
249
+ ##################################################
250
+
251
+ # Answers :property, :param or :meta depending on the type of the attribute
252
+ # According to original version, this is called millions of times
253
+ # and a cache is required.
254
+ # @param name [Symbol]
255
+ def attrtype(name)
256
+ raise NotImplementedError, "attrtype() - returns the kind (:meta, :param, or :property) of the parameter"
257
+ # @attr_types[name]
258
+ end
259
+
260
+ # Returns the implementation of a param/property/attribute - i.e. a Param class
261
+ def attrclass(name)
262
+ raise NotImplementedError, "attrclass() - returns the (param) class of the parameter"
263
+ end
264
+
265
+ # PROBABLY NOT USED WHEN COMPILING
266
+ # Returns the names of all attributes in a defined order:
267
+ # * all key attributes (the composite id)
268
+ # * :provider if it is specified
269
+ # * all properties
270
+ # * all parameters
271
+ # * meta parameters
272
+ #
273
+ def allattrs
274
+ raise NotImplementedError, "allattrs() - return all attribute names in order - probably not used master side"
275
+ # key_attributes | (parameters & [:provider]) | properties.collect { |property| property.name } | parameters | metaparams
276
+ end
277
+
278
+ # Sets "applies to host"
279
+ def apply_to
280
+ raise NotImplementedError, "apply_to() - probably used when selecting a provider (device/host support)"
281
+ end
282
+
283
+ def apply_to_host
284
+ raise NotImplementedError, "apply_to_host() - probably used when selecting a provider (device/host support)"
285
+ end
286
+
287
+ def apply_to_device
288
+ raise NotImplementedError, "apply_to_device() - probably used when selecting a provider (device/host support)"
289
+ end
290
+
291
+ def apply_to_all
292
+ raise NotImplementedError, "apply_to_all() - probably used when selecting a provider (device/host support)"
293
+ end
294
+
295
+ def can_apply_to_target(target)
296
+ raise NotImplementedError, "can_apply_to_target() - probably used when selecting a provider (device/host support)"
297
+ end
298
+
299
+ end
300
+ end
301
+ end