puppet 6.21.1 → 6.25.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 (427) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +5 -5
  3. data/Gemfile +3 -3
  4. data/Gemfile.lock +34 -28
  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/osx/puppet.plist +2 -0
  16. data/ext/project_data.yaml +3 -2
  17. data/lib/puppet/application/agent.rb +16 -5
  18. data/lib/puppet/application/apply.rb +22 -3
  19. data/lib/puppet/application/device.rb +2 -1
  20. data/lib/puppet/application/filebucket.rb +1 -0
  21. data/lib/puppet/application/resource.rb +32 -16
  22. data/lib/puppet/application/script.rb +2 -1
  23. data/lib/puppet/application/ssl.rb +12 -0
  24. data/lib/puppet/concurrent/thread_local_singleton.rb +1 -0
  25. data/lib/puppet/configurer/downloader.rb +2 -1
  26. data/lib/puppet/configurer.rb +85 -57
  27. data/lib/puppet/confine/variable.rb +1 -1
  28. data/lib/puppet/defaults.rb +63 -35
  29. data/lib/puppet/environments.rb +91 -26
  30. data/lib/puppet/face/facts.rb +129 -31
  31. data/lib/puppet/face/help/action.erb +1 -0
  32. data/lib/puppet/face/help/face.erb +1 -0
  33. data/lib/puppet/face/node/clean.rb +11 -0
  34. data/lib/puppet/facter_impl.rb +96 -0
  35. data/lib/puppet/file_serving/configuration/parser.rb +2 -0
  36. data/lib/puppet/file_serving/configuration.rb +3 -0
  37. data/lib/puppet/file_serving/fileset.rb +14 -2
  38. data/lib/puppet/file_serving/mount/file.rb +4 -4
  39. data/lib/puppet/file_serving/mount/scripts.rb +24 -0
  40. data/lib/puppet/file_system/file_impl.rb +3 -1
  41. data/lib/puppet/file_system/memory_file.rb +8 -1
  42. data/lib/puppet/file_system/windows.rb +4 -2
  43. data/lib/puppet/forge.rb +4 -4
  44. data/lib/puppet/functions/all.rb +1 -1
  45. data/lib/puppet/functions/camelcase.rb +1 -1
  46. data/lib/puppet/functions/capitalize.rb +2 -2
  47. data/lib/puppet/functions/downcase.rb +2 -2
  48. data/lib/puppet/functions/empty.rb +8 -0
  49. data/lib/puppet/functions/find_template.rb +2 -2
  50. data/lib/puppet/functions/get.rb +5 -5
  51. data/lib/puppet/functions/group_by.rb +13 -5
  52. data/lib/puppet/functions/lest.rb +1 -1
  53. data/lib/puppet/functions/new.rb +100 -100
  54. data/lib/puppet/functions/partition.rb +12 -4
  55. data/lib/puppet/functions/require.rb +5 -5
  56. data/lib/puppet/functions/sort.rb +3 -3
  57. data/lib/puppet/functions/strftime.rb +1 -0
  58. data/lib/puppet/functions/tree_each.rb +7 -9
  59. data/lib/puppet/functions/type.rb +4 -4
  60. data/lib/puppet/functions/unwrap.rb +17 -2
  61. data/lib/puppet/functions/upcase.rb +2 -2
  62. data/lib/puppet/http/resolver/server_list.rb +15 -4
  63. data/lib/puppet/http/service/compiler.rb +75 -1
  64. data/lib/puppet/http/service/file_server.rb +2 -1
  65. data/lib/puppet/indirector/catalog/compiler.rb +25 -6
  66. data/lib/puppet/indirector/catalog/rest.rb +1 -0
  67. data/lib/puppet/indirector/facts/facter.rb +28 -7
  68. data/lib/puppet/indirector/file_metadata/rest.rb +1 -0
  69. data/lib/puppet/indirector/indirection.rb +1 -1
  70. data/lib/puppet/indirector/resource/ral.rb +6 -1
  71. data/lib/puppet/indirector/terminus.rb +4 -0
  72. data/lib/puppet/interface/documentation.rb +1 -0
  73. data/lib/puppet/module/plan.rb +0 -1
  74. data/lib/puppet/module/task.rb +1 -1
  75. data/lib/puppet/module.rb +1 -0
  76. data/lib/puppet/module_tool/applications/installer.rb +12 -4
  77. data/lib/puppet/module_tool/applications/uninstaller.rb +1 -1
  78. data/lib/puppet/module_tool/applications/upgrader.rb +1 -1
  79. data/lib/puppet/module_tool/errors/shared.rb +17 -0
  80. data/lib/puppet/network/formats.rb +67 -0
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/factory.rb +4 -0
  83. data/lib/puppet/node/environment.rb +10 -11
  84. data/lib/puppet/pal/pal_impl.rb +1 -1
  85. data/lib/puppet/parser/functions/fqdn_rand.rb +14 -6
  86. data/lib/puppet/parser/scope.rb +1 -0
  87. data/lib/puppet/parser/templatewrapper.rb +1 -0
  88. data/lib/puppet/pops/lookup/lookup_adapter.rb +3 -2
  89. data/lib/puppet/pops/model/ast.rb +1 -0
  90. data/lib/puppet/pops/model/factory.rb +2 -1
  91. data/lib/puppet/pops/parser/eparser.rb +201 -201
  92. data/lib/puppet/pops/parser/lexer2.rb +92 -91
  93. data/lib/puppet/pops/parser/slurp_support.rb +1 -0
  94. data/lib/puppet/pops/serialization/to_data_converter.rb +18 -6
  95. data/lib/puppet/pops/serialization/to_stringified_converter.rb +1 -1
  96. data/lib/puppet/pops/types/p_sem_ver_type.rb +8 -2
  97. data/lib/puppet/pops/types/p_sensitive_type.rb +10 -0
  98. data/lib/puppet/pops/types/type_formatter.rb +4 -3
  99. data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
  100. data/lib/puppet/pops/types/types.rb +1 -1
  101. data/lib/puppet/provider/aix_object.rb +1 -1
  102. data/lib/puppet/provider/exec/posix.rb +16 -4
  103. data/lib/puppet/provider/group/groupadd.rb +5 -2
  104. data/lib/puppet/provider/package/dnfmodule.rb +1 -1
  105. data/lib/puppet/provider/package/nim.rb +11 -6
  106. data/lib/puppet/provider/package/pip.rb +15 -3
  107. data/lib/puppet/provider/package/pkg.rb +19 -2
  108. data/lib/puppet/provider/package/puppetserver_gem.rb +1 -1
  109. data/lib/puppet/provider/package/yum.rb +1 -1
  110. data/lib/puppet/provider/parsedfile.rb +3 -0
  111. data/lib/puppet/provider/service/base.rb +1 -1
  112. data/lib/puppet/provider/service/init.rb +5 -5
  113. data/lib/puppet/provider/service/launchd.rb +2 -2
  114. data/lib/puppet/provider/service/redhat.rb +1 -1
  115. data/lib/puppet/provider/service/smf.rb +3 -3
  116. data/lib/puppet/provider/service/systemd.rb +16 -6
  117. data/lib/puppet/provider/service/upstart.rb +5 -5
  118. data/lib/puppet/provider/service/windows.rb +38 -0
  119. data/lib/puppet/provider/user/aix.rb +44 -1
  120. data/lib/puppet/provider/user/directoryservice.rb +26 -13
  121. data/lib/puppet/provider/user/useradd.rb +73 -17
  122. data/lib/puppet/provider.rb +1 -1
  123. data/lib/puppet/reference/configuration.rb +1 -1
  124. data/lib/puppet/reference/providers.rb +2 -2
  125. data/lib/puppet/resource/type_collection.rb +1 -0
  126. data/lib/puppet/runtime.rb +11 -1
  127. data/lib/puppet/settings/environment_conf.rb +1 -0
  128. data/lib/puppet/settings.rb +32 -9
  129. data/lib/puppet/test/test_helper.rb +4 -1
  130. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  131. data/lib/puppet/transaction/persistence.rb +11 -1
  132. data/lib/puppet/transaction/report.rb +15 -1
  133. data/lib/puppet/type/exec.rb +35 -5
  134. data/lib/puppet/type/file/mode.rb +6 -0
  135. data/lib/puppet/type/file/selcontext.rb +1 -1
  136. data/lib/puppet/type/file.rb +25 -7
  137. data/lib/puppet/type/filebucket.rb +3 -3
  138. data/lib/puppet/type/group.rb +0 -1
  139. data/lib/puppet/type/resources.rb +1 -1
  140. data/lib/puppet/type/service.rb +26 -41
  141. data/lib/puppet/type/tidy.rb +22 -3
  142. data/lib/puppet/type/user.rb +38 -21
  143. data/lib/puppet/type.rb +1 -1
  144. data/lib/puppet/util/command_line.rb +1 -1
  145. data/lib/puppet/util/fact_dif.rb +36 -17
  146. data/lib/puppet/util/filetype.rb +2 -2
  147. data/lib/puppet/util/json.rb +3 -0
  148. data/lib/puppet/util/log.rb +1 -2
  149. data/lib/puppet/util/logging.rb +1 -25
  150. data/lib/puppet/util/monkey_patches.rb +7 -0
  151. data/lib/puppet/util/pidlock.rb +1 -1
  152. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
  153. data/lib/puppet/util/selinux.rb +30 -4
  154. data/lib/puppet/util/suidmanager.rb +1 -2
  155. data/lib/puppet/util/symbolic_file_mode.rb +29 -17
  156. data/lib/puppet/util/tagging.rb +1 -0
  157. data/lib/puppet/util/windows/adsi.rb +46 -0
  158. data/lib/puppet/util/windows/api_types.rb +1 -1
  159. data/lib/puppet/util/windows/principal.rb +9 -2
  160. data/lib/puppet/util/windows/sid.rb +6 -2
  161. data/lib/puppet/util/windows/user.rb +0 -2
  162. data/lib/puppet/util.rb +4 -3
  163. data/lib/puppet/version.rb +1 -1
  164. data/lib/puppet.rb +5 -9
  165. data/locales/puppet.pot +506 -410
  166. data/man/man5/puppet.conf.5 +310 -274
  167. data/man/man8/puppet-agent.8 +4 -1
  168. data/man/man8/puppet-apply.8 +1 -1
  169. data/man/man8/puppet-catalog.8 +9 -9
  170. data/man/man8/puppet-config.8 +1 -1
  171. data/man/man8/puppet-describe.8 +1 -1
  172. data/man/man8/puppet-device.8 +1 -1
  173. data/man/man8/puppet-doc.8 +1 -1
  174. data/man/man8/puppet-epp.8 +1 -1
  175. data/man/man8/puppet-facts.8 +65 -7
  176. data/man/man8/puppet-filebucket.8 +1 -1
  177. data/man/man8/puppet-generate.8 +1 -1
  178. data/man/man8/puppet-help.8 +1 -1
  179. data/man/man8/puppet-key.8 +7 -7
  180. data/man/man8/puppet-lookup.8 +1 -1
  181. data/man/man8/puppet-man.8 +1 -1
  182. data/man/man8/puppet-module.8 +3 -3
  183. data/man/man8/puppet-node.8 +5 -5
  184. data/man/man8/puppet-parser.8 +1 -1
  185. data/man/man8/puppet-plugin.8 +1 -1
  186. data/man/man8/puppet-report.8 +5 -5
  187. data/man/man8/puppet-resource.8 +1 -1
  188. data/man/man8/puppet-script.8 +1 -1
  189. data/man/man8/puppet-ssl.8 +5 -1
  190. data/man/man8/puppet-status.8 +4 -4
  191. data/man/man8/puppet.8 +2 -2
  192. data/spec/fixtures/integration/application/agent/lib/facter/agent_spec_role.rb +3 -0
  193. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Gemfile +4 -0
  194. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Rakefile +3 -0
  195. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/lib/puppet/functions/l10n.rb +8 -0
  196. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/config.yaml +25 -0
  197. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/ja/puppet-l10n.po +19 -0
  198. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/puppet-l10n.pot +20 -0
  199. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/metadata.json +8 -0
  200. data/spec/fixtures/ssl/127.0.0.1-key.pem +107 -57
  201. data/spec/fixtures/ssl/127.0.0.1.pem +52 -31
  202. data/spec/fixtures/ssl/bad-basic-constraints.pem +57 -35
  203. data/spec/fixtures/ssl/bad-int-basic-constraints.pem +57 -35
  204. data/spec/fixtures/ssl/ca.pem +57 -35
  205. data/spec/fixtures/ssl/crl.pem +28 -18
  206. data/spec/fixtures/ssl/ec-key.pem +11 -11
  207. data/spec/fixtures/ssl/ec.pem +33 -24
  208. data/spec/fixtures/ssl/encrypted-ec-key.pem +12 -12
  209. data/spec/fixtures/ssl/encrypted-key.pem +108 -58
  210. data/spec/fixtures/ssl/intermediate-agent-crl.pem +28 -19
  211. data/spec/fixtures/ssl/intermediate-agent.pem +57 -36
  212. data/spec/fixtures/ssl/intermediate-crl.pem +31 -21
  213. data/spec/fixtures/ssl/intermediate.pem +57 -36
  214. data/spec/fixtures/ssl/oid-key.pem +117 -0
  215. data/spec/fixtures/ssl/oid.pem +69 -0
  216. data/spec/fixtures/ssl/pluto-key.pem +107 -57
  217. data/spec/fixtures/ssl/pluto.pem +52 -30
  218. data/spec/fixtures/ssl/request-key.pem +107 -57
  219. data/spec/fixtures/ssl/request.pem +47 -26
  220. data/spec/fixtures/ssl/revoked-key.pem +107 -57
  221. data/spec/fixtures/ssl/revoked.pem +52 -30
  222. data/spec/fixtures/ssl/signed-key.pem +107 -57
  223. data/spec/fixtures/ssl/signed.pem +52 -30
  224. data/spec/fixtures/ssl/tampered-cert.pem +52 -30
  225. data/spec/fixtures/ssl/tampered-csr.pem +47 -26
  226. data/spec/fixtures/ssl/trusted_oid_mapping.yaml +5 -0
  227. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +107 -57
  228. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +50 -29
  229. data/spec/fixtures/ssl/unknown-ca-key.pem +107 -57
  230. data/spec/fixtures/ssl/unknown-ca.pem +55 -33
  231. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
  232. data/spec/integration/application/agent_spec.rb +113 -37
  233. data/spec/integration/application/filebucket_spec.rb +16 -0
  234. data/spec/integration/application/module_spec.rb +21 -0
  235. data/spec/integration/application/plugin_spec.rb +1 -1
  236. data/spec/integration/application/resource_spec.rb +64 -0
  237. data/spec/integration/application/ssl_spec.rb +20 -0
  238. data/spec/integration/configurer_spec.rb +18 -2
  239. data/spec/integration/environments/settings_interpolation_spec.rb +0 -4
  240. data/spec/integration/http/client_spec.rb +12 -0
  241. data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
  242. data/spec/integration/indirector/facts/facter_spec.rb +93 -39
  243. data/spec/integration/l10n/compiler_spec.rb +37 -0
  244. data/spec/integration/transaction/report_spec.rb +1 -1
  245. data/spec/integration/type/exec_spec.rb +70 -45
  246. data/spec/integration/type/file_spec.rb +2 -2
  247. data/spec/integration/type/package_spec.rb +6 -6
  248. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  249. data/spec/integration/util/windows/adsi_spec.rb +18 -0
  250. data/spec/integration/util/windows/principal_spec.rb +21 -0
  251. data/spec/integration/util/windows/process_spec.rb +1 -9
  252. data/spec/integration/util/windows/registry_spec.rb +6 -0
  253. data/spec/lib/puppet/test_ca.rb +7 -2
  254. data/spec/lib/puppet_spec/modules.rb +13 -2
  255. data/spec/lib/puppet_spec/puppetserver.rb +15 -0
  256. data/spec/lib/puppet_spec/settings.rb +1 -0
  257. data/spec/shared_behaviours/documentation_on_faces.rb +0 -2
  258. data/spec/shared_contexts/l10n.rb +27 -0
  259. data/spec/spec_helper.rb +12 -11
  260. data/spec/unit/application/agent_spec.rb +7 -2
  261. data/spec/unit/application/apply_spec.rb +76 -56
  262. data/spec/unit/application/facts_spec.rb +482 -3
  263. data/spec/unit/application/resource_spec.rb +29 -0
  264. data/spec/unit/application/ssl_spec.rb +23 -0
  265. data/spec/unit/configurer/downloader_spec.rb +6 -0
  266. data/spec/unit/configurer_spec.rb +194 -56
  267. data/spec/unit/defaults_spec.rb +17 -0
  268. data/spec/unit/environments_spec.rb +348 -88
  269. data/spec/unit/face/facts_spec.rb +4 -0
  270. data/spec/unit/facter_impl_spec.rb +31 -0
  271. data/spec/unit/file_bucket/dipper_spec.rb +2 -2
  272. data/spec/unit/file_serving/configuration/parser_spec.rb +23 -0
  273. data/spec/unit/file_serving/configuration_spec.rb +14 -4
  274. data/spec/unit/file_serving/fileset_spec.rb +60 -0
  275. data/spec/unit/file_serving/mount/scripts_spec.rb +69 -0
  276. data/spec/unit/file_system_spec.rb +22 -0
  277. data/spec/unit/functions/assert_type_spec.rb +1 -1
  278. data/spec/unit/functions/empty_spec.rb +10 -0
  279. data/spec/unit/functions/logging_spec.rb +1 -0
  280. data/spec/unit/functions/lookup_spec.rb +64 -0
  281. data/spec/unit/functions/unwrap_spec.rb +8 -0
  282. data/spec/unit/functions4_spec.rb +2 -2
  283. data/spec/unit/gettext/config_spec.rb +12 -0
  284. data/spec/unit/http/service/compiler_spec.rb +131 -0
  285. data/spec/unit/indirector/catalog/compiler_spec.rb +101 -10
  286. data/spec/unit/indirector/catalog/rest_spec.rb +8 -0
  287. data/spec/unit/indirector/facts/facter_spec.rb +95 -0
  288. data/spec/unit/indirector/indirection_spec.rb +10 -3
  289. data/spec/unit/indirector/resource/ral_spec.rb +40 -75
  290. data/spec/unit/interface/action_spec.rb +0 -9
  291. data/spec/unit/module_spec.rb +15 -1
  292. data/spec/unit/module_tool/applications/installer_spec.rb +51 -12
  293. data/spec/unit/network/authstore_spec.rb +0 -15
  294. data/spec/unit/network/formats_spec.rb +47 -0
  295. data/spec/unit/network/http/factory_spec.rb +19 -0
  296. data/spec/unit/parser/functions/fqdn_rand_spec.rb +15 -1
  297. data/spec/unit/parser/templatewrapper_spec.rb +12 -2
  298. data/spec/unit/pops/parser/parse_containers_spec.rb +0 -11
  299. data/spec/unit/pops/serialization/to_from_hr_spec.rb +58 -0
  300. data/spec/unit/pops/serialization/to_stringified_spec.rb +5 -0
  301. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +18 -0
  302. data/spec/unit/pops/types/p_sensitive_type_spec.rb +18 -0
  303. data/spec/unit/pops/types/type_calculator_spec.rb +6 -0
  304. data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
  305. data/spec/unit/provider/package/gem_spec.rb +1 -1
  306. data/spec/unit/provider/package/nim_spec.rb +42 -0
  307. data/spec/unit/provider/package/pip2_spec.rb +1 -1
  308. data/spec/unit/provider/package/pip3_spec.rb +1 -1
  309. data/spec/unit/provider/package/pip_spec.rb +38 -1
  310. data/spec/unit/provider/package/pkg_spec.rb +29 -4
  311. data/spec/unit/provider/package/puppet_gem_spec.rb +1 -1
  312. data/spec/unit/provider/package/puppetserver_gem_spec.rb +1 -1
  313. data/spec/unit/provider/parsedfile_spec.rb +10 -0
  314. data/spec/unit/provider/service/init_spec.rb +1 -0
  315. data/spec/unit/provider/service/launchd_spec.rb +11 -0
  316. data/spec/unit/provider/service/openwrt_spec.rb +3 -1
  317. data/spec/unit/provider/service/systemd_spec.rb +54 -9
  318. data/spec/unit/provider/service/windows_spec.rb +202 -0
  319. data/spec/unit/provider/user/aix_spec.rb +100 -0
  320. data/spec/unit/provider/user/directoryservice_spec.rb +68 -36
  321. data/spec/unit/provider/user/useradd_spec.rb +61 -5
  322. data/spec/unit/provider_spec.rb +4 -4
  323. data/spec/unit/puppet_spec.rb +12 -4
  324. data/spec/unit/resource/catalog_spec.rb +1 -1
  325. data/spec/unit/settings_spec.rb +97 -56
  326. data/spec/unit/ssl/certificate_request_spec.rb +8 -14
  327. data/spec/unit/ssl/state_machine_spec.rb +19 -5
  328. data/spec/unit/transaction/additional_resource_generator_spec.rb +0 -2
  329. data/spec/unit/transaction_spec.rb +18 -20
  330. data/spec/unit/type/exec_spec.rb +76 -29
  331. data/spec/unit/type/file/selinux_spec.rb +3 -3
  332. data/spec/unit/type/file/source_spec.rb +4 -4
  333. data/spec/unit/type/service_spec.rb +86 -188
  334. data/spec/unit/type/tidy_spec.rb +24 -7
  335. data/spec/unit/type/user_spec.rb +45 -0
  336. data/spec/unit/type_spec.rb +2 -2
  337. data/spec/unit/util/logging_spec.rb +2 -0
  338. data/spec/unit/util/selinux_spec.rb +87 -16
  339. data/spec/unit/util/windows/sid_spec.rb +41 -0
  340. data/tasks/generate_cert_fixtures.rake +12 -3
  341. data/tasks/parallel.rake +3 -3
  342. metadata +51 -99
  343. data/ext/README.environment +0 -8
  344. data/ext/dbfix.sql +0 -132
  345. data/ext/debian/README.Debian +0 -8
  346. data/ext/debian/README.source +0 -2
  347. data/ext/debian/TODO.Debian +0 -1
  348. data/ext/debian/changelog.erb +0 -1122
  349. data/ext/debian/compat +0 -1
  350. data/ext/debian/control +0 -144
  351. data/ext/debian/copyright +0 -339
  352. data/ext/debian/docs +0 -1
  353. data/ext/debian/fileserver.conf +0 -41
  354. data/ext/debian/puppet-common.dirs +0 -13
  355. data/ext/debian/puppet-common.install +0 -3
  356. data/ext/debian/puppet-common.lintian-overrides +0 -5
  357. data/ext/debian/puppet-common.manpages +0 -28
  358. data/ext/debian/puppet-common.postinst +0 -35
  359. data/ext/debian/puppet-common.postrm +0 -33
  360. data/ext/debian/puppet-el.dirs +0 -1
  361. data/ext/debian/puppet-el.emacsen-install +0 -25
  362. data/ext/debian/puppet-el.emacsen-remove +0 -11
  363. data/ext/debian/puppet-el.emacsen-startup +0 -9
  364. data/ext/debian/puppet-el.install +0 -1
  365. data/ext/debian/puppet-testsuite.install +0 -2
  366. data/ext/debian/puppet-testsuite.lintian-overrides +0 -4
  367. data/ext/debian/puppet.lintian-overrides +0 -3
  368. data/ext/debian/puppet.logrotate +0 -20
  369. data/ext/debian/puppet.postinst +0 -20
  370. data/ext/debian/puppet.postrm +0 -20
  371. data/ext/debian/puppet.preinst +0 -20
  372. data/ext/debian/puppetmaster-common.install +0 -2
  373. data/ext/debian/puppetmaster-common.manpages +0 -2
  374. data/ext/debian/puppetmaster-common.postinst +0 -6
  375. data/ext/debian/puppetmaster-passenger.dirs +0 -4
  376. data/ext/debian/puppetmaster-passenger.postinst +0 -162
  377. data/ext/debian/puppetmaster-passenger.postrm +0 -61
  378. data/ext/debian/puppetmaster.README.debian +0 -17
  379. data/ext/debian/puppetmaster.default +0 -14
  380. data/ext/debian/puppetmaster.init +0 -137
  381. data/ext/debian/puppetmaster.lintian-overrides +0 -3
  382. data/ext/debian/puppetmaster.postinst +0 -20
  383. data/ext/debian/puppetmaster.postrm +0 -5
  384. data/ext/debian/puppetmaster.preinst +0 -22
  385. data/ext/debian/rules +0 -132
  386. data/ext/debian/source/format +0 -1
  387. data/ext/debian/source/options +0 -1
  388. data/ext/debian/vim-puppet.README.Debian +0 -13
  389. data/ext/debian/vim-puppet.dirs +0 -5
  390. data/ext/debian/vim-puppet.yaml +0 -7
  391. data/ext/debian/watch +0 -2
  392. data/ext/freebsd/puppetd +0 -26
  393. data/ext/freebsd/puppetmasterd +0 -26
  394. data/ext/gentoo/conf.d/puppet +0 -5
  395. data/ext/gentoo/conf.d/puppetmaster +0 -12
  396. data/ext/gentoo/init.d/puppet +0 -38
  397. data/ext/gentoo/init.d/puppetmaster +0 -51
  398. data/ext/gentoo/puppet/fileserver.conf +0 -41
  399. data/ext/ips/puppet-agent +0 -44
  400. data/ext/ips/puppet-master +0 -44
  401. data/ext/ips/puppet.p5m.erb +0 -12
  402. data/ext/ips/puppetagent.xml +0 -42
  403. data/ext/ips/puppetmaster.xml +0 -42
  404. data/ext/ips/rules +0 -19
  405. data/ext/ips/transforms +0 -34
  406. data/ext/ldap/puppet.schema +0 -24
  407. data/ext/logcheck/puppet +0 -23
  408. data/ext/osx/file_mapping.yaml +0 -33
  409. data/ext/osx/postflight.erb +0 -109
  410. data/ext/osx/preflight.erb +0 -52
  411. data/ext/osx/prototype.plist.erb +0 -38
  412. data/ext/redhat/fileserver.conf +0 -41
  413. data/ext/redhat/logrotate +0 -21
  414. data/ext/redhat/puppet.spec.erb +0 -842
  415. data/ext/redhat/server.init +0 -128
  416. data/ext/redhat/server.sysconfig +0 -13
  417. data/ext/solaris/pkginfo +0 -6
  418. data/ext/solaris/smf/puppetd.xml +0 -77
  419. data/ext/solaris/smf/puppetmasterd.xml +0 -77
  420. data/ext/solaris/smf/svc-puppetd +0 -71
  421. data/ext/solaris/smf/svc-puppetmasterd +0 -67
  422. data/ext/suse/puppet.spec +0 -310
  423. data/ext/suse/server.init +0 -173
  424. data/ext/yaml_nodes.rb +0 -105
  425. data/spec/lib/matchers/include.rb +0 -27
  426. data/spec/lib/matchers/include_spec.rb +0 -32
  427. data/spec/unit/indirector/store_configs_spec.rb +0 -7
@@ -368,6 +368,12 @@ describe "Puppet Network Format" do
368
368
  expect(json.render_multiple(instances)).to eq([{"string" => "foo"}].to_json)
369
369
  end
370
370
 
371
+ it "should render multiple instances as a JSON array of hashes when multi_json is not present" do
372
+ hide_const("MultiJson") if defined?(MultiJson)
373
+ instances = [FormatsTest.new("foo")]
374
+ expect(json.render_multiple(instances)).to eq([{"string" => "foo"}].to_json)
375
+ end
376
+
371
377
  it "should intern an instance from a JSON hash" do
372
378
  text = Puppet::Util::Json.dump({"string" => "parsed_json"})
373
379
  instance = json.intern(FormatsTest, text)
@@ -534,4 +540,45 @@ EOT
534
540
  end
535
541
  end
536
542
  end
543
+
544
+ describe ":flat format" do
545
+ let(:flat) { Puppet::Network::FormatHandler.format(:flat) }
546
+
547
+ it "should include a flat format" do
548
+ expect(flat).to be_an_instance_of Puppet::Network::Format
549
+ end
550
+
551
+ [:intern, :intern_multiple].each do |method|
552
+ it "should not implement #{method}" do
553
+ expect { flat.send(method, String, 'blah') }.to raise_error NotImplementedError
554
+ end
555
+ end
556
+
557
+ context "when rendering arrays" do
558
+ {
559
+ [] => "",
560
+ [1, 2] => "0=1\n1=2\n",
561
+ ["one"] => "0=one\n",
562
+ [{"one" => 1}, {"two" => 2}] => "0.one=1\n1.two=2\n",
563
+ [['something', 'for'], ['the', 'test']] => "0=[\"something\", \"for\"]\n1=[\"the\", \"test\"]\n"
564
+ }.each_pair do |input, output|
565
+ it "should render #{input.inspect} as one item per line" do
566
+ expect(flat.render(input)).to eq(output)
567
+ end
568
+ end
569
+ end
570
+
571
+ context "when rendering hashes" do
572
+ {
573
+ {} => "",
574
+ {1 => 2} => "1=2\n",
575
+ {"one" => "two"} => "one=two\n",
576
+ {[1,2] => 3, [2,3] => 5, [3,4] => 7} => "[1, 2]=3\n[2, 3]=5\n[3, 4]=7\n",
577
+ }.each_pair do |input, output|
578
+ it "should render #{input.inspect}" do
579
+ expect(flat.render(input)).to eq(output)
580
+ end
581
+ end
582
+ end
583
+ end
537
584
  end
@@ -144,4 +144,23 @@ describe Puppet::Network::HTTP::Factory do
144
144
  expect(conn.local_host).to eq('127.0.0.1')
145
145
  end
146
146
  end
147
+
148
+ context 'tls' do
149
+ it "sets the minimum version to TLS 1.0", if: RUBY_VERSION.to_f >= 2.5 do
150
+ conn = create_connection(site)
151
+ expect(conn.min_version).to eq(OpenSSL::SSL::TLS1_VERSION)
152
+ end
153
+
154
+ it "defaults to ciphersuites providing 128 bits of security or greater" do
155
+ conn = create_connection(site)
156
+ expect(conn.ciphers).to eq("ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256")
157
+ end
158
+
159
+ it "can be restricted to TLSv1.3 ciphers" do
160
+ tls13_ciphers = "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"
161
+ Puppet[:ciphers] = tls13_ciphers
162
+ conn = create_connection(site)
163
+ expect(conn.ciphers).to eq(tls13_ciphers)
164
+ end
165
+ end
147
166
  end
@@ -61,12 +61,26 @@ describe "the fqdn_rand function" do
61
61
  expect(fqdn_rand(5000, :extra_identifier => ['expensive job 33'])).to eql(2389)
62
62
  end
63
63
 
64
+ it "returns the same value if only host differs by case" do
65
+ val1 = fqdn_rand(1000000000, :host => "host.example.com", :extra_identifier => [nil, true])
66
+ val2 = fqdn_rand(1000000000, :host => "HOST.example.com", :extra_identifier => [nil, true])
67
+
68
+ expect(val1).to eql(val2)
69
+ end
70
+
71
+ it "returns the same value if only host differs by case and an initial seed is given" do
72
+ val1 = fqdn_rand(1000000000, :host => "host.example.com", :extra_identifier => ['a seed', true])
73
+ val2 = fqdn_rand(1000000000, :host => "HOST.example.com", :extra_identifier => ['a seed', true])
74
+
75
+ expect(val1).to eql(val2)
76
+ end
77
+
64
78
  def fqdn_rand(max, args = {})
65
79
  host = args[:host] || '127.0.0.1'
66
80
  extra = args[:extra_identifier] || []
67
81
 
68
82
  scope = create_test_scope_for_node('localhost')
69
- allow(scope).to receive(:[]).with("::fqdn").and_return(host)
83
+ scope.compiler.topscope['fqdn'] = host.freeze
70
84
 
71
85
  scope.function_fqdn_rand([max] + extra)
72
86
  end
@@ -2,6 +2,8 @@ require 'spec_helper'
2
2
  require 'puppet/parser/templatewrapper'
3
3
 
4
4
  describe Puppet::Parser::TemplateWrapper do
5
+ include PuppetSpec::Files
6
+
5
7
  let(:known_resource_types) { Puppet::Resource::TypeCollection.new("env") }
6
8
  let(:scope) do
7
9
  compiler = Puppet::Parser::Compiler.new(Puppet::Node.new("mynode"))
@@ -41,6 +43,13 @@ describe Puppet::Parser::TemplateWrapper do
41
43
  expect(tw.result).to eq(full_file_name)
42
44
  end
43
45
 
46
+ it "ignores a leading BOM" do
47
+ full_file_name = given_a_template_file("bom_template", "\uFEFF<%= file %>")
48
+
49
+ tw.file = "bom_template"
50
+ expect(tw.result).to eq(full_file_name)
51
+ end
52
+
44
53
  it "evaluates a given string as a template" do
45
54
  expect(tw.result("template contents")).to eql("template contents")
46
55
  end
@@ -90,11 +99,12 @@ describe Puppet::Parser::TemplateWrapper do
90
99
  end
91
100
 
92
101
  def given_a_template_file(name, contents)
93
- full_name = "/full/path/to/#{name}"
102
+ full_name = tmpfile("template_#{name}")
103
+ File.binwrite(full_name, contents)
104
+
94
105
  allow(Puppet::Parser::Files).to receive(:find_template).
95
106
  with(name, anything()).
96
107
  and_return(full_name)
97
- allow(Puppet::FileSystem).to receive(:read_preserve_line_endings).with(full_name).and_return(contents)
98
108
 
99
109
  full_name
100
110
  end
@@ -95,18 +95,7 @@ describe "egrammar parsing containers" do
95
95
  expect(dump(parse("class foo::default {}"))).to eq("(class foo::default ())")
96
96
  end
97
97
 
98
- it "class class inherits default {} # inherits default", :broken => true do
99
- expect {
100
- parse("class class inherits default {}")
101
- }.to raise_error(/not a valid classname/)
102
- end
103
-
104
98
  it "class class inherits default {} # inherits default" do
105
- # TODO: See previous test marked as :broken=>true, it is actually this test (result) that is wacky,
106
- # this because a class is named at parse time (since class evaluation is lazy, the model must have the
107
- # full class name for nested classes - only, it gets this wrong when a class is named "class" - or at least
108
- # I think it is wrong.)
109
- #
110
99
  expect { parse("class class inherits default {}") }.to raise_error(/'class' keyword not allowed at this location/)
111
100
  end
112
101
 
@@ -559,6 +559,29 @@ module Serialization
559
559
  expect(warnings).to eql(["['key'] contains the special value default. It will be converted to the String 'default'"])
560
560
  end
561
561
  end
562
+ context 'and force_symbol set to true' do
563
+ let(:to_converter) { ToDataConverter.new(:rich_data => false, :force_symbol => true) }
564
+
565
+ it 'A Hash with Symbol values is converted to hash with Symbol values' do
566
+ val = { 'one' => :one, 'two' => :two }
567
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
568
+
569
+ # write and read methods does not work here as we cannot force Symbols in Json.
570
+ # and a hash with symbol values cannot be an instance of Types::TypeFactory.data.
571
+ # Using YAML for this instead
572
+ io.reopen
573
+ value = to_converter.convert(val)
574
+ io << [value].to_yaml
575
+ io.rewind
576
+
577
+ val2 = from_converter.convert(YAML::load(io.read)[0])
578
+
579
+ expect(val2).to be_a(Hash)
580
+ expect(val2).to eql({ 'one' => :one, 'two' => :two })
581
+ end
582
+ expect(warnings).to be_empty
583
+ end
584
+ end
562
585
  end
563
586
 
564
587
  context 'with rich_data is set to true' do
@@ -632,6 +655,41 @@ module Serialization
632
655
  end.to raise_error(/Cannot create a Pcore::TimestampType from a (Fixnum|Integer)/)
633
656
  end
634
657
  end
658
+
659
+ context 'when data is unknown' do
660
+ let(:to_converter) { ToDataConverter.new(:message_prefix => 'Test Hash') }
661
+ let(:logs) { [] }
662
+ let(:warnings) { logs.select { |log| log.level == :warning }.map { |log| log.message } }
663
+ let(:val) { Class.new }
664
+
665
+ context 'and :silence_warnings undefined or set to false' do
666
+ it 'convert the unknown data to string with warnings' do
667
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
668
+ write(val)
669
+ val2 = read
670
+ expect(val2).to be_a(String)
671
+ expect(val2).to match(/Class/)
672
+ end
673
+ expect(warnings).to eql([
674
+ "Test Hash contains a #{val.class} value. It will be converted to the String '#{val.to_s}'"])
675
+ end
676
+ end
677
+
678
+ context 'and :silence_warnings undefined or set to true' do
679
+ let(:to_converter) { ToDataConverter.new(:message_prefix => 'Test Hash', :silence_warnings => true) }
680
+
681
+ it 'convert the unknown data to string without warnings if silence_warnings set to true' do
682
+ val = Class.new
683
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
684
+ write(val)
685
+ val2 = read
686
+ expect(val2).to be_a(String)
687
+ expect(val2).to match(/Class/)
688
+ end
689
+ expect(warnings).to be_empty
690
+ end
691
+ end
692
+ end
635
693
  end
636
694
  end
637
695
  end
@@ -154,4 +154,9 @@ describe 'ToStringifiedConverter' do
154
154
  unassigned = [243, 176, 128, 128].pack("C*").force_encoding(Encoding::UTF_8)
155
155
  expect(transform(unassigned)).to eq("󰀀")
156
156
  end
157
+
158
+ it 'converts ProcessOutput objects to string' do
159
+ object = Puppet::Util::Execution::ProcessOutput.new('object', 0)
160
+ expect(transform(object)).to be_instance_of(String)
161
+ end
157
162
  end
@@ -125,6 +125,24 @@ describe 'Semantic Versions' do
125
125
  expect(eval_and_collect_notices(code)).to eql(['true', 'false'])
126
126
  end
127
127
 
128
+ it 'can be compared to another instance created from arguments' do
129
+ code = <<-CODE
130
+ $x = SemVer('1.2.3-rc4+5')
131
+ $y = SemVer(1, 2, 3, 'rc4', '5')
132
+ notice($x == $y)
133
+ CODE
134
+ expect(eval_and_collect_notices(code)).to eql(['true'])
135
+ end
136
+
137
+ it 'can be compared to another instance created from a hash' do
138
+ code = <<-CODE
139
+ $x = SemVer('1.2.3-rc4+5')
140
+ $y = SemVer(major => 1, minor => 2, patch => 3, prerelease => 'rc4', build => '5')
141
+ notice($x == $y)
142
+ CODE
143
+ expect(eval_and_collect_notices(code)).to eql(['true'])
144
+ end
145
+
128
146
  it 'can be compared to another instance for magnitude' do
129
147
  code = <<-CODE
130
148
  $x = SemVer('1.1.1')
@@ -113,6 +113,24 @@ describe 'Sensitive Type' do
113
113
  expect(eval_and_collect_notices(code)).to eq(['Sensitive[Integer] != Sensitive[String]'])
114
114
  end
115
115
 
116
+ it 'equals another instance with the same value' do
117
+ code =<<-CODE
118
+ $i = Sensitive('secret')
119
+ $o = Sensitive('secret')
120
+ notice($i == $o)
121
+ CODE
122
+ expect(eval_and_collect_notices(code)).to eq(['true'])
123
+ end
124
+
125
+ it 'has equal hash keys for same values' do
126
+ code =<<-CODE
127
+ $i = Sensitive('secret')
128
+ $o = Sensitive('secret')
129
+ notice({$i => 1} == {$o => 1})
130
+ CODE
131
+ expect(eval_and_collect_notices(code)).to eq(['true'])
132
+ end
133
+
116
134
  it 'can be created from another sensitive instance ' do
117
135
  code =<<-CODE
118
136
  $o = Sensitive("hunter2")
@@ -1980,6 +1980,12 @@ describe 'The type calculator' do
1980
1980
  expect(calculator.instance?(tuple, [1, 'a', 1])).to eq(false)
1981
1981
  end
1982
1982
 
1983
+ it 'should not consider ProcessOutput objects as instanceof PScalarDataType' do
1984
+ object = Puppet::Util::Execution::ProcessOutput.new('object', 0)
1985
+
1986
+ expect(calculator.instance?(PScalarDataType::DEFAULT, object)).to eq(false)
1987
+ end
1988
+
1983
1989
  context 'and t is Struct' do
1984
1990
  it 'should consider hash[cont] as instance of Struct[cont-t]' do
1985
1991
  struct = struct_t({'a'=>Integer, 'b'=>String, 'c'=>Float})
@@ -123,7 +123,7 @@ describe Puppet::Type.type(:package).provider(:dnfmodule) do
123
123
  provider.install
124
124
  end
125
125
 
126
- it "should just enable the module if it has no default profile" do
126
+ it "should just enable the module if it has no default profile(missing groups or modules)" do
127
127
  dnf_exception = Puppet::ExecutionFailure.new("Error: Problems in request:\nmissing groups or modules: #{resource[:name]}")
128
128
  allow(provider).to receive(:execute).with(array_including('install')).and_raise(dnf_exception)
129
129
  resource[:ensure] = :present
@@ -132,6 +132,15 @@ describe Puppet::Type.type(:package).provider(:dnfmodule) do
132
132
  provider.install
133
133
  end
134
134
 
135
+ it "should just enable the module if it has no default profile(broken groups or modules)" do
136
+ dnf_exception = Puppet::ExecutionFailure.new("Error: Problems in request:\nbroken groups or modules: #{resource[:name]}")
137
+ allow(provider).to receive(:execute).with(array_including('install')).and_raise(dnf_exception)
138
+ resource[:ensure] = :present
139
+ expect(provider).to receive(:execute).with(array_including('install')).ordered
140
+ expect(provider).to receive(:execute).with(array_including('enable')).ordered
141
+ provider.install
142
+ end
143
+
135
144
  it "should just enable the module if enable_only = true" do
136
145
  resource[:ensure] = :present
137
146
  resource[:enable_only] = true
@@ -442,7 +442,7 @@ context Puppet::Type.type(:package).provider(:gem) do
442
442
  end
443
443
 
444
444
  context 'when is defaultfor' do
445
- let(:os) { Facter.value(:operatingsystem) }
445
+ let(:os) { Puppet.runtime[:facter].value(:operatingsystem) }
446
446
  subject do
447
447
  described_class.defaultfor(operatingsystem: os)
448
448
  described_class.specificity
@@ -191,6 +191,27 @@ OUTPUT
191
191
  expect(versions[version]).to eq(:rpm)
192
192
  end
193
193
  end
194
+
195
+ it "should be able to parse RPM package listings with letters in version" do
196
+ showres_output = <<END
197
+ cairo ALL @@R:cairo _all_filesets
198
+ @@R:cairo-1.14.6-2waixX11 1.14.6-2waixX11
199
+ END
200
+ packages = subject.send(:parse_showres_output, showres_output)
201
+ expect(Set.new(packages.keys)).to eq(Set.new(['cairo']))
202
+ versions = packages['cairo']
203
+ expect(versions.has_key?('1.14.6-2waixX11')).to eq(true)
204
+ expect(versions['1.14.6-2waixX11']).to eq(:rpm)
205
+ end
206
+
207
+ it "should raise error when parsing invalid RPM package listings" do
208
+ showres_output = <<END
209
+ cairo ALL @@R:cairo _all_filesets
210
+ @@R:cairo-invalid_version invalid_version
211
+ END
212
+ expect{ subject.send(:parse_showres_output, showres_output) }.to raise_error(Puppet::Error,
213
+ /Unable to parse output from nimclient showres: package string does not match expected rpm package string format/)
214
+ end
194
215
  end
195
216
 
196
217
  context "#determine_latest_version" do
@@ -220,6 +241,27 @@ END
220
241
  it "should return :installp for installp/bff packages" do
221
242
  expect(subject.send(:determine_package_type, bff_showres_output, 'mypackage.foo', '1.2.3.4')).to eq(:installp)
222
243
  end
244
+
245
+ it "should return :installp for security updates" do
246
+ nimclient_showres_output = <<END
247
+ bos.net ALL @@S:bos.net _all_filesets
248
+ + 7.2.0.1 TCP/IP ntp Applications @@S:bos.net.tcp.ntp 7.2.0.1
249
+ + 7.2.0.2 TCP/IP ntp Applications @@S:bos.net.tcp.ntp 7.2.0.2
250
+
251
+ END
252
+ expect(subject.send(:determine_package_type, nimclient_showres_output, 'bos.net.tcp.ntp', '7.2.0.2')).to eq(:installp)
253
+ end
254
+
255
+ it "should raise error when invalid header format is given" do
256
+ nimclient_showres_output = <<END
257
+ bos.net ALL @@INVALID_TYPE:bos.net _all_filesets
258
+ + 7.2.0.1 TCP/IP ntp Applications @@INVALID_TYPE:bos.net.tcp.ntp 7.2.0.1
259
+ + 7.2.0.2 TCP/IP ntp Applications @@INVALID_TYPE:bos.net.tcp.ntp 7.2.0.2
260
+
261
+ END
262
+ expect{ subject.send(:determine_package_type, nimclient_showres_output, 'bos.net.tcp.ntp', '7.2.0.2') }.to raise_error(
263
+ Puppet::Error, /Unable to parse output from nimclient showres: line does not match expected package header format/)
264
+ end
223
265
  end
224
266
  end
225
267
  end
@@ -24,7 +24,7 @@ describe Puppet::Type.type(:package).provider(:pip2) 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
@@ -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
@@ -83,6 +83,7 @@ describe 'Puppet::Type::Service::Provider::Init',
83
83
  allow(provider_class).to receive(:defpath).and_return('tmp')
84
84
 
85
85
  @services = ['one', 'two', 'three', 'four', 'umountfs']
86
+ allow(Dir).to receive(:entries).and_call_original
86
87
  allow(Dir).to receive(:entries).with('tmp').and_return(@services)
87
88
  expect(FileTest).to receive(:directory?).with('tmp').and_return(true)
88
89
  allow(FileTest).to receive(:executable?).and_return(true)
@@ -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
@@ -32,6 +32,7 @@ describe 'Puppet::Type::Service::Provider::Openwrt',
32
32
  allow(File).to receive(:directory?).with('/etc/init.d').and_return(true)
33
33
 
34
34
  allow(Puppet::FileSystem).to receive(:exist?).with('/etc/init.d/myservice').and_return(true)
35
+ allow(FileTest).to receive(:file?).and_call_original
35
36
  allow(FileTest).to receive(:file?).with('/etc/init.d/myservice').and_return(true)
36
37
  allow(FileTest).to receive(:executable?).with('/etc/init.d/myservice').and_return(true)
37
38
  end
@@ -47,7 +48,8 @@ describe 'Puppet::Type::Service::Provider::Openwrt',
47
48
  let(:services) {['dnsmasq', 'dropbear', 'firewall', 'led', 'puppet', 'uhttpd' ]}
48
49
 
49
50
  before :each do
50
- allow(Dir).to receive(:entries).and_return(services)
51
+ allow(Dir).to receive(:entries).and_call_original
52
+ allow(Dir).to receive(:entries).with('/etc/init.d').and_return(services)
51
53
  allow(FileTest).to receive(:directory?).and_return(true)
52
54
  allow(FileTest).to receive(:executable?).and_return(true)
53
55
  end