puppet 6.11.1 → 6.16.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 (395) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +3 -8
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +39 -36
  6. data/README.md +17 -24
  7. data/ext/build_defaults.yaml +1 -0
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/windows/service/daemon.rb +25 -20
  10. data/lib/puppet.rb +52 -13
  11. data/lib/puppet/agent.rb +20 -14
  12. data/lib/puppet/application/agent.rb +12 -14
  13. data/lib/puppet/application/describe.rb +7 -5
  14. data/lib/puppet/application/device.rb +2 -2
  15. data/lib/puppet/application/filebucket.rb +19 -15
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/resource.rb +1 -1
  18. data/lib/puppet/application/ssl.rb +4 -4
  19. data/lib/puppet/concurrent.rb +2 -0
  20. data/lib/puppet/concurrent/lock.rb +16 -0
  21. data/lib/puppet/concurrent/synchronized.rb +15 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
  23. data/lib/puppet/configurer.rb +85 -83
  24. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  25. data/lib/puppet/context/trusted_information.rb +14 -8
  26. data/lib/puppet/daemon.rb +13 -27
  27. data/lib/puppet/defaults.rb +158 -40
  28. data/lib/puppet/environments.rb +30 -20
  29. data/lib/puppet/error.rb +9 -1
  30. data/lib/puppet/face/facts.rb +8 -5
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/plugin.rb +2 -2
  34. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  35. data/lib/puppet/file_system/file_impl.rb +13 -9
  36. data/lib/puppet/file_system/memory_file.rb +6 -0
  37. data/lib/puppet/file_system/memory_impl.rb +13 -0
  38. data/lib/puppet/file_system/uniquefile.rb +4 -0
  39. data/lib/puppet/file_system/windows.rb +7 -10
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/forge/errors.rb +2 -2
  42. data/lib/puppet/forge/repository.rb +31 -86
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/camelcase.rb +2 -2
  45. data/lib/puppet/functions/epp.rb +4 -4
  46. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/find_file.rb +9 -9
  49. data/lib/puppet/functions/find_template.rb +63 -0
  50. data/lib/puppet/functions/inline_epp.rb +5 -5
  51. data/lib/puppet/functions/reduce.rb +2 -4
  52. data/lib/puppet/http.rb +7 -0
  53. data/lib/puppet/http/client.rb +341 -54
  54. data/lib/puppet/http/errors.rb +2 -0
  55. data/lib/puppet/http/external_client.rb +90 -0
  56. data/lib/puppet/http/redirector.rb +34 -0
  57. data/lib/puppet/http/resolver.rb +57 -1
  58. data/lib/puppet/http/resolver/server_list.rb +98 -0
  59. data/lib/puppet/http/resolver/settings.rb +23 -2
  60. data/lib/puppet/http/resolver/srv.rb +36 -4
  61. data/lib/puppet/http/response.rb +68 -1
  62. data/lib/puppet/http/retry_after_handler.rb +39 -0
  63. data/lib/puppet/http/service.rb +179 -3
  64. data/lib/puppet/http/service/ca.rb +84 -21
  65. data/lib/puppet/http/service/compiler.rb +319 -0
  66. data/lib/puppet/http/service/file_server.rb +206 -0
  67. data/lib/puppet/http/service/report.rb +66 -0
  68. data/lib/puppet/http/session.rb +106 -31
  69. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  70. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  71. data/lib/puppet/indirector/facts/rest.rb +42 -0
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  73. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  74. data/lib/puppet/indirector/file_content/http.rb +5 -0
  75. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  76. data/lib/puppet/indirector/file_metadata/http.rb +4 -4
  77. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  78. data/lib/puppet/indirector/json.rb +1 -1
  79. data/lib/puppet/indirector/msgpack.rb +1 -1
  80. data/lib/puppet/indirector/node/rest.rb +24 -0
  81. data/lib/puppet/indirector/report/rest.rb +19 -0
  82. data/lib/puppet/indirector/report/yaml.rb +23 -0
  83. data/lib/puppet/indirector/rest.rb +12 -0
  84. data/lib/puppet/indirector/status/rest.rb +18 -0
  85. data/lib/puppet/loaders.rb +6 -0
  86. data/lib/puppet/metatype/manager.rb +80 -80
  87. data/lib/puppet/network/http/base_pool.rb +19 -1
  88. data/lib/puppet/network/http/compression.rb +7 -0
  89. data/lib/puppet/network/http/connection.rb +6 -0
  90. data/lib/puppet/network/http/connection_adapter.rb +182 -0
  91. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  92. data/lib/puppet/network/http/pool.rb +13 -6
  93. data/lib/puppet/network/http_pool.rb +2 -1
  94. data/lib/puppet/node/environment.rb +24 -8
  95. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  96. data/lib/puppet/pal/pal_impl.rb +9 -29
  97. data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
  98. data/lib/puppet/parser/compiler.rb +42 -32
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/epp.rb +3 -3
  101. data/lib/puppet/parser/functions/filter.rb +1 -0
  102. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  105. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/lookup/invocation.rb +10 -3
  109. data/lib/puppet/pops/model/pn_transformer.rb +5 -9
  110. data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
  111. data/lib/puppet/pops/serialization/json_path.rb +3 -3
  112. data/lib/puppet/pops/time/timespan.rb +3 -5
  113. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  114. data/lib/puppet/pops/types/string_converter.rb +6 -9
  115. data/lib/puppet/pops/types/type_calculator.rb +30 -10
  116. data/lib/puppet/pops/types/type_formatter.rb +9 -11
  117. data/lib/puppet/pops/types/type_parser.rb +3 -3
  118. data/lib/puppet/pops/validation/checker4_0.rb +1 -1
  119. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  120. data/lib/puppet/provider/aix_object.rb +4 -2
  121. data/lib/puppet/provider/group/aix.rb +1 -0
  122. data/lib/puppet/provider/group/groupadd.rb +57 -24
  123. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +78 -4
  126. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  127. data/lib/puppet/provider/package/dpkg.rb +14 -7
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +41 -7
  130. data/lib/puppet/provider/package/openbsd.rb +13 -1
  131. data/lib/puppet/provider/package/pacman.rb +2 -5
  132. data/lib/puppet/provider/package/pip.rb +143 -48
  133. data/lib/puppet/provider/package/pip3.rb +0 -2
  134. data/lib/puppet/provider/package/pkg.rb +18 -5
  135. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  136. data/lib/puppet/provider/package/pkgng.rb +16 -4
  137. data/lib/puppet/provider/package/portage.rb +5 -5
  138. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  139. data/lib/puppet/provider/package/rpm.rb +6 -213
  140. data/lib/puppet/provider/package/yum.rb +108 -24
  141. data/lib/puppet/provider/package/zypper.rb +59 -1
  142. data/lib/puppet/provider/package_targetable.rb +5 -4
  143. data/lib/puppet/provider/service/systemd.rb +23 -5
  144. data/lib/puppet/provider/user/aix.rb +1 -0
  145. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  146. data/lib/puppet/provider/user/hpux.rb +1 -1
  147. data/lib/puppet/provider/user/useradd.rb +11 -8
  148. data/lib/puppet/reports/http.rb +13 -9
  149. data/lib/puppet/reports/store.rb +1 -1
  150. data/lib/puppet/resource/type_collection.rb +20 -16
  151. data/lib/puppet/runtime.rb +32 -1
  152. data/lib/puppet/settings.rb +4 -0
  153. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  154. data/lib/puppet/ssl.rb +1 -0
  155. data/lib/puppet/ssl/certificate.rb +2 -1
  156. data/lib/puppet/ssl/host.rb +4 -4
  157. data/lib/puppet/ssl/oids.rb +1 -0
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -0
  159. data/lib/puppet/ssl/state_machine.rb +81 -35
  160. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  161. data/lib/puppet/test/test_helper.rb +7 -1
  162. data/lib/puppet/transaction.rb +33 -11
  163. data/lib/puppet/transaction/report.rb +2 -2
  164. data/lib/puppet/transaction/resource_harness.rb +1 -1
  165. data/lib/puppet/type.rb +7 -2
  166. data/lib/puppet/type/file.rb +13 -0
  167. data/lib/puppet/type/file/data_sync.rb +5 -1
  168. data/lib/puppet/type/file/source.rb +49 -58
  169. data/lib/puppet/type/group.rb +5 -4
  170. data/lib/puppet/type/package.rb +102 -10
  171. data/lib/puppet/type/service.rb +6 -8
  172. data/lib/puppet/type/user.rb +6 -30
  173. data/lib/puppet/util.rb +34 -11
  174. data/lib/puppet/util/at_fork.rb +1 -1
  175. data/lib/puppet/util/autoload.rb +4 -18
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/logging.rb +30 -18
  179. data/lib/puppet/util/package/version/debian.rb +175 -0
  180. data/lib/puppet/util/package/version/gem.rb +15 -0
  181. data/lib/puppet/util/package/version/pip.rb +167 -0
  182. data/lib/puppet/util/package/version/range.rb +53 -0
  183. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  185. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  187. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  188. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  189. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  190. data/lib/puppet/util/package/version/rpm.rb +73 -0
  191. data/lib/puppet/util/pidlock.rb +36 -10
  192. data/lib/puppet/util/platform.rb +5 -0
  193. data/lib/puppet/util/plist.rb +6 -0
  194. data/lib/puppet/util/rpm_compare.rb +193 -0
  195. data/lib/puppet/util/storage.rb +0 -1
  196. data/lib/puppet/util/windows/adsi.rb +50 -20
  197. data/lib/puppet/util/windows/process.rb +15 -14
  198. data/lib/puppet/util/windows/security.rb +1 -0
  199. data/lib/puppet/util/windows/sid.rb +3 -3
  200. data/lib/puppet/util/yaml.rb +1 -1
  201. data/lib/puppet/version.rb +1 -1
  202. data/lib/puppet/x509/cert_provider.rb +9 -5
  203. data/locales/puppet.pot +640 -521
  204. data/man/man5/puppet.conf.5 +88 -9
  205. data/man/man8/puppet-agent.8 +6 -6
  206. data/man/man8/puppet-apply.8 +1 -1
  207. data/man/man8/puppet-catalog.8 +1 -1
  208. data/man/man8/puppet-config.8 +1 -1
  209. data/man/man8/puppet-describe.8 +1 -1
  210. data/man/man8/puppet-device.8 +2 -2
  211. data/man/man8/puppet-doc.8 +1 -1
  212. data/man/man8/puppet-epp.8 +1 -1
  213. data/man/man8/puppet-facts.8 +1 -1
  214. data/man/man8/puppet-filebucket.8 +17 -2
  215. data/man/man8/puppet-generate.8 +1 -1
  216. data/man/man8/puppet-help.8 +6 -3
  217. data/man/man8/puppet-key.8 +1 -1
  218. data/man/man8/puppet-lookup.8 +1 -1
  219. data/man/man8/puppet-man.8 +1 -1
  220. data/man/man8/puppet-module.8 +4 -1
  221. data/man/man8/puppet-node.8 +1 -1
  222. data/man/man8/puppet-parser.8 +1 -1
  223. data/man/man8/puppet-plugin.8 +1 -1
  224. data/man/man8/puppet-report.8 +1 -1
  225. data/man/man8/puppet-resource.8 +1 -1
  226. data/man/man8/puppet-script.8 +1 -1
  227. data/man/man8/puppet-ssl.8 +2 -2
  228. data/man/man8/puppet-status.8 +1 -1
  229. data/man/man8/puppet.8 +2 -2
  230. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  231. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  232. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  233. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  234. data/spec/fixtures/unit/forge/bacula.json +76 -0
  235. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  236. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  238. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  239. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  241. 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 -106
  242. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  243. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  244. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. 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 -102
  247. data/spec/integration/application/agent_spec.rb +394 -0
  248. data/spec/integration/application/apply_spec.rb +132 -3
  249. data/spec/integration/application/filebucket_spec.rb +190 -0
  250. data/spec/integration/application/plugin_spec.rb +73 -0
  251. data/spec/integration/configurer_spec.rb +26 -7
  252. data/spec/integration/http/client_spec.rb +154 -0
  253. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  254. data/spec/integration/indirector/report/yaml.rb +83 -0
  255. data/spec/integration/module_tool/forge_spec.rb +51 -0
  256. data/spec/integration/network/http_pool_spec.rb +76 -20
  257. data/spec/integration/node/environment_spec.rb +15 -0
  258. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  259. data/spec/lib/puppet/test_ca.rb +2 -2
  260. data/spec/lib/puppet_spec/https.rb +20 -9
  261. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  262. data/spec/shared_contexts/https.rb +29 -0
  263. data/spec/spec_helper.rb +6 -2
  264. data/spec/unit/agent_spec.rb +80 -26
  265. data/spec/unit/application/agent_spec.rb +9 -5
  266. data/spec/unit/application/apply_spec.rb +2 -12
  267. data/spec/unit/application/describe_spec.rb +88 -50
  268. data/spec/unit/application/device_spec.rb +2 -2
  269. data/spec/unit/application/filebucket_spec.rb +22 -2
  270. data/spec/unit/application/resource_spec.rb +2 -2
  271. data/spec/unit/concurrent/lock_spec.rb +29 -0
  272. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  273. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  274. data/spec/unit/configurer_spec.rb +400 -406
  275. data/spec/unit/context/trusted_information_spec.rb +17 -0
  276. data/spec/unit/daemon_spec.rb +5 -64
  277. data/spec/unit/defaults_spec.rb +38 -4
  278. data/spec/unit/environments_spec.rb +65 -28
  279. data/spec/unit/face/facts_spec.rb +24 -20
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/plugin_spec.rb +12 -10
  282. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  283. data/spec/unit/file_system_spec.rb +26 -2
  284. data/spec/unit/forge/errors_spec.rb +1 -1
  285. data/spec/unit/forge/forge_spec.rb +12 -54
  286. data/spec/unit/forge/module_release_spec.rb +19 -6
  287. data/spec/unit/forge/repository_spec.rb +63 -157
  288. data/spec/unit/forge_spec.rb +46 -116
  289. data/spec/unit/functions/find_template_spec.rb +69 -0
  290. data/spec/unit/functions/lookup_spec.rb +13 -0
  291. data/spec/unit/http/client_spec.rb +395 -27
  292. data/spec/unit/http/external_client_spec.rb +201 -0
  293. data/spec/unit/http/resolver_spec.rb +81 -12
  294. data/spec/unit/http/response_spec.rb +69 -0
  295. data/spec/unit/http/service/ca_spec.rb +100 -7
  296. data/spec/unit/http/service/compiler_spec.rb +627 -0
  297. data/spec/unit/http/service/file_server_spec.rb +308 -0
  298. data/spec/unit/http/service/report_spec.rb +118 -0
  299. data/spec/unit/http/service_spec.rb +117 -4
  300. data/spec/unit/http/session_spec.rb +237 -19
  301. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  302. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  303. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  304. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  305. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  306. data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
  307. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  308. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  309. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  310. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  311. data/spec/unit/indirector/rest_spec.rb +13 -0
  312. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  313. data/spec/unit/network/http/connection_spec.rb +549 -176
  314. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  315. data/spec/unit/network/http/pool_spec.rb +89 -11
  316. data/spec/unit/network/http_pool_spec.rb +63 -57
  317. data/spec/unit/network/http_spec.rb +1 -1
  318. data/spec/unit/node/environment_spec.rb +16 -0
  319. data/spec/unit/node/facts_spec.rb +2 -1
  320. data/spec/unit/node_spec.rb +7 -4
  321. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  322. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  323. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  324. data/spec/unit/provider/aix_object_spec.rb +16 -2
  325. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  326. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  327. data/spec/unit/provider/package/aix_spec.rb +29 -0
  328. data/spec/unit/provider/package/apt_spec.rb +43 -2
  329. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  330. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  331. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  332. data/spec/unit/provider/package/gem_spec.rb +40 -0
  333. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  334. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  335. data/spec/unit/provider/package/pip_spec.rb +68 -19
  336. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  337. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  338. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  339. data/spec/unit/provider/package/portage_spec.rb +9 -4
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  341. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  342. data/spec/unit/provider/package/yum_spec.rb +292 -0
  343. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  344. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  345. data/spec/unit/provider/service/init_spec.rb +1 -0
  346. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  347. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  348. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  349. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  350. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  351. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  352. data/spec/unit/provider/user/useradd_spec.rb +21 -8
  353. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  354. data/spec/unit/puppet_pal_2pec.rb +0 -26
  355. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  356. data/spec/unit/puppet_spec.rb +47 -0
  357. data/spec/unit/reports/http_spec.rb +70 -52
  358. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  359. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  360. data/spec/unit/ssl/certificate_spec.rb +7 -0
  361. data/spec/unit/ssl/host_spec.rb +4 -2
  362. data/spec/unit/ssl/oids_spec.rb +1 -0
  363. data/spec/unit/ssl/ssl_provider_spec.rb +71 -0
  364. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  365. data/spec/unit/transaction/persistence_spec.rb +1 -10
  366. data/spec/unit/transaction/report_spec.rb +4 -0
  367. data/spec/unit/transaction_spec.rb +45 -1
  368. data/spec/unit/type/file/content_spec.rb +9 -3
  369. data/spec/unit/type/file/ensure_spec.rb +1 -2
  370. data/spec/unit/type/file/source_spec.rb +86 -35
  371. data/spec/unit/type/package_spec.rb +8 -0
  372. data/spec/unit/type/service_spec.rb +9 -8
  373. data/spec/unit/type/user_spec.rb +1 -2
  374. data/spec/unit/util/at_fork_spec.rb +3 -2
  375. data/spec/unit/util/autoload_spec.rb +2 -1
  376. data/spec/unit/util/log/destinations_spec.rb +1 -29
  377. data/spec/unit/util/log_spec.rb +0 -138
  378. data/spec/unit/util/logging_spec.rb +200 -0
  379. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  380. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  381. data/spec/unit/util/package/version/range_spec.rb +175 -0
  382. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  383. data/spec/unit/util/pidlock_spec.rb +112 -42
  384. data/spec/unit/util/plist_spec.rb +20 -0
  385. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  386. data/spec/unit/util/storage_spec.rb +1 -8
  387. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  388. data/spec/unit/util/windows/sid_spec.rb +2 -2
  389. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  390. data/tasks/generate_cert_fixtures.rake +15 -1
  391. data/tasks/manpages.rake +6 -35
  392. metadata +92 -12
  393. data/COMMITTERS.md +0 -244
  394. data/spec/integration/faces/plugin_spec.rb +0 -61
  395. data/spec/lib/puppet_spec/validators.rb +0 -37
@@ -45,8 +45,8 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
45
45
  # eventually become this Puppet::Type::Package::ProviderDpkg class.
46
46
  self::DPKG_QUERY_FORMAT_STRING = %Q{'${Status} ${Package} ${Version}\\n'}
47
47
  self::DPKG_QUERY_PROVIDES_FORMAT_STRING = %Q{'${Status} ${Package} ${Version} [${Provides}]\\n'}
48
- self::FIELDS_REGEX = %r{^(\S+) +(\S+) +(\S+) (\S+) (\S*)$}
49
- self::FIELDS_REGEX_WITH_PROVIDES = %r{^(\S+) +(\S+) +(\S+) (\S+) (\S*) \[.*\]$}
48
+ self::FIELDS_REGEX = %r{^'?(\S+) +(\S+) +(\S+) (\S+) (\S*)$}
49
+ self::FIELDS_REGEX_WITH_PROVIDES = %r{^'?(\S+) +(\S+) +(\S+) (\S+) (\S*) \[.*\]$}
50
50
  self::FIELDS= [:desired, :error, :status, :name, :ensure]
51
51
 
52
52
  def self.defaultto_allow_virtual
@@ -74,7 +74,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
74
74
  elsif ['config-files', 'half-installed', 'unpacked', 'half-configured'].include?(hash[:status])
75
75
  hash[:ensure] = :absent
76
76
  end
77
- hash[:ensure] = :held if hash[:desired] == 'hold'
77
+ hash[:mark] = :hold if hash[:desired] == 'hold'
78
78
  else
79
79
  Puppet.debug("Failed to match dpkg-query line #{line.inspect}")
80
80
  end
@@ -91,8 +91,6 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
91
91
  end
92
92
  args = []
93
93
 
94
- # We always unhold when installing to remove any prior hold.
95
- self.unhold
96
94
 
97
95
  if @resource[:configfiles] == :keep
98
96
  args << '--force-confold'
@@ -101,7 +99,12 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
101
99
  end
102
100
  args << '-i' << file
103
101
 
104
- dpkg(*args)
102
+ self.unhold if self.properties[:mark] == :hold
103
+ begin
104
+ dpkg(*args)
105
+ ensure
106
+ self.hold if @resource[:mark] == :hold
107
+ end
105
108
  end
106
109
 
107
110
  def update
@@ -170,10 +173,14 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
170
173
  dpkg "--purge", @resource[:name]
171
174
  end
172
175
 
173
- def hold
176
+ def deprecated_hold
174
177
  if package_not_installed?
175
178
  self.install
176
179
  end
180
+ hold
181
+ end
182
+
183
+ def hold
177
184
  Tempfile.open('puppet_dpkg_set_selection') do |tmpfile|
178
185
  tmpfile.write("#{@resource[:name]} hold\n")
179
186
  tmpfile.flush
@@ -37,7 +37,12 @@ Puppet::Type.type(:package).provide :fink, :parent => :dpkg, :source => :dpkg do
37
37
 
38
38
  cmd << :install << str
39
39
 
40
- finkcmd(cmd)
40
+ self.unhold if self.properties[:mark] == :hold
41
+ begin
42
+ finkcmd(cmd)
43
+ ensure
44
+ self.hold if @resource[:mark] == :hold
45
+ end
41
46
  end
42
47
 
43
48
  # What's the latest package version available?
@@ -71,10 +76,22 @@ Puppet::Type.type(:package).provide :fink, :parent => :dpkg, :source => :dpkg do
71
76
  end
72
77
 
73
78
  def uninstall
74
- finkcmd "-y", "-q", :remove, @model[:name]
79
+ self.unhold if self.properties[:mark] == :hold
80
+ begin
81
+ finkcmd "-y", "-q", :remove, @model[:name]
82
+ rescue StandardError, LoadError => e
83
+ self.hold if self.properties[:mark] == :hold
84
+ raise e
85
+ end
75
86
  end
76
87
 
77
88
  def purge
78
- aptget '-y', '-q', 'remove', '--purge', @resource[:name]
89
+ self.unhold if self.properties[:mark] == :hold
90
+ begin
91
+ aptget '-y', '-q', 'remove', '--purge', @resource[:name]
92
+ rescue StandardError, LoadError => e
93
+ self.hold if self.properties[:mark] == :hold
94
+ raise e
95
+ end
79
96
  end
80
97
  end
@@ -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
@@ -125,16 +130,35 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
125
130
 
126
131
  def insync?(is)
127
132
  return false unless is && is != :absent
133
+ is = [is] unless is.is_a? Array
134
+ should = @resource[:ensure]
128
135
 
136
+ unless should =~ Regexp.union(/,/, Gem::Requirement::PATTERN)
137
+ begin
138
+ should_range = GEM_VERSION_RANGE.parse(should, GEM_VERSION)
139
+ rescue GEM_VERSION_RANGE::ValidationFailure, GEM_VERSION::ValidationFailure
140
+ Puppet.debug("Cannot parse #{should} as a ruby gem version range")
141
+ return false
142
+ end
143
+
144
+ return is.any? do |version|
145
+ begin
146
+ should_range.include?(GEM_VERSION.parse(version))
147
+ rescue GEM_VERSION::ValidationFailure
148
+ Puppet.debug("Cannot parse #{version} as a ruby gem version")
149
+ false
150
+ end
151
+ end
152
+ end
153
+
129
154
  begin
130
- dependency = Gem::Dependency.new('', resource[:ensure])
155
+ # Range intersections are not supported by Gem::Requirement, so just split by comma.
156
+ dependency = Gem::Dependency.new('', should.split(','))
131
157
  rescue ArgumentError
132
158
  # Bad requirements will cause an error during gem command invocation, so just return not in sync
133
159
  return false
134
160
  end
135
161
 
136
- is = [is] unless is.is_a? Array
137
-
138
162
  # Check if any version matches the dependency
139
163
  is.any? { |version| dependency.match?('', version) }
140
164
  end
@@ -148,12 +172,22 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
148
172
  command = resource_or_provider_command
149
173
  command_options = ["install"]
150
174
  command_options += install_options if resource[:install_options]
175
+ should = resource[:ensure]
176
+
177
+ unless should =~ Regexp.union(/,/, Gem::Requirement::PATTERN)
178
+ begin
179
+ should_range = GEM_VERSION_RANGE.parse(should, GEM_VERSION)
180
+ should = should_range.to_gem_version
181
+ useversion = true
182
+ rescue GEM_VERSION_RANGE::ValidationFailure, GEM_VERSION::ValidationFailure
183
+ Puppet.debug("Cannot parse #{should} as a ruby gem version range. Falling through.")
184
+ end
185
+ end
151
186
 
152
187
  if Puppet::Util::Platform.windows?
153
- version = resource[:ensure]
154
- command_options << "-v" << %Q["#{version}"] if (! resource[:ensure].is_a? Symbol) and useversion
188
+ command_options << "-v" << %Q["#{should}"] if useversion && !should.is_a?(Symbol)
155
189
  else
156
- command_options << "-v" << resource[:ensure] if (! resource[:ensure].is_a? Symbol) and useversion
190
+ command_options << "-v" << should if useversion && !should.is_a?(Symbol)
157
191
  end
158
192
 
159
193
  if Puppet::Util::Package.versioncmp(rubygem_version(command), '2.0.0') == -1
@@ -20,6 +20,7 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
20
20
  has_feature :install_options
21
21
  has_feature :uninstall_options
22
22
  has_feature :upgradeable
23
+ has_feature :supports_flavors
23
24
 
24
25
  def self.instances
25
26
  packages = []
@@ -27,7 +28,7 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
27
28
  begin
28
29
  execpipe(listcmd) do |process|
29
30
  # our regex for matching pkg_info output
30
- regex = /^(.*)-(\d[^-]*)[-]?(\w*)(.*)$/
31
+ regex = /^(.*)-(\d[^-]*)[-]?([\w-]*)(.*)$/
31
32
  fields = [:name, :ensure, :flavor ]
32
33
  hash = {}
33
34
 
@@ -245,4 +246,15 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
245
246
  def purge
246
247
  pkgdelete "-c", "-q", @resource[:name]
247
248
  end
249
+
250
+ def flavor
251
+ @property_hash[:flavor]
252
+ end
253
+
254
+ def flavor=(value)
255
+ if flavor != @resource.should(:flavor)
256
+ uninstall
257
+ install
258
+ end
259
+ end
248
260
  end
@@ -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