puppet 5.5.17 → 5.5.22

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 (340) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +1 -1
  3. data/Gemfile +4 -5
  4. data/Gemfile.lock +59 -55
  5. data/ext/build_defaults.yaml +1 -0
  6. data/ext/cert_inspector +3 -3
  7. data/ext/puppet-test +2 -2
  8. data/ext/regexp_nodes/regexp_nodes.rb +4 -4
  9. data/ext/windows/service/daemon.rb +54 -8
  10. data/install.rb +6 -6
  11. data/lib/puppet.rb +5 -2
  12. data/lib/puppet/agent.rb +5 -13
  13. data/lib/puppet/application.rb +1 -1
  14. data/lib/puppet/application/agent.rb +3 -1
  15. data/lib/puppet/application/apply.rb +2 -2
  16. data/lib/puppet/application/describe.rb +3 -9
  17. data/lib/puppet/application/doc.rb +1 -1
  18. data/lib/puppet/application/filebucket.rb +13 -0
  19. data/lib/puppet/application/lookup.rb +1 -1
  20. data/lib/puppet/application/script.rb +2 -2
  21. data/lib/puppet/configurer.rb +106 -31
  22. data/lib/puppet/configurer/downloader.rb +33 -16
  23. data/lib/puppet/daemon.rb +1 -1
  24. data/lib/puppet/defaults.rb +86 -40
  25. data/lib/puppet/error.rb +9 -1
  26. data/lib/puppet/external/nagios/base.rb +1 -1
  27. data/lib/puppet/face/ca.rb +1 -1
  28. data/lib/puppet/face/module/list.rb +5 -5
  29. data/lib/puppet/face/module/search.rb +1 -1
  30. data/lib/puppet/face/module/uninstall.rb +1 -1
  31. data/lib/puppet/face/module/upgrade.rb +1 -1
  32. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  33. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  34. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  35. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  36. data/lib/puppet/file_system.rb +0 -8
  37. data/lib/puppet/file_system/memory_file.rb +1 -1
  38. data/lib/puppet/file_system/posix.rb +3 -2
  39. data/lib/puppet/file_system/uniquefile.rb +4 -0
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/functions/epp.rb +4 -4
  42. data/lib/puppet/functions/inline_epp.rb +5 -5
  43. data/lib/puppet/functions/new.rb +8 -3
  44. data/lib/puppet/functions/reduce.rb +2 -4
  45. data/lib/puppet/functions/reverse_each.rb +1 -1
  46. data/lib/puppet/functions/step.rb +1 -1
  47. data/lib/puppet/gettext/module_translations.rb +1 -1
  48. data/lib/puppet/graph/rb_tree_map.rb +2 -2
  49. data/lib/puppet/graph/simple_graph.rb +6 -5
  50. data/lib/puppet/indirector/catalog/compiler.rb +8 -0
  51. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  52. data/lib/puppet/indirector/hiera.rb +6 -0
  53. data/lib/puppet/indirector/resource/ral.rb +1 -3
  54. data/lib/puppet/indirector/resource/validator.rb +1 -1
  55. data/lib/puppet/interface.rb +2 -1
  56. data/lib/puppet/loaders.rb +0 -1
  57. data/lib/puppet/metatype/manager.rb +1 -1
  58. data/lib/puppet/module.rb +1 -1
  59. data/lib/puppet/module_tool/applications/builder.rb +1 -1
  60. data/lib/puppet/module_tool/applications/installer.rb +1 -1
  61. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
  62. data/lib/puppet/module_tool/metadata.rb +1 -1
  63. data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
  64. data/lib/puppet/module_tool/tar/mini.rb +1 -1
  65. data/lib/puppet/network/http/api/indirected_routes.rb +13 -12
  66. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  67. data/lib/puppet/network/http/connection.rb +14 -12
  68. data/lib/puppet/network/http/pool.rb +7 -1
  69. data/lib/puppet/network/http/rack/rest.rb +2 -2
  70. data/lib/puppet/network/http/site.rb +1 -1
  71. data/lib/puppet/network/resolver.rb +2 -2
  72. data/lib/puppet/node/environment.rb +11 -3
  73. data/lib/puppet/parser/ast.rb +1 -1
  74. data/lib/puppet/parser/ast/resourceparam.rb +1 -1
  75. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  76. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  77. data/lib/puppet/parser/environment_compiler.rb +3 -0
  78. data/lib/puppet/parser/functions.rb +14 -10
  79. data/lib/puppet/parser/functions/epp.rb +3 -3
  80. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  81. data/lib/puppet/parser/resource.rb +3 -2
  82. data/lib/puppet/parser/resource/param.rb +6 -0
  83. data/lib/puppet/pops/adaptable.rb +7 -13
  84. data/lib/puppet/pops/adapters.rb +8 -4
  85. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  86. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  87. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
  88. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
  89. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  90. data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
  91. data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
  92. data/lib/puppet/pops/issues.rb +5 -0
  93. data/lib/puppet/pops/loaders.rb +1 -1
  94. data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
  95. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  96. data/lib/puppet/pops/merge_strategy.rb +22 -18
  97. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  98. data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
  99. data/lib/puppet/pops/parser/locator.rb +1 -1
  100. data/lib/puppet/pops/parser/pn_parser.rb +17 -16
  101. data/lib/puppet/pops/puppet_stack.rb +51 -48
  102. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  103. data/lib/puppet/pops/types/iterable.rb +34 -8
  104. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  105. data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
  106. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  107. data/lib/puppet/pops/types/string_converter.rb +10 -10
  108. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  109. data/lib/puppet/pops/types/types.rb +3 -3
  110. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  111. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  112. data/lib/puppet/property.rb +1 -1
  113. data/lib/puppet/property/ensure.rb +1 -1
  114. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  115. data/lib/puppet/provider/cron/crontab.rb +1 -1
  116. data/lib/puppet/provider/exec.rb +6 -2
  117. data/lib/puppet/provider/group/groupadd.rb +19 -19
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  120. data/lib/puppet/provider/mount.rb +1 -1
  121. data/lib/puppet/provider/mount/parsed.rb +8 -8
  122. data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
  123. data/lib/puppet/provider/nameservice/pw.rb +2 -2
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +14 -3
  126. data/lib/puppet/provider/package/dnfmodule.rb +141 -0
  127. data/lib/puppet/provider/package/dpkg.rb +16 -18
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +4 -2
  130. data/lib/puppet/provider/package/openbsd.rb +14 -2
  131. data/lib/puppet/provider/package/pip.rb +37 -10
  132. data/lib/puppet/provider/package/pkg.rb +18 -5
  133. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  134. data/lib/puppet/provider/package/pkgng.rb +16 -4
  135. data/lib/puppet/provider/package/portage.rb +4 -4
  136. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  137. data/lib/puppet/provider/package/rpm.rb +6 -6
  138. data/lib/puppet/provider/package/windows/package.rb +1 -1
  139. data/lib/puppet/provider/package/yum.rb +28 -20
  140. data/lib/puppet/provider/package/zypper.rb +1 -0
  141. data/lib/puppet/provider/package_targetable.rb +5 -4
  142. data/lib/puppet/provider/parsedfile.rb +1 -1
  143. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +3 -3
  144. data/lib/puppet/provider/selmodule/semodule.rb +43 -26
  145. data/lib/puppet/provider/service/daemontools.rb +9 -9
  146. data/lib/puppet/provider/service/openbsd.rb +1 -1
  147. data/lib/puppet/provider/service/rcng.rb +2 -2
  148. data/lib/puppet/provider/service/runit.rb +2 -8
  149. data/lib/puppet/provider/service/systemd.rb +31 -13
  150. data/lib/puppet/provider/user/directoryservice.rb +31 -6
  151. data/lib/puppet/provider/user/hpux.rb +1 -1
  152. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  153. data/lib/puppet/provider/user/useradd.rb +39 -20
  154. data/lib/puppet/provider/user/windows_adsi.rb +4 -5
  155. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  156. data/lib/puppet/reference/indirection.rb +2 -2
  157. data/lib/puppet/reference/metaparameter.rb +1 -3
  158. data/lib/puppet/reference/providers.rb +1 -1
  159. data/lib/puppet/reference/type.rb +3 -9
  160. data/lib/puppet/reports.rb +1 -1
  161. data/lib/puppet/resource.rb +1 -1
  162. data/lib/puppet/resource/catalog.rb +1 -1
  163. data/lib/puppet/resource/type.rb +10 -1
  164. data/lib/puppet/settings.rb +3 -3
  165. data/lib/puppet/settings/environment_conf.rb +1 -0
  166. data/lib/puppet/ssl/certificate.rb +2 -1
  167. data/lib/puppet/ssl/certificate_authority.rb +6 -5
  168. data/lib/puppet/ssl/certificate_authority/interface.rb +1 -1
  169. data/lib/puppet/ssl/certificate_factory.rb +2 -2
  170. data/lib/puppet/ssl/host.rb +3 -3
  171. data/lib/puppet/ssl/oids.rb +1 -1
  172. data/lib/puppet/test/test_helper.rb +20 -12
  173. data/lib/puppet/transaction/report.rb +1 -1
  174. data/lib/puppet/transaction/resource_harness.rb +1 -1
  175. data/lib/puppet/type.rb +8 -4
  176. data/lib/puppet/type/cron.rb +1 -1
  177. data/lib/puppet/type/exec.rb +7 -3
  178. data/lib/puppet/type/file.rb +14 -2
  179. data/lib/puppet/type/file/data_sync.rb +5 -1
  180. data/lib/puppet/type/group.rb +4 -2
  181. data/lib/puppet/type/interface.rb +1 -1
  182. data/lib/puppet/type/notify.rb +3 -2
  183. data/lib/puppet/type/package.rb +97 -8
  184. data/lib/puppet/type/schedule.rb +1 -1
  185. data/lib/puppet/type/selboolean.rb +17 -3
  186. data/lib/puppet/type/service.rb +2 -8
  187. data/lib/puppet/type/user.rb +5 -9
  188. data/lib/puppet/util.rb +35 -12
  189. data/lib/puppet/util/autoload.rb +9 -7
  190. data/lib/puppet/util/command_line/trollop.rb +1 -1
  191. data/lib/puppet/util/http_proxy.rb +8 -14
  192. data/lib/puppet/util/instance_loader.rb +1 -1
  193. data/lib/puppet/util/log.rb +1 -1
  194. data/lib/puppet/util/log/destinations.rb +3 -12
  195. data/lib/puppet/util/logging.rb +30 -18
  196. data/lib/puppet/util/metric.rb +2 -2
  197. data/lib/puppet/util/monkey_patches.rb +1 -1
  198. data/lib/puppet/util/nagios_maker.rb +2 -2
  199. data/lib/puppet/util/network_device/cisco/device.rb +1 -1
  200. data/lib/puppet/util/network_device/cisco/interface.rb +2 -2
  201. data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
  202. data/lib/puppet/util/pidlock.rb +12 -6
  203. data/lib/puppet/util/plist.rb +6 -0
  204. data/lib/puppet/util/provider_features.rb +2 -4
  205. data/lib/puppet/util/rdoc.rb +1 -1
  206. data/lib/puppet/util/reference.rb +1 -1
  207. data/lib/puppet/util/resource_template.rb +1 -1
  208. data/lib/puppet/util/selinux.rb +3 -1
  209. data/lib/puppet/util/windows/adsi.rb +60 -30
  210. data/lib/puppet/util/windows/api_types.rb +45 -32
  211. data/lib/puppet/util/windows/eventlog.rb +1 -6
  212. data/lib/puppet/util/windows/principal.rb +8 -6
  213. data/lib/puppet/util/windows/process.rb +16 -15
  214. data/lib/puppet/util/windows/registry.rb +17 -15
  215. data/lib/puppet/util/windows/security.rb +1 -0
  216. data/lib/puppet/util/windows/sid.rb +3 -3
  217. data/lib/puppet/vendor.rb +1 -1
  218. data/lib/puppet/version.rb +1 -1
  219. data/lib/puppet_pal.rb +2 -2
  220. data/locales/puppet.pot +362 -318
  221. data/man/man5/puppet.conf.5 +39 -9
  222. data/man/man8/puppet-agent.8 +2 -2
  223. data/man/man8/puppet-apply.8 +1 -1
  224. data/man/man8/puppet-ca.8 +1 -1
  225. data/man/man8/puppet-catalog.8 +1 -1
  226. data/man/man8/puppet-cert.8 +1 -1
  227. data/man/man8/puppet-certificate.8 +1 -1
  228. data/man/man8/puppet-certificate_request.8 +1 -1
  229. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  230. data/man/man8/puppet-config.8 +1 -1
  231. data/man/man8/puppet-describe.8 +1 -1
  232. data/man/man8/puppet-device.8 +1 -1
  233. data/man/man8/puppet-doc.8 +1 -1
  234. data/man/man8/puppet-epp.8 +1 -1
  235. data/man/man8/puppet-facts.8 +1 -1
  236. data/man/man8/puppet-filebucket.8 +16 -1
  237. data/man/man8/puppet-generate.8 +1 -1
  238. data/man/man8/puppet-help.8 +1 -1
  239. data/man/man8/puppet-key.8 +1 -1
  240. data/man/man8/puppet-lookup.8 +1 -1
  241. data/man/man8/puppet-man.8 +1 -1
  242. data/man/man8/puppet-master.8 +1 -1
  243. data/man/man8/puppet-module.8 +1 -1
  244. data/man/man8/puppet-node.8 +1 -1
  245. data/man/man8/puppet-parser.8 +1 -1
  246. data/man/man8/puppet-plugin.8 +1 -1
  247. data/man/man8/puppet-report.8 +1 -1
  248. data/man/man8/puppet-resource.8 +1 -1
  249. data/man/man8/puppet-script.8 +1 -1
  250. data/man/man8/puppet-status.8 +1 -1
  251. data/man/man8/puppet.8 +2 -2
  252. data/spec/fixtures/integration/provider/mailalias/aliases/test1 +1 -0
  253. data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list.txt +19 -0
  254. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  255. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  256. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  257. data/spec/integration/configurer_spec.rb +66 -0
  258. data/spec/integration/data_binding_spec.rb +1 -0
  259. data/spec/integration/defaults_spec.rb +1 -2
  260. data/spec/integration/faces/plugin_spec.rb +29 -47
  261. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  262. data/spec/integration/parser/compiler_spec.rb +11 -0
  263. data/spec/integration/type/notify_spec.rb +46 -0
  264. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  265. data/spec/integration/util/windows/registry_spec.rb +7 -7
  266. data/spec/shared_contexts/types_setup.rb +2 -0
  267. data/spec/unit/agent_spec.rb +34 -26
  268. data/spec/unit/application/apply_spec.rb +2 -12
  269. data/spec/unit/configurer/downloader_spec.rb +10 -0
  270. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  271. data/spec/unit/configurer_spec.rb +430 -415
  272. data/spec/unit/daemon_spec.rb +0 -1
  273. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  274. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  275. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  276. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  277. data/spec/unit/forge/forge_spec.rb +1 -3
  278. data/spec/unit/forge/repository_spec.rb +1 -3
  279. data/spec/unit/indirector/catalog/compiler_spec.rb +45 -26
  280. data/spec/unit/indirector/resource/ral_spec.rb +4 -4
  281. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  282. data/spec/unit/network/http/connection_spec.rb +43 -1
  283. data/spec/unit/network/http/pool_spec.rb +32 -0
  284. data/spec/unit/node_spec.rb +7 -4
  285. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  286. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  287. data/spec/unit/provider/exec_spec.rb +209 -0
  288. data/spec/unit/provider/group/groupadd_spec.rb +30 -1
  289. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  290. data/spec/unit/provider/package/aix_spec.rb +29 -0
  291. data/spec/unit/provider/package/apt_spec.rb +13 -2
  292. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  293. data/spec/unit/provider/package/dnfmodule_spec.rb +247 -0
  294. data/spec/unit/provider/package/dpkg_spec.rb +35 -7
  295. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  296. data/spec/unit/provider/package/pip_spec.rb +93 -22
  297. data/spec/unit/provider/package/pkg_spec.rb +13 -1
  298. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  299. data/spec/unit/provider/package/pkgng_spec.rb +36 -0
  300. data/spec/unit/provider/package/portage_spec.rb +4 -4
  301. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  302. data/spec/unit/provider/package/yum_spec.rb +90 -0
  303. data/spec/unit/provider/package/zypper_spec.rb +13 -0
  304. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  305. data/spec/unit/provider/selmodule_spec.rb +118 -47
  306. data/spec/unit/provider/service/daemontools_spec.rb +24 -0
  307. data/spec/unit/provider/service/runit_spec.rb +24 -0
  308. data/spec/unit/provider/service/systemd_spec.rb +109 -36
  309. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  310. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  311. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  312. data/spec/unit/provider/user/useradd_spec.rb +81 -16
  313. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  314. data/spec/unit/puppet_pal_2pec.rb +3 -0
  315. data/spec/unit/ssl/certificate_authority_spec.rb +2 -3
  316. data/spec/unit/ssl/certificate_spec.rb +7 -0
  317. data/spec/unit/ssl/host_spec.rb +2 -0
  318. data/spec/unit/test/test_helper_spec.rb +17 -0
  319. data/spec/unit/type/exec_spec.rb +6 -12
  320. data/spec/unit/type/file/content_spec.rb +9 -3
  321. data/spec/unit/type/file_spec.rb +9 -4
  322. data/spec/unit/type/package_spec.rb +8 -0
  323. data/spec/unit/type/selboolean_spec.rb +4 -6
  324. data/spec/unit/type/service_spec.rb +9 -8
  325. data/spec/unit/type/user_spec.rb +19 -13
  326. data/spec/unit/util/execution_spec.rb +16 -0
  327. data/spec/unit/util/http_proxy_spec.rb +97 -0
  328. data/spec/unit/util/log/destinations_spec.rb +2 -26
  329. data/spec/unit/util/log_spec.rb +0 -138
  330. data/spec/unit/util/logging_spec.rb +200 -0
  331. data/spec/unit/util/pidlock_spec.rb +67 -40
  332. data/spec/unit/util/plist_spec.rb +20 -0
  333. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  334. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  335. data/spec/unit/util/windows/sid_spec.rb +2 -2
  336. data/tasks/manpages.rake +1 -0
  337. metadata +16 -7
  338. data/lib/puppet/pops/loader/null_loader.rb +0 -60
  339. data/locales/ja/puppet.po +0 -12114
  340. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -414,7 +414,9 @@ end
414
414
 
415
415
  describe Puppet::Node, "when generating the list of names to search through" do
416
416
  before do
417
- @node = Puppet::Node.new("foo.domain.com", :parameters => {"hostname" => "yay", "domain" => "domain.com"})
417
+ Puppet[:strict_hostname_checking] = false
418
+ @node = Puppet::Node.new("foo.domain.com",
419
+ :parameters => {"hostname" => "yay", "domain" => "domain.com"})
418
420
  end
419
421
 
420
422
  it "returns an array of names" do
@@ -445,7 +447,6 @@ describe Puppet::Node, "when generating the list of names to search through" do
445
447
 
446
448
  describe "and :node_name is set to 'cert'" do
447
449
  before do
448
- Puppet[:strict_hostname_checking] = false
449
450
  Puppet[:node_name] = "cert"
450
451
  end
451
452
 
@@ -454,8 +455,11 @@ describe Puppet::Node, "when generating the list of names to search through" do
454
455
  end
455
456
 
456
457
  describe "and strict hostname checking is enabled" do
457
- it "only uses the passed-in key" do
458
+ before do
458
459
  Puppet[:strict_hostname_checking] = true
460
+ end
461
+
462
+ it "only uses the passed-in key" do
459
463
  expect(@node.names).to eq(["foo.domain.com"])
460
464
  end
461
465
  end
@@ -463,7 +467,6 @@ describe Puppet::Node, "when generating the list of names to search through" do
463
467
 
464
468
  describe "and :node_name is set to 'facter'" do
465
469
  before do
466
- Puppet[:strict_hostname_checking] = false
467
470
  Puppet[:node_name] = "facter"
468
471
  end
469
472
 
@@ -367,6 +367,13 @@ EOS
367
367
  }.to raise_error(/'Cap\[cap\]' is exported by both 'Prod\[one\]' and 'Prod\[two\]'/)
368
368
  end
369
369
 
370
+ it "issues deprecation warnings" do
371
+ expect {compile_collect_log(MANIFEST_WO_NODE)}.not_to raise_error
372
+ expect(warnings).to include(/Capability Mapping is deprecated/) # there are two of these
373
+ expect(warnings).to include(/Application is deprecated/)
374
+ expect(warnings).to include(/Site Definition is deprecated/)
375
+ end
376
+
370
377
  context "for producing node" do
371
378
  let(:compiled_node) { Puppet::Node.new('first', :environment => env) }
372
379
  let(:compiled_catalog) { compile_to_catalog(MANIFEST, compiled_node)}
@@ -442,21 +442,26 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
442
442
  }.each do |source, coerced_val|
443
443
  it "should warn about numeric coercion in '#{source}' when strict = warning" do
444
444
  Puppet[:strict] = :warning
445
+ expect(Puppet::Pops::Evaluator::Runtime3Support::EvaluationError).not_to receive(:new)
445
446
  collect_notices(source)
446
447
  expect(warnings).to include(/The string '#{coerced_val}' was automatically coerced to the numerical value #{coerced_val}/)
447
448
  end
448
449
 
449
450
  it "should not warn about numeric coercion in '#{source}' if strict = off" do
450
451
  Puppet[:strict] = :off
452
+ expect(Puppet::Pops::Evaluator::Runtime3Support::EvaluationError).not_to receive(:new)
451
453
  collect_notices(source)
452
454
  expect(warnings).to_not include(/The string '#{coerced_val}' was automatically coerced to the numerical value #{coerced_val}/)
453
455
  end
454
456
 
455
457
  it "should error when finding numeric coercion in '#{source}' if strict = error" do
456
458
  Puppet[:strict] = :error
457
- expect { parser.evaluate_string(scope, source, __FILE__) }.to raise_error(
458
- /The string '#{coerced_val}' was automatically coerced to the numerical value #{coerced_val}/
459
- )
459
+ expect {
460
+ parser.evaluate_string(scope, source, __FILE__)
461
+ }.to raise_error {|error|
462
+ expect(error.message).to match(/The string '#{coerced_val}' was automatically coerced to the numerical value #{coerced_val}/)
463
+ expect(error.backtrace.first).to match(/runtime3_support\.rb.+optionally_fail/)
464
+ }
460
465
  end
461
466
  end
462
467
 
@@ -1,7 +1,12 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/provider/exec'
3
+ require 'puppet_spec/compiler'
4
+ require 'puppet_spec/files'
3
5
 
4
6
  describe Puppet::Provider::Exec do
7
+ include PuppetSpec::Compiler
8
+ include PuppetSpec::Files
9
+
5
10
  describe "#extractexe" do
6
11
  it "should return the first element of an array" do
7
12
  expect(subject.extractexe(['one', 'two'])).to eq('one')
@@ -31,4 +36,208 @@ describe Puppet::Provider::Exec do
31
36
  end
32
37
  end
33
38
  end
39
+
40
+ context "when handling sensitive data" do
41
+ before :each do
42
+ Puppet[:log_level] = 'debug'
43
+ end
44
+
45
+ let(:supersecret) { 'supersecret' }
46
+ let(:path) do
47
+ if Puppet::Util::Platform.windows?
48
+ # The `apply_compiled_manifest` helper doesn't add the `path` fact, so
49
+ # we can't reference that in our manifest. Windows PATHs can contain
50
+ # double quotes and trailing backslashes, which confuse HEREDOC
51
+ # interpolation below. So sanitize it:
52
+ ENV['PATH'].split(File::PATH_SEPARATOR).map do |dir|
53
+ dir.gsub(/"/, '\"').gsub(/\\$/, '')
54
+ end.join(File::PATH_SEPARATOR)
55
+ else
56
+ ENV['PATH']
57
+ end
58
+ end
59
+
60
+ def ruby_exit_0
61
+ "ruby -e 'exit 0'"
62
+ end
63
+
64
+ def echo_from_ruby_exit_0(message)
65
+ # Escape double quotes due to HEREDOC interpolation below
66
+ "ruby -e 'puts \"#{message}\"; exit 0'".gsub(/"/, '\"')
67
+ end
68
+
69
+ def echo_from_ruby_exit_1(message)
70
+ # Escape double quotes due to HEREDOC interpolation below
71
+ "ruby -e 'puts \"#{message}\"; exit 1'".gsub(/"/, '\"')
72
+ end
73
+
74
+ context "when validating the command" do
75
+ it "redacts the arguments if the command is relative" do
76
+ expect {
77
+ apply_compiled_manifest(<<-MANIFEST)
78
+ exec { 'echo':
79
+ command => Sensitive.new('echo #{supersecret}')
80
+ }
81
+ MANIFEST
82
+ }.to raise_error do |err|
83
+ expect(err).to be_a(Puppet::Error)
84
+ expect(err.message).to match(/'echo' is not qualified and no path was specified. Please qualify the command or specify a path./)
85
+ expect(err.message).to_not match(/#{supersecret}/)
86
+ end
87
+ end
88
+
89
+ it "redacts the arguments if the command is a directory" do
90
+ dir = tmpdir('exec')
91
+ apply_compiled_manifest(<<-MANIFEST)
92
+ exec { 'echo':
93
+ command => Sensitive.new('#{dir} #{supersecret}'),
94
+ }
95
+ MANIFEST
96
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: /'#{dir}' is a directory, not a file/))
97
+ expect(@logs).to_not include(an_object_having_attributes(message: /#{supersecret}/))
98
+ end
99
+
100
+ it "redacts the arguments if the command isn't executable" do
101
+ file = tmpfile('exec')
102
+ Puppet::FileSystem.touch(file)
103
+ Puppet::FileSystem.chmod(0644, file)
104
+
105
+ apply_compiled_manifest(<<-MANIFEST)
106
+ exec { 'echo':
107
+ command => Sensitive.new('#{file} #{supersecret}'),
108
+ }
109
+ MANIFEST
110
+ # Execute permission works differently on Windows, but execute will fail since the
111
+ # file doesn't have a valid extension and isn't a valid executable. The raised error
112
+ # will be Errno::EIO, which is not useful. The Windows execute code needs to raise
113
+ # Puppet::Util::Windows::Error so the Win32 error message is preserved.
114
+ pending("PUP-3561 Needs to raise a meaningful Puppet::Error") if Puppet::Util::Platform.windows?
115
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: /'#{file}' is not executable/))
116
+ expect(@logs).to_not include(an_object_having_attributes(message: /#{supersecret}/))
117
+ end
118
+
119
+ it "redacts the arguments if the relative command cannot be resolved using the path parameter" do
120
+ file = File.basename(tmpfile('exec'))
121
+ dir = tmpdir('exec')
122
+
123
+ apply_compiled_manifest(<<-MANIFEST)
124
+ exec { 'echo':
125
+ command => Sensitive.new('#{file} #{supersecret}'),
126
+ path => "#{dir}",
127
+ }
128
+ MANIFEST
129
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: /Could not find command '#{file}'/))
130
+ expect(@logs).to_not include(an_object_having_attributes(message: /#{supersecret}/))
131
+ end
132
+ end
133
+
134
+ it "redacts the command on success" do
135
+ command = echo_from_ruby_exit_0(supersecret)
136
+
137
+ apply_compiled_manifest(<<-MANIFEST)
138
+ exec { 'true':
139
+ command => Sensitive.new("#{command}"),
140
+ path => "#{path}",
141
+ }
142
+ MANIFEST
143
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing '[redacted]'", source: /Exec\[true\]/))
144
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing: '[redacted]'", source: "Puppet"))
145
+ expect(@logs).to include(an_object_having_attributes(level: :notice, message: "executed successfully"))
146
+ expect(@logs).to_not include(an_object_having_attributes(message: /#{supersecret}/))
147
+ end
148
+
149
+ it "redacts the command on failure" do
150
+ command = echo_from_ruby_exit_1(supersecret)
151
+
152
+ apply_compiled_manifest(<<-MANIFEST)
153
+ exec { 'false':
154
+ command => Sensitive.new("#{command}"),
155
+ path => "#{path}",
156
+ }
157
+ MANIFEST
158
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing '[redacted]'", source: /Exec\[false\]/))
159
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing: '[redacted]'", source: "Puppet"))
160
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: "[command redacted] returned 1 instead of one of [0]"))
161
+ expect(@logs).to_not include(an_object_having_attributes(message: /#{supersecret}/))
162
+ end
163
+
164
+ context "when handling checks" do
165
+ let(:onlyifsecret) { "onlyifsecret" }
166
+ let(:unlesssecret) { "unlesssecret" }
167
+
168
+ it "redacts command and onlyif outputs" do
169
+ onlyif = echo_from_ruby_exit_0(onlyifsecret)
170
+
171
+ apply_compiled_manifest(<<-MANIFEST)
172
+ exec { 'true':
173
+ command => Sensitive.new("#{ruby_exit_0}"),
174
+ onlyif => Sensitive.new("#{onlyif}"),
175
+ path => "#{path}",
176
+ }
177
+ MANIFEST
178
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing check '[redacted]'"))
179
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing '[redacted]'", source: /Exec\[true\]/))
180
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing: '[redacted]'", source: "Puppet"))
181
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "[output redacted]"))
182
+ expect(@logs).to include(an_object_having_attributes(level: :notice, message: "executed successfully"))
183
+ expect(@logs).to_not include(an_object_having_attributes(message: /#{onlyifsecret}/))
184
+ end
185
+
186
+ it "redacts the command that would have been executed but didn't due to onlyif" do
187
+ command = echo_from_ruby_exit_0(supersecret)
188
+ onlyif = echo_from_ruby_exit_1(onlyifsecret)
189
+
190
+ apply_compiled_manifest(<<-MANIFEST)
191
+ exec { 'true':
192
+ command => Sensitive.new("#{command}"),
193
+ onlyif => Sensitive.new("#{onlyif}"),
194
+ path => "#{path}",
195
+ }
196
+ MANIFEST
197
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing check '[redacted]'"))
198
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing: '[redacted]'", source: "Puppet"))
199
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "[output redacted]"))
200
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "'[command redacted]' won't be executed because of failed check 'onlyif'"))
201
+ expect(@logs).to_not include(an_object_having_attributes(message: /#{supersecret}/))
202
+ expect(@logs).to_not include(an_object_having_attributes(message: /#{onlyifsecret}/))
203
+ end
204
+
205
+ it "redacts command and unless outputs" do
206
+ unlesscmd = echo_from_ruby_exit_1(unlesssecret)
207
+
208
+ apply_compiled_manifest(<<-MANIFEST)
209
+ exec { 'true':
210
+ command => Sensitive.new("#{ruby_exit_0}"),
211
+ unless => Sensitive.new("#{unlesscmd}"),
212
+ path => "#{path}",
213
+ }
214
+ MANIFEST
215
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing check '[redacted]'"))
216
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing '[redacted]'", source: /Exec\[true\]/))
217
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing: '[redacted]'", source: "Puppet"))
218
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "[output redacted]"))
219
+ expect(@logs).to include(an_object_having_attributes(level: :notice, message: "executed successfully"))
220
+ expect(@logs).to_not include(an_object_having_attributes(message: /#{unlesssecret}/))
221
+ end
222
+
223
+ it "redacts the command that would have been executed but didn't due to unless" do
224
+ command = echo_from_ruby_exit_0(supersecret)
225
+ unlesscmd = echo_from_ruby_exit_0(unlesssecret)
226
+
227
+ apply_compiled_manifest(<<-MANIFEST)
228
+ exec { 'true':
229
+ command => Sensitive.new("#{command}"),
230
+ unless => Sensitive.new("#{unlesscmd}"),
231
+ path => "#{path}",
232
+ }
233
+ MANIFEST
234
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing check '[redacted]'"))
235
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Executing: '[redacted]'", source: "Puppet"))
236
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "[output redacted]"))
237
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "'[command redacted]' won't be executed because of failed check 'unless'"))
238
+ expect(@logs).to_not include(an_object_having_attributes(message: /#{supersecret}/))
239
+ expect(@logs).to_not include(an_object_having_attributes(message: /#{unlesssecret}/))
240
+ end
241
+ end
242
+ end
34
243
  end
@@ -47,7 +47,7 @@ describe Puppet::Type.type(:group).provider(:groupadd) do
47
47
  described_class.has_feature(:libuser)
48
48
  resource[:forcelocal] = :true
49
49
  end
50
-
50
+
51
51
  it "should use lgroupadd instead of groupadd" do
52
52
  expect(provider).to receive(:execute).with(including('/usr/sbin/lgroupadd'), hash_including(:custom_environment => hash_including('LIBUSER_CONF')))
53
53
  provider.create
@@ -124,6 +124,35 @@ describe Puppet::Type.type(:group).provider(:groupadd) do
124
124
  end
125
125
  end
126
126
 
127
+ describe "#findgroup" do
128
+ before { allow(File).to receive(:read).with('/etc/group').and_return(content) }
129
+
130
+ let(:content) { "sample_group_name:sample_password:sample_gid:sample_user_list" }
131
+ let(:output) do
132
+ {
133
+ group_name: 'sample_group_name',
134
+ password: 'sample_password',
135
+ gid: 'sample_gid',
136
+ user_list: 'sample_user_list',
137
+ }
138
+ end
139
+
140
+ [:group_name, :password, :gid, :user_list].each do |key|
141
+ it "finds a group by #{key} when asked" do
142
+ expect(provider.send(:findgroup, key, "sample_#{key}")).to eq(output)
143
+ end
144
+ end
145
+
146
+ it "returns false when specified key/value pair is not found" do
147
+ expect(provider.send(:findgroup, :group_name, 'invalid_group_name')).to eq(false)
148
+ end
149
+
150
+ it "reads the group file only once per resource" do
151
+ expect(File).to receive(:read).with('/etc/group').once
152
+ 5.times { provider.send(:findgroup, :group_name, 'sample_group_name') }
153
+ end
154
+ end
155
+
127
156
  describe "#delete" do
128
157
  before do
129
158
  allow(provider).to receive(:exists?).and_return(true)
@@ -33,13 +33,18 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet.featur
33
33
  let(:user1) { double(:account => 'user1', :domain => '.', :sid => 'user1sid') }
34
34
  let(:user2) { double(:account => 'user2', :domain => '.', :sid => 'user2sid') }
35
35
  let(:user3) { double(:account => 'user3', :domain => '.', :sid => 'user3sid') }
36
+ let(:user_without_domain) { double(:account => 'user_without_domain', :domain => nil, :sid => 'user_without_domain_sid') }
37
+
36
38
  let(:invalid_user) { SecureRandom.uuid }
39
+ let(:invalid_user_principal) { double(:account => "#{invalid_user}", :domain => nil, :sid => "#{invalid_user}") }
37
40
 
38
41
  before :each do
39
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1').and_return(user1)
40
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2').and_return(user2)
41
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3').and_return(user3)
42
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1', any_args).and_return(user1)
43
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2', any_args).and_return(user2)
44
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3', any_args).and_return(user3)
45
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user_without_domain', any_args).and_return(user_without_domain)
42
46
  allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with(invalid_user).and_return(nil)
47
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with(invalid_user, true).and_return(invalid_user_principal)
43
48
  end
44
49
 
45
50
  describe "#members_insync?" do
@@ -199,7 +204,15 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet.featur
199
204
  ]
200
205
  expect(provider.members_insync?(current, ['user2','user1'])).to be_truthy
201
206
  end
207
+
208
+ it "should return true even if a current user is unresolvable if should is included" do
209
+ current = [
210
+ "#{invalid_user}",
211
+ 'user2',
212
+ ]
213
+ expect(provider.members_insync?(current, ['user2'])).to be_truthy
202
214
  end
215
+ end
203
216
  end
204
217
 
205
218
  describe "#members_to_s" do
@@ -222,8 +235,8 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet.featur
222
235
  expect(provider.members_to_s(['user1', 'user2'])).to eq('.\user1,.\user2')
223
236
  end
224
237
 
225
- it "should return the username when it cannot be resolved to a SID (for the sake of resource_harness error messages)" do
226
- expect(provider.members_to_s([invalid_user])).to eq("#{invalid_user}")
238
+ it "should return a user string without domain if domain is not set" do
239
+ expect(provider.members_to_s(['user_without_domain'])).to eq('user_without_domain')
227
240
  end
228
241
 
229
242
  it "should return the username when it cannot be resolved to a SID (for the sake of resource_harness error messages)" do
@@ -237,10 +250,14 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet.featur
237
250
  let(:user2) { double(:account => 'user2', :domain => '.', :sid => 'user2sid') }
238
251
  let(:user3) { double(:account => 'user3', :domain => '.', :sid => 'user3sid') }
239
252
 
253
+ let(:invalid_user) { SecureRandom.uuid }
254
+ let(:invalid_user_principal) { double(:account => "#{invalid_user}", :domain => nil, :sid => "#{invalid_user}") }
255
+
240
256
  before :each do
241
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1').and_return(user1)
242
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2').and_return(user2)
243
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3').and_return(user3)
257
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1', any_args).and_return(user1)
258
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2', any_args).and_return(user2)
259
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3', any_args).and_return(user3)
260
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with(invalid_user, true).and_return(invalid_user_principal)
244
261
 
245
262
  resource[:auth_membership] = true
246
263
  end
@@ -261,6 +278,22 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet.featur
261
278
  expect(provider.members).to match_array(expected_members)
262
279
  end
263
280
 
281
+ it "should be able to handle unresolvable SID in list of members" do
282
+ allow(provider.group).to receive(:members).and_return([
283
+ 'user1',
284
+ "#{invalid_user}",
285
+ 'user3',
286
+ ])
287
+
288
+ expected_member_sids = [user1.sid, invalid_user_principal.sid, user3.sid]
289
+ expected_members = ['user1', "#{invalid_user}", 'user3']
290
+ allow(provider).to receive(:members_to_s)
291
+ .with(expected_member_sids)
292
+ .and_return(expected_members.join(','))
293
+
294
+ expect(provider.members).to match_array(expected_members)
295
+ end
296
+
264
297
  it "should be able to set group members" do
265
298
  allow(provider.group).to receive(:members).and_return(['user1', 'user2'])
266
299
 
@@ -272,8 +305,8 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet.featur
272
305
 
273
306
  allow(provider.group).to receive(:member_sids).and_return(member_sids[0..1])
274
307
 
275
- expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2').and_return(member_sids[1])
276
- expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3').and_return(member_sids[2])
308
+ expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2', any_args).and_return(member_sids[1])
309
+ expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3', any_args).and_return(member_sids[2])
277
310
 
278
311
  expect(provider.group).to receive(:remove_member_sids).with(member_sids[0])
279
312
  expect(provider.group).to receive(:add_member_sids).with(member_sids[2])
@@ -22,16 +22,26 @@ describe Puppet::Type.type(:package).provider(:aix) do
22
22
 
23
23
  context "when installing" do
24
24
  it "should install a package" do
25
+ allow(@provider).to receive(:query).and_return({:name => 'mypackage', :ensure => 'present', :status => :committed})
25
26
  expect(@provider).to receive(:installp).with('-acgwXY', '-d', 'mysource', 'mypackage')
26
27
  @provider.install
27
28
  end
28
29
 
29
30
  it "should install a specific package version" do
30
31
  allow(@resource).to receive(:should).with(:ensure).and_return("1.2.3.4")
32
+ allow(@provider).to receive(:query).and_return({:name => 'mypackage', :ensure => '1.2.3.4', :status => :committed})
31
33
  expect(@provider).to receive(:installp).with('-acgwXY', '-d', 'mysource', 'mypackage 1.2.3.4')
32
34
  @provider.install
33
35
  end
34
36
 
37
+ [:broken, :inconsistent].each do |state|
38
+ it "should fail if the installation resulted in a '#{state}' state" do
39
+ allow(@provider).to receive(:query).and_return({:name => 'mypackage', :ensure => 'present', :status => state})
40
+ expect(@provider).to receive(:installp).with('-acgwXY', '-d', 'mysource', 'mypackage')
41
+ expect { @provider.install }.to raise_error(Puppet::Error, "Package 'mypackage' is in a #{state} state and requires manual intervention")
42
+ end
43
+ end
44
+
35
45
  it "should fail if the specified version is superseded" do
36
46
  @resource[:ensure] = '1.2.3.3'
37
47
  allow(@provider).to receive(:installp).and_return(<<-OUTPUT)
@@ -126,4 +136,23 @@ END
126
136
  expect(described_class).to receive(:execute).and_return('mypackage:mypackage.rte:1.8.6.4::I:T:::::N:A Super Cool Package::::0::\n')
127
137
  described_class.prefetch({ 'mypackage' => latest, 'otherpackage' => absent })
128
138
  end
139
+
140
+ context "when querying instances" do
141
+ before(:each) do
142
+ allow(described_class).to receive(:execute).and_return(<<-END.chomp)
143
+ sysmgt.cim.providers:sysmgt.cim.providers.metrics:2.12.1.1: : :B: :Metrics Providers for AIX OS: : : : : : :1:0:/:
144
+ sysmgt.cim.providers:sysmgt.cim.providers.osbase:2.12.1.1: : :C: :Base Providers for AIX OS: : : : : : :1:0:/:
145
+ openssl.base:openssl.base:1.0.2.1800: : :?: :Open Secure Socket Layer: : : : : : :0:0:/:
146
+ END
147
+ end
148
+
149
+ it "should treat installed packages in broken and inconsistent state as absent" do
150
+ installed_packages = described_class.instances.map { |package| package.properties }
151
+ expected_packages = [{:name => 'sysmgt.cim.providers.metrics', :ensure => :absent, :status => :broken, :provider => :aix},
152
+ {:name => 'sysmgt.cim.providers.osbase', :ensure => '2.12.1.1', :status => :committed, :provider => :aix},
153
+ {:name => 'openssl.base', :ensure => :absent, :status => :inconsistent, :provider => :aix}]
154
+
155
+ expect(installed_packages).to eql(expected_packages)
156
+ end
157
+ end
129
158
  end