puppet 6.13.0 → 6.18.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 (461) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +36 -32
  6. data/README.md +17 -24
  7. data/ext/windows/service/daemon.rb +3 -3
  8. data/lib/puppet.rb +33 -9
  9. data/lib/puppet/agent.rb +20 -14
  10. data/lib/puppet/application/agent.rb +26 -17
  11. data/lib/puppet/application/apply.rb +18 -20
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/lookup.rb +16 -4
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +58 -57
  19. data/lib/puppet/configurer/downloader.rb +31 -10
  20. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  21. data/lib/puppet/confine.rb +2 -2
  22. data/lib/puppet/confine/any.rb +1 -1
  23. data/lib/puppet/context/trusted_information.rb +14 -8
  24. data/lib/puppet/daemon.rb +13 -27
  25. data/lib/puppet/defaults.rb +92 -12
  26. data/lib/puppet/environments.rb +4 -5
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/plugin.rb +2 -2
  31. data/lib/puppet/feature/base.rb +1 -1
  32. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  33. data/lib/puppet/file_serving/metadata.rb +4 -1
  34. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  35. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  36. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  37. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  38. data/lib/puppet/file_system/file_impl.rb +17 -13
  39. data/lib/puppet/file_system/uniquefile.rb +12 -16
  40. data/lib/puppet/forge.rb +1 -1
  41. data/lib/puppet/forge/cache.rb +1 -1
  42. data/lib/puppet/forge/repository.rb +4 -7
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  45. data/lib/puppet/functions/filter.rb +1 -0
  46. data/lib/puppet/functions/lstrip.rb +4 -4
  47. data/lib/puppet/functions/reduce.rb +2 -4
  48. data/lib/puppet/functions/reverse_each.rb +1 -1
  49. data/lib/puppet/functions/rstrip.rb +4 -4
  50. data/lib/puppet/functions/step.rb +1 -1
  51. data/lib/puppet/functions/strip.rb +4 -4
  52. data/lib/puppet/gettext/config.rb +5 -5
  53. data/lib/puppet/gettext/module_translations.rb +4 -4
  54. data/lib/puppet/http.rb +3 -0
  55. data/lib/puppet/http/client.rb +263 -73
  56. data/lib/puppet/http/external_client.rb +90 -0
  57. data/lib/puppet/http/redirector.rb +43 -7
  58. data/lib/puppet/http/resolver.rb +46 -3
  59. data/lib/puppet/http/resolver/server_list.rb +76 -16
  60. data/lib/puppet/http/resolver/settings.rb +23 -3
  61. data/lib/puppet/http/resolver/srv.rb +29 -3
  62. data/lib/puppet/http/response.rb +87 -1
  63. data/lib/puppet/http/retry_after_handler.rb +39 -0
  64. data/lib/puppet/http/service.rb +97 -12
  65. data/lib/puppet/http/service/ca.rb +76 -14
  66. data/lib/puppet/http/service/compiler.rb +249 -16
  67. data/lib/puppet/http/service/file_server.rb +141 -20
  68. data/lib/puppet/http/service/report.rb +47 -17
  69. data/lib/puppet/http/session.rb +96 -7
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/rest.rb +42 -0
  75. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  76. data/lib/puppet/indirector/file_content/http.rb +5 -0
  77. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  78. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  79. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  80. data/lib/puppet/indirector/hiera.rb +4 -0
  81. data/lib/puppet/indirector/indirection.rb +1 -1
  82. data/lib/puppet/indirector/node/rest.rb +24 -0
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/report/rest.rb +19 -0
  85. data/lib/puppet/indirector/report/yaml.rb +23 -0
  86. data/lib/puppet/indirector/request.rb +1 -1
  87. data/lib/puppet/indirector/rest.rb +12 -0
  88. data/lib/puppet/indirector/status/rest.rb +18 -0
  89. data/lib/puppet/loaders.rb +6 -0
  90. data/lib/puppet/metatype/manager.rb +80 -80
  91. data/lib/puppet/module.rb +1 -2
  92. data/lib/puppet/network/format_support.rb +2 -2
  93. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  94. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  95. data/lib/puppet/network/http/base_pool.rb +7 -2
  96. data/lib/puppet/network/http/compression.rb +7 -0
  97. data/lib/puppet/network/http/connection.rb +2 -0
  98. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  99. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  100. data/lib/puppet/network/http/pool.rb +8 -5
  101. data/lib/puppet/network/http/route.rb +2 -2
  102. data/lib/puppet/network/http_pool.rb +2 -1
  103. data/lib/puppet/node/environment.rb +22 -5
  104. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  105. data/lib/puppet/pal/pal_impl.rb +30 -31
  106. data/lib/puppet/parameter.rb +1 -1
  107. data/lib/puppet/parser/ast/leaf.rb +5 -5
  108. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  109. data/lib/puppet/parser/compiler.rb +43 -33
  110. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  111. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  112. data/lib/puppet/parser/environment_compiler.rb +4 -1
  113. data/lib/puppet/parser/functions.rb +18 -9
  114. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  115. data/lib/puppet/parser/functions/filter.rb +1 -0
  116. data/lib/puppet/parser/resource.rb +3 -2
  117. data/lib/puppet/parser/resource/param.rb +6 -0
  118. data/lib/puppet/parser/type_loader.rb +2 -2
  119. data/lib/puppet/pops/adaptable.rb +7 -13
  120. data/lib/puppet/pops/adapters.rb +8 -4
  121. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  122. data/lib/puppet/pops/issues.rb +5 -0
  123. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  124. data/lib/puppet/pops/loaders.rb +24 -15
  125. data/lib/puppet/pops/lookup/context.rb +1 -1
  126. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  128. data/lib/puppet/pops/types/iterable.rb +34 -8
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/group/groupadd.rb +9 -4
  133. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  134. data/lib/puppet/provider/package/aix.rb +17 -2
  135. data/lib/puppet/provider/package/apt.rb +98 -1
  136. data/lib/puppet/provider/package/aptitude.rb +1 -1
  137. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  138. data/lib/puppet/provider/package/gem.rb +45 -9
  139. data/lib/puppet/provider/package/pacman.rb +2 -5
  140. data/lib/puppet/provider/package/pip.rb +143 -48
  141. data/lib/puppet/provider/package/pip3.rb +0 -2
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +16 -4
  144. data/lib/puppet/provider/package/portage.rb +2 -2
  145. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  146. data/lib/puppet/provider/package/rpm.rb +6 -213
  147. data/lib/puppet/provider/package/yum.rb +100 -20
  148. data/lib/puppet/provider/package/zypper.rb +62 -1
  149. data/lib/puppet/provider/service/systemd.rb +22 -4
  150. data/lib/puppet/provider/service/windows.rb +23 -7
  151. data/lib/puppet/provider/user/aix.rb +1 -1
  152. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  153. data/lib/puppet/provider/user/useradd.rb +16 -5
  154. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  155. data/lib/puppet/reports/http.rb +15 -9
  156. data/lib/puppet/resource.rb +2 -1
  157. data/lib/puppet/resource/type.rb +8 -0
  158. data/lib/puppet/resource/type_collection.rb +20 -16
  159. data/lib/puppet/runtime.rb +31 -1
  160. data/lib/puppet/settings.rb +3 -1
  161. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  162. data/lib/puppet/ssl.rb +1 -0
  163. data/lib/puppet/ssl/host.rb +4 -4
  164. data/lib/puppet/ssl/oids.rb +1 -0
  165. data/lib/puppet/ssl/ssl_context.rb +2 -2
  166. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  167. data/lib/puppet/ssl/state_machine.rb +81 -35
  168. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  169. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  170. data/lib/puppet/test/test_helper.rb +21 -14
  171. data/lib/puppet/transaction.rb +2 -2
  172. data/lib/puppet/transaction/persistence.rb +1 -1
  173. data/lib/puppet/transaction/report.rb +3 -3
  174. data/lib/puppet/trusted_external.rb +29 -1
  175. data/lib/puppet/type.rb +21 -8
  176. data/lib/puppet/type/file.rb +51 -13
  177. data/lib/puppet/type/file/checksum.rb +4 -4
  178. data/lib/puppet/type/file/source.rb +75 -64
  179. data/lib/puppet/type/notify.rb +2 -2
  180. data/lib/puppet/type/package.rb +41 -3
  181. data/lib/puppet/type/service.rb +59 -8
  182. data/lib/puppet/type/user.rb +19 -29
  183. data/lib/puppet/util.rb +41 -3
  184. data/lib/puppet/util/at_fork.rb +1 -1
  185. data/lib/puppet/util/autoload.rb +13 -25
  186. data/lib/puppet/util/character_encoding.rb +9 -5
  187. data/lib/puppet/util/checksums.rb +19 -4
  188. data/lib/puppet/util/execution.rb +2 -2
  189. data/lib/puppet/util/fileparsing.rb +2 -2
  190. data/lib/puppet/util/instance_loader.rb +14 -10
  191. data/lib/puppet/util/log/destinations.rb +1 -10
  192. data/lib/puppet/util/package/version/debian.rb +175 -0
  193. data/lib/puppet/util/package/version/gem.rb +15 -0
  194. data/lib/puppet/util/package/version/pip.rb +167 -0
  195. data/lib/puppet/util/package/version/range.rb +53 -0
  196. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  197. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  198. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  199. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  200. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  201. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  202. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  203. data/lib/puppet/util/package/version/rpm.rb +73 -0
  204. data/lib/puppet/util/pidlock.rb +13 -7
  205. data/lib/puppet/util/platform.rb +5 -0
  206. data/lib/puppet/util/provider_features.rb +1 -1
  207. data/lib/puppet/util/reference.rb +1 -1
  208. data/lib/puppet/util/rpm_compare.rb +193 -0
  209. data/lib/puppet/util/windows.rb +1 -0
  210. data/lib/puppet/util/windows/adsi.rb +2 -2
  211. data/lib/puppet/util/windows/api_types.rb +60 -33
  212. data/lib/puppet/util/windows/eventlog.rb +1 -6
  213. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  214. data/lib/puppet/util/windows/principal.rb +8 -6
  215. data/lib/puppet/util/windows/process.rb +15 -14
  216. data/lib/puppet/util/windows/registry.rb +11 -11
  217. data/lib/puppet/util/windows/security.rb +5 -4
  218. data/lib/puppet/util/windows/service.rb +43 -26
  219. data/lib/puppet/util/windows/sid.rb +3 -3
  220. data/lib/puppet/util/windows/user.rb +242 -8
  221. data/lib/puppet/version.rb +1 -1
  222. data/locales/puppet.pot +641 -511
  223. data/man/man5/puppet.conf.5 +75 -10
  224. data/man/man8/puppet-agent.8 +7 -7
  225. data/man/man8/puppet-apply.8 +1 -1
  226. data/man/man8/puppet-catalog.8 +1 -1
  227. data/man/man8/puppet-config.8 +1 -1
  228. data/man/man8/puppet-describe.8 +1 -1
  229. data/man/man8/puppet-device.8 +2 -2
  230. data/man/man8/puppet-doc.8 +1 -1
  231. data/man/man8/puppet-epp.8 +1 -1
  232. data/man/man8/puppet-facts.8 +1 -1
  233. data/man/man8/puppet-filebucket.8 +17 -2
  234. data/man/man8/puppet-generate.8 +1 -1
  235. data/man/man8/puppet-help.8 +6 -3
  236. data/man/man8/puppet-key.8 +1 -1
  237. data/man/man8/puppet-lookup.8 +2 -2
  238. data/man/man8/puppet-man.8 +1 -1
  239. data/man/man8/puppet-module.8 +4 -1
  240. data/man/man8/puppet-node.8 +1 -1
  241. data/man/man8/puppet-parser.8 +1 -1
  242. data/man/man8/puppet-plugin.8 +1 -1
  243. data/man/man8/puppet-report.8 +1 -1
  244. data/man/man8/puppet-resource.8 +1 -1
  245. data/man/man8/puppet-script.8 +1 -1
  246. data/man/man8/puppet-ssl.8 +2 -2
  247. data/man/man8/puppet-status.8 +1 -1
  248. data/man/man8/puppet.8 +2 -2
  249. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  250. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  251. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  252. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  253. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  254. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  255. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  256. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  257. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  258. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  259. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  260. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  261. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  262. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -67
  263. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -69
  264. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -69
  265. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -67
  266. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -65
  267. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -67
  268. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -67
  269. data/spec/integration/application/agent_spec.rb +475 -0
  270. data/spec/integration/application/apply_spec.rb +279 -150
  271. data/spec/integration/application/config_spec.rb +74 -0
  272. data/spec/integration/application/doc_spec.rb +16 -6
  273. data/spec/integration/application/filebucket_spec.rb +239 -0
  274. data/spec/integration/application/help_spec.rb +42 -0
  275. data/spec/integration/application/lookup_spec.rb +13 -0
  276. data/spec/integration/application/module_spec.rb +68 -0
  277. data/spec/integration/application/plugin_spec.rb +123 -0
  278. data/spec/integration/data_binding_spec.rb +82 -0
  279. data/spec/integration/defaults_spec.rb +1 -2
  280. data/spec/integration/directory_environments_spec.rb +17 -17
  281. data/spec/integration/http/client_spec.rb +47 -37
  282. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  283. data/spec/integration/indirector/report/yaml.rb +83 -0
  284. data/spec/integration/network/http_pool_spec.rb +93 -20
  285. data/spec/integration/node/environment_spec.rb +15 -0
  286. data/spec/integration/parser/compiler_spec.rb +11 -0
  287. data/spec/integration/type/file_spec.rb +1 -1
  288. data/spec/integration/util/execution_spec.rb +22 -0
  289. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  290. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  291. data/spec/integration/util/windows/process_spec.rb +26 -32
  292. data/spec/integration/util/windows/registry_spec.rb +7 -7
  293. data/spec/integration/util/windows/user_spec.rb +47 -5
  294. data/spec/integration/util_spec.rb +7 -33
  295. data/spec/lib/puppet/test_ca.rb +2 -2
  296. data/spec/lib/puppet_spec/https.rb +16 -7
  297. data/spec/lib/puppet_spec/matchers.rb +0 -80
  298. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  299. data/spec/shared_contexts/https.rb +29 -0
  300. data/spec/unit/agent_spec.rb +80 -26
  301. data/spec/unit/application/agent_spec.rb +12 -9
  302. data/spec/unit/application/describe_spec.rb +88 -50
  303. data/spec/unit/application/device_spec.rb +2 -2
  304. data/spec/unit/application/face_base_spec.rb +6 -4
  305. data/spec/unit/application/facts_spec.rb +39 -10
  306. data/spec/unit/application/filebucket_spec.rb +22 -2
  307. data/spec/unit/application/man_spec.rb +52 -0
  308. data/spec/unit/application/resource_spec.rb +3 -1
  309. data/spec/unit/application/ssl_spec.rb +15 -2
  310. data/spec/unit/configurer/downloader_spec.rb +10 -0
  311. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  312. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  313. data/spec/unit/configurer_spec.rb +64 -46
  314. data/spec/unit/confine_spec.rb +2 -1
  315. data/spec/unit/context/trusted_information_spec.rb +25 -2
  316. data/spec/unit/daemon_spec.rb +5 -64
  317. data/spec/unit/defaults_spec.rb +24 -1
  318. data/spec/unit/environments_spec.rb +8 -0
  319. data/spec/unit/face/config_spec.rb +3 -1
  320. data/spec/unit/face/module/search_spec.rb +17 -0
  321. data/spec/unit/face/plugin_spec.rb +12 -10
  322. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  323. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  324. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  325. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  326. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  327. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  328. data/spec/unit/file_system_spec.rb +10 -0
  329. data/spec/unit/functions/lookup_spec.rb +13 -0
  330. data/spec/unit/http/client_spec.rb +321 -36
  331. data/spec/unit/http/external_client_spec.rb +201 -0
  332. data/spec/unit/http/resolver_spec.rb +34 -3
  333. data/spec/unit/http/response_spec.rb +75 -0
  334. data/spec/unit/http/service/ca_spec.rb +53 -12
  335. data/spec/unit/http/service/compiler_spec.rb +332 -28
  336. data/spec/unit/http/service/file_server_spec.rb +100 -12
  337. data/spec/unit/http/service/report_spec.rb +19 -9
  338. data/spec/unit/http/service_spec.rb +94 -6
  339. data/spec/unit/http/session_spec.rb +159 -8
  340. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  341. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  342. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  343. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  344. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  345. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  346. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  347. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  348. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  349. data/spec/unit/indirector/request_spec.rb +1 -1
  350. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  351. data/spec/unit/indirector/rest_spec.rb +13 -0
  352. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  353. data/spec/unit/interface_spec.rb +3 -3
  354. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  355. data/spec/unit/network/format_support_spec.rb +3 -2
  356. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  357. data/spec/unit/network/http/connection_spec.rb +552 -190
  358. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  359. data/spec/unit/network/http/pool_spec.rb +59 -13
  360. data/spec/unit/network/http_pool_spec.rb +63 -57
  361. data/spec/unit/network/http_spec.rb +1 -1
  362. data/spec/unit/node/environment_spec.rb +33 -0
  363. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  364. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  365. data/spec/unit/parser/scope_spec.rb +1 -1
  366. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  367. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  368. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  369. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  370. data/spec/unit/provider/group/groupadd_spec.rb +22 -8
  371. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  372. data/spec/unit/provider/package/aix_spec.rb +29 -0
  373. data/spec/unit/provider/package/apt_spec.rb +107 -0
  374. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  375. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  376. data/spec/unit/provider/package/gem_spec.rb +40 -0
  377. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  378. data/spec/unit/provider/package/pip_spec.rb +68 -19
  379. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  380. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  381. data/spec/unit/provider/package/portage_spec.rb +5 -0
  382. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  383. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  384. data/spec/unit/provider/package/yum_spec.rb +243 -1
  385. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  386. data/spec/unit/provider/service/init_spec.rb +42 -0
  387. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  388. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  389. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  390. data/spec/unit/provider/service/systemd_spec.rb +93 -18
  391. data/spec/unit/provider/service/windows_spec.rb +50 -14
  392. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  393. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  394. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  395. data/spec/unit/puppet_pal_2pec.rb +11 -0
  396. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  397. data/spec/unit/puppet_spec.rb +33 -0
  398. data/spec/unit/reports/http_spec.rb +70 -52
  399. data/spec/unit/reports/store_spec.rb +17 -13
  400. data/spec/unit/resource_spec.rb +3 -3
  401. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  402. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  403. data/spec/unit/ssl/host_spec.rb +4 -2
  404. data/spec/unit/ssl/oids_spec.rb +1 -0
  405. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  406. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  407. data/spec/unit/test/test_helper_spec.rb +17 -0
  408. data/spec/unit/transaction/persistence_spec.rb +15 -0
  409. data/spec/unit/transaction/report_spec.rb +5 -1
  410. data/spec/unit/transaction_spec.rb +0 -2
  411. data/spec/unit/type/file/ensure_spec.rb +1 -2
  412. data/spec/unit/type/file/source_spec.rb +89 -38
  413. data/spec/unit/type/file_spec.rb +122 -96
  414. data/spec/unit/type/service_spec.rb +218 -8
  415. data/spec/unit/type/user_spec.rb +32 -3
  416. data/spec/unit/type_spec.rb +50 -0
  417. data/spec/unit/util/at_fork_spec.rb +3 -2
  418. data/spec/unit/util/autoload_spec.rb +2 -1
  419. data/spec/unit/util/character_encoding_spec.rb +4 -4
  420. data/spec/unit/util/checksums_spec.rb +16 -0
  421. data/spec/unit/util/command_line_spec.rb +11 -6
  422. data/spec/unit/util/log/destinations_spec.rb +1 -29
  423. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  424. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  425. data/spec/unit/util/package/version/range_spec.rb +175 -0
  426. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  427. data/spec/unit/util/pidlock_spec.rb +102 -54
  428. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  429. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  430. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  431. data/spec/unit/util/windows/service_spec.rb +4 -4
  432. data/spec/unit/util/windows/sid_spec.rb +2 -2
  433. data/spec/unit/util_spec.rb +3 -3
  434. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  435. data/tasks/generate_cert_fixtures.rake +15 -1
  436. data/tasks/manpages.rake +5 -35
  437. metadata +84 -52
  438. data/COMMITTERS.md +0 -244
  439. data/spec/integration/faces/config_spec.rb +0 -91
  440. data/spec/integration/faces/documentation_spec.rb +0 -57
  441. data/spec/integration/faces/plugin_spec.rb +0 -61
  442. data/spec/integration/file_bucket/file_spec.rb +0 -50
  443. data/spec/integration/file_serving/content_spec.rb +0 -7
  444. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  445. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  446. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  447. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  448. data/spec/integration/module_tool/forge_spec.rb +0 -64
  449. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  450. data/spec/integration/provider/service/init_spec.rb +0 -48
  451. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  452. data/spec/integration/provider/service/windows_spec.rb +0 -50
  453. data/spec/integration/reference/providers_spec.rb +0 -21
  454. data/spec/integration/reports_spec.rb +0 -13
  455. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  456. data/spec/integration/ssl/host_spec.rb +0 -72
  457. data/spec/integration/ssl/key_spec.rb +0 -99
  458. data/spec/integration/test/test_helper_spec.rb +0 -31
  459. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  460. data/spec/unit/face/man_spec.rb +0 -25
  461. data/spec/unit/man_spec.rb +0 -31
@@ -1,3 +1,5 @@
1
+ require 'puppet/util/package/version/gem'
2
+ require 'puppet/util/package/version/range'
1
3
  require 'puppet/provider/package_targetable'
2
4
  require 'uri'
3
5
 
@@ -15,7 +17,10 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
15
17
  These options should be specified as an array where each element is either a
16
18
  string or a hash."
17
19
 
18
- has_feature :versionable, :install_options, :uninstall_options, :targetable
20
+ has_feature :versionable, :install_options, :uninstall_options, :targetable, :version_ranges
21
+
22
+ GEM_VERSION = Puppet::Util::Package::Version::Gem
23
+ GEM_VERSION_RANGE = Puppet::Util::Package::Version::Range
19
24
 
20
25
  # Override the specificity method to return 1 if gem is not set as default provider
21
26
  def self.specificity
@@ -48,11 +53,13 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
48
53
  #
49
54
  # In this case, causing the puppet_gem provider to inherit the parent gem provider's convenience gemcmd() methods, with the wrong path.
50
55
 
51
- def self.execute_gem_command(command, command_options)
56
+ def self.execute_gem_command(command, command_options, custom_environment = {})
52
57
  validate_command(command)
53
58
  cmd = [command] << command_options
54
59
 
55
- execute(cmd, {:failonfail => true, :combine => true, :custom_environment => {"HOME"=>ENV["HOME"]}})
60
+ custom_environment = {'HOME'=>Puppet::Util.get_env('HOME')}.merge(custom_environment)
61
+
62
+ execute(cmd, {:failonfail => true, :combine => true, :custom_environment => custom_environment})
56
63
  end
57
64
 
58
65
  def self.instances(target_command = nil)
@@ -125,16 +132,35 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
125
132
 
126
133
  def insync?(is)
127
134
  return false unless is && is != :absent
135
+ is = [is] unless is.is_a? Array
136
+ should = @resource[:ensure]
137
+
138
+ unless should =~ Regexp.union(/,/, Gem::Requirement::PATTERN)
139
+ begin
140
+ should_range = GEM_VERSION_RANGE.parse(should, GEM_VERSION)
141
+ rescue GEM_VERSION_RANGE::ValidationFailure, GEM_VERSION::ValidationFailure
142
+ Puppet.debug("Cannot parse #{should} as a ruby gem version range")
143
+ return false
144
+ end
128
145
 
146
+ return is.any? do |version|
147
+ begin
148
+ should_range.include?(GEM_VERSION.parse(version))
149
+ rescue GEM_VERSION::ValidationFailure
150
+ Puppet.debug("Cannot parse #{version} as a ruby gem version")
151
+ false
152
+ end
153
+ end
154
+ end
155
+
129
156
  begin
130
- dependency = Gem::Dependency.new('', resource[:ensure])
157
+ # Range intersections are not supported by Gem::Requirement, so just split by comma.
158
+ dependency = Gem::Dependency.new('', should.split(','))
131
159
  rescue ArgumentError
132
160
  # Bad requirements will cause an error during gem command invocation, so just return not in sync
133
161
  return false
134
162
  end
135
163
 
136
- is = [is] unless is.is_a? Array
137
-
138
164
  # Check if any version matches the dependency
139
165
  is.any? { |version| dependency.match?('', version) }
140
166
  end
@@ -148,12 +174,22 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
148
174
  command = resource_or_provider_command
149
175
  command_options = ["install"]
150
176
  command_options += install_options if resource[:install_options]
177
+ should = resource[:ensure]
178
+
179
+ unless should =~ Regexp.union(/,/, Gem::Requirement::PATTERN)
180
+ begin
181
+ should_range = GEM_VERSION_RANGE.parse(should, GEM_VERSION)
182
+ should = should_range.to_gem_version
183
+ useversion = true
184
+ rescue GEM_VERSION_RANGE::ValidationFailure, GEM_VERSION::ValidationFailure
185
+ Puppet.debug("Cannot parse #{should} as a ruby gem version range. Falling through.")
186
+ end
187
+ end
151
188
 
152
189
  if Puppet::Util::Platform.windows?
153
- version = resource[:ensure]
154
- command_options << "-v" << %Q["#{version}"] if (! resource[:ensure].is_a? Symbol) and useversion
190
+ command_options << "-v" << %Q["#{should}"] if useversion && !should.is_a?(Symbol)
155
191
  else
156
- command_options << "-v" << resource[:ensure] if (! resource[:ensure].is_a? Symbol) and useversion
192
+ command_options << "-v" << should if useversion && !should.is_a?(Symbol)
157
193
  end
158
194
 
159
195
  if Puppet::Util::Package.versioncmp(rubygem_version(command), '2.0.0') == -1
@@ -132,9 +132,6 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
132
132
 
133
133
  # We rescue the main check from Pacman with a check on the AUR using yaourt, if installed
134
134
  def latest
135
- # Synchronize the database
136
- pacman "-Sy"
137
-
138
135
  resource_name = @resource[:name]
139
136
 
140
137
  # If target is a group, construct the group version
@@ -243,7 +240,7 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
243
240
  else
244
241
  fail _("Source %{source} is not supported by pacman") % { source: source }
245
242
  end
246
- pacman "--noconfirm", "--noprogressbar", "-Sy"
243
+ pacman "--noconfirm", "--noprogressbar", "-S"
247
244
  pacman "--noconfirm", "--noprogressbar", "-U", source
248
245
  end
249
246
 
@@ -255,7 +252,7 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
255
252
 
256
253
  cmd = %w{--noconfirm --needed --noprogressbar}
257
254
  cmd += install_options if @resource[:install_options]
258
- cmd << "-Sy" << resource_name
255
+ cmd << "-S" << resource_name
259
256
 
260
257
  if self.class.yaourt?
261
258
  yaourt(*cmd)
@@ -1,6 +1,8 @@
1
1
  # Puppet package provider for Python's `pip` package management frontend.
2
2
  # <http://pip.pypa.io/>
3
3
 
4
+ require 'puppet/util/package/version/pip'
5
+ require 'puppet/util/package/version/range'
4
6
  require 'puppet/provider/package_targetable'
5
7
  require 'puppet/util/http_proxy'
6
8
 
@@ -11,7 +13,10 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
11
13
  This provider supports the `install_options` attribute, which allows command-line flags to be passed to pip.
12
14
  These options should be specified as an array where each element is either a string or a hash."
13
15
 
14
- has_feature :installable, :uninstallable, :upgradeable, :versionable, :install_options, :targetable
16
+ has_feature :installable, :uninstallable, :upgradeable, :versionable, :version_ranges, :install_options, :targetable
17
+
18
+ PIP_VERSION = Puppet::Util::Package::Version::Pip
19
+ PIP_VERSION_RANGE = Puppet::Util::Package::Version::Range
15
20
 
16
21
  # Override the specificity method to return 1 if pip is not set as default provider
17
22
  def self.specificity
@@ -25,7 +30,6 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
25
30
 
26
31
  # Define the default provider package command name when the provider is targetable.
27
32
  # Required by Puppet::Provider::Package::Targetable::resource_or_provider_command
28
-
29
33
  def self.provider_command
30
34
  # Ensure pip can upgrade pip, which usually puts pip into a new path /usr/local/bin/pip (compared to /usr/bin/pip)
31
35
  self.cmd.map { |c| which(c) }.find { |c| c != nil }
@@ -58,7 +62,6 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
58
62
 
59
63
  # Return an array of structured information about every installed package
60
64
  # that's managed by `pip` or an empty array if `pip` is not available.
61
-
62
65
  def self.instances(target_command = nil)
63
66
  if target_command
64
67
  command = target_command
@@ -72,11 +75,11 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
72
75
 
73
76
  command_options = ['freeze']
74
77
  command_version = self.pip_version(command)
75
- if Puppet::Util::Package.versioncmp(command_version, '8.1.0') >= 0
78
+ if compare_pip_versions(command_version, '8.1.0') >= 0
76
79
  command_options << '--all'
77
80
  end
78
81
 
79
- execpipe [command, command_options] do |process|
82
+ execpipe [quote(command), command_options] do |process|
80
83
  process.collect do |line|
81
84
  pkg = parse(line)
82
85
  next unless pkg
@@ -88,7 +91,7 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
88
91
  # Pip can also upgrade pip, but it's not listed in freeze so need to special case it
89
92
  # Pip list would also show pip installed version, but "pip list" doesn't exist for older versions of pip (E.G v1.0)
90
93
  # Not needed when "pip freeze --all" is available.
91
- if Puppet::Util::Package.versioncmp(command_version, '8.1.0') == -1
94
+ if compare_pip_versions(command_version, '8.1.0') == -1
92
95
  packages << new({:ensure => command_version, :name => File.basename(command), :provider => name, :command => command})
93
96
  end
94
97
 
@@ -105,7 +108,6 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
105
108
 
106
109
  # Return structured information about a particular package or `nil`
107
110
  # if the package is not installed or `pip` itself is not available.
108
-
109
111
  def query
110
112
  command = resource_or_provider_command
111
113
  self.class.validate_command(command)
@@ -116,99 +118,171 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
116
118
  return nil
117
119
  end
118
120
 
119
- # Use pip CLI to look up versions from PyPI repositories,
120
- # honoring local pip config such as custom repositories.
121
-
121
+ # Return latest version available for current package
122
122
  def latest
123
123
  command = resource_or_provider_command
124
124
  self.class.validate_command(command)
125
125
 
126
126
  command_version = self.class.pip_version(command)
127
- if Puppet::Util::Package.versioncmp(command_version, '1.5.4') == -1
128
- latest_with_old_pip
127
+ if self.class.compare_pip_versions(command_version, '1.5.4') == -1
128
+ available_versions_with_old_pip.last
129
129
  else
130
- latest_with_new_pip
130
+ available_versions_with_new_pip.last
131
131
  end
132
132
  end
133
133
 
134
- # Less resource-intensive approach for pip version 1.5.4 and newer.
134
+ def self.compare_pip_versions(x, y)
135
+ begin
136
+ Puppet::Util::Package::Version::Pip.compare(x, y)
137
+ rescue PIP_VERSION::ValidationFailure => ex
138
+ Puppet.debug("Cannot compare #{x} and #{y}. #{ex.message} Falling through default comparison mechanism.")
139
+ Puppet::Util::Package.versioncmp(x, y)
140
+ end
141
+ end
135
142
 
136
- def latest_with_new_pip
143
+ # Use pip CLI to look up versions from PyPI repositories,
144
+ # honoring local pip config such as custom repositories.
145
+ def available_versions
137
146
  command = resource_or_provider_command
138
147
  self.class.validate_command(command)
139
148
 
140
- command_and_options = [command, 'install', "#{@resource[:name]}==versionplease"]
149
+ command_version = self.class.pip_version(command)
150
+ if self.class.compare_pip_versions(command_version, '1.5.4') == -1
151
+ available_versions_with_old_pip
152
+ else
153
+ available_versions_with_new_pip
154
+ end
155
+ end
156
+
157
+ def available_versions_with_new_pip
158
+ command = resource_or_provider_command
159
+ self.class.validate_command(command)
160
+
161
+ command_and_options = [self.class.quote(command), 'install', "#{@resource[:name]}==versionplease"]
141
162
  command_and_options << install_options if @resource[:install_options]
142
163
  execpipe command_and_options do |process|
143
164
  process.collect do |line|
144
165
  # PIP OUTPUT: Could not find a version that satisfies the requirement example==versionplease (from versions: 1.2.3, 4.5.6)
145
- if line =~ /from versions: /
146
- textAfterLastMatch = $'.chomp(")\n")
147
- versionList = textAfterLastMatch.split(', ').sort do |x,y|
148
- Puppet::Util::Package.versioncmp(x, y)
166
+ if line =~ /from versions: (.+)\)/
167
+ versionList = $1.split(', ').sort do |x,y|
168
+ self.class.compare_pip_versions(x, y)
149
169
  end
150
- return versionList.last
170
+ return versionList
151
171
  end
152
172
  end
153
- return nil
154
173
  end
174
+ []
155
175
  end
156
176
 
157
- # More resource-intensive approach for pip version 1.5.3 and older.
158
-
159
- def latest_with_old_pip
177
+ def available_versions_with_old_pip
160
178
  command = resource_or_provider_command
161
179
  self.class.validate_command(command)
162
180
 
163
181
  Dir.mktmpdir("puppet_pip") do |dir|
164
- command_and_options = [command, 'install', "#{@resource[:name]}", '-d', "#{dir}", '-v']
182
+ command_and_options = [self.class.quote(command), 'install', "#{@resource[:name]}", '-d', "#{dir}", '-v']
165
183
  command_and_options << install_options if @resource[:install_options]
166
184
  execpipe command_and_options do |process|
167
185
  process.collect do |line|
168
186
  # PIP OUTPUT: Using version 0.10.1 (newest of versions: 1.2.3, 4.5.6)
169
- if line =~ /Using version (.+?) \(newest of versions/
170
- return $1
187
+ if line =~ /Using version .+? \(newest of versions: (.+?)\)/
188
+ versionList = $1.split(', ').sort do |x,y|
189
+ self.class.compare_pip_versions(x, y)
190
+ end
191
+ return versionList
171
192
  end
172
193
  end
173
- return nil
174
194
  end
195
+ return []
175
196
  end
176
197
  end
177
198
 
178
- # Install a package. The ensure parameter may specify installed,
179
- # latest, a version number, or, in conjunction with the source
180
- # parameter, an SCM revision. In that case, the source parameter
181
- # gives the fully-qualified URL to the repository.
199
+ # Finds the most suitable version available in a given range
200
+ def best_version(should_range)
201
+ included_available_versions = []
202
+ available_versions.each do |version|
203
+ version = PIP_VERSION.parse(version)
204
+ included_available_versions.push(version) if should_range.include?(version)
205
+ end
182
206
 
183
- def install
184
- command = resource_or_provider_command
185
- self.class.validate_command(command)
207
+ included_available_versions.sort!
208
+ return included_available_versions.last unless included_available_versions.empty?
209
+
210
+ Puppet.debug("No available version for package #{@resource[:name]} is included in range #{should_range}")
211
+ should_range
212
+ end
186
213
 
214
+ def get_install_command_options()
215
+ should = @resource[:ensure]
187
216
  command_options = %w{install -q}
188
- command_options += install_options if @resource[:install_options]
217
+ command_options += install_options if @resource[:install_options]
218
+
189
219
  if @resource[:source]
190
- if String === @resource[:ensure]
191
- command_options << "#{@resource[:source]}@#{@resource[:ensure]}#egg=#{@resource[:name]}"
220
+ if String === should
221
+ command_options << "#{@resource[:source]}@#{should}#egg=#{@resource[:name]}"
192
222
  else
193
223
  command_options << "#{@resource[:source]}#egg=#{@resource[:name]}"
194
224
  end
195
- else
196
- case @resource[:ensure]
197
- when String
198
- command_options << "#{@resource[:name]}==#{@resource[:ensure]}"
199
- when :latest
200
- command_options << "--upgrade" << @resource[:name]
225
+
226
+ return command_options
227
+ end
228
+
229
+ if should == :latest
230
+ command_options << "--upgrade" << @resource[:name]
231
+
232
+ return command_options
233
+ end
234
+
235
+ unless String === should
236
+ command_options << @resource[:name]
237
+
238
+ return command_options
239
+ end
240
+
241
+ begin
242
+ should_range = PIP_VERSION_RANGE.parse(should, PIP_VERSION)
243
+ rescue PIP_VERSION_RANGE::ValidationFailure, PIP_VERSION::ValidationFailure
244
+ Puppet.debug("Cannot parse #{should} as a pip version range, falling through.")
245
+ command_options << "#{@resource[:name]}==#{should}"
246
+
247
+ return command_options
248
+ end
249
+
250
+ if should_range.is_a?(PIP_VERSION_RANGE::Eq)
251
+ command_options << "#{@resource[:name]}==#{should}"
252
+
253
+ return command_options
254
+ end
255
+
256
+ should = best_version(should_range)
257
+
258
+ if should == should_range
259
+ # when no suitable version for the given range was found, let pip handle
260
+ if should.is_a?(PIP_VERSION_RANGE::MinMax)
261
+ command_options << "#{@resource[:name]} #{should.split.join(',')}"
201
262
  else
202
- command_options << @resource[:name]
263
+ command_options << "#{@resource[:name]} #{should}"
203
264
  end
265
+ else
266
+ command_options << "#{@resource[:name]}==#{should}"
204
267
  end
205
268
 
269
+ command_options
270
+ end
271
+
272
+ # Install a package. The ensure parameter may specify installed,
273
+ # latest, a version number, or, in conjunction with the source
274
+ # parameter, an SCM revision. In that case, the source parameter
275
+ # gives the fully-qualified URL to the repository.
276
+ def install
277
+ command = resource_or_provider_command
278
+ self.class.validate_command(command)
279
+
280
+ command_options = get_install_command_options
206
281
  execute([command, command_options])
207
282
  end
208
283
 
209
284
  # Uninstall a package. Uninstall won't work reliably on Debian/Ubuntu unless this issue gets fixed.
210
285
  # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=562544
211
-
212
286
  def uninstall
213
287
  command = resource_or_provider_command
214
288
  self.class.validate_command(command)
@@ -226,6 +300,28 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
226
300
  join_options(@resource[:install_options])
227
301
  end
228
302
 
303
+ def insync?(is)
304
+ return false unless is && is != :absent
305
+ begin
306
+ should = @resource[:ensure]
307
+ should_range = PIP_VERSION_RANGE.parse(should, PIP_VERSION)
308
+ rescue PIP_VERSION_RANGE::ValidationFailure, PIP_VERSION::ValidationFailure
309
+ Puppet.debug("Cannot parse #{should} as a pip version range")
310
+ return false
311
+ end
312
+
313
+ begin
314
+ is_version = PIP_VERSION.parse(is)
315
+ rescue PIP_VERSION::ValidationFailure
316
+ Puppet.debug("Cannot parse #{is} as a pip version")
317
+ return false
318
+ end
319
+
320
+ should_range.include?(is_version)
321
+ end
322
+
323
+ # Quoting is required if the path to the pip command contains spaces.
324
+ # Required for execpipe() but not execute(), as execute() already does this.
229
325
  def self.quote(path)
230
326
  if path.include?(" ")
231
327
  "\"#{path}\""
@@ -233,5 +329,4 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
233
329
  path
234
330
  end
235
331
  end
236
- private_class_method :quote
237
332
  end
@@ -1,8 +1,6 @@
1
1
  # Puppet package provider for Python's `pip3` package management frontend.
2
2
  # <http://pip.pypa.io/>
3
3
 
4
- require 'puppet/provider/package/pip'
5
-
6
4
  Puppet::Type.type(:package).provide :pip3,
7
5
  :parent => :pip do
8
6
 
@@ -102,7 +102,7 @@ Puppet::Type.type(:package).provide :pkgdmg, :parent => Puppet::Provider::Packag
102
102
  if source =~ /\.dmg$/i
103
103
  # If you fix this to use open-uri again, you must update the docs above. -NF
104
104
  File.open(cached_source) do |dmg|
105
- xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-noidme", "-mountrandom", "/tmp", dmg.path
105
+ xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-mountrandom", "/tmp", dmg.path
106
106
  hdiutil_info = Puppet::Util::Plist.parse_plist(xml_str)
107
107
  raise Puppet::Error.new(_("No disk entities returned by mount at %{path}") % { path: dmg.path }) unless hdiutil_info.has_key?("system-entities")
108
108
  mounts = hdiutil_info["system-entities"].collect { |entity|