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
@@ -68,7 +68,7 @@ Puppet::Type.type(:ssh_authorized_key).provide(
68
68
  end
69
69
  end
70
70
 
71
- # parse sshv2 option strings, wich is a comma separated list of
71
+ # Parse sshv2 option strings, which is a comma-separated list of
72
72
  # either key="values" elements or bare-word elements
73
73
  def self.parse_options(options)
74
74
  result = []
@@ -56,7 +56,7 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
56
56
  # Valid attributes to be managed by this provider.
57
57
  # It is a list with of hash
58
58
  # :aix_attr AIX command attribute name
59
- # :puppet_prop Puppet propertie name
59
+ # :puppet_prop Puppet property name
60
60
  # :to Method to adapt puppet property to aix command value. Optional.
61
61
  # :from Method to adapt aix command value to puppet property. Optional
62
62
  self.attribute_mapping = [
@@ -279,6 +279,7 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
279
279
 
280
280
  def managed_attribute_keys(hash)
281
281
  managed_attributes ||= @resource.original_parameters[:attributes] || hash.keys.map{|k| k.to_s}
282
+ managed_attributes = [managed_attributes] unless managed_attributes.is_a?(Array)
282
283
  managed_attributes.map {|attr| key, value = attr.split("="); key.strip.to_sym}
283
284
  end
284
285
 
@@ -289,7 +290,7 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
289
290
  end
290
291
 
291
292
  def filter_attributes(hash)
292
- # Return only managed attributtes.
293
+ # Return only managed attributes.
293
294
  managed_keys = managed_attribute_keys(hash)
294
295
  results = hash.select {
295
296
  |k,v| should_include?(k, managed_keys)
@@ -141,7 +141,7 @@ Puppet::Type.type(:user).provide :directoryservice do
141
141
  ################################
142
142
  # Get Password/Salt/Iterations #
143
143
  ################################
144
- if attribute_hash[:shadowhashdata].empty?
144
+ if attribute_hash[:shadowhashdata].nil? or attribute_hash[:shadowhashdata].empty?
145
145
  attribute_hash[:password] = '*'
146
146
  else
147
147
  embedded_binary_plist = get_embedded_binary_plist(attribute_hash[:shadowhashdata])
@@ -367,7 +367,7 @@ Puppet::Type.type(:user).provide :directoryservice do
367
367
  # flushing the dscl cache to allow all dscl calls to get INTO the cache
368
368
  # first. This could be made faster (and avoid a sleep call) by finding
369
369
  # a way to enter calls into the dscl cache faster. A sleep time of 1
370
- # second would intermittantly require a second Puppet run to set
370
+ # second would intermittently require a second Puppet run to set
371
371
  # properties, so 2 seconds seems to be the minimum working value.
372
372
  sleep 2
373
373
  flush_dscl_cache
@@ -553,6 +553,7 @@ Puppet::Type.type(:user).provide :directoryservice do
553
553
  # password hash (and Salt/Iterations value if the OS is 10.8 or greater)
554
554
  # into the ShadowHashData key of the user's plist.
555
555
  def set_shadow_hash_data(users_plist, binary_plist)
556
+ binary_plist = Puppet::Util::Plist.string_to_blob(binary_plist)
556
557
  if users_plist.has_key?('ShadowHashData')
557
558
  users_plist['ShadowHashData'][0] = binary_plist
558
559
  else
@@ -595,7 +596,7 @@ Puppet::Type.type(:user).provide :directoryservice do
595
596
  shadow_hash_data['SALTED-SHA512-PBKDF2'] = Hash.new unless shadow_hash_data['SALTED-SHA512-PBKDF2']
596
597
  case field
597
598
  when 'salt', 'entropy'
598
- shadow_hash_data['SALTED-SHA512-PBKDF2'][field] = base64_decode_string(value)
599
+ shadow_hash_data['SALTED-SHA512-PBKDF2'][field] = Puppet::Util::Plist.string_to_blob(base64_decode_string(value))
599
600
  when 'iterations'
600
601
  shadow_hash_data['SALTED-SHA512-PBKDF2'][field] = Integer(value)
601
602
  else
@@ -3,7 +3,7 @@ Puppet::Type.type(:user).provide :hpuxuseradd, :parent => :useradd do
3
3
  switch to HP-UX's special `usermod` binary to work around the fact that
4
4
  its standard `usermod` cannot make changes while the user is logged in.
5
5
  New functionality provides for changing trusted computing passwords and
6
- resetting password expirations under trusted computing"
6
+ resetting password expirations under trusted computing."
7
7
 
8
8
  defaultfor :operatingsystem => "hp-ux"
9
9
  confine :operatingsystem => "hp-ux"
@@ -161,7 +161,7 @@ Puppet::Type.type(:user).provide :user_role_add, :parent => :useradd, :source =>
161
161
  return @shadow_entry if defined? @shadow_entry
162
162
  @shadow_entry = File.readlines(target_file_path).
163
163
  reject { |r| r =~ /^[^\w]/ }.
164
- # PUP-229 dont suppress the empty fields
164
+ # PUP-229: don't suppress the empty fields
165
165
  collect { |l| l.chomp.split(':', -1) }.
166
166
  find { |user, _| user == @resource[:name] }
167
167
  end
@@ -117,6 +117,9 @@ Puppet::Type.type(:user).provide :windows_adsi do
117
117
  end
118
118
 
119
119
  def password
120
+ # avoid a LogonUserW style password check when the resource is not yet
121
+ # populated with a password (as is the case with `puppet resource user`)
122
+ return nil if @resource[:password].nil?
120
123
  user.password_is?( @resource[:password] ) ? @resource[:password] : nil
121
124
  end
122
125
 
@@ -47,7 +47,7 @@ Puppet::Type.type(:zfs).provide(:zfs) do
47
47
  [:aclmode, :shareiscsi].each do |field|
48
48
  # The zfs commands use the property value '-' to indicate that the
49
49
  # property is not set. We make use of this value to indicate that the
50
- # property is not set since it is not avaliable. Conversely, if these
50
+ # property is not set since it is not available. Conversely, if these
51
51
  # properties are attempted to be unset, and resulted in an error, our
52
52
  # best bet is to catch the exception and continue.
53
53
  define_method(field) do
@@ -36,7 +36,7 @@ Puppet::Util::Reference.newreference :type, :doc => "All Puppet resource types a
36
36
  - *Providers* provide low-level functionality for a given resource type. This is
37
37
  usually in the form of calling out to external commands.
38
38
 
39
- When required binaries are specified for providers, fully qualifed paths
39
+ When required binaries are specified for providers, fully qualified paths
40
40
  indicate that the binary must exist at that specific path and unqualified
41
41
  binaries indicate that Puppet will search for the binary using the shell
42
42
  path.
@@ -14,6 +14,11 @@ class Puppet::Resource
14
14
  attr_accessor :file, :line, :catalog, :exported, :virtual, :strict
15
15
  attr_reader :type, :title
16
16
 
17
+ # @!attribute [rw] sensitive_parameters
18
+ # @api private
19
+ # @return [Array<Symbol>] A list of parameters to be treated as sensitive
20
+ attr_accessor :sensitive_parameters
21
+
17
22
  # @deprecated
18
23
  attr_accessor :validate_parameters
19
24
 
@@ -36,6 +41,10 @@ class Puppet::Resource
36
41
  params.each { |param, value| resource[param] = value }
37
42
  end
38
43
 
44
+ if sensitive_parameters = data['sensitive_parameters']
45
+ resource.sensitive_parameters = sensitive_parameters.map(&:to_sym)
46
+ end
47
+
39
48
  if tags = data['tags']
40
49
  tags.each { |tag| resource.tag(tag) }
41
50
  end
@@ -74,6 +83,8 @@ class Puppet::Resource
74
83
 
75
84
  data["parameters"] = params unless params.empty?
76
85
 
86
+ data["sensitive_parameters"] = sensitive_parameters unless sensitive_parameters.empty?
87
+
77
88
  data
78
89
  end
79
90
 
@@ -141,12 +152,14 @@ class Puppet::Resource
141
152
 
142
153
  # Compatibility method.
143
154
  def builtin?
155
+ # TODO: should be deprecated (was only used in one place in puppet codebase)
144
156
  builtin_type?
145
157
  end
146
158
 
147
159
  # Is this a builtin resource type?
148
160
  def builtin_type?
149
- resource_type.is_a?(Class)
161
+ # Note - old implementation only checked if the resource_type was a Class
162
+ resource_type.is_a?(Puppet::CompilableResourceType)
150
163
  end
151
164
 
152
165
  # Iterate over each param/value pair, as required for Enumerable.
@@ -197,6 +210,7 @@ class Puppet::Resource
197
210
  # @api public
198
211
  def initialize(type, title = nil, attributes = {})
199
212
  @parameters = {}
213
+ @sensitive_parameters = []
200
214
  if type.is_a?(Puppet::Resource)
201
215
  # Copy constructor. Let's avoid munging, extracting, tagging, etc
202
216
  src = type
@@ -224,6 +238,7 @@ class Puppet::Resource
224
238
 
225
239
  self[p] = v
226
240
  end
241
+ @sensitive_parameters.replace(type.sensitive_parameters)
227
242
  else
228
243
  if type.is_a?(Hash)
229
244
  raise ArgumentError, "Puppet::Resource.new does not take a hash as the first argument. "+
@@ -231,12 +246,23 @@ class Puppet::Resource
231
246
  end
232
247
 
233
248
  environment = attributes[:environment]
234
- if type.is_a?(Class) && type < Puppet::Type
235
- # Set the resource type to avoid an expensive `known_resource_types`
236
- # lookup.
249
+ # In order to avoid an expensive search of 'known_resource_types" and
250
+ # to obey/preserve the implementation of the resource's type - if the
251
+ # given type is a resource type implementation (one of):
252
+ # * a "classic" 3.x ruby plugin
253
+ # * a compatible implementation (e.g. loading from pcore metadata)
254
+ # * a resolved user defined type
255
+ #
256
+ # ...then, modify the parameters to the "old" (agent side compatible) way
257
+ # of describing the type/title with string/symbols.
258
+ #
259
+ # TODO: Further optimizations should be possible as the "type juggling" is
260
+ # not needed when the type implementation is known.
261
+ #
262
+ if type.is_a?(Puppet::CompilableResourceType) || type.is_a?(Puppet::Resource::Type)
263
+ # set the resource type implementation
237
264
  self.resource_type = type
238
- # From this point on, the constructor behaves the same as if `type` had
239
- # been passed as a symbol.
265
+ # set the type name to the symbolic name
240
266
  type = type.name
241
267
  end
242
268
 
@@ -584,7 +610,7 @@ class Puppet::Resource
584
610
  def parse_title
585
611
  h = {}
586
612
  type = resource_type
587
- if type.respond_to? :title_patterns
613
+ if type.respond_to?(:title_patterns) && !type.title_patterns.nil?
588
614
  type.title_patterns.each { |regexp, symbols_and_lambdas|
589
615
  if captures = regexp.match(title.to_s)
590
616
  symbols_and_lambdas.zip(captures[1..-1]).each do |symbol_and_lambda,capture|
@@ -12,7 +12,11 @@ require 'json'
12
12
  # @api private
13
13
  module Puppet::Resource::CapabilityFinder
14
14
 
15
- # Looks the capability resource from PuppetDB.
15
+ # Looks up a capability resource from PuppetDB. Capability resources are
16
+ # required to be unique per environment and code id. If multiple copies of a
17
+ # capability resource are found, the one matching the current code id is
18
+ # used.
19
+ #
16
20
  # @param environment [String] environment name
17
21
  # @param code_id [String,nil] code_id of the catalog
18
22
  # @param cap [Puppet::Type] the capability resource type instance
@@ -22,6 +26,29 @@ module Puppet::Resource::CapabilityFinder
22
26
  raise Puppet::DevError, 'PuppetDB is not available'
23
27
  end
24
28
 
29
+ resources = search(environment, nil, cap)
30
+
31
+ if resources.size > 1 && code_id
32
+ Puppet.debug "Found multiple resources when looking up capability #{cap}, filtering by code id #{code_id}"
33
+ resources = search(environment, code_id, cap)
34
+ end
35
+
36
+ if resources.size > 1
37
+ raise Puppet::DevError,
38
+ "Unexpected response from PuppetDB when looking up #{cap}:\n" \
39
+ "expected exactly one resource but got #{resources.size};\n" \
40
+ "returned data is:\n#{resources.inspect}"
41
+ end
42
+
43
+ if resource_hash = resources.first
44
+ instantiate_resource(resource_hash)
45
+ else
46
+ Puppet.debug "Could not find capability resource #{cap} in PuppetDB"
47
+ nil
48
+ end
49
+ end
50
+
51
+ def self.search(environment, code_id, cap)
25
52
  query_terms = [
26
53
  'and',
27
54
  ['=', 'type', cap.type.capitalize],
@@ -36,67 +63,60 @@ module Puppet::Resource::CapabilityFinder
36
63
  ['=', 'code_id', code_id]]]]
37
64
  end
38
65
 
39
- Puppet.notice "Capability lookup #{cap}]: #{query_terms}"
66
+ Puppet.notice "Looking up capability #{cap} in PuppetDB: #{query_terms}"
40
67
 
41
- data = query_puppetdb(query_terms)
42
-
43
- # The format of the response body is documented at
44
- # http://docs.puppetlabs.com/puppetdb/3.0/api/query/v4/resources.html#response-format
45
- # In a nutshell, we expect to get an array of resources back. If the
46
- # array is empty, the lookup failed and we return +nil+, if it
47
- # contains exactly one, we turn that resource back into a Puppet
48
- # ::Resource. If the array contains more than one entry, we have a
49
- # bug in the overall system, as we allowed multiple capabilities with
50
- # the same type and title to be produced in this environment.
51
- unless data.is_a?(Array)
52
- raise Puppet::DevError,
53
- "Unexpected response from PuppetDB when looking up #{cap}: " +
54
- "expected an Array but got #{data.inspect}"
55
- end
56
- if data.size > 1
57
- raise Puppet::DevError,
58
- "Unexpected response from PuppetDB when looking up #{cap}:\n" +
59
- "expected exactly one resource but got #{data.size};\n" +
60
- "returned data is:\n#{data.inspect}"
61
- end
68
+ query_puppetdb(query_terms)
69
+ end
62
70
 
63
- unless data.empty?
64
- resource_hash = data.first
65
- resource = Puppet::Resource.new(resource_hash['type'],
66
- resource_hash['title'])
67
- real_type = Puppet::Type.type(resource.type)
68
- if real_type.nil?
69
- fail Puppet::ParseError,
70
- "Could not find resource type #{resource.type} returned from PuppetDB"
71
- end
72
- real_type.parameters.each do |param|
73
- param = param.to_s
74
- next if param == 'name'
75
- if value = resource_hash['parameters'][param]
76
- resource[param] = value
77
- else
78
- Puppet.debug "No capability value for #{resource}->#{param}"
71
+ def self.query_puppetdb(query)
72
+ begin
73
+ # If using PuppetDB >= 4, use the API method query_puppetdb()
74
+ result = if Puppet::Util::Puppetdb.respond_to?(:query_puppetdb)
75
+ # PuppetDB 4 uses a unified query endpoint, so we have to specify what we're querying
76
+ Puppet::Util::Puppetdb.query_puppetdb(["from", "resources", query])
77
+ # For PuppetDB < 4, use the old internal method action()
78
+ else
79
+ url = "/pdb/query/v4/resource?query=#{CGI.escape(query.to_json)}"
80
+ response = Puppet::Util::Puppetdb::Http.action(url) do |conn, uri|
81
+ conn.get(uri, { 'Accept' => 'application/json'})
79
82
  end
83
+ JSON.parse(response.body)
84
+ end
85
+
86
+ # The format of the response body is documented at
87
+ # http://docs.puppetlabs.com/puppetdb/3.0/api/query/v4/resources.html#response-format
88
+ unless result.is_a?(Array)
89
+ raise Puppet::DevError,
90
+ "Unexpected response from PuppetDB when looking up #{cap}: " \
91
+ "expected an Array but got #{result.inspect}"
80
92
  end
81
- return resource
93
+
94
+ result
95
+ rescue JSON::JSONError => e
96
+ raise Puppet::DevError,
97
+ "Invalid JSON from PuppetDB when looking up #{cap}\n#{e}"
82
98
  end
83
99
  end
84
100
 
85
- def self.query_puppetdb(query)
86
- # If using PuppetDB >= 4, use the API method query_puppetdb()
87
- if Puppet::Util::Puppetdb.respond_to?(:query_puppetdb)
88
- # PuppetDB 4 uses a unified query endpoint, so we have to specify what we're querying
89
- Puppet::Util::Puppetdb.query_puppetdb(["from", "resources", query])
90
- # For PuppetDB < 4, use the old internal method action()
91
- else
92
- url = "/pdb/query/v4/resource?query=#{CGI.escape(query.to_json)}"
93
- response = Puppet::Util::Puppetdb::Http.action(url) do |conn, uri|
94
- conn.get(uri, { 'Accept' => 'application/json'})
101
+ private
102
+
103
+ def self.instantiate_resource(resource_hash)
104
+ resource = Puppet::Resource.new(resource_hash['type'],
105
+ resource_hash['title'])
106
+ real_type = Puppet::Type.type(resource.type)
107
+ if real_type.nil?
108
+ fail Puppet::ParseError,
109
+ "Could not find resource type #{resource.type} returned from PuppetDB"
110
+ end
111
+ real_type.parameters.each do |param|
112
+ param = param.to_s
113
+ next if param == 'name'
114
+ if value = resource_hash['parameters'][param]
115
+ resource[param] = value
116
+ else
117
+ Puppet.debug "No capability value for #{resource}->#{param}"
95
118
  end
96
- JSON.parse(response.body)
97
119
  end
98
- rescue JSON::JSONError => e
99
- raise Puppet::DevError,
100
- "Invalid JSON from PuppetDB when looking up #{cap}\n#{e}"
120
+ return resource
101
121
  end
102
122
  end
@@ -30,7 +30,7 @@ module Puppet
30
30
  attr_accessor :evaluation_time
31
31
 
32
32
  # Boolean status types set while evaluating `@real_resource`.
33
- STATES = [:skipped, :failed, :failed_to_restart, :restarted, :changed, :out_of_sync, :scheduled]
33
+ STATES = [:skipped, :failed, :failed_to_restart, :restarted, :changed, :out_of_sync, :scheduled, :corrective_change]
34
34
  attr_accessor *STATES
35
35
 
36
36
  # @!attribute [r] source_description
@@ -83,6 +83,10 @@ module Puppet
83
83
  # while evaluating `@real_resource`.
84
84
  attr_reader :events
85
85
 
86
+ # @!attribute [r] corrective_change
87
+ # @return [Boolean] true if the resource contained a corrective change.
88
+ attr_reader :corrective_change
89
+
86
90
  # @!attribute [rw] failed_dependencies
87
91
  # @return [Array<Puppet::Resource>] A cache of all
88
92
  # dependencies of this resource that failed to apply.
@@ -130,6 +134,9 @@ module Puppet
130
134
  @out_of_sync_count += 1
131
135
  @out_of_sync = true
132
136
  end
137
+ if event.corrective_change
138
+ @corrective_change = true
139
+ end
133
140
  end
134
141
 
135
142
  def failed_because(detail)
@@ -153,6 +160,7 @@ module Puppet
153
160
  @out_of_sync = false
154
161
  @skipped = false
155
162
  @failed = false
163
+ @corrective_change = false
156
164
 
157
165
  @file = resource.file
158
166
  @line = resource.line
@@ -181,7 +189,7 @@ module Puppet
181
189
  @changed = data['changed']
182
190
  @skipped = data['skipped']
183
191
  @failed = data['failed']
184
-
192
+ @corrective_change = data['corrective_change']
185
193
  @events = data['events'].map do |event|
186
194
  # in YAML (for reports) we serialize this as an object, but
187
195
  # in PSON it becomes a hash. Depending on where we came from
@@ -212,6 +220,7 @@ module Puppet
212
220
  'change_count' => @change_count,
213
221
  'out_of_sync_count' => @out_of_sync_count,
214
222
  'events' => @events,
223
+ 'corrective_change' => @corrective_change,
215
224
  }
216
225
  end
217
226
 
@@ -29,6 +29,7 @@ class Puppet::Settings
29
29
  require 'puppet/settings/config_file'
30
30
  require 'puppet/settings/value_translator'
31
31
  require 'puppet/settings/environment_conf'
32
+ require 'puppet/settings/server_list_setting'
32
33
 
33
34
  # local reference for convenience
34
35
  PuppetOptionParser = Puppet::Util::CommandLine::PuppetOptionParser
@@ -667,6 +668,7 @@ class Puppet::Settings
667
668
  :symbolic_enum => SymbolicEnumSetting,
668
669
  :priority => PrioritySetting,
669
670
  :autosign => AutosignSetting,
671
+ :server_list => ServerListSetting
670
672
  }
671
673
 
672
674
  # Create a new setting. The value is passed in because it's used to determine
@@ -876,7 +878,7 @@ class Puppet::Settings
876
878
  # also supports additional options such as "mode", "owner", "group"
877
879
  # :directory - A (single) directory path; puppet may attempt to create this file depending on how the settings are used. This type
878
880
  # also supports additional options such as "mode", "owner", "group"
879
- # :path - This is intended to be used for settings whose value can contain multiple directory paths, respresented
881
+ # :path - This is intended to be used for settings whose value can contain multiple directory paths, represented
880
882
  # as strings separated by the system path separator (e.g. system path, module path, etc.).
881
883
  # [:mode] => an (optional) octal value to be used as the permissions/mode for :file and :directory settings
882
884
  # [:owner] => optional owner username/uid for :file and :directory settings
@@ -1360,12 +1362,21 @@ Generated on #{Time.now}.
1360
1362
  "Attempt to assign a value to unknown setting #{name.inspect}"
1361
1363
  end
1362
1364
 
1363
- if default.has_hook?
1364
- default.handle(value)
1365
- end
1366
-
1365
+ # This little exception-handling dance ensures that a hook is
1366
+ # able to check whether a value for itself has been explicitly
1367
+ # set, while still preserving the existing value if the hook
1368
+ # throws (as was existing behavior)
1369
+ old_value = @values[name]
1367
1370
  @values[name] = value
1368
- end
1371
+ begin
1372
+ if default.has_hook?
1373
+ default.handle(value)
1374
+ end
1375
+ rescue Exception => e
1376
+ @values[name] = old_value
1377
+ raise e
1378
+ end
1379
+ end
1369
1380
 
1370
1381
  def inspect
1371
1382
  %Q{<#{self.class}:#{self.object_id} @name="#{@name}" @values="#{@values}">}