puppet 6.12.0-x64-mingw32 → 6.17.0-x64-mingw32

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 (412) 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 +39 -36
  6. data/README.md +18 -25
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/windows/service/daemon.rb +3 -3
  9. data/lib/puppet.rb +52 -13
  10. data/lib/puppet/agent.rb +20 -14
  11. data/lib/puppet/application/agent.rb +26 -17
  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/plugin.rb +1 -0
  16. data/lib/puppet/application/resource.rb +1 -1
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +65 -69
  19. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  20. data/lib/puppet/confine.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +154 -58
  24. data/lib/puppet/environments.rb +27 -20
  25. data/lib/puppet/face/facts.rb +8 -5
  26. data/lib/puppet/face/help.rb +29 -3
  27. data/lib/puppet/face/module/search.rb +5 -0
  28. data/lib/puppet/face/plugin.rb +2 -2
  29. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  30. data/lib/puppet/file_serving/metadata.rb +4 -1
  31. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  32. data/lib/puppet/file_system/file_impl.rb +14 -10
  33. data/lib/puppet/file_system/memory_file.rb +6 -0
  34. data/lib/puppet/file_system/memory_impl.rb +13 -0
  35. data/lib/puppet/file_system/uniquefile.rb +12 -16
  36. data/lib/puppet/file_system/windows.rb +7 -10
  37. data/lib/puppet/forge.rb +1 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge/repository.rb +4 -7
  40. data/lib/puppet/functions/call.rb +1 -1
  41. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  42. data/lib/puppet/functions/filter.rb +1 -0
  43. data/lib/puppet/functions/reduce.rb +2 -4
  44. data/lib/puppet/http.rb +5 -0
  45. data/lib/puppet/http/client.rb +293 -73
  46. data/lib/puppet/http/errors.rb +2 -0
  47. data/lib/puppet/http/external_client.rb +90 -0
  48. data/lib/puppet/http/redirector.rb +43 -7
  49. data/lib/puppet/http/resolver.rb +46 -3
  50. data/lib/puppet/http/resolver/server_list.rb +76 -16
  51. data/lib/puppet/http/resolver/settings.rb +23 -3
  52. data/lib/puppet/http/resolver/srv.rb +29 -3
  53. data/lib/puppet/http/response.rb +87 -1
  54. data/lib/puppet/http/retry_after_handler.rb +39 -0
  55. data/lib/puppet/http/service.rb +151 -7
  56. data/lib/puppet/http/service/ca.rb +76 -14
  57. data/lib/puppet/http/service/compiler.rb +319 -0
  58. data/lib/puppet/http/service/file_server.rb +206 -0
  59. data/lib/puppet/http/service/report.rb +49 -23
  60. data/lib/puppet/http/session.rb +103 -7
  61. data/lib/puppet/indirector.rb +1 -1
  62. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  63. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  64. data/lib/puppet/indirector/facts/rest.rb +42 -0
  65. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  66. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  67. data/lib/puppet/indirector/file_content/http.rb +5 -0
  68. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  69. data/lib/puppet/indirector/file_metadata/http.rb +27 -8
  70. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  71. data/lib/puppet/indirector/json.rb +1 -1
  72. data/lib/puppet/indirector/msgpack.rb +1 -1
  73. data/lib/puppet/indirector/node/rest.rb +24 -0
  74. data/lib/puppet/indirector/report/rest.rb +19 -0
  75. data/lib/puppet/indirector/report/yaml.rb +23 -0
  76. data/lib/puppet/indirector/request.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +12 -0
  78. data/lib/puppet/indirector/status/rest.rb +18 -0
  79. data/lib/puppet/loaders.rb +6 -0
  80. data/lib/puppet/metatype/manager.rb +80 -80
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  83. data/lib/puppet/network/http/base_pool.rb +7 -2
  84. data/lib/puppet/network/http/compression.rb +7 -0
  85. data/lib/puppet/network/http/connection.rb +6 -0
  86. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  87. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  88. data/lib/puppet/network/http/pool.rb +13 -6
  89. data/lib/puppet/network/http_pool.rb +2 -1
  90. data/lib/puppet/node/environment.rb +11 -1
  91. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  92. data/lib/puppet/pal/pal_impl.rb +4 -29
  93. data/lib/puppet/parser/ast/leaf.rb +5 -5
  94. data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
  95. data/lib/puppet/parser/compiler.rb +43 -33
  96. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  97. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  98. data/lib/puppet/parser/environment_compiler.rb +4 -1
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/filter.rb +1 -0
  101. data/lib/puppet/parser/resource.rb +3 -2
  102. data/lib/puppet/parser/resource/param.rb +6 -0
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
  105. data/lib/puppet/pops/issues.rb +5 -0
  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/parser/evaluating_parser.rb +5 -7
  109. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  110. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  111. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  112. data/lib/puppet/pops/validation/checker4_0.rb +11 -1
  113. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  114. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  115. data/lib/puppet/provider/aix_object.rb +4 -2
  116. data/lib/puppet/provider/group/aix.rb +1 -0
  117. data/lib/puppet/provider/group/groupadd.rb +57 -24
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/package/aix.rb +17 -2
  120. data/lib/puppet/provider/package/apt.rb +78 -4
  121. data/lib/puppet/provider/package/aptitude.rb +1 -1
  122. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  123. data/lib/puppet/provider/package/dpkg.rb +14 -7
  124. data/lib/puppet/provider/package/fink.rb +20 -3
  125. data/lib/puppet/provider/package/gem.rb +41 -7
  126. data/lib/puppet/provider/package/openbsd.rb +13 -1
  127. data/lib/puppet/provider/package/pacman.rb +2 -5
  128. data/lib/puppet/provider/package/pip.rb +143 -48
  129. data/lib/puppet/provider/package/pip3.rb +0 -2
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +2 -2
  134. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  135. data/lib/puppet/provider/package/rpm.rb +6 -213
  136. data/lib/puppet/provider/package/yum.rb +109 -25
  137. data/lib/puppet/provider/package/zypper.rb +59 -1
  138. data/lib/puppet/provider/service/systemd.rb +22 -4
  139. data/lib/puppet/provider/service/windows.rb +23 -7
  140. data/lib/puppet/provider/user/aix.rb +1 -0
  141. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  142. data/lib/puppet/provider/user/useradd.rb +22 -12
  143. data/lib/puppet/reports/http.rb +15 -9
  144. data/lib/puppet/reports/store.rb +1 -1
  145. data/lib/puppet/resource.rb +2 -1
  146. data/lib/puppet/resource/type.rb +8 -0
  147. data/lib/puppet/resource/type_collection.rb +20 -16
  148. data/lib/puppet/runtime.rb +31 -1
  149. data/lib/puppet/settings.rb +4 -0
  150. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  151. data/lib/puppet/ssl.rb +1 -0
  152. data/lib/puppet/ssl/certificate.rb +2 -1
  153. data/lib/puppet/ssl/host.rb +4 -4
  154. data/lib/puppet/ssl/oids.rb +1 -0
  155. data/lib/puppet/ssl/ssl_context.rb +2 -2
  156. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  157. data/lib/puppet/ssl/state_machine.rb +81 -35
  158. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  159. data/lib/puppet/test/test_helper.rb +15 -11
  160. data/lib/puppet/transaction/report.rb +2 -2
  161. data/lib/puppet/transaction/resource_harness.rb +1 -1
  162. data/lib/puppet/trusted_external.rb +29 -1
  163. data/lib/puppet/type.rb +18 -6
  164. data/lib/puppet/type/file.rb +51 -13
  165. data/lib/puppet/type/file/checksum.rb +4 -4
  166. data/lib/puppet/type/file/source.rb +51 -60
  167. data/lib/puppet/type/group.rb +2 -2
  168. data/lib/puppet/type/package.rb +102 -10
  169. data/lib/puppet/type/service.rb +55 -8
  170. data/lib/puppet/type/user.rb +3 -28
  171. data/lib/puppet/util.rb +39 -15
  172. data/lib/puppet/util/at_fork.rb +1 -1
  173. data/lib/puppet/util/autoload.rb +4 -18
  174. data/lib/puppet/util/checksums.rb +19 -4
  175. data/lib/puppet/util/fileparsing.rb +2 -2
  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/package/version/debian.rb +175 -0
  179. data/lib/puppet/util/package/version/gem.rb +15 -0
  180. data/lib/puppet/util/package/version/pip.rb +167 -0
  181. data/lib/puppet/util/package/version/range.rb +53 -0
  182. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  183. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  185. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  187. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  188. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  189. data/lib/puppet/util/package/version/rpm.rb +73 -0
  190. data/lib/puppet/util/pidlock.rb +36 -10
  191. data/lib/puppet/util/platform.rb +5 -0
  192. data/lib/puppet/util/plist.rb +6 -0
  193. data/lib/puppet/util/provider_features.rb +1 -1
  194. data/lib/puppet/util/reference.rb +1 -1
  195. data/lib/puppet/util/rpm_compare.rb +193 -0
  196. data/lib/puppet/util/storage.rb +0 -1
  197. data/lib/puppet/util/windows/adsi.rb +2 -2
  198. data/lib/puppet/util/windows/api_types.rb +45 -32
  199. data/lib/puppet/util/windows/eventlog.rb +1 -6
  200. data/lib/puppet/util/windows/principal.rb +8 -6
  201. data/lib/puppet/util/windows/process.rb +15 -14
  202. data/lib/puppet/util/windows/registry.rb +11 -11
  203. data/lib/puppet/util/windows/security.rb +1 -0
  204. data/lib/puppet/util/windows/service.rb +43 -26
  205. data/lib/puppet/util/windows/sid.rb +3 -3
  206. data/lib/puppet/util/windows/user.rb +23 -8
  207. data/lib/puppet/util/yaml.rb +1 -1
  208. data/lib/puppet/version.rb +1 -1
  209. data/locales/puppet.pot +707 -574
  210. data/man/man5/puppet.conf.5 +74 -14
  211. data/man/man8/puppet-agent.8 +7 -7
  212. data/man/man8/puppet-apply.8 +1 -1
  213. data/man/man8/puppet-catalog.8 +1 -1
  214. data/man/man8/puppet-config.8 +1 -1
  215. data/man/man8/puppet-describe.8 +1 -1
  216. data/man/man8/puppet-device.8 +2 -2
  217. data/man/man8/puppet-doc.8 +1 -1
  218. data/man/man8/puppet-epp.8 +1 -1
  219. data/man/man8/puppet-facts.8 +1 -1
  220. data/man/man8/puppet-filebucket.8 +17 -2
  221. data/man/man8/puppet-generate.8 +1 -1
  222. data/man/man8/puppet-help.8 +6 -3
  223. data/man/man8/puppet-key.8 +1 -1
  224. data/man/man8/puppet-lookup.8 +1 -1
  225. data/man/man8/puppet-man.8 +1 -1
  226. data/man/man8/puppet-module.8 +4 -1
  227. data/man/man8/puppet-node.8 +1 -1
  228. data/man/man8/puppet-parser.8 +1 -1
  229. data/man/man8/puppet-plugin.8 +1 -1
  230. data/man/man8/puppet-report.8 +1 -1
  231. data/man/man8/puppet-resource.8 +1 -1
  232. data/man/man8/puppet-script.8 +1 -1
  233. data/man/man8/puppet-ssl.8 +2 -2
  234. data/man/man8/puppet-status.8 +1 -1
  235. data/man/man8/puppet.8 +2 -2
  236. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  237. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  238. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  239. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  240. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  241. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  242. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  243. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  244. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  245. 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
  246. 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
  247. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  248. 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
  249. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  250. 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
  251. 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
  252. data/spec/integration/application/agent_spec.rb +483 -0
  253. data/spec/integration/application/apply_spec.rb +132 -3
  254. data/spec/integration/application/filebucket_spec.rb +190 -0
  255. data/spec/integration/application/plugin_spec.rb +73 -0
  256. data/spec/integration/configurer_spec.rb +26 -7
  257. data/spec/integration/defaults_spec.rb +1 -2
  258. data/spec/integration/http/client_spec.rb +47 -37
  259. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  260. data/spec/integration/indirector/report/yaml.rb +83 -0
  261. data/spec/integration/module_tool/forge_spec.rb +2 -15
  262. data/spec/integration/network/http_pool_spec.rb +93 -20
  263. data/spec/integration/node/environment_spec.rb +15 -0
  264. data/spec/integration/parser/compiler_spec.rb +11 -0
  265. data/spec/integration/type/file_spec.rb +1 -1
  266. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  267. data/spec/integration/util/windows/registry_spec.rb +7 -7
  268. data/spec/integration/util/windows/user_spec.rb +40 -5
  269. data/spec/lib/puppet/test_ca.rb +2 -2
  270. data/spec/lib/puppet_spec/https.rb +16 -7
  271. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  272. data/spec/shared_contexts/https.rb +29 -0
  273. data/spec/unit/agent_spec.rb +80 -26
  274. data/spec/unit/application/agent_spec.rb +9 -5
  275. data/spec/unit/application/apply_spec.rb +2 -12
  276. data/spec/unit/application/describe_spec.rb +88 -50
  277. data/spec/unit/application/device_spec.rb +2 -2
  278. data/spec/unit/application/filebucket_spec.rb +22 -2
  279. data/spec/unit/application/resource_spec.rb +2 -2
  280. data/spec/unit/configurer/fact_handler_spec.rb +4 -8
  281. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  282. data/spec/unit/configurer_spec.rb +17 -18
  283. data/spec/unit/context/trusted_information_spec.rb +25 -2
  284. data/spec/unit/daemon_spec.rb +5 -64
  285. data/spec/unit/defaults_spec.rb +25 -2
  286. data/spec/unit/environments_spec.rb +65 -28
  287. data/spec/unit/face/facts_spec.rb +24 -20
  288. data/spec/unit/face/module/search_spec.rb +17 -0
  289. data/spec/unit/face/plugin_spec.rb +12 -10
  290. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  291. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  292. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  293. data/spec/unit/file_system_spec.rb +26 -2
  294. data/spec/unit/functions/lookup_spec.rb +13 -0
  295. data/spec/unit/http/client_spec.rb +327 -35
  296. data/spec/unit/http/external_client_spec.rb +201 -0
  297. data/spec/unit/http/resolver_spec.rb +34 -2
  298. data/spec/unit/http/response_spec.rb +75 -0
  299. data/spec/unit/http/service/ca_spec.rb +53 -11
  300. data/spec/unit/http/service/compiler_spec.rb +627 -0
  301. data/spec/unit/http/service/file_server_spec.rb +308 -0
  302. data/spec/unit/http/service/report_spec.rb +27 -9
  303. data/spec/unit/http/service_spec.rb +98 -5
  304. data/spec/unit/http/session_spec.rb +190 -7
  305. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  306. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  307. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  308. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  309. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  310. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  311. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  312. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  313. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  314. data/spec/unit/indirector/request_spec.rb +1 -1
  315. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  316. data/spec/unit/indirector/rest_spec.rb +13 -0
  317. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  318. data/spec/unit/interface_spec.rb +3 -3
  319. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  320. data/spec/unit/network/http/connection_spec.rb +559 -175
  321. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  322. data/spec/unit/network/http/pool_spec.rb +89 -11
  323. data/spec/unit/network/http_pool_spec.rb +63 -57
  324. data/spec/unit/network/http_spec.rb +1 -1
  325. data/spec/unit/node/environment_spec.rb +16 -0
  326. data/spec/unit/node/facts_spec.rb +2 -1
  327. data/spec/unit/node_spec.rb +7 -4
  328. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  329. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  330. data/spec/unit/parser/scope_spec.rb +1 -1
  331. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  332. data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
  333. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  334. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  335. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  336. data/spec/unit/provider/aix_object_spec.rb +16 -2
  337. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  338. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  339. data/spec/unit/provider/package/aix_spec.rb +29 -0
  340. data/spec/unit/provider/package/apt_spec.rb +43 -2
  341. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  342. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  343. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  344. data/spec/unit/provider/package/gem_spec.rb +40 -0
  345. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  346. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  347. data/spec/unit/provider/package/pip_spec.rb +68 -19
  348. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  349. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  350. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  351. data/spec/unit/provider/package/portage_spec.rb +5 -0
  352. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  353. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  354. data/spec/unit/provider/package/yum_spec.rb +292 -0
  355. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  356. data/spec/unit/provider/service/init_spec.rb +1 -0
  357. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  358. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  359. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  360. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  361. data/spec/unit/provider/service/windows_spec.rb +22 -14
  362. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  363. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  364. data/spec/unit/provider/user/useradd_spec.rb +43 -24
  365. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  366. data/spec/unit/puppet_pal_2pec.rb +0 -26
  367. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  368. data/spec/unit/puppet_spec.rb +47 -0
  369. data/spec/unit/reports/http_spec.rb +70 -52
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  372. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  373. data/spec/unit/ssl/certificate_spec.rb +7 -0
  374. data/spec/unit/ssl/host_spec.rb +4 -2
  375. data/spec/unit/ssl/oids_spec.rb +1 -0
  376. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  377. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  378. data/spec/unit/test/test_helper_spec.rb +17 -0
  379. data/spec/unit/transaction/persistence_spec.rb +1 -10
  380. data/spec/unit/transaction/report_spec.rb +5 -1
  381. data/spec/unit/transaction_spec.rb +0 -2
  382. data/spec/unit/type/file/ensure_spec.rb +1 -2
  383. data/spec/unit/type/file/source_spec.rb +89 -38
  384. data/spec/unit/type/file_spec.rb +122 -96
  385. data/spec/unit/type/package_spec.rb +8 -0
  386. data/spec/unit/type/service_spec.rb +185 -8
  387. data/spec/unit/type/user_spec.rb +1 -2
  388. data/spec/unit/type_spec.rb +50 -0
  389. data/spec/unit/util/at_fork_spec.rb +3 -2
  390. data/spec/unit/util/autoload_spec.rb +2 -1
  391. data/spec/unit/util/checksums_spec.rb +16 -0
  392. data/spec/unit/util/log/destinations_spec.rb +1 -29
  393. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  394. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  395. data/spec/unit/util/package/version/range_spec.rb +175 -0
  396. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  397. data/spec/unit/util/pidlock_spec.rb +112 -42
  398. data/spec/unit/util/plist_spec.rb +20 -0
  399. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  400. data/spec/unit/util/storage_spec.rb +1 -8
  401. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  402. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  403. data/spec/unit/util/windows/service_spec.rb +4 -4
  404. data/spec/unit/util/windows/sid_spec.rb +2 -2
  405. data/spec/unit/util_spec.rb +3 -3
  406. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  407. data/tasks/generate_cert_fixtures.rake +15 -1
  408. data/tasks/manpages.rake +5 -35
  409. metadata +73 -12
  410. data/COMMITTERS.md +0 -244
  411. data/spec/integration/faces/plugin_spec.rb +0 -61
  412. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -72,6 +72,11 @@ describe Puppet::Type.type(:package).provider(:portage) do
72
72
  expect(described_class).to be_reinstallable
73
73
  end
74
74
 
75
+ it "should be the default provider on :osfamily => Gentoo" do
76
+ expect(Facter).to receive(:value).with(:osfamily).and_return("Gentoo")
77
+ expect(described_class.default?).to be_truthy
78
+ end
79
+
75
80
  it 'should support string install options' do
76
81
  expect(@provider).to receive(:emerge).with('--foo', '--bar', @resource[:name])
77
82
 
@@ -67,6 +67,14 @@ describe Puppet::Type.type(:package).provider(:puppet_gem) do
67
67
  expect(described_class).to receive(:execute_gem_command).with(provider_gem_cmd, %w{uninstall --executables --all myresource --force --bindir=/usr/bin}).and_return('')
68
68
  provider.uninstall
69
69
  end
70
+
71
+ it 'should invalidate the rubygems cache' do
72
+ gem_source = double('gem_source')
73
+ allow(Puppet::Util::Autoload).to receive(:gem_source).and_return(gem_source)
74
+ expect(described_class).to receive(:execute_gem_command).with(provider_gem_cmd, %w{uninstall --executables --all myresource}).and_return('')
75
+ expect(gem_source).to receive(:clear_paths)
76
+ provider.uninstall
77
+ end
70
78
  end
71
79
 
72
80
  context 'calculated specificity' do
@@ -552,218 +552,6 @@ describe Puppet::Type.type(:package).provider(:rpm) do
552
552
  end
553
553
  end
554
554
 
555
- describe 'version comparison' do
556
- # test cases munged directly from rpm's own
557
- # tests/rpmvercmp.at
558
- it { expect(provider.rpmvercmp("1.0", "1.0")).to eq(0) }
559
- it { expect(provider.rpmvercmp("1.0", "2.0")).to eq(-1) }
560
- it { expect(provider.rpmvercmp("2.0", "1.0")).to eq(1) }
561
- it { expect(provider.rpmvercmp("2.0.1", "2.0.1")).to eq(0) }
562
- it { expect(provider.rpmvercmp("2.0", "2.0.1")).to eq(-1) }
563
- it { expect(provider.rpmvercmp("2.0.1", "2.0")).to eq(1) }
564
- it { expect(provider.rpmvercmp("2.0.1a", "2.0.1a")).to eq(0) }
565
- it { expect(provider.rpmvercmp("2.0.1a", "2.0.1")).to eq(1) }
566
- it { expect(provider.rpmvercmp("2.0.1", "2.0.1a")).to eq(-1) }
567
- it { expect(provider.rpmvercmp("5.5p1", "5.5p1")).to eq(0) }
568
- it { expect(provider.rpmvercmp("5.5p1", "5.5p2")).to eq(-1) }
569
- it { expect(provider.rpmvercmp("5.5p2", "5.5p1")).to eq(1) }
570
- it { expect(provider.rpmvercmp("5.5p10", "5.5p10")).to eq(0) }
571
- it { expect(provider.rpmvercmp("5.5p1", "5.5p10")).to eq(-1) }
572
- it { expect(provider.rpmvercmp("5.5p10", "5.5p1")).to eq(1) }
573
- it { expect(provider.rpmvercmp("10xyz", "10.1xyz")).to eq(-1) }
574
- it { expect(provider.rpmvercmp("10.1xyz", "10xyz")).to eq(1) }
575
- it { expect(provider.rpmvercmp("xyz10", "xyz10")).to eq(0) }
576
- it { expect(provider.rpmvercmp("xyz10", "xyz10.1")).to eq(-1) }
577
- it { expect(provider.rpmvercmp("xyz10.1", "xyz10")).to eq(1) }
578
- it { expect(provider.rpmvercmp("xyz.4", "xyz.4")).to eq(0) }
579
- it { expect(provider.rpmvercmp("xyz.4", "8")).to eq(-1) }
580
- it { expect(provider.rpmvercmp("8", "xyz.4")).to eq(1) }
581
- it { expect(provider.rpmvercmp("xyz.4", "2")).to eq(-1) }
582
- it { expect(provider.rpmvercmp("2", "xyz.4")).to eq(1) }
583
- it { expect(provider.rpmvercmp("5.5p2", "5.6p1")).to eq(-1) }
584
- it { expect(provider.rpmvercmp("5.6p1", "5.5p2")).to eq(1) }
585
- it { expect(provider.rpmvercmp("5.6p1", "6.5p1")).to eq(-1) }
586
- it { expect(provider.rpmvercmp("6.5p1", "5.6p1")).to eq(1) }
587
- it { expect(provider.rpmvercmp("6.0.rc1", "6.0")).to eq(1) }
588
- it { expect(provider.rpmvercmp("6.0", "6.0.rc1")).to eq(-1) }
589
- it { expect(provider.rpmvercmp("10b2", "10a1")).to eq(1) }
590
- it { expect(provider.rpmvercmp("10a2", "10b2")).to eq(-1) }
591
- it { expect(provider.rpmvercmp("1.0aa", "1.0aa")).to eq(0) }
592
- it { expect(provider.rpmvercmp("1.0a", "1.0aa")).to eq(-1) }
593
- it { expect(provider.rpmvercmp("1.0aa", "1.0a")).to eq(1) }
594
- it { expect(provider.rpmvercmp("10.0001", "10.0001")).to eq(0) }
595
- it { expect(provider.rpmvercmp("10.0001", "10.1")).to eq(0) }
596
- it { expect(provider.rpmvercmp("10.1", "10.0001")).to eq(0) }
597
- it { expect(provider.rpmvercmp("10.0001", "10.0039")).to eq(-1) }
598
- it { expect(provider.rpmvercmp("10.0039", "10.0001")).to eq(1) }
599
- it { expect(provider.rpmvercmp("4.999.9", "5.0")).to eq(-1) }
600
- it { expect(provider.rpmvercmp("5.0", "4.999.9")).to eq(1) }
601
- it { expect(provider.rpmvercmp("20101121", "20101121")).to eq(0) }
602
- it { expect(provider.rpmvercmp("20101121", "20101122")).to eq(-1) }
603
- it { expect(provider.rpmvercmp("20101122", "20101121")).to eq(1) }
604
- it { expect(provider.rpmvercmp("2_0", "2_0")).to eq(0) }
605
- it { expect(provider.rpmvercmp("2.0", "2_0")).to eq(0) }
606
- it { expect(provider.rpmvercmp("2_0", "2.0")).to eq(0) }
607
- it { expect(provider.rpmvercmp("a", "a")).to eq(0) }
608
- it { expect(provider.rpmvercmp("a+", "a+")).to eq(0) }
609
- it { expect(provider.rpmvercmp("a+", "a_")).to eq(0) }
610
- it { expect(provider.rpmvercmp("a_", "a+")).to eq(0) }
611
- it { expect(provider.rpmvercmp("+a", "+a")).to eq(0) }
612
- it { expect(provider.rpmvercmp("+a", "_a")).to eq(0) }
613
- it { expect(provider.rpmvercmp("_a", "+a")).to eq(0) }
614
- it { expect(provider.rpmvercmp("+_", "+_")).to eq(0) }
615
- it { expect(provider.rpmvercmp("_+", "+_")).to eq(0) }
616
- it { expect(provider.rpmvercmp("_+", "_+")).to eq(0) }
617
- it { expect(provider.rpmvercmp("+", "_")).to eq(0) }
618
- it { expect(provider.rpmvercmp("_", "+")).to eq(0) }
619
- it { expect(provider.rpmvercmp("1.0~rc1", "1.0~rc1")).to eq(0) }
620
- it { expect(provider.rpmvercmp("1.0~rc1", "1.0")).to eq(-1) }
621
- it { expect(provider.rpmvercmp("1.0", "1.0~rc1")).to eq(1) }
622
- it { expect(provider.rpmvercmp("1.0~rc1", "1.0~rc2")).to eq(-1) }
623
- it { expect(provider.rpmvercmp("1.0~rc2", "1.0~rc1")).to eq(1) }
624
- it { expect(provider.rpmvercmp("1.0~rc1~git123", "1.0~rc1~git123")).to eq(0) }
625
- it { expect(provider.rpmvercmp("1.0~rc1~git123", "1.0~rc1")).to eq(-1) }
626
- it { expect(provider.rpmvercmp("1.0~rc1", "1.0~rc1~git123")).to eq(1) }
627
- it { expect(provider.rpmvercmp("1.0~rc1", "1.0arc1")).to eq(-1) }
628
- it { expect(provider.rpmvercmp("", "~")).to eq(1) }
629
- it { expect(provider.rpmvercmp("~", "~~")).to eq(1) }
630
- it { expect(provider.rpmvercmp("~", "~+~")).to eq(1) }
631
- it { expect(provider.rpmvercmp("~", "~a")).to eq(-1) }
632
-
633
- # non-upstream test cases
634
- it { expect(provider.rpmvercmp("405", "406")).to eq(-1) }
635
- it { expect(provider.rpmvercmp("1", "0")).to eq(1) }
636
- end
637
-
638
- describe 'package evr parsing' do
639
- it 'should parse full simple evr' do
640
- v = provider.rpm_parse_evr('0:1.2.3-4.el5')
641
- expect(v[:epoch]).to eq('0')
642
- expect(v[:version]).to eq('1.2.3')
643
- expect(v[:release]).to eq('4.el5')
644
- end
645
-
646
- it 'should parse version only' do
647
- v = provider.rpm_parse_evr('1.2.3')
648
- expect(v[:epoch]).to eq(nil)
649
- expect(v[:version]).to eq('1.2.3')
650
- expect(v[:release]).to eq(nil)
651
- end
652
-
653
- it 'should parse version-release' do
654
- v = provider.rpm_parse_evr('1.2.3-4.5.el6')
655
- expect(v[:epoch]).to eq(nil)
656
- expect(v[:version]).to eq('1.2.3')
657
- expect(v[:release]).to eq('4.5.el6')
658
- end
659
-
660
- it 'should parse release with git hash' do
661
- v = provider.rpm_parse_evr('1.2.3-4.1234aefd')
662
- expect(v[:epoch]).to eq(nil)
663
- expect(v[:version]).to eq('1.2.3')
664
- expect(v[:release]).to eq('4.1234aefd')
665
- end
666
-
667
- it 'should parse single integer versions' do
668
- v = provider.rpm_parse_evr('12345')
669
- expect(v[:epoch]).to eq(nil)
670
- expect(v[:version]).to eq('12345')
671
- expect(v[:release]).to eq(nil)
672
- end
673
-
674
- it 'should parse text in the epoch to 0' do
675
- v = provider.rpm_parse_evr('foo0:1.2.3-4')
676
- expect(v[:epoch]).to eq(nil)
677
- expect(v[:version]).to eq('1.2.3')
678
- expect(v[:release]).to eq('4')
679
- end
680
-
681
- it 'should parse revisions with text' do
682
- v = provider.rpm_parse_evr('1.2.3-SNAPSHOT20140107')
683
- expect(v[:epoch]).to eq(nil)
684
- expect(v[:version]).to eq('1.2.3')
685
- expect(v[:release]).to eq('SNAPSHOT20140107')
686
- end
687
-
688
- # test cases for PUP-682
689
- it 'should parse revisions with text and numbers' do
690
- v = provider.rpm_parse_evr('2.2-SNAPSHOT20121119105647')
691
- expect(v[:epoch]).to eq(nil)
692
- expect(v[:version]).to eq('2.2')
693
- expect(v[:release]).to eq('SNAPSHOT20121119105647')
694
- end
695
- end
696
-
697
- describe 'rpm evr comparison' do
698
- # currently passing tests
699
- it 'should evaluate identical version-release as equal' do
700
- v = provider.rpm_compareEVR({:epoch => '0', :version => '1.2.3', :release => '1.el5'},
701
- {:epoch => '0', :version => '1.2.3', :release => '1.el5'})
702
- expect(v).to eq(0)
703
- end
704
-
705
- it 'should evaluate identical version as equal' do
706
- v = provider.rpm_compareEVR({:epoch => '0', :version => '1.2.3', :release => nil},
707
- {:epoch => '0', :version => '1.2.3', :release => nil})
708
- expect(v).to eq(0)
709
- end
710
-
711
- it 'should evaluate identical version but older release as less' do
712
- v = provider.rpm_compareEVR({:epoch => '0', :version => '1.2.3', :release => '1.el5'},
713
- {:epoch => '0', :version => '1.2.3', :release => '2.el5'})
714
- expect(v).to eq(-1)
715
- end
716
-
717
- it 'should evaluate identical version but newer release as greater' do
718
- v = provider.rpm_compareEVR({:epoch => '0', :version => '1.2.3', :release => '3.el5'},
719
- {:epoch => '0', :version => '1.2.3', :release => '2.el5'})
720
- expect(v).to eq(1)
721
- end
722
-
723
- it 'should evaluate a newer epoch as greater' do
724
- v = provider.rpm_compareEVR({:epoch => '1', :version => '1.2.3', :release => '4.5'},
725
- {:epoch => '0', :version => '1.2.3', :release => '4.5'})
726
- expect(v).to eq(1)
727
- end
728
-
729
- # these tests describe PUP-1244 logic yet to be implemented
730
- it 'should evaluate any version as equal to the same version followed by release' do
731
- v = provider.rpm_compareEVR({:epoch => '0', :version => '1.2.3', :release => nil},
732
- {:epoch => '0', :version => '1.2.3', :release => '2.el5'})
733
- expect(v).to eq(0)
734
- end
735
-
736
- # test cases for PUP-682
737
- it 'should evaluate same-length numeric revisions numerically' do
738
- expect(provider.rpm_compareEVR({:epoch => '0', :version => '2.2', :release => '405'},
739
- {:epoch => '0', :version => '2.2', :release => '406'})).to eq(-1)
740
- end
741
- end
742
-
743
- describe 'version segment comparison' do
744
- it 'should treat two nil values as equal' do
745
- v = provider.compare_values(nil, nil)
746
- expect(v).to eq(0)
747
- end
748
-
749
- it 'should treat a nil value as less than a non-nil value' do
750
- v = provider.compare_values(nil, '0')
751
- expect(v).to eq(-1)
752
- end
753
-
754
- it 'should treat a non-nil value as greater than a nil value' do
755
- v = provider.compare_values('0', nil)
756
- expect(v).to eq(1)
757
- end
758
-
759
- it 'should pass two non-nil values on to rpmvercmp' do
760
- allow(provider).to receive(:rpmvercmp).and_return(0)
761
- expect(provider).to receive(:rpmvercmp).with('s1', 's2')
762
- provider.compare_values('s1', 's2')
763
- end
764
- end
765
-
766
-
767
555
  describe 'insync?' do
768
556
  context 'for multiple versions' do
769
557
  let(:is) { '1:1.2.3.4-5.el4; 1:5.6.7.8-5.el4' }
@@ -3,6 +3,17 @@ require 'spec_helper'
3
3
  describe Puppet::Type.type(:package).provider(:yum) do
4
4
  include PuppetSpec::Fixtures
5
5
 
6
+ let(:resource_name) { 'myresource' }
7
+ let(:resource) do
8
+ Puppet::Type.type(:package).new(
9
+ :name => resource_name,
10
+ :ensure => :installed,
11
+ :provider => 'yum'
12
+ )
13
+ end
14
+
15
+ let(:provider) { Puppet::Type.type(:package).provider(:yum).new(resource) }
16
+
6
17
  it_behaves_like 'RHEL package provider', described_class, 'yum'
7
18
 
8
19
  it "should have lower specificity" do
@@ -95,6 +106,56 @@ describe Puppet::Type.type(:package).provider(:yum) do
95
106
  provider.install
96
107
  end
97
108
  end
109
+
110
+ describe 'with install_options' do
111
+ it 'can parse disable-repo with array of strings' do
112
+ resource[:install_options] = ['--disable-repo=dev*', '--disable-repo=prod*']
113
+ expect(provider).to receive(:execute) do | arr|
114
+ expect(arr[-3]).to eq(["--disable-repo=dev*", "--disable-repo=prod*"])
115
+ end
116
+ provider.install
117
+ end
118
+
119
+ it 'can parse disable-repo with array of hashes' do
120
+ resource[:install_options] = [{'--disable-repo' => 'dev*'}, {'--disable-repo' => 'prod*'}]
121
+ expect(provider).to receive(:execute) do | arr|
122
+ expect(arr[-3]).to eq(["--disable-repo=dev*", "--disable-repo=prod*"])
123
+ end
124
+ provider.install
125
+ end
126
+
127
+ it 'can parse enable-repo with array of strings' do
128
+ resource[:install_options] = ['--enable-repo=dev*', '--enable-repo=prod*']
129
+ expect(provider).to receive(:execute) do | arr|
130
+ expect(arr[-3]).to eq(["--enable-repo=dev*", "--enable-repo=prod*"])
131
+ end
132
+ provider.install
133
+ end
134
+
135
+ it 'can parse enable-repo with array of hashes' do
136
+ resource[:install_options] = [{'--enable-repo' => 'dev*'}, {'--disable-repo' => 'prod*'}]
137
+ expect(provider).to receive(:execute) do | arr|
138
+ expect(arr[-3]).to eq(["--enable-repo=dev*", "--disable-repo=prod*"])
139
+ end
140
+ provider.install
141
+ end
142
+
143
+ it 'can parse enable-repo with single hash' do
144
+ resource[:install_options] = [{'--enable-repo' => 'dev*','--disable-repo' => 'prod*'}]
145
+ expect(provider).to receive(:execute) do | arr|
146
+ expect(arr[-3]).to eq(["--disable-repo=prod*", "--enable-repo=dev*"])
147
+ end
148
+ provider.install
149
+ end
150
+
151
+ it 'can parse enable-repo with empty array' do
152
+ resource[:install_options] = []
153
+ expect(provider).to receive(:execute) do | arr|
154
+ expect(arr[-3]).to eq([])
155
+ end
156
+ provider.install
157
+ end
158
+ end
98
159
  end
99
160
 
100
161
  context "parsing the output of check-update" do
@@ -185,5 +246,236 @@ describe Puppet::Type.type(:package).provider(:yum) do
185
246
  expect(output).not_to include("Random plugin")
186
247
  end
187
248
  end
249
+
250
+ context "with subscription manager enabled " do
251
+ let(:check_update) { File.read(my_fixture("yum-check-update-subscription-manager.txt")) }
252
+ let(:output) { described_class.parse_updates(check_update) }
253
+
254
+ it "parses correctly formatted entries" do
255
+ expect(output['curl.x86_64']).to eq([{:name => 'curl', :epoch => '0', :version => '7.32.0', :release => '10.fc20', :arch => 'x86_64'}])
256
+ end
257
+ end
258
+ end
259
+
260
+ describe 'insync?' do
261
+ context 'when version is not a valid RPM version' do
262
+ let(:is) { '>===a:123' }
263
+
264
+ before do
265
+ resource[:ensure] = is
266
+ end
267
+
268
+ it 'logs a debug message' do
269
+ expect(Puppet).to receive(:debug).with("Cannot parse #{is} as a RPM version range")
270
+ provider.insync?(is)
271
+ end
272
+ end
273
+
274
+ context 'with valid semantic versions' do
275
+ let(:is) { '1:1.2.3.4-5.el4' }
276
+
277
+ it 'returns true if the current version matches the given semantic version' do
278
+ resource[:ensure] = is
279
+ expect(provider).to be_insync(is)
280
+ end
281
+
282
+ it 'returns false if the current version does not match the given semantic version' do
283
+ resource[:ensure] = '999r'
284
+ expect(provider).not_to be_insync(is)
285
+ end
286
+
287
+ it 'no debug logs if the current version matches the given semantic version' do
288
+ resource[:ensure] = is
289
+ expect(Puppet).not_to receive(:debug)
290
+ provider.insync?(is)
291
+ end
292
+
293
+ it 'returns true if current version matches the greater or equal semantic version in ensure' do
294
+ resource[:ensure] = '<=1:1.2.3.4-5.el4'
295
+ expect(provider).to be_insync(is)
296
+ end
297
+
298
+ it 'returns true if current version matches the lesser semantic version in ensure' do
299
+ resource[:ensure] = '>1:1.0.0'
300
+ expect(provider).to be_insync(is)
301
+ end
302
+
303
+ it 'returns true if current version matches two semantic conditions' do
304
+ resource[:ensure] = '>1:1.1.3.4-5.el4 <1:1.3.3.6-5.el4'
305
+ expect(provider).to be_insync(is)
306
+ end
307
+
308
+ it 'returns false if current version does not match matches two semantic conditions' do
309
+ resource[:ensure] = '<1:1.1.3.4-5.el4 <1:1.3.3.6-5.el4'
310
+ expect(provider).not_to be_insync(is)
311
+ end
312
+ end
313
+ end
314
+
315
+ describe 'install' do
316
+ before do
317
+ resource[:ensure] = ensure_value
318
+ allow(Facter).to receive(:value).with(:operatingsystemmajrelease).and_return('7')
319
+ allow(described_class).to receive(:command).with(:cmd).and_return('/usr/bin/yum')
320
+ allow(provider).to receive(:query).twice.and_return(nil, ensure: '18.3.2')
321
+ allow(provider).to receive(:insync?).with('18.3.2').and_return(true)
322
+ end
323
+
324
+ context 'with version range' do
325
+ before do
326
+ allow(provider).to receive(:available_versions).and_return(available_versions)
327
+ end
328
+
329
+ context 'without epoch' do
330
+ let(:ensure_value) { '>18.1 <19' }
331
+ let(:available_versions) { ['17.5.2', '18.0', 'a:23', '18.3', '18.3.2', '19.0', '3:18.4'] }
332
+
333
+ it 'selects best_version' do
334
+ expect(provider).to receive(:execute).with(
335
+ ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :install, 'myresource-18.3.2']
336
+ )
337
+ provider.install
338
+ end
339
+
340
+ context 'when comparing with available packages that do not have epoch' do
341
+ let(:ensure_value) { '>18' }
342
+ let(:available_versions) { ['18.3.3', '3:18.3.2'] }
343
+
344
+ it 'treats no epoch as zero' do
345
+ expect(provider).to receive(:execute).with(
346
+ ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :install, 'myresource-18.3.2']
347
+ )
348
+ provider.install
349
+ end
350
+ end
351
+ end
352
+
353
+ context 'with epoch' do
354
+ let(:ensure_value) { '>18.1 <3:19' }
355
+ let(:available_versions) { ['3:17.5.2', '3:18.0', 'a:23', '18.3.3', '3:18.3.2', '3:19.0', '19.1'] }
356
+
357
+ it 'selects best_version and removes epoch' do
358
+ expect(provider).to receive(:execute).with(
359
+ ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :install, 'myresource-18.3.2']
360
+ )
361
+ provider.install
362
+ end
363
+ end
364
+
365
+ context 'when no suitable version in range' do
366
+ let(:ensure_value) { '>18.1 <19' }
367
+ let(:available_versions) { ['3:17.5.2', '3:18.0', 'a:23' '18.3', '3:18.3.2', '3:19.0', '19.1'] }
368
+
369
+ it 'uses requested version' do
370
+ expect(provider).to receive(:execute).with(
371
+ ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :install, "myresource->18.1 <19"]
372
+ )
373
+ provider.install
374
+ end
375
+
376
+ it 'logs a debug message' do
377
+ allow(provider).to receive(:execute).with(
378
+ ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :install, "myresource->18.1 <19"]
379
+ )
380
+
381
+ expect(Puppet).to receive(:debug).with(
382
+ "No available version for package myresource is included in range >18.1 <19"
383
+ )
384
+ provider.install
385
+ end
386
+ end
387
+ end
388
+
389
+ context 'with fix version' do
390
+ let(:ensure_value) { '1:18.12' }
391
+
392
+ it 'passes the version to yum command' do
393
+ expect(provider).to receive(:execute).with(
394
+ ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :install, "myresource-1:18.12"]
395
+ )
396
+ provider.install
397
+ end
398
+ end
399
+
400
+ context 'when upgrading' do
401
+ let(:ensure_value) { '>18.1 <19' }
402
+ let(:available_versions) { ['17.5.2', '18.0', 'a:23' '18.3', '18.3.2', '19.0', '3:18.4'] }
403
+
404
+ before do
405
+ allow(provider).to receive(:available_versions).and_return(available_versions)
406
+ allow(provider).to receive(:query).twice
407
+ .and_return({ ensure: '17.0' }, { ensure: '18.3.2' })
408
+ end
409
+
410
+ it 'adds update flag to install command' do
411
+ expect(provider).to receive(:execute).with(
412
+ ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', 'update', 'myresource-18.3.2']
413
+ )
414
+ provider.install
415
+ end
416
+ end
417
+
418
+ context 'when dowgrading' do
419
+ let(:ensure_value) { '>18.1 <19' }
420
+ let(:available_versions) { ['17.5.2', '18.0', 'a:23' '18.3', '18.3.2', '19.0', '3:18.4'] }
421
+
422
+ before do
423
+ allow(provider).to receive(:available_versions).and_return(available_versions)
424
+ allow(provider).to receive(:query).twice
425
+ .and_return({ ensure: '19.0' }, { ensure: '18.3.2' })
426
+ end
427
+
428
+ it 'adds downgrade flag to install command' do
429
+ expect(provider).to receive(:execute).with(
430
+ ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :downgrade, 'myresource-18.3.2']
431
+ )
432
+ provider.install
433
+ end
434
+ end
435
+
436
+ context 'on failure' do
437
+ let(:ensure_value) { '20' }
438
+
439
+ context 'when execute command fails' do
440
+ before do
441
+ allow(provider).to receive(:execute).with(
442
+ ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :install, "myresource-20"]
443
+ ).and_return('No package myresource-20 available.')
444
+ end
445
+
446
+ it 'raises Puppet::Error' do
447
+ expect { provider.install }.to \
448
+ raise_error(Puppet::Error, 'Could not find package myresource-20')
449
+ end
450
+ end
451
+
452
+ context 'when package is not found' do
453
+ before do
454
+ allow(provider).to receive(:query)
455
+ allow(provider).to receive(:execute).with(
456
+ ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :install, "myresource-20"]
457
+ )
458
+ end
459
+
460
+ it 'raises Puppet::Error' do
461
+ expect { provider.install }.to \
462
+ raise_error(Puppet::Error, 'Could not find package myresource')
463
+ end
464
+ end
465
+
466
+ context 'when package is not installed' do
467
+ before do
468
+ allow(provider).to receive(:execute).with(
469
+ ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', :install, "myresource-20"]
470
+ )
471
+ allow(provider).to receive(:insync?).and_return(false)
472
+ end
473
+
474
+ it 'raises Puppet::Error' do
475
+ expect { provider.install }.to \
476
+ raise_error(Puppet::Error, 'Failed to update to version 20, got version 18.3.2 instead')
477
+ end
478
+ end
479
+ end
188
480
  end
189
481
  end