puppet 6.23.0 → 6.26.0

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 (397) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +5 -5
  3. data/Gemfile +4 -4
  4. data/Gemfile.lock +32 -25
  5. data/README.md +4 -4
  6. data/{ext → examples/enc}/regexp_nodes/classes/databases +0 -0
  7. data/{ext → examples/enc}/regexp_nodes/classes/webservers +0 -0
  8. data/{ext → examples/enc}/regexp_nodes/environment/development +0 -0
  9. data/{ext → examples/enc}/regexp_nodes/parameters/service/prod +0 -0
  10. data/{ext → examples/enc}/regexp_nodes/parameters/service/qa +0 -0
  11. data/{ext → examples/enc}/regexp_nodes/parameters/service/sandbox +0 -0
  12. data/{ext → examples/enc}/regexp_nodes/regexp_nodes.rb +0 -0
  13. data/{ext → examples}/nagios/check_puppet.rb +2 -2
  14. data/ext/README.md +13 -0
  15. data/ext/project_data.yaml +1 -0
  16. data/lib/puppet/application/agent.rb +4 -0
  17. data/lib/puppet/application/apply.rb +20 -2
  18. data/lib/puppet/application/filebucket.rb +1 -0
  19. data/lib/puppet/application/lookup.rb +78 -24
  20. data/lib/puppet/application/resource.rb +30 -15
  21. data/lib/puppet/application/ssl.rb +1 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +6 -3
  23. data/lib/puppet/configurer.rb +134 -56
  24. data/lib/puppet/confine/variable.rb +1 -1
  25. data/lib/puppet/defaults.rb +55 -32
  26. data/lib/puppet/environments.rb +75 -25
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/generate.rb +2 -0
  29. data/lib/puppet/face/help/action.erb +1 -0
  30. data/lib/puppet/face/help/face.erb +1 -0
  31. data/lib/puppet/face/node/clean.rb +11 -0
  32. data/lib/puppet/facter_impl.rb +96 -0
  33. data/lib/puppet/file_serving/configuration/parser.rb +2 -0
  34. data/lib/puppet/file_serving/configuration.rb +3 -0
  35. data/lib/puppet/file_serving/metadata.rb +3 -0
  36. data/lib/puppet/file_serving/mount/file.rb +4 -4
  37. data/lib/puppet/file_serving/mount/scripts.rb +24 -0
  38. data/lib/puppet/file_system/file_impl.rb +10 -8
  39. data/lib/puppet/file_system/jruby.rb +1 -1
  40. data/lib/puppet/file_system/windows.rb +6 -6
  41. data/lib/puppet/file_system.rb +1 -1
  42. data/lib/puppet/forge.rb +4 -4
  43. data/lib/puppet/functions/empty.rb +8 -0
  44. data/lib/puppet/functions/find_template.rb +2 -2
  45. data/lib/puppet/functions/strftime.rb +1 -0
  46. data/lib/puppet/functions/unwrap.rb +17 -2
  47. data/lib/puppet/functions/versioncmp.rb +6 -2
  48. data/lib/puppet/generate/type.rb +9 -0
  49. data/lib/puppet/http/client.rb +1 -1
  50. data/lib/puppet/http/redirector.rb +5 -0
  51. data/lib/puppet/http/service/compiler.rb +6 -1
  52. data/lib/puppet/indirector/catalog/compiler.rb +24 -6
  53. data/lib/puppet/indirector/catalog/rest.rb +1 -0
  54. data/lib/puppet/indirector/facts/facter.rb +6 -6
  55. data/lib/puppet/indirector/indirection.rb +1 -1
  56. data/lib/puppet/indirector/resource/ral.rb +6 -1
  57. data/lib/puppet/indirector/terminus.rb +4 -0
  58. data/lib/puppet/interface/documentation.rb +1 -0
  59. data/lib/puppet/module/plan.rb +0 -1
  60. data/lib/puppet/module/task.rb +1 -1
  61. data/lib/puppet/module.rb +1 -0
  62. data/lib/puppet/module_tool/applications/installer.rb +12 -4
  63. data/lib/puppet/module_tool/applications/uninstaller.rb +1 -1
  64. data/lib/puppet/module_tool/applications/upgrader.rb +1 -1
  65. data/lib/puppet/module_tool/errors/shared.rb +17 -0
  66. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  67. data/lib/puppet/node/environment.rb +10 -11
  68. data/lib/puppet/node.rb +1 -1
  69. data/lib/puppet/pal/pal_impl.rb +1 -1
  70. data/lib/puppet/parser/resource.rb +1 -1
  71. data/lib/puppet/parser/scope.rb +1 -0
  72. data/lib/puppet/parser/templatewrapper.rb +1 -0
  73. data/lib/puppet/pops/evaluator/closure.rb +7 -5
  74. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -0
  75. data/lib/puppet/pops/lookup/lookup_adapter.rb +3 -2
  76. data/lib/puppet/pops/model/ast.rb +1 -0
  77. data/lib/puppet/pops/model/factory.rb +2 -1
  78. data/lib/puppet/pops/parser/code_merger.rb +4 -4
  79. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  80. data/lib/puppet/pops/parser/eparser.rb +1014 -995
  81. data/lib/puppet/pops/parser/lexer2.rb +92 -91
  82. data/lib/puppet/pops/parser/slurp_support.rb +1 -0
  83. data/lib/puppet/pops/serialization/to_stringified_converter.rb +1 -1
  84. data/lib/puppet/pops/types/type_formatter.rb +4 -3
  85. data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
  86. data/lib/puppet/pops/types/types.rb +1 -1
  87. data/lib/puppet/provider/aix_object.rb +1 -1
  88. data/lib/puppet/provider/exec/posix.rb +16 -4
  89. data/lib/puppet/provider/group/groupadd.rb +5 -2
  90. data/lib/puppet/provider/package/pip.rb +15 -3
  91. data/lib/puppet/provider/package/pkg.rb +19 -2
  92. data/lib/puppet/provider/package/puppetserver_gem.rb +1 -1
  93. data/lib/puppet/provider/package/yum.rb +1 -1
  94. data/lib/puppet/provider/parsedfile.rb +3 -0
  95. data/lib/puppet/provider/service/base.rb +1 -1
  96. data/lib/puppet/provider/service/init.rb +10 -9
  97. data/lib/puppet/provider/service/launchd.rb +2 -2
  98. data/lib/puppet/provider/service/redhat.rb +1 -1
  99. data/lib/puppet/provider/service/smf.rb +3 -3
  100. data/lib/puppet/provider/service/systemd.rb +2 -2
  101. data/lib/puppet/provider/service/upstart.rb +5 -5
  102. data/lib/puppet/provider/user/aix.rb +44 -1
  103. data/lib/puppet/provider/user/directoryservice.rb +1 -1
  104. data/lib/puppet/provider/user/useradd.rb +72 -16
  105. data/lib/puppet/provider.rb +1 -1
  106. data/lib/puppet/reference/providers.rb +2 -2
  107. data/lib/puppet/resource/catalog.rb +1 -1
  108. data/lib/puppet/resource/type_collection.rb +1 -0
  109. data/lib/puppet/resource.rb +38 -5
  110. data/lib/puppet/runtime.rb +11 -1
  111. data/lib/puppet/settings.rb +32 -9
  112. data/lib/puppet/ssl/verifier.rb +6 -0
  113. data/lib/puppet/test/test_helper.rb +4 -1
  114. data/lib/puppet/transaction/persistence.rb +21 -1
  115. data/lib/puppet/transaction/report.rb +15 -1
  116. data/lib/puppet/type/exec.rb +35 -5
  117. data/lib/puppet/type/file/data_sync.rb +1 -1
  118. data/lib/puppet/type/file/mode.rb +6 -0
  119. data/lib/puppet/type/file.rb +6 -6
  120. data/lib/puppet/type/filebucket.rb +3 -3
  121. data/lib/puppet/type/group.rb +0 -1
  122. data/lib/puppet/type/resources.rb +1 -1
  123. data/lib/puppet/type/service.rb +8 -3
  124. data/lib/puppet/type/tidy.rb +1 -1
  125. data/lib/puppet/type/user.rb +40 -39
  126. data/lib/puppet/type.rb +1 -1
  127. data/lib/puppet/util/command_line.rb +1 -1
  128. data/lib/puppet/util/filetype.rb +2 -2
  129. data/lib/puppet/util/json.rb +20 -0
  130. data/lib/puppet/util/log.rb +8 -4
  131. data/lib/puppet/util/logging.rb +1 -25
  132. data/lib/puppet/util/monkey_patches.rb +6 -0
  133. data/lib/puppet/util/package.rb +25 -16
  134. data/lib/puppet/util/pidlock.rb +1 -1
  135. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
  136. data/lib/puppet/util/suidmanager.rb +1 -2
  137. data/lib/puppet/util/symbolic_file_mode.rb +29 -17
  138. data/lib/puppet/util/tagging.rb +1 -0
  139. data/lib/puppet/util/windows/service.rb +0 -5
  140. data/lib/puppet/util/windows/sid.rb +3 -1
  141. data/lib/puppet/util/windows/user.rb +0 -2
  142. data/lib/puppet/util/windows.rb +3 -0
  143. data/lib/puppet/util/yaml.rb +21 -2
  144. data/lib/puppet/util.rb +4 -3
  145. data/lib/puppet/version.rb +1 -1
  146. data/lib/puppet.rb +6 -9
  147. data/locales/puppet.pot +5 -10418
  148. data/man/man5/puppet.conf.5 +52 -25
  149. data/man/man8/puppet-agent.8 +4 -1
  150. data/man/man8/puppet-apply.8 +1 -1
  151. data/man/man8/puppet-catalog.8 +9 -9
  152. data/man/man8/puppet-config.8 +1 -1
  153. data/man/man8/puppet-describe.8 +1 -1
  154. data/man/man8/puppet-device.8 +1 -1
  155. data/man/man8/puppet-doc.8 +1 -1
  156. data/man/man8/puppet-epp.8 +1 -1
  157. data/man/man8/puppet-facts.8 +8 -8
  158. data/man/man8/puppet-filebucket.8 +1 -1
  159. data/man/man8/puppet-generate.8 +1 -1
  160. data/man/man8/puppet-help.8 +1 -1
  161. data/man/man8/puppet-key.8 +7 -7
  162. data/man/man8/puppet-lookup.8 +9 -6
  163. data/man/man8/puppet-man.8 +1 -1
  164. data/man/man8/puppet-module.8 +3 -3
  165. data/man/man8/puppet-node.8 +5 -5
  166. data/man/man8/puppet-parser.8 +1 -1
  167. data/man/man8/puppet-plugin.8 +1 -1
  168. data/man/man8/puppet-report.8 +5 -5
  169. data/man/man8/puppet-resource.8 +1 -1
  170. data/man/man8/puppet-script.8 +1 -1
  171. data/man/man8/puppet-ssl.8 +1 -1
  172. data/man/man8/puppet-status.8 +4 -4
  173. data/man/man8/puppet.8 +2 -2
  174. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +2 -1
  175. data/spec/fixtures/integration/application/agent/lib/facter/agent_spec_role.rb +3 -0
  176. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Gemfile +4 -0
  177. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Rakefile +3 -0
  178. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/lib/puppet/functions/l10n.rb +8 -0
  179. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/config.yaml +25 -0
  180. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/ja/puppet-l10n.po +19 -0
  181. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/puppet-l10n.pot +20 -0
  182. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/metadata.json +8 -0
  183. data/spec/fixtures/ssl/127.0.0.1-key.pem +106 -106
  184. data/spec/fixtures/ssl/127.0.0.1.pem +48 -48
  185. data/spec/fixtures/ssl/bad-basic-constraints.pem +54 -54
  186. data/spec/fixtures/ssl/bad-int-basic-constraints.pem +51 -51
  187. data/spec/fixtures/ssl/ca.pem +52 -52
  188. data/spec/fixtures/ssl/crl.pem +25 -25
  189. data/spec/fixtures/ssl/ec-key.pem +11 -11
  190. data/spec/fixtures/ssl/ec.pem +32 -32
  191. data/spec/fixtures/ssl/encrypted-ec-key.pem +12 -12
  192. data/spec/fixtures/ssl/encrypted-key.pem +107 -107
  193. data/spec/fixtures/ssl/intermediate-agent-crl.pem +25 -25
  194. data/spec/fixtures/ssl/intermediate-agent.pem +54 -54
  195. data/spec/fixtures/ssl/intermediate-crl.pem +28 -28
  196. data/spec/fixtures/ssl/intermediate.pem +51 -51
  197. data/spec/fixtures/ssl/oid-key.pem +117 -0
  198. data/spec/fixtures/ssl/oid.pem +69 -0
  199. data/spec/fixtures/ssl/pluto-key.pem +106 -106
  200. data/spec/fixtures/ssl/pluto.pem +50 -50
  201. data/spec/fixtures/ssl/request-key.pem +106 -106
  202. data/spec/fixtures/ssl/request.pem +45 -45
  203. data/spec/fixtures/ssl/revoked-key.pem +106 -106
  204. data/spec/fixtures/ssl/revoked.pem +49 -49
  205. data/spec/fixtures/ssl/signed-key.pem +106 -106
  206. data/spec/fixtures/ssl/signed.pem +47 -47
  207. data/spec/fixtures/ssl/tampered-cert.pem +49 -49
  208. data/spec/fixtures/ssl/tampered-csr.pem +45 -45
  209. data/spec/fixtures/ssl/trusted_oid_mapping.yaml +5 -0
  210. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +106 -106
  211. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -48
  212. data/spec/fixtures/ssl/unknown-ca-key.pem +106 -106
  213. data/spec/fixtures/ssl/unknown-ca.pem +52 -52
  214. data/spec/fixtures/unit/forge/bacula.json +1 -1
  215. data/spec/integration/application/agent_spec.rb +141 -37
  216. data/spec/integration/application/filebucket_spec.rb +16 -0
  217. data/spec/integration/application/lookup_spec.rb +32 -6
  218. data/spec/integration/application/module_spec.rb +21 -0
  219. data/spec/integration/application/resource_spec.rb +35 -1
  220. data/spec/integration/application/ssl_spec.rb +20 -0
  221. data/spec/integration/configurer_spec.rb +18 -2
  222. data/spec/integration/environments/settings_interpolation_spec.rb +0 -4
  223. data/spec/integration/indirector/facts/facter_spec.rb +93 -39
  224. data/spec/integration/l10n/compiler_spec.rb +37 -0
  225. data/spec/integration/parser/pcore_resource_spec.rb +10 -0
  226. data/spec/integration/transaction/report_spec.rb +1 -1
  227. data/spec/integration/type/exec_spec.rb +70 -45
  228. data/spec/integration/type/file_spec.rb +2 -2
  229. data/spec/integration/type/package_spec.rb +6 -6
  230. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  231. data/spec/integration/util/windows/process_spec.rb +1 -9
  232. data/spec/lib/puppet/test_ca.rb +5 -0
  233. data/spec/lib/puppet_spec/modules.rb +13 -2
  234. data/spec/lib/puppet_spec/puppetserver.rb +15 -0
  235. data/spec/lib/puppet_spec/settings.rb +1 -0
  236. data/spec/shared_behaviours/documentation_on_faces.rb +0 -2
  237. data/spec/shared_contexts/l10n.rb +32 -0
  238. data/spec/spec_helper.rb +1 -10
  239. data/spec/unit/application/apply_spec.rb +76 -56
  240. data/spec/unit/application/lookup_spec.rb +131 -10
  241. data/spec/unit/application/resource_spec.rb +29 -0
  242. data/spec/unit/concurrent/thread_local_singleton_spec.rb +39 -0
  243. data/spec/unit/configurer_spec.rb +265 -57
  244. data/spec/unit/defaults_spec.rb +1 -0
  245. data/spec/unit/environments_spec.rb +184 -0
  246. data/spec/unit/face/generate_spec.rb +64 -0
  247. data/spec/unit/facter_impl_spec.rb +31 -0
  248. data/spec/unit/file_bucket/dipper_spec.rb +2 -2
  249. data/spec/unit/file_serving/configuration/parser_spec.rb +23 -0
  250. data/spec/unit/file_serving/configuration_spec.rb +14 -4
  251. data/spec/unit/file_serving/mount/scripts_spec.rb +69 -0
  252. data/spec/unit/file_system_spec.rb +47 -4
  253. data/spec/unit/forge/module_release_spec.rb +3 -3
  254. data/spec/unit/functions/assert_type_spec.rb +1 -1
  255. data/spec/unit/functions/empty_spec.rb +10 -0
  256. data/spec/unit/functions/logging_spec.rb +1 -0
  257. data/spec/unit/functions/lookup_spec.rb +64 -0
  258. data/spec/unit/functions/unwrap_spec.rb +8 -0
  259. data/spec/unit/functions/versioncmp_spec.rb +40 -4
  260. data/spec/unit/functions4_spec.rb +2 -2
  261. data/spec/unit/http/client_spec.rb +58 -1
  262. data/spec/unit/http/service/compiler_spec.rb +8 -0
  263. data/spec/unit/indirector/catalog/compiler_spec.rb +87 -0
  264. data/spec/unit/indirector/catalog/rest_spec.rb +8 -0
  265. data/spec/unit/indirector/indirection_spec.rb +10 -3
  266. data/spec/unit/indirector/resource/ral_spec.rb +40 -75
  267. data/spec/unit/interface/action_spec.rb +0 -9
  268. data/spec/unit/module_spec.rb +15 -1
  269. data/spec/unit/module_tool/applications/installer_spec.rb +51 -12
  270. data/spec/unit/network/authstore_spec.rb +0 -15
  271. data/spec/unit/network/formats_spec.rb +6 -0
  272. data/spec/unit/node_spec.rb +6 -0
  273. data/spec/unit/parser/templatewrapper_spec.rb +12 -2
  274. data/spec/unit/pops/parser/parse_containers_spec.rb +2 -13
  275. data/spec/unit/pops/serialization/to_stringified_spec.rb +5 -0
  276. data/spec/unit/pops/types/type_calculator_spec.rb +6 -0
  277. data/spec/unit/pops/validator/validator_spec.rb +5 -0
  278. data/spec/unit/provider/package/gem_spec.rb +1 -1
  279. data/spec/unit/provider/package/pip2_spec.rb +1 -1
  280. data/spec/unit/provider/package/pip3_spec.rb +1 -1
  281. data/spec/unit/provider/package/pip_spec.rb +38 -1
  282. data/spec/unit/provider/package/pkg_spec.rb +29 -4
  283. data/spec/unit/provider/package/puppet_gem_spec.rb +1 -1
  284. data/spec/unit/provider/package/puppetserver_gem_spec.rb +1 -1
  285. data/spec/unit/provider/parsedfile_spec.rb +10 -0
  286. data/spec/unit/provider/service/gentoo_spec.rb +6 -5
  287. data/spec/unit/provider/service/init_spec.rb +15 -9
  288. data/spec/unit/provider/service/launchd_spec.rb +11 -0
  289. data/spec/unit/provider/service/openwrt_spec.rb +21 -29
  290. data/spec/unit/provider/service/redhat_spec.rb +3 -2
  291. data/spec/unit/provider/service/systemd_spec.rb +1 -1
  292. data/spec/unit/provider/user/aix_spec.rb +100 -0
  293. data/spec/unit/provider/user/directoryservice_spec.rb +1 -1
  294. data/spec/unit/provider/user/useradd_spec.rb +43 -2
  295. data/spec/unit/provider_spec.rb +4 -4
  296. data/spec/unit/puppet_spec.rb +12 -4
  297. data/spec/unit/resource/catalog_spec.rb +14 -1
  298. data/spec/unit/resource_spec.rb +58 -2
  299. data/spec/unit/settings_spec.rb +97 -56
  300. data/spec/unit/ssl/certificate_request_spec.rb +8 -14
  301. data/spec/unit/transaction/persistence_spec.rb +51 -0
  302. data/spec/unit/type/exec_spec.rb +76 -29
  303. data/spec/unit/type/file/source_spec.rb +4 -4
  304. data/spec/unit/type/service_spec.rb +27 -0
  305. data/spec/unit/type/tidy_spec.rb +7 -0
  306. data/spec/unit/type/user_spec.rb +0 -45
  307. data/spec/unit/type_spec.rb +2 -2
  308. data/spec/unit/util/json_spec.rb +126 -0
  309. data/spec/unit/util/logging_spec.rb +2 -0
  310. data/spec/unit/util/windows/sid_spec.rb +39 -4
  311. data/spec/unit/util/yaml_spec.rb +54 -29
  312. data/tasks/generate_cert_fixtures.rake +10 -1
  313. data/tasks/parallel.rake +3 -3
  314. metadata +52 -96
  315. data/ext/README.environment +0 -8
  316. data/ext/dbfix.sql +0 -132
  317. data/ext/debian/README.Debian +0 -8
  318. data/ext/debian/README.source +0 -2
  319. data/ext/debian/TODO.Debian +0 -1
  320. data/ext/debian/changelog.erb +0 -1122
  321. data/ext/debian/compat +0 -1
  322. data/ext/debian/control +0 -144
  323. data/ext/debian/copyright +0 -339
  324. data/ext/debian/docs +0 -1
  325. data/ext/debian/fileserver.conf +0 -41
  326. data/ext/debian/puppet-common.dirs +0 -13
  327. data/ext/debian/puppet-common.install +0 -3
  328. data/ext/debian/puppet-common.lintian-overrides +0 -5
  329. data/ext/debian/puppet-common.manpages +0 -28
  330. data/ext/debian/puppet-common.postinst +0 -35
  331. data/ext/debian/puppet-common.postrm +0 -33
  332. data/ext/debian/puppet-el.dirs +0 -1
  333. data/ext/debian/puppet-el.emacsen-install +0 -25
  334. data/ext/debian/puppet-el.emacsen-remove +0 -11
  335. data/ext/debian/puppet-el.emacsen-startup +0 -9
  336. data/ext/debian/puppet-el.install +0 -1
  337. data/ext/debian/puppet-testsuite.install +0 -2
  338. data/ext/debian/puppet-testsuite.lintian-overrides +0 -4
  339. data/ext/debian/puppet.lintian-overrides +0 -3
  340. data/ext/debian/puppet.logrotate +0 -20
  341. data/ext/debian/puppet.postinst +0 -20
  342. data/ext/debian/puppet.postrm +0 -20
  343. data/ext/debian/puppet.preinst +0 -20
  344. data/ext/debian/puppetmaster-common.install +0 -2
  345. data/ext/debian/puppetmaster-common.manpages +0 -2
  346. data/ext/debian/puppetmaster-common.postinst +0 -6
  347. data/ext/debian/puppetmaster-passenger.dirs +0 -4
  348. data/ext/debian/puppetmaster-passenger.postinst +0 -162
  349. data/ext/debian/puppetmaster-passenger.postrm +0 -61
  350. data/ext/debian/puppetmaster.README.debian +0 -17
  351. data/ext/debian/puppetmaster.default +0 -14
  352. data/ext/debian/puppetmaster.init +0 -137
  353. data/ext/debian/puppetmaster.lintian-overrides +0 -3
  354. data/ext/debian/puppetmaster.postinst +0 -20
  355. data/ext/debian/puppetmaster.postrm +0 -5
  356. data/ext/debian/puppetmaster.preinst +0 -22
  357. data/ext/debian/rules +0 -132
  358. data/ext/debian/source/format +0 -1
  359. data/ext/debian/source/options +0 -1
  360. data/ext/debian/vim-puppet.README.Debian +0 -13
  361. data/ext/debian/vim-puppet.dirs +0 -5
  362. data/ext/debian/vim-puppet.yaml +0 -7
  363. data/ext/debian/watch +0 -2
  364. data/ext/freebsd/puppetd +0 -26
  365. data/ext/freebsd/puppetmasterd +0 -26
  366. data/ext/gentoo/conf.d/puppet +0 -5
  367. data/ext/gentoo/conf.d/puppetmaster +0 -12
  368. data/ext/gentoo/init.d/puppet +0 -38
  369. data/ext/gentoo/init.d/puppetmaster +0 -51
  370. data/ext/gentoo/puppet/fileserver.conf +0 -41
  371. data/ext/ips/puppet-agent +0 -44
  372. data/ext/ips/puppet-master +0 -44
  373. data/ext/ips/puppet.p5m.erb +0 -12
  374. data/ext/ips/puppetagent.xml +0 -42
  375. data/ext/ips/puppetmaster.xml +0 -42
  376. data/ext/ips/rules +0 -19
  377. data/ext/ips/transforms +0 -34
  378. data/ext/ldap/puppet.schema +0 -24
  379. data/ext/logcheck/puppet +0 -23
  380. data/ext/osx/file_mapping.yaml +0 -33
  381. data/ext/osx/postflight.erb +0 -109
  382. data/ext/osx/preflight.erb +0 -52
  383. data/ext/osx/prototype.plist.erb +0 -38
  384. data/ext/redhat/fileserver.conf +0 -41
  385. data/ext/redhat/logrotate +0 -21
  386. data/ext/redhat/puppet.spec.erb +0 -842
  387. data/ext/redhat/server.init +0 -128
  388. data/ext/redhat/server.sysconfig +0 -13
  389. data/ext/solaris/pkginfo +0 -6
  390. data/ext/solaris/smf/puppetd.xml +0 -77
  391. data/ext/solaris/smf/puppetmasterd.xml +0 -77
  392. data/ext/solaris/smf/svc-puppetd +0 -71
  393. data/ext/solaris/smf/svc-puppetmasterd +0 -67
  394. data/ext/suse/puppet.spec +0 -310
  395. data/ext/suse/server.init +0 -173
  396. data/ext/yaml_nodes.rb +0 -105
  397. data/spec/unit/indirector/store_configs_spec.rb +0 -7
@@ -24,7 +24,7 @@ describe Puppet::Type.type(:package).provider(:pip3) do
24
24
  end
25
25
 
26
26
  context 'when is defaultfor' do
27
- let(:os) { Facter.value(:operatingsystem) }
27
+ let(:os) { Puppet.runtime[:facter].value(:operatingsystem) }
28
28
  subject do
29
29
  described_class.defaultfor(operatingsystem: os)
30
30
  described_class.specificity
@@ -266,6 +266,43 @@ describe Puppet::Type.type(:package).provider(:pip) do
266
266
  let(:pip_version) { '1.5.4' }
267
267
  let(:pip_path) { '/fake/bin/pip' }
268
268
 
269
+ context "with pip version >= 20.3 and < 21.1" do
270
+ let(:pip_version) { '20.3.1' }
271
+ let(:pip_path) { '/fake/bin/pip' }
272
+
273
+ it "should use legacy-resolver argument" do
274
+ p = StringIO.new(
275
+ <<-EOS
276
+ Collecting real-package==versionplease
277
+ Could not find a version that satisfies the requirement real-package==versionplease (from versions: 1.1.3, 1.0, 1.9b1)
278
+ No matching distribution found for real-package==versionplease
279
+ EOS
280
+ )
281
+ expect(Puppet::Util::Execution).to receive(:execpipe).with(["/fake/bin/pip", "install", "real_package==versionplease",
282
+ "--use-deprecated=legacy-resolver"]).and_yield(p).once
283
+ @resource[:name] = "real_package"
284
+ @provider.latest
285
+ end
286
+ end
287
+
288
+ context "with pip version >= 21.1" do
289
+ let(:pip_version) { '21.1' }
290
+ let(:pip_path) { '/fake/bin/pip' }
291
+
292
+ it "should not use legacy-resolver argument" do
293
+ p = StringIO.new(
294
+ <<-EOS
295
+ Collecting real-package==versionplease
296
+ Could not find a version that satisfies the requirement real-package==versionplease (from versions: 1.1.3, 1.0, 1.9b1)
297
+ No matching distribution found for real-package==versionplease
298
+ EOS
299
+ )
300
+ expect(Puppet::Util::Execution).to receive(:execpipe).with(["/fake/bin/pip", "install", "real_package==versionplease"]).and_yield(p).once
301
+ @resource[:name] = "real_package"
302
+ @provider.latest
303
+ end
304
+ end
305
+
269
306
  it "should find a version number for real_package" do
270
307
  p = StringIO.new(
271
308
  <<-EOS
@@ -454,7 +491,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
454
491
  end
455
492
 
456
493
  context 'when is defaultfor' do
457
- let(:os) { Facter.value(:operatingsystem) }
494
+ let(:os) { Puppet.runtime[:facter].value(:operatingsystem) }
458
495
  subject do
459
496
  described_class.defaultfor(operatingsystem: os)
460
497
  described_class.specificity
@@ -352,12 +352,15 @@ describe Puppet::Type.type(:package).provider(:pkg), unless: Puppet::Util::Platf
352
352
  resource[:ensure] = '1.0-0.151006'
353
353
  is = :absent
354
354
  expect(provider).to receive(:query).with(no_args).and_return({:ensure => is})
355
- expect(provider).to receive(:properties).and_return({:mark => :hold})
355
+ expect(provider).to receive(:properties).and_return({:mark => :hold}).exactly(3).times
356
+
356
357
  expect(described_class).to receive(:pkg)
357
358
  .with(:list, '-Hvfa', 'dummy@1.0-0.151006')
358
359
  .and_return(Puppet::Util::Execution::ProcessOutput.new(File.read(my_fixture('dummy_implicit_version')), 0))
359
360
  expect(Puppet::Util::Execution).to receive(:execute).with(['/bin/pkg', 'install', '-n', 'dummy@1.0,5.11-0.151006:20140220T084443Z'], {:failonfail => false, :combine => true})
360
- expect(provider).to receive(:unhold).with(no_args)
361
+ expect(provider).to receive(:unhold).with(no_args).twice
362
+ expect(described_class).to receive(:pkg)
363
+ .with(:freeze, 'dummy')
361
364
  expect(Puppet::Util::Execution).to receive(:execute).with(['/bin/pkg', 'install', *hash[:flags], 'dummy@1.0,5.11-0.151006:20140220T084443Z'], {:failonfail => false, :combine => true})
362
365
  allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
363
366
  provider.insync?(is)
@@ -368,10 +371,14 @@ describe Puppet::Type.type(:package).provider(:pkg), unless: Puppet::Util::Platf
368
371
  resource[:ensure] = '1.0-0.151006'
369
372
  is = '1.0,5.11-0.151006:20140219T191204Z'
370
373
  expect(provider).to receive(:query).with(no_args).and_return({:ensure => is})
371
- expect(provider).to receive(:properties).and_return({:mark => :hold})
374
+ expect(provider).to receive(:properties).and_return({:mark => :hold}).exactly(3).times
375
+
372
376
  expect(described_class).to receive(:pkg).with(:list, '-Hvfa', 'dummy@1.0-0.151006').and_return(File.read(my_fixture('dummy_implicit_version')))
377
+ expect(described_class).to receive(:pkg)
378
+ .with(:freeze, 'dummy')
373
379
  expect(Puppet::Util::Execution).to receive(:execute).with(['/bin/pkg', 'update', '-n', 'dummy@1.0,5.11-0.151006:20140220T084443Z'], {:failonfail => false, :combine => true})
374
- expect(provider).to receive(:unhold).with(no_args)
380
+ .and_return(File.read(my_fixture('dummy_implicit_version')))
381
+ expect(provider).to receive(:unhold).with(no_args).twice
375
382
  expect(Puppet::Util::Execution).to receive(:execute).with(['/bin/pkg', 'update', *hash[:flags], 'dummy@1.0,5.11-0.151006:20140220T084443Z'], {:failonfail => false, :combine => true})
376
383
  allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
377
384
  provider.insync?(is)
@@ -385,6 +392,8 @@ describe Puppet::Type.type(:package).provider(:pkg), unless: Puppet::Util::Platf
385
392
  expect(described_class).to receive(:pkg)
386
393
  .with(:list, '-Hvfa', 'dummy@1.0-0.151006')
387
394
  .and_return(Puppet::Util::Execution::ProcessOutput.new(File.read(my_fixture('dummy_implicit_version')), 0))
395
+ expect(Puppet::Util::Execution).to receive(:execute).with(["/bin/pkg", "list", "-Hv", "dummy"], {:failonfail => false, :combine => true})
396
+ .and_return(File.read(my_fixture('dummy_implicit_version')))
388
397
  expect(Puppet::Util::Execution).to receive(:execute).with(['/bin/pkg', 'update', '-n', 'dummy@1.0,5.11-0.151006:20140220T084443Z'], {:failonfail => false, :combine => true})
389
398
  allow($CHILD_STATUS).to receive(:exitstatus).and_return(4)
390
399
  provider.insync?(is)
@@ -396,10 +405,26 @@ describe Puppet::Type.type(:package).provider(:pkg), unless: Puppet::Util::Platf
396
405
  expect(provider).to receive(:warning).with("Implicit version 1.0-0.151006 has 3 possible matches")
397
406
  expect(provider).to receive(:warning).with("Selecting version '1.0,5.11-0.151006:20140220T084443Z' for implicit '1.0-0.151006'")
398
407
  expect(described_class).to receive(:pkg).with(:list, '-Hvfa', 'dummy@1.0-0.151006').and_return(File.read(my_fixture('dummy_implicit_version')))
408
+ expect(Puppet::Util::Execution).to receive(:execute).with(["/bin/pkg", "list", "-Hv", "dummy"], {:failonfail => false, :combine => true})
409
+ .and_return(File.read(my_fixture('dummy_implicit_version')))
399
410
  expect(Puppet::Util::Execution).to receive(:execute).with(['/bin/pkg', 'install', '-n', 'dummy@1.0,5.11-0.151006:20140220T084443Z'], {:failonfail => false, :combine => true})
400
411
  allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
401
412
  provider.insync?(is)
402
413
  end
414
+
415
+ it "should try 5 times to install and fail when all tries failed" do
416
+ allow_any_instance_of(Kernel).to receive(:sleep)
417
+
418
+ expect(provider).to receive(:query).and_return({:ensure => :absent})
419
+ expect(provider).to receive(:properties).and_return({:mark => :hold})
420
+ expect(provider).to receive(:unhold)
421
+ expect(Puppet::Util::Execution).to receive(:execute)
422
+ .with(['/bin/pkg', 'install', *hash[:flags], 'dummy'], {:failonfail => false, :combine => true}).exactly(5).times
423
+ allow($CHILD_STATUS).to receive(:exitstatus).and_return(7)
424
+ expect {
425
+ provider.update
426
+ }.to raise_error(Puppet::Error, /Pkg could not install dummy after 5 tries. Aborting run/)
427
+ end
403
428
  end
404
429
  end
405
430
  end
@@ -87,7 +87,7 @@ describe Puppet::Type.type(:package).provider(:puppet_gem) do
87
87
  end
88
88
 
89
89
  context 'when is defaultfor' do
90
- let(:os) { Facter.value(:operatingsystem) }
90
+ let(:os) { Puppet.runtime[:facter].value(:operatingsystem) }
91
91
  subject do
92
92
  described_class.defaultfor(operatingsystem: os)
93
93
  described_class.specificity
@@ -125,7 +125,7 @@ describe Puppet::Type.type(:package).provider(:puppetserver_gem) do
125
125
  end
126
126
 
127
127
  context 'when is defaultfor' do
128
- let(:os) { Facter.value(:operatingsystem) }
128
+ let(:os) { Puppet.runtime[:facter].value(:operatingsystem) }
129
129
  subject do
130
130
  described_class.defaultfor(operatingsystem: os)
131
131
  described_class.specificity
@@ -79,6 +79,16 @@ describe Puppet::Provider::ParsedFile do
79
79
 
80
80
  provider.instances
81
81
  end
82
+
83
+ it "should raise if parsing returns nil" do
84
+ expect(provider).to receive(:targets).and_return(%w{/one})
85
+ expect_any_instance_of(Puppet::Util::FileType::FileTypeFlat).to receive(:read).and_return('a=b')
86
+ expect(provider).to receive(:parse).and_return(nil)
87
+
88
+ expect {
89
+ provider.instances
90
+ }.to raise_error(Puppet::DevError, %r{Prefetching /one for provider parsedfile_provider returned nil})
91
+ end
82
92
  end
83
93
 
84
94
  describe "when matching resources to existing records" do
@@ -10,8 +10,8 @@ describe 'Puppet::Type::Service::Provider::Gentoo',
10
10
 
11
11
  before :each do
12
12
  allow(Puppet::Type.type(:service)).to receive(:defaultprovider).and_return(provider_class)
13
- allow(FileTest).to receive(:file?).with('/sbin/rc-update').and_return(true)
14
- allow(FileTest).to receive(:executable?).with('/sbin/rc-update').and_return(true)
13
+ allow(Puppet::FileSystem).to receive(:file?).with('/sbin/rc-update').and_return(true)
14
+ allow(Puppet::FileSystem).to receive(:executable?).with('/sbin/rc-update').and_return(true)
15
15
  allow(Facter).to receive(:value).with(:operatingsystem).and_return('Gentoo')
16
16
  allow(Facter).to receive(:value).with(:osfamily).and_return('Gentoo')
17
17
 
@@ -52,13 +52,14 @@ describe 'Puppet::Type::Service::Provider::Gentoo',
52
52
  end
53
53
 
54
54
  it "should get a list of services from /etc/init.d but exclude helper scripts" do
55
- expect(FileTest).to receive(:directory?).with('/etc/init.d').and_return(true)
55
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
56
+ allow(Puppet::FileSystem).to receive(:directory?).with('/etc/init.d').and_return(true)
56
57
  expect(Dir).to receive(:entries).with('/etc/init.d').and_return(initscripts)
57
58
  (initscripts - helperscripts).each do |script|
58
- expect(FileTest).to receive(:executable?).with("/etc/init.d/#{script}").and_return(true)
59
+ expect(Puppet::FileSystem).to receive(:executable?).with("/etc/init.d/#{script}").and_return(true)
59
60
  end
60
61
  helperscripts.each do |script|
61
- expect(FileTest).not_to receive(:executable?).with("/etc/init.d/#{script}")
62
+ expect(Puppet::FileSystem).not_to receive(:executable?).with("/etc/init.d/#{script}")
62
63
  end
63
64
 
64
65
  allow(Puppet::FileSystem).to receive(:symlink?).and_return(false)
@@ -85,14 +85,20 @@ describe 'Puppet::Type::Service::Provider::Init',
85
85
  @services = ['one', 'two', 'three', 'four', 'umountfs']
86
86
  allow(Dir).to receive(:entries).and_call_original
87
87
  allow(Dir).to receive(:entries).with('tmp').and_return(@services)
88
- expect(FileTest).to receive(:directory?).with('tmp').and_return(true)
89
- allow(FileTest).to receive(:executable?).and_return(true)
88
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
89
+ allow(Puppet::FileSystem).to receive(:directory?).with('tmp').and_return(true)
90
+ allow(Puppet::FileSystem).to receive(:executable?).and_return(true)
90
91
  end
91
92
 
92
93
  it "should return instances for all services" do
93
94
  expect(provider_class.instances.map(&:name)).to eq(@services)
94
95
  end
95
96
 
97
+ it "should omit directories from the service list" do
98
+ expect(Puppet::FileSystem).to receive(:directory?).with('tmp/four').and_return(true)
99
+ expect(provider_class.instances.map(&:name)).to eq(@services - ['four'])
100
+ end
101
+
96
102
  it "should omit an array of services from exclude list" do
97
103
  exclude = ['two', 'four']
98
104
  expect(provider_class.get_services(provider_class.defpath, exclude).map(&:name)).to eq(@services - exclude)
@@ -140,9 +146,9 @@ describe 'Puppet::Type::Service::Provider::Init',
140
146
 
141
147
  describe "when checking valid paths" do
142
148
  it "should discard paths that do not exist" do
143
- expect(File).to receive(:directory?).with(paths[0]).and_return(false)
149
+ expect(Puppet::FileSystem).to receive(:directory?).with(paths[0]).and_return(false)
144
150
  expect(Puppet::FileSystem).to receive(:exist?).with(paths[0]).and_return(false)
145
- expect(File).to receive(:directory?).with(paths[1]).and_return(true)
151
+ expect(Puppet::FileSystem).to receive(:directory?).with(paths[1]).and_return(true)
146
152
 
147
153
  expect(provider.paths).to eq([paths[1]])
148
154
  end
@@ -150,7 +156,7 @@ describe 'Puppet::Type::Service::Provider::Init',
150
156
  it "should discard paths that are not directories" do
151
157
  paths.each do |path|
152
158
  expect(Puppet::FileSystem).to receive(:exist?).with(path).and_return(true)
153
- expect(File).to receive(:directory?).with(path).and_return(false)
159
+ expect(Puppet::FileSystem).to receive(:directory?).with(path).and_return(false)
154
160
  end
155
161
  expect(provider.paths).to be_empty
156
162
  end
@@ -158,7 +164,7 @@ describe 'Puppet::Type::Service::Provider::Init',
158
164
 
159
165
  describe "when searching for the init script" do
160
166
  before :each do
161
- paths.each {|path| expect(File).to receive(:directory?).with(path).and_return(true) }
167
+ paths.each {|path| expect(Puppet::FileSystem).to receive(:directory?).with(path).and_return(true) }
162
168
  end
163
169
 
164
170
  it "should be able to find the init script in the service path" do
@@ -191,9 +197,9 @@ describe 'Puppet::Type::Service::Provider::Init',
191
197
 
192
198
  describe "if the init script is present" do
193
199
  before :each do
194
- allow(File).to receive(:directory?).and_call_original
195
- allow(File).to receive(:directory?).with("/service/path").and_return(true)
196
- allow(File).to receive(:directory?).with("/alt/service/path").and_return(true)
200
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
201
+ allow(Puppet::FileSystem).to receive(:directory?).with("/service/path").and_return(true)
202
+ allow(Puppet::FileSystem).to receive(:directory?).with("/alt/service/path").and_return(true)
197
203
  allow(Puppet::FileSystem).to receive(:exist?).with("/service/path/myservice").and_return(true)
198
204
  end
199
205
 
@@ -327,6 +327,7 @@ describe 'Puppet::Type::Service::Provider::Launchd',
327
327
  'LimitLoadToSessionType' => 'Aqua'
328
328
  }
329
329
  end
330
+ let(:plist_without_label_not_hash) { 'just a string' }
330
331
  let(:busted_plist_path) { '/Library/LaunchAgents/org.busted.plist' }
331
332
  let(:binary_plist_path) { '/Library/LaunchAgents/org.binary.plist' }
332
333
 
@@ -338,6 +339,16 @@ describe 'Puppet::Type::Service::Provider::Launchd',
338
339
  expect(Puppet).to receive(:debug).with("The #{busted_plist_path} plist does not contain a 'label' key; Puppet is skipping it")
339
340
  provider.make_label_to_path_map
340
341
  end
342
+
343
+ it "it should warn that the malformed plist in question is being skipped" do
344
+ expect(provider).to receive(:launchd_paths).and_return(['/Library/LaunchAgents'])
345
+ expect(provider).to receive(:return_globbed_list_of_file_paths).with('/Library/LaunchAgents').and_return([busted_plist_path])
346
+ expect(plistlib).to receive(:read_plist_file).with(busted_plist_path).and_return(plist_without_label_not_hash)
347
+ expect(Puppet).to receive(:debug).with("Reading launchd plist #{busted_plist_path}")
348
+ expect(Puppet).to receive(:debug).with("The #{busted_plist_path} plist does not contain a 'label' key; Puppet is skipping it")
349
+ provider.make_label_to_path_map
350
+ end
351
+
341
352
  end
342
353
 
343
354
  it "should return the cached value when available" do
@@ -2,63 +2,56 @@ require 'spec_helper'
2
2
 
3
3
  describe 'Puppet::Type::Service::Provider::Openwrt',
4
4
  unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
5
+
5
6
  let(:provider_class) { Puppet::Type.type(:service).provider(:openwrt) }
6
7
 
7
8
  let(:resource) do
8
- resource = double('resource')
9
- allow(resource).to receive(:[]).and_return(nil)
10
- allow(resource).to receive(:[]).with(:name).and_return("myservice")
11
- allow(resource).to receive(:[]).with(:path).and_return(["/etc/init.d"])
12
-
13
- resource
9
+ Puppet::Type.type(:service).new(
10
+ :name => 'myservice',
11
+ :path => '/etc/init.d',
12
+ :hasrestart => true,
13
+ )
14
14
  end
15
15
 
16
16
  let(:provider) do
17
17
  provider = provider_class.new
18
- allow(provider).to receive(:get).with(:hasstatus).and_return(false)
19
-
18
+ provider.resource = resource
20
19
  provider
21
20
  end
22
21
 
23
22
  before :each do
24
- allow(resource).to receive(:provider).and_return(provider)
25
- provider.resource = resource
26
-
27
- allow(FileTest).to receive(:file?).with('/etc/rc.common').and_return(true)
28
- allow(FileTest).to receive(:executable?).with('/etc/rc.common').and_return(true)
23
+ resource.provider = provider
29
24
 
30
25
  # All OpenWrt tests operate on the init script directly. It must exist.
31
- allow(File).to receive(:directory?).and_call_original
32
- allow(File).to receive(:directory?).with('/etc/init.d').and_return(true)
26
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
27
+ allow(Puppet::FileSystem).to receive(:directory?).with('/etc/init.d').and_return(true)
33
28
 
34
29
  allow(Puppet::FileSystem).to receive(:exist?).with('/etc/init.d/myservice').and_return(true)
35
- allow(FileTest).to receive(:file?).and_call_original
36
- allow(FileTest).to receive(:file?).with('/etc/init.d/myservice').and_return(true)
37
- allow(FileTest).to receive(:executable?).with('/etc/init.d/myservice').and_return(true)
30
+ allow(Puppet::FileSystem).to receive(:file?).and_call_original
31
+ allow(Puppet::FileSystem).to receive(:file?).with('/etc/init.d/myservice').and_return(true)
32
+ allow(Puppet::FileSystem).to receive(:executable?).with('/etc/init.d/myservice').and_return(true)
38
33
  end
39
34
 
40
- operatingsystem = 'openwrt'
41
- it "should be the default provider on #{operatingsystem}" do
42
- expect(Facter).to receive(:value).with(:operatingsystem).and_return(operatingsystem)
35
+ it "should be the default provider on 'openwrt'" do
36
+ expect(Facter).to receive(:value).with(:operatingsystem).and_return('openwrt')
43
37
  expect(provider_class.default?).to be_truthy
44
38
  end
45
39
 
46
40
  # test self.instances
47
41
  describe "when getting all service instances" do
48
- let(:services) {['dnsmasq', 'dropbear', 'firewall', 'led', 'puppet', 'uhttpd' ]}
42
+ let(:services) { ['dnsmasq', 'dropbear', 'firewall', 'led', 'puppet', 'uhttpd' ] }
49
43
 
50
44
  before :each do
51
45
  allow(Dir).to receive(:entries).and_call_original
52
46
  allow(Dir).to receive(:entries).with('/etc/init.d').and_return(services)
53
- allow(FileTest).to receive(:directory?).and_return(true)
54
- allow(FileTest).to receive(:executable?).and_return(true)
47
+ allow(Puppet::FileSystem).to receive(:executable?).and_return(true)
55
48
  end
56
49
 
57
50
  it "should return instances for all services" do
58
51
  services.each do |inst|
59
52
  expect(provider_class).to receive(:new).with(hash_including(:name => inst, :path => '/etc/init.d')).and_return("#{inst}_instance")
60
53
  end
61
- results = services.collect {|x| "#{x}_instance"}
54
+ results = services.collect { |x| "#{x}_instance"}
62
55
  expect(provider_class.instances).to eq(results)
63
56
  end
64
57
  end
@@ -82,14 +75,13 @@ describe 'Puppet::Type::Service::Provider::Openwrt',
82
75
 
83
76
  describe "when running #{method}" do
84
77
  it "should use any provided explicit command" do
85
- allow(resource).to receive(:[]).with(method).and_return("/user/specified/command")
86
- expect(provider).to receive(:execute).with(["/user/specified/command"], any_args)
78
+ resource[method] = '/user/specified/command'
79
+ expect(provider).to receive(:execute).with(['/user/specified/command'], any_args)
87
80
  provider.send(method)
88
81
  end
89
82
 
90
83
  it "should execute the init script with #{method} when no explicit command is provided" do
91
- allow(resource).to receive(:[]).with("has#{method}".intern).and_return(:true)
92
- expect(provider).to receive(:execute).with(['/etc/init.d/myservice', method ], any_args)
84
+ expect(provider).to receive(:execute).with(['/etc/init.d/myservice', method], any_args)
93
85
  provider.send(method)
94
86
  end
95
87
  end
@@ -50,8 +50,9 @@ describe 'Puppet::Type::Service::Provider::Redhat',
50
50
  @services = ['one', 'two', 'three', 'four', 'kudzu', 'functions', 'halt', 'killall', 'single', 'linuxconf', 'boot', 'reboot']
51
51
  @not_services = ['functions', 'halt', 'killall', 'single', 'linuxconf', 'reboot', 'boot']
52
52
  allow(Dir).to receive(:entries).and_return(@services)
53
- allow(FileTest).to receive(:directory?).and_return(true)
54
- allow(FileTest).to receive(:executable?).and_return(true)
53
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
54
+ allow(Puppet::FileSystem).to receive(:directory?).with('/etc/init.d').and_return(true)
55
+ allow(Puppet::FileSystem).to receive(:executable?).and_return(true)
55
56
  end
56
57
 
57
58
  it "should return instances for all services" do
@@ -34,7 +34,7 @@ describe 'Puppet::Type::Service::Provider::Systemd',
34
34
  end
35
35
  end
36
36
 
37
- [7, 8].each do |ver|
37
+ [7, 8, 9].each do |ver|
38
38
  it "should be the default provider on rhel#{ver}" do
39
39
  allow(Facter).to receive(:value).with(:osfamily).and_return(:redhat)
40
40
  allow(Facter).to receive(:value).with(:operatingsystem).and_return(:redhat)
@@ -217,4 +217,104 @@ describe 'Puppet::Type::User::Provider::Aix' do
217
217
  provider.create
218
218
  end
219
219
  end
220
+
221
+ describe '#list_all_homes' do
222
+ it "should return empty array and output debug on failure" do
223
+ allow(Puppet::Util::Execution).to receive(:execute).and_raise(Puppet::ExecutionFailure, 'Execution failed')
224
+ expect(Puppet).to receive(:debug).with('Could not list home of all users: Execution failed')
225
+ expect(provider.list_all_homes).to eql({})
226
+ end
227
+ end
228
+
229
+ describe '#delete' do
230
+ before(:each) do
231
+ allow(File).to receive(:realpath).and_call_original
232
+ allow(FileUtils).to receive(:remove_entry_secure).and_call_original
233
+
234
+ allow(provider.resource).to receive(:should).with(anything).and_return(nil)
235
+ allow(provider).to receive(:home).and_return(Dir.tmpdir)
236
+ allow(provider).to receive(:execute).and_return(nil)
237
+ allow(provider).to receive(:object_info).and_return(nil)
238
+ allow(FileUtils).to receive(:remove_entry_secure).with(Dir.tmpdir, true).and_return(nil)
239
+ end
240
+
241
+ context 'with managehome true' do
242
+ before(:each) do
243
+ allow(provider.resource).to receive(:managehome?).and_return(true)
244
+ allow(provider).to receive(:list_all_homes).and_return([])
245
+ end
246
+
247
+ it 'should delete the user without error' do
248
+ expect{ provider.delete }.not_to raise_error
249
+ end
250
+
251
+ it "should not remove home when relative" do
252
+ allow(provider).to receive(:home).and_return('relative_path')
253
+
254
+ expect(Puppet).to receive(:debug).with(/Please make sure the path is not relative, symlink or '\/'./)
255
+ provider.delete
256
+ end
257
+
258
+ it "should not remove home when '/'" do
259
+ allow(provider).to receive(:home).and_return('/')
260
+
261
+ expect(Puppet).to receive(:debug).with(/Please make sure the path is not relative, symlink or '\/'./)
262
+ provider.delete
263
+ end
264
+
265
+ it "should not remove home when symlink" do
266
+ allow(Puppet::FileSystem).to receive(:symlink?).with(Dir.tmpdir).and_return(true)
267
+
268
+ expect(Puppet).to receive(:debug).with(/Please make sure the path is not relative, symlink or '\/'./)
269
+ provider.delete
270
+ end
271
+
272
+ it "should not remove home when other users would be affected" do
273
+ allow(provider).to receive(:home).and_return('/special')
274
+ allow(File).to receive(:realpath).with('/special').and_return('/special')
275
+ allow(Puppet::Util).to receive(:absolute_path?).with('/special').and_return(true)
276
+ allow(provider).to receive(:list_all_homes).and_return([{:name => 'other_user', :home => '/special/other_user'}])
277
+
278
+ expect(Puppet).to receive(:debug).with(/it would remove the home directory '\/special\/other_user' of user 'other_user' also./)
279
+ provider.delete
280
+ end
281
+
282
+ it 'should remove homedir' do
283
+ expect(FileUtils).to receive(:remove_entry_secure).with(Dir.tmpdir, true)
284
+ provider.delete
285
+ end
286
+ end
287
+
288
+ context 'with managehome false' do
289
+ before(:each) do
290
+ allow(provider.resource).to receive(:managehome?).and_return(false)
291
+ end
292
+
293
+ it 'should delete the user without error' do
294
+ expect{ provider.delete }.not_to raise_error
295
+ end
296
+
297
+ it 'should not remove homedir' do
298
+ expect(FileUtils).not_to receive(:remove_entry_secure).with(Dir.tmpdir, true)
299
+ end
300
+
301
+ it 'should not print manage home debug messages' do
302
+ expect(Puppet).not_to receive(:debug).with(/Please make sure the path is not relative, symlink or '\/'./)
303
+ expect(Puppet).not_to receive(:debug).with(/it would remove the home directory '\/special\/other_user' of user 'other_user' also./)
304
+
305
+ provider.delete
306
+ end
307
+ end
308
+ end
309
+
310
+ describe '#deletecmd' do
311
+ it 'uses the -p flag when removing the user' do
312
+ allow(provider.class).to receive(:command).with(:delete).and_return('delete')
313
+ allow(provider).to receive(:ia_module_args).and_return(['ia_module_args'])
314
+
315
+ expect(provider.deletecmd).to eql(
316
+ ['delete', '-p', 'ia_module_args', provider.resource.name]
317
+ )
318
+ end
319
+ end
220
320
  end
@@ -1142,7 +1142,7 @@ end
1142
1142
  provider.class.instance_variable_set(:@os_version, nil) if provider.class.instance_variable_defined? :@os_version
1143
1143
  end
1144
1144
 
1145
- it 'should call Facter.value(:macosx_productversion_major) ONLY ONCE no matter how ' +
1145
+ it 'should call Puppet.runtime[:facter].value(:macosx_productversion_major) ONLY ONCE no matter how ' +
1146
1146
  'many times get_os_version() is called' do
1147
1147
  expect(Facter).to receive(:value).with(:macosx_productversion_major).once.and_return('10.8')
1148
1148
  expect(provider.class.get_os_version).to eq('10.8')
@@ -13,6 +13,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do
13
13
  allow(described_class).to receive(:command).with(:localmodify).and_return('/usr/sbin/lusermod')
14
14
  allow(described_class).to receive(:command).with(:delete).and_return('/usr/sbin/userdel')
15
15
  allow(described_class).to receive(:command).with(:localdelete).and_return('/usr/sbin/luserdel')
16
+ allow(described_class).to receive(:command).with(:chpasswd).and_return('/usr/sbin/chpasswd')
16
17
  end
17
18
 
18
19
  let(:resource) do
@@ -62,7 +63,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do
62
63
  :provider => provider,
63
64
  )
64
65
  resource2[:ensure] = :present
65
- expect(provider).to receive(:execute).with(kind_of(Array), hash_including(sensitive: true))
66
+ expect(provider).to receive(:execute).with(kind_of(Array), hash_including(sensitive: true)).twice
66
67
  provider.create
67
68
  end
68
69
 
@@ -208,7 +209,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do
208
209
  end
209
210
 
210
211
  it "should call execute with sensitive if sensitive data is changed" do
211
- expect(provider).to receive(:execute).with(kind_of(Array), hash_including(sensitive: true))
212
+ expect(provider).to receive(:execute).with(kind_of(Array), hash_including(sensitive: true)).and_return('')
212
213
  provider.password = 'bird bird bird'
213
214
  end
214
215
  end
@@ -351,6 +352,46 @@ describe Puppet::Type.type(:user).provider(:useradd) do
351
352
  end
352
353
  end
353
354
 
355
+ describe "#shell" do
356
+ before { described_class.has_feature :manages_local_users_and_groups }
357
+
358
+ let(:content) { "myuser:x:x:x:x:x:/bin/local_shell" }
359
+
360
+ it "should return the local shell string when forcelocal is true" do
361
+ resource[:forcelocal] = true
362
+ allow(Puppet::FileSystem).to receive(:exist?).with('/etc/passwd').and_return(true)
363
+ allow(Puppet::FileSystem).to receive(:each_line).with('/etc/passwd').and_yield(content)
364
+ expect(provider.shell).to eq('/bin/local_shell')
365
+ end
366
+
367
+ it "should fall back to nameservice shell string when forcelocal is false" do
368
+ resource[:forcelocal] = false
369
+ allow(provider).to receive(:get).with(:shell).and_return('/bin/remote_shell')
370
+ expect(provider).not_to receive(:localshell)
371
+ expect(provider.shell).to eq('/bin/remote_shell')
372
+ end
373
+ end
374
+
375
+ describe "#home" do
376
+ before { described_class.has_feature :manages_local_users_and_groups }
377
+
378
+ let(:content) { "myuser:x:x:x:x:/opt/local_home:x" }
379
+
380
+ it "should return the local home string when forcelocal is true" do
381
+ resource[:forcelocal] = true
382
+ allow(Puppet::FileSystem).to receive(:exist?).with('/etc/passwd').and_return(true)
383
+ allow(Puppet::FileSystem).to receive(:each_line).with('/etc/passwd').and_yield(content)
384
+ expect(provider.home).to eq('/opt/local_home')
385
+ end
386
+
387
+ it "should fall back to nameservice home string when forcelocal is false" do
388
+ resource[:forcelocal] = false
389
+ allow(provider).to receive(:get).with(:home).and_return('/opt/remote_home')
390
+ expect(provider).not_to receive(:localhome)
391
+ expect(provider.home).to eq('/opt/remote_home')
392
+ end
393
+ end
394
+
354
395
  describe "#gid" do
355
396
  before { described_class.has_feature :manages_local_users_and_groups }
356
397
 
@@ -222,18 +222,18 @@ describe Puppet::Provider do
222
222
  { :true => false } => false,
223
223
  { :false => false } => true,
224
224
  { :false => true } => false,
225
- { :operatingsystem => Facter.value(:operatingsystem) } => true,
225
+ { :operatingsystem => Puppet.runtime[:facter].value(:operatingsystem) } => true,
226
226
  { :operatingsystem => :yayness } => false,
227
227
  { :nothing => :yayness } => false,
228
228
  { :exists => Puppet::Util.which(existing_command) } => true,
229
229
  { :exists => "/this/file/does/not/exist" } => false,
230
230
  { :true => true, :exists => Puppet::Util.which(existing_command) } => true,
231
231
  { :true => true, :exists => "/this/file/does/not/exist" } => false,
232
- { :operatingsystem => Facter.value(:operatingsystem),
232
+ { :operatingsystem => Puppet.runtime[:facter].value(:operatingsystem),
233
233
  :exists => Puppet::Util.which(existing_command) } => true,
234
234
  { :operatingsystem => :yayness,
235
235
  :exists => Puppet::Util.which(existing_command) } => false,
236
- { :operatingsystem => Facter.value(:operatingsystem),
236
+ { :operatingsystem => Puppet.runtime[:facter].value(:operatingsystem),
237
237
  :exists => "/this/file/does/not/exist" } => false,
238
238
  { :operatingsystem => :yayness,
239
239
  :exists => "/this/file/does/not/exist" } => false,
@@ -269,7 +269,7 @@ describe Puppet::Provider do
269
269
  end
270
270
 
271
271
  context "default providers" do
272
- let :os do Facter.value(:operatingsystem) end
272
+ let :os do Puppet.runtime[:facter].value(:operatingsystem) end
273
273
 
274
274
  it { is_expected.to respond_to :specificity }
275
275