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
@@ -649,7 +649,7 @@ describe Puppet::SSL::Host do
649
649
  it "should use the CA to sign its certificate request if it does not have a certificate" do
650
650
  @host.expects(:certificate).returns nil
651
651
 
652
- @ca.expects(:sign).with(@host.name, true)
652
+ @ca.expects(:sign).with(@host.name, {allow_dns_alt_names: true})
653
653
 
654
654
  @host.generate
655
655
  end
@@ -12,28 +12,31 @@ describe Puppet::SSL::Oids do
12
12
  'pp_instance_id' => '1.3.6.1.4.1.34380.1.1.2',
13
13
  'pp_image_name' => '1.3.6.1.4.1.34380.1.1.3',
14
14
  'pp_preshared_key' => '1.3.6.1.4.1.34380.1.1.4',
15
- 'pp_cost_center' => "1.3.6.1.4.1.34380.1.1.5",
16
- 'pp_product' => "1.3.6.1.4.1.34380.1.1.6",
17
- 'pp_project' => "1.3.6.1.4.1.34380.1.1.7",
18
- 'pp_application' => "1.3.6.1.4.1.34380.1.1.8",
19
- 'pp_service' => "1.3.6.1.4.1.34380.1.1.9",
20
- 'pp_employee' => "1.3.6.1.4.1.34380.1.1.10",
21
- 'pp_created_by' => "1.3.6.1.4.1.34380.1.1.11",
22
- 'pp_environment' => "1.3.6.1.4.1.34380.1.1.12",
23
- 'pp_role' => "1.3.6.1.4.1.34380.1.1.13",
24
- 'pp_software_version' => "1.3.6.1.4.1.34380.1.1.14",
25
- 'pp_department' => "1.3.6.1.4.1.34380.1.1.15",
26
- 'pp_cluster' => "1.3.6.1.4.1.34380.1.1.16",
27
- 'pp_provisioner' => "1.3.6.1.4.1.34380.1.1.17",
28
- 'pp_region' => "1.3.6.1.4.1.34380.1.1.18",
29
- 'pp_datacenter' => "1.3.6.1.4.1.34380.1.1.19",
30
- 'pp_zone' => "1.3.6.1.4.1.34380.1.1.20",
31
- 'pp_network' => "1.3.6.1.4.1.34380.1.1.21",
32
- 'pp_securitypolicy' => "1.3.6.1.4.1.34380.1.1.22",
33
- 'pp_cloudplatform' => "1.3.6.1.4.1.34380.1.1.23",
34
- 'pp_apptier' => "1.3.6.1.4.1.34380.1.1.24",
35
- 'pp_hostname' => "1.3.6.1.4.1.34380.1.1.25",
15
+ 'pp_cost_center' => '1.3.6.1.4.1.34380.1.1.5',
16
+ 'pp_product' => '1.3.6.1.4.1.34380.1.1.6',
17
+ 'pp_project' => '1.3.6.1.4.1.34380.1.1.7',
18
+ 'pp_application' => '1.3.6.1.4.1.34380.1.1.8',
19
+ 'pp_service' => '1.3.6.1.4.1.34380.1.1.9',
20
+ 'pp_employee' => '1.3.6.1.4.1.34380.1.1.10',
21
+ 'pp_created_by' => '1.3.6.1.4.1.34380.1.1.11',
22
+ 'pp_environment' => '1.3.6.1.4.1.34380.1.1.12',
23
+ 'pp_role' => '1.3.6.1.4.1.34380.1.1.13',
24
+ 'pp_software_version' => '1.3.6.1.4.1.34380.1.1.14',
25
+ 'pp_department' => '1.3.6.1.4.1.34380.1.1.15',
26
+ 'pp_cluster' => '1.3.6.1.4.1.34380.1.1.16',
27
+ 'pp_provisioner' => '1.3.6.1.4.1.34380.1.1.17',
28
+ 'pp_region' => '1.3.6.1.4.1.34380.1.1.18',
29
+ 'pp_datacenter' => '1.3.6.1.4.1.34380.1.1.19',
30
+ 'pp_zone' => '1.3.6.1.4.1.34380.1.1.20',
31
+ 'pp_network' => '1.3.6.1.4.1.34380.1.1.21',
32
+ 'pp_securitypolicy' => '1.3.6.1.4.1.34380.1.1.22',
33
+ 'pp_cloudplatform' => '1.3.6.1.4.1.34380.1.1.23',
34
+ 'pp_apptier' => '1.3.6.1.4.1.34380.1.1.24',
35
+ 'pp_hostname' => '1.3.6.1.4.1.34380.1.1.25',
36
36
  'ppPrivCertExt' => '1.3.6.1.4.1.34380.1.2',
37
+ 'ppAuthCertExt' => '1.3.6.1.4.1.34380.1.3',
38
+ 'pp_authorization' => '1.3.6.1.4.1.34380.1.3.1',
39
+ 'pp_auth_role' => '1.3.6.1.4.1.34380.1.3.13',
37
40
  }.each_pair do |sn, oid|
38
41
  it "defines #{sn} as #{oid}" do
39
42
  object_id = OpenSSL::ASN1::ObjectId.new(sn)
@@ -128,7 +128,9 @@ describe Puppet::Transaction::Event do
128
128
  :desired_value => 7, :historical_value => 'Brazil',
129
129
  :message => "Help I'm trapped in a spec test",
130
130
  :name => :mode_changed, :previous_value => 6, :property => :mode,
131
- :status => 'success')
131
+ :status => 'success',
132
+ :redacted => false,
133
+ :corrective_change => false)
132
134
  expect(event.to_yaml_properties).to match_array(Puppet::Transaction::Event::YAML_ATTRIBUTES)
133
135
  end
134
136
  end
@@ -0,0 +1,173 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+
4
+ require 'yaml'
5
+ require 'fileutils'
6
+ require 'puppet/transaction/persistence'
7
+
8
+ describe Puppet::Transaction::Persistence do
9
+ include PuppetSpec::Files
10
+
11
+ before(:each) do
12
+ @basepath = File.expand_path("/somepath")
13
+ end
14
+
15
+ describe "when loading from file" do
16
+ before do
17
+ Puppet.settings.stubs(:use).returns(true)
18
+ end
19
+
20
+ describe "when the file/directory does not exist" do
21
+ before(:each) do
22
+ @path = tmpfile('storage_test')
23
+ end
24
+
25
+ it "should not fail to load" do
26
+ expect(Puppet::FileSystem.exist?(@path)).to be_falsey
27
+ Puppet[:statedir] = @path
28
+ persistence = Puppet::Transaction::Persistence.new
29
+ persistence.load
30
+ Puppet[:transactionstorefile] = @path
31
+ persistence = Puppet::Transaction::Persistence.new
32
+ persistence.load
33
+ end
34
+ end
35
+
36
+ describe "when the file/directory exists" do
37
+ before(:each) do
38
+ @tmpfile = tmpfile('storage_test')
39
+ Puppet[:transactionstorefile] = @tmpfile
40
+ end
41
+
42
+ def write_state_file(contents)
43
+ File.open(@tmpfile, 'w') { |f| f.write(contents) }
44
+ end
45
+
46
+ it "should overwrite its internal state if load() is called" do
47
+ resource = "Foo[bar]"
48
+ property = "my"
49
+ value = "something"
50
+
51
+ Puppet.expects(:err).never
52
+
53
+ persistence = Puppet::Transaction::Persistence.new
54
+ persistence.set_system_value(resource, property, value)
55
+
56
+ persistence.load
57
+
58
+ expect(persistence.get_system_value(resource, property)).to eq(nil)
59
+ end
60
+
61
+ it "should restore its internal state if the file contains valid YAML" do
62
+ test_yaml = {"resources"=>{"a"=>"b"}}
63
+ write_state_file(test_yaml.to_yaml)
64
+
65
+ Puppet.expects(:err).never
66
+
67
+ persistence = Puppet::Transaction::Persistence.new
68
+ persistence.load
69
+
70
+ expect(persistence.data).to eq(test_yaml)
71
+ end
72
+
73
+ it "should initialize with a clear internal state if the file does not contain valid YAML" do
74
+ write_state_file('{ invalid')
75
+
76
+ Puppet.expects(:err).with(regexp_matches(/Transaction store file .* is corrupt/))
77
+
78
+ persistence = Puppet::Transaction::Persistence.new
79
+ persistence.load
80
+
81
+ expect(persistence.data).to eq({})
82
+ end
83
+
84
+ it "should initialize with a clear internal state if the file does not contain a hash of data" do
85
+ write_state_file("not_a_hash")
86
+
87
+ Puppet.expects(:err).with(regexp_matches(/Transaction store file .* is valid YAML but not returning a hash/))
88
+
89
+ persistence = Puppet::Transaction::Persistence.new
90
+ persistence.load
91
+
92
+ expect(persistence.data).to eq({})
93
+ end
94
+
95
+ it "should raise an error if the file does not contain valid YAML and cannot be renamed" do
96
+ write_state_file('{ invalid')
97
+
98
+ File.expects(:rename).raises(SystemCallError)
99
+
100
+ Puppet.expects(:err).with(regexp_matches(/Transaction store file .* is corrupt/))
101
+ Puppet.expects(:err).with(regexp_matches(/Unable to rename/))
102
+
103
+ persistence = Puppet::Transaction::Persistence.new
104
+ expect { persistence.load }.to raise_error(Puppet::Error, /Could not rename/)
105
+ end
106
+
107
+ it "should attempt to rename the file if the file is corrupted" do
108
+ write_state_file('{ invalid')
109
+
110
+ File.expects(:rename).at_least_once
111
+
112
+ Puppet.expects(:err).with(regexp_matches(/Transaction store file .* is corrupt/))
113
+
114
+ persistence = Puppet::Transaction::Persistence.new
115
+ persistence.load
116
+ end
117
+
118
+ it "should fail gracefully on load() if the file is not a regular file" do
119
+ FileUtils.rm_f(@tmpfile)
120
+ Dir.mkdir(@tmpfile)
121
+
122
+ Puppet.expects(:warning).with(regexp_matches(/Transaction store file .* is not a file/))
123
+
124
+ persistence = Puppet::Transaction::Persistence.new
125
+ persistence.load
126
+ end
127
+ end
128
+ end
129
+
130
+ describe "when storing to the file" do
131
+ before(:each) do
132
+ @tmpfile = tmpfile('persistence_test')
133
+ @saved = Puppet[:transactionstorefile]
134
+ Puppet[:transactionstorefile] = @tmpfile
135
+ end
136
+
137
+ it "should create the file if it does not exist" do
138
+ expect(Puppet::FileSystem.exist?(Puppet[:transactionstorefile])).to be_falsey
139
+
140
+ persistence = Puppet::Transaction::Persistence.new
141
+ persistence.save
142
+
143
+ expect(Puppet::FileSystem.exist?(Puppet[:transactionstorefile])).to be_truthy
144
+ end
145
+
146
+ it "should raise an exception if the file is not a regular file" do
147
+ Dir.mkdir(Puppet[:transactionstorefile])
148
+ persistence = Puppet::Transaction::Persistence.new
149
+
150
+ if Puppet.features.microsoft_windows?
151
+ expect { persistence.save }.to raise_error(Puppet::Util::Windows::Error, /Access is denied/)
152
+ else
153
+ expect { persistence.save }.to raise_error(Errno::EISDIR, /Is a directory/)
154
+ end
155
+
156
+ Dir.rmdir(Puppet[:transactionstorefile])
157
+ end
158
+
159
+ it "should load the same information that it saves" do
160
+ resource = "File[/tmp/foo]"
161
+ property = "content"
162
+ value = "foo"
163
+
164
+ persistence = Puppet::Transaction::Persistence.new
165
+ persistence.set_system_value(resource, property, value)
166
+
167
+ persistence.save
168
+ persistence.load
169
+
170
+ expect(persistence.get_system_value(resource, property)).to eq(value)
171
+ end
172
+ end
173
+ end
@@ -70,6 +70,24 @@ describe Puppet::Transaction::Report do
70
70
  expect(report.cached_catalog_status).to eq("explicitly_requested")
71
71
  end
72
72
 
73
+ it "should set noop to true if Puppet[:noop] is true" do
74
+ Puppet[:noop] = true
75
+ report = Puppet::Transaction::Report.new("apply")
76
+ expect(report.noop).to be_truthy
77
+ end
78
+
79
+ it "should set noop to false if Puppet[:noop] is false" do
80
+ Puppet[:noop] = false
81
+ report = Puppet::Transaction::Report.new("apply")
82
+ expect(report.noop).to be_falsey
83
+ end
84
+
85
+ it "should set noop to false if Puppet[:noop] is unset" do
86
+ Puppet[:noop] = nil
87
+ report = Puppet::Transaction::Report.new("apply")
88
+ expect(report.noop).to be_falsey
89
+ end
90
+
73
91
  it "should take 'environment' as an argument" do
74
92
  expect(Puppet::Transaction::Report.new("inspect", "some configuration version", "some environment").environment).to eq("some environment")
75
93
  end
@@ -218,7 +236,6 @@ describe Puppet::Transaction::Report do
218
236
  end
219
237
  end
220
238
 
221
-
222
239
  [:time, :resources, :changes, :events].each do |type|
223
240
  it "should add #{type} metrics" do
224
241
  @report.finalize_report
@@ -334,6 +351,50 @@ describe Puppet::Transaction::Report do
334
351
  end
335
352
  end
336
353
  end
354
+
355
+ describe "for noop events" do
356
+ it "should have 'noop_pending == false' when no events are available" do
357
+ add_statuses(3)
358
+ @report.finalize_report
359
+ expect(@report.noop_pending).to be_falsey
360
+ end
361
+
362
+ it "should have 'noop_pending == false' when no 'noop' events are available" do
363
+ add_statuses(3) do |status|
364
+ ['success', 'audit'].each do |status_name|
365
+ event = Puppet::Transaction::Event.new
366
+ event.status = status_name
367
+ status.add_event(event)
368
+ end
369
+ end
370
+ @report.finalize_report
371
+ expect(@report.noop_pending).to be_falsey
372
+ end
373
+
374
+ it "should have 'noop_pending == true' when 'noop' events are available" do
375
+ add_statuses(3) do |status|
376
+ ['success', 'audit', 'noop'].each do |status_name|
377
+ event = Puppet::Transaction::Event.new
378
+ event.status = status_name
379
+ status.add_event(event)
380
+ end
381
+ end
382
+ @report.finalize_report
383
+ expect(@report.noop_pending).to be_truthy
384
+ end
385
+
386
+ it "should have 'noop_pending == true' when 'noop' and 'failure' events are available" do
387
+ add_statuses(3) do |status|
388
+ ['success', 'failure', 'audit', 'noop'].each do |status_name|
389
+ event = Puppet::Transaction::Event.new
390
+ event.status = status_name
391
+ status.add_event(event)
392
+ end
393
+ end
394
+ @report.finalize_report
395
+ expect(@report.noop_pending).to be_truthy
396
+ end
397
+ end
337
398
  end
338
399
 
339
400
  describe "when producing a summary" do
@@ -509,6 +570,7 @@ describe Puppet::Transaction::Report do
509
570
  report.code_id = "some code id"
510
571
  report.catalog_uuid = "some catalog uuid"
511
572
  report.cached_catalog_status = "not_used"
573
+ report.master_used = "test:000"
512
574
  report.add_resource_status(status)
513
575
  report.finalize_report
514
576
  report
@@ -525,6 +587,7 @@ describe Puppet::Transaction::Report do
525
587
  report.code_id = "some code id"
526
588
  report.catalog_uuid = "some catalog uuid"
527
589
  report.cached_catalog_status = "not_used"
590
+ report.master_used = "test:000"
528
591
  report.add_resource_status(status)
529
592
  report.finalize_report
530
593
  report
@@ -418,6 +418,97 @@ describe Puppet::Transaction::ResourceHarness do
418
418
  end
419
419
  end
420
420
 
421
+ describe "handling sensitive properties" do
422
+ describe 'when syncing' do
423
+ let(:test_file) do
424
+ tmpfile('foo').tap do |path|
425
+ File.open(path, 'w') { |fh| fh.write("goodbye world") }
426
+ end
427
+ end
428
+
429
+ let(:resource) do
430
+ Puppet::Type.type(:file).new(:path => test_file, :backup => false, :content => "hello world").tap do |r|
431
+ r.parameter(:content).sensitive = true
432
+ end
433
+ end
434
+
435
+ it "redacts event messages for sensitive properties" do
436
+ status = @harness.evaluate(resource)
437
+ sync_event = status.events[0]
438
+ expect(sync_event.message).to eq 'changed [redacted] to [redacted]'
439
+ end
440
+
441
+ it "redacts event contents for sensitive properties" do
442
+ status = @harness.evaluate(resource)
443
+ sync_event = status.events[0]
444
+ expect(sync_event.previous_value).to eq '[redacted]'
445
+ expect(sync_event.desired_value).to eq '[redacted]'
446
+ end
447
+
448
+ it "redacts event messages for sensitive properties when simulating noop changes" do
449
+ resource[:noop] = true
450
+ status = @harness.evaluate(resource)
451
+ sync_event = status.events[0]
452
+ expect(sync_event.message).to eq 'current_value [redacted], should be [redacted] (noop)'
453
+ end
454
+
455
+ describe 'auditing' do
456
+ before do
457
+ resource[:audit] = ['content']
458
+ end
459
+
460
+ it "redacts notices when a parameter is newly audited" do
461
+ resource.property(:content).expects(:notice).with("audit change: newly-recorded value [redacted]")
462
+ @harness.evaluate(resource)
463
+ end
464
+
465
+ it "redacts event messages for sensitive properties" do
466
+ Puppet::Util::Storage.stubs(:cache).with(resource).returns({:content => "historical world"})
467
+ status = @harness.evaluate(resource)
468
+ sync_event = status.events[0]
469
+ expect(sync_event.message).to eq 'changed [redacted] to [redacted] (previously recorded value was [redacted])'
470
+ end
471
+
472
+ it "redacts audit event messages for sensitive properties when simulating noop changes" do
473
+ Puppet::Util::Storage.stubs(:cache).with(resource).returns({:content => "historical world"})
474
+ resource[:noop] = true
475
+ status = @harness.evaluate(resource)
476
+ sync_event = status.events[0]
477
+ expect(sync_event.message).to eq 'current_value [redacted], should be [redacted] (noop) (previously recorded value was [redacted])'
478
+ end
479
+
480
+ it "redacts event contents for sensitive properties" do
481
+ Puppet::Util::Storage.stubs(:cache).with(resource).returns({:content => "historical world"})
482
+ status = @harness.evaluate(resource)
483
+ sync_event = status.events[0]
484
+ expect(sync_event.historical_value).to eq '[redacted]'
485
+ end
486
+ end
487
+ end
488
+
489
+ describe 'handling errors' do
490
+ it "redacts event messages generated when syncing a param raises a StandardError" do
491
+ stub_provider = make_stub_provider
492
+ resource = stub_provider.new :name => 'name', :bar => 1
493
+ resource.parameter(:bar).sensitive = true
494
+ status = @harness.evaluate(resource)
495
+
496
+ error_event = status.events[0]
497
+ expect(error_event.message).to eq "change from [redacted] to [redacted] failed: bar"
498
+ end
499
+
500
+ it "redacts event messages generated when syncing a param raises an Exception" do
501
+ stub_provider = make_stub_provider
502
+ resource = stub_provider.new :name => 'name', :baz => 1
503
+ resource.parameter(:baz).sensitive = true
504
+
505
+ expect { @harness.evaluate(resource) }.to raise_error(Exception, 'baz')
506
+
507
+ expect(@logs.first.message).to eq "change from [redacted] to [redacted] failed: baz"
508
+ end
509
+ end
510
+ end
511
+
421
512
  describe "when finding the schedule" do
422
513
  before do
423
514
  @catalog = Puppet::Resource::Catalog.new
@@ -184,25 +184,30 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
184
184
  expect(content.respond_to?("diff")).to eq(false)
185
185
  end
186
186
 
187
- [true, false].product([true, false]).each do |cfg, param|
188
- describe "and Puppet[:show_diff] is #{cfg} and show_diff => #{param}" do
187
+ describe "showing the diff" do
188
+ it "doesn't show the diff when #show_diff? is false" do
189
+ content.expects(:show_diff?).returns false
190
+ content.expects(:diff).never
191
+ expect(content).not_to be_safe_insync("other content")
192
+ end
193
+
194
+ describe "and #show_diff? is true" do
189
195
  before do
190
- Puppet[:show_diff] = cfg
191
- resource.stubs(:show_diff?).returns param
196
+ content.expects(:show_diff?).returns true
192
197
  resource[:loglevel] = "debug"
193
198
  end
194
199
 
195
- if cfg and param
196
- it "should display a diff" do
197
- content.expects(:diff).returns("my diff").once
198
- content.expects(:debug).with("\nmy diff").once
199
- expect(content).not_to be_safe_insync("other content")
200
- end
201
- else
202
- it "should not display a diff" do
203
- content.expects(:diff).never
204
- expect(content).not_to be_safe_insync("other content")
205
- end
200
+ it "prints the diff" do
201
+ content.expects(:diff).returns("my diff").once
202
+ content.expects(:debug).with("\nmy diff").once
203
+ expect(content).not_to be_safe_insync("other content")
204
+ end
205
+
206
+ it "redacts the diff when the property is sensitive" do
207
+ content.sensitive = true
208
+ content.expects(:diff).returns("my diff").never
209
+ content.expects(:debug).with("[diff redacted]").once
210
+ expect(content).not_to be_safe_insync("other content")
206
211
  end
207
212
  end
208
213
  end
@@ -308,6 +313,33 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
308
313
  end
309
314
  end
310
315
 
316
+ describe "determining if a diff should be shown" do
317
+ let(:content) { described_class.new(:resource => resource) }
318
+
319
+ before do
320
+ Puppet[:show_diff] = true
321
+ resource[:show_diff] = true
322
+ end
323
+
324
+ it "is true if there are changes and the global and per-resource show_diff settings are true" do
325
+ expect(content.show_diff?(true)).to be_truthy
326
+ end
327
+
328
+ it "is false if there are no changes" do
329
+ expect(content.show_diff?(false)).to be_falsey
330
+ end
331
+
332
+ it "is false if show_diff is globally disabled" do
333
+ Puppet[:show_diff] = false
334
+ expect(content.show_diff?(false)).to be_falsey
335
+ end
336
+
337
+ it "is false if show_diff is disabled on the resource" do
338
+ resource[:show_diff] = false
339
+ expect(content.show_diff?(false)).to be_falsey
340
+ end
341
+ end
342
+
311
343
  describe "when changing the content" do
312
344
  let(:content) { described_class.new(:resource => resource) }
313
345