puppet 6.12.0 → 6.17.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 (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
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+ require 'puppet/util/package/version/range'
3
+
4
+ class IntegerVersion
5
+ class ValidationFailure < ArgumentError; end
6
+ include Comparable
7
+ REGEX_FULL = '(\d+)'.freeze
8
+ REGEX_FULL_RX = /\A#{REGEX_FULL}\Z/.freeze
9
+
10
+ def self.parse(ver)
11
+ match, version = *ver.match(REGEX_FULL_RX)
12
+ raise ValidationFailure, "Unable to parse '#{ver}' as a version identifier" unless match
13
+
14
+ new(version).freeze
15
+ end
16
+
17
+ attr_reader :version
18
+
19
+ def initialize(version)
20
+ @version = version.to_i
21
+ end
22
+
23
+ def <=>(other)
24
+ @version <=> other.version
25
+ end
26
+ end
27
+
28
+ describe Puppet::Util::Package::Version::Range do
29
+ context 'when creating new version range' do
30
+ it 'should raise unless String is passed' do
31
+ expect { Puppet::Util::Package::Version::Range.parse(:abc, IntegerVersion) }.to raise_error(Puppet::Util::Package::Version::Range::ValidationFailure)
32
+ end
33
+ it 'should raise if operator is not implemented' do
34
+ expect { Puppet::Util::Package::Version::Range.parse('=a', IntegerVersion) }.to raise_error(Puppet::Util::Package::Version::Range::ValidationFailure)
35
+ end
36
+ it 'should raise if operator cannot be parsed' do
37
+ expect { Puppet::Util::Package::Version::Range.parse('~=a', IntegerVersion) }.to raise_error(IntegerVersion::ValidationFailure)
38
+ end
39
+ it 'should raise if version cannot be parsed' do
40
+ expect { Puppet::Util::Package::Version::Range.parse('>=a', IntegerVersion) }.to raise_error(IntegerVersion::ValidationFailure)
41
+ end
42
+ end
43
+
44
+ context 'when creating new version range with regular version' do
45
+ it 'it does not include greater version' do
46
+ vr = Puppet::Util::Package::Version::Range.parse('3', IntegerVersion)
47
+ v = IntegerVersion.parse('4')
48
+ expect(vr.include?(v)).to eql(false)
49
+ end
50
+
51
+ it 'it includes specified version' do
52
+ vr = Puppet::Util::Package::Version::Range.parse('3', IntegerVersion)
53
+ v = IntegerVersion.parse('3')
54
+ expect(vr.include?(v)).to eql(true)
55
+ end
56
+
57
+ it 'it does not include lower version' do
58
+ vr = Puppet::Util::Package::Version::Range.parse('3', IntegerVersion)
59
+ v = IntegerVersion.parse('2')
60
+ expect(vr.include?(v)).to eql(false)
61
+ end
62
+ end
63
+
64
+ context 'when creating new version range with greater or equal operator' do
65
+ it 'it includes greater version' do
66
+ vr = Puppet::Util::Package::Version::Range.parse('>=3', IntegerVersion)
67
+ v = IntegerVersion.parse('4')
68
+ expect(vr.include?(v)).to eql(true)
69
+ end
70
+
71
+ it 'it includes specified version' do
72
+ vr = Puppet::Util::Package::Version::Range.parse('>=3', IntegerVersion)
73
+ v = IntegerVersion.parse('3')
74
+ expect(vr.include?(v)).to eql(true)
75
+ end
76
+
77
+ it 'it does not include lower version' do
78
+ vr = Puppet::Util::Package::Version::Range.parse('>=3', IntegerVersion)
79
+ v = IntegerVersion.parse('2')
80
+ expect(vr.include?(v)).to eql(false)
81
+ end
82
+ end
83
+
84
+ context 'when creating new version range with greater operator' do
85
+ it 'it includes greater version' do
86
+ vr = Puppet::Util::Package::Version::Range.parse('>3', IntegerVersion)
87
+ v = IntegerVersion.parse('10')
88
+ expect(vr.include?(v)).to eql(true)
89
+ end
90
+
91
+ it 'it does not include specified version' do
92
+ vr = Puppet::Util::Package::Version::Range.parse('>3', IntegerVersion)
93
+ v = IntegerVersion.parse('3')
94
+ expect(vr.include?(v)).to eql(false)
95
+ end
96
+
97
+ it 'it does not include lower version' do
98
+ vr = Puppet::Util::Package::Version::Range.parse('>3', IntegerVersion)
99
+ v = IntegerVersion.parse('1')
100
+ expect(vr.include?(v)).to eql(false)
101
+ end
102
+ end
103
+
104
+ context 'when creating new version range with lower or equal operator' do
105
+ it 'it does not include greater version' do
106
+ vr = Puppet::Util::Package::Version::Range.parse('<=3', IntegerVersion)
107
+ v = IntegerVersion.parse('5')
108
+ expect(vr.include?(v)).to eql(false)
109
+ end
110
+
111
+ it 'it includes specified version' do
112
+ vr = Puppet::Util::Package::Version::Range.parse('<=3', IntegerVersion)
113
+ v = IntegerVersion.parse('3')
114
+ expect(vr.include?(v)).to eql(true)
115
+ end
116
+
117
+ it 'it includes lower version' do
118
+ vr = Puppet::Util::Package::Version::Range.parse('<=3', IntegerVersion)
119
+ v = IntegerVersion.parse('1')
120
+ expect(vr.include?(v)).to eql(true)
121
+ end
122
+ end
123
+
124
+ context 'when creating new version range with lower operator' do
125
+ it 'it does not include greater version' do
126
+ vr = Puppet::Util::Package::Version::Range.parse('<3', IntegerVersion)
127
+ v = IntegerVersion.parse('8')
128
+ expect(vr.include?(v)).to eql(false)
129
+ end
130
+
131
+ it 'it does not include specified version' do
132
+ vr = Puppet::Util::Package::Version::Range.parse('<3', IntegerVersion)
133
+ v = IntegerVersion.parse('3')
134
+ expect(vr.include?(v)).to eql(false)
135
+ end
136
+
137
+ it 'it includes lower version' do
138
+ vr = Puppet::Util::Package::Version::Range.parse('<3', IntegerVersion)
139
+ v = IntegerVersion.parse('2')
140
+ expect(vr.include?(v)).to eql(true)
141
+ end
142
+ end
143
+
144
+ context 'when creating new version range with interval' do
145
+ it 'it does not include greater version' do
146
+ vr = Puppet::Util::Package::Version::Range.parse('>3 <=5', IntegerVersion)
147
+ v = IntegerVersion.parse('7')
148
+ expect(vr.include?(v)).to eql(false)
149
+ end
150
+
151
+ it 'it includes specified max interval value' do
152
+ vr = Puppet::Util::Package::Version::Range.parse('>3 <=5', IntegerVersion)
153
+ v = IntegerVersion.parse('5')
154
+ expect(vr.include?(v)).to eql(true)
155
+ end
156
+
157
+ it 'it includes in interval version' do
158
+ vr = Puppet::Util::Package::Version::Range.parse('>3 <=5', IntegerVersion)
159
+ v = IntegerVersion.parse('4')
160
+ expect(vr.include?(v)).to eql(true)
161
+ end
162
+
163
+ it 'it does not include min interval value ' do
164
+ vr = Puppet::Util::Package::Version::Range.parse('>3 <=5', IntegerVersion)
165
+ v = IntegerVersion.parse('3')
166
+ expect(vr.include?(v)).to eql(false)
167
+ end
168
+
169
+ it 'it does not include lower value ' do
170
+ vr = Puppet::Util::Package::Version::Range.parse('>3 <=5', IntegerVersion)
171
+ v = IntegerVersion.parse('2')
172
+ expect(vr.include?(v)).to eql(false)
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,121 @@
1
+ require 'spec_helper'
2
+ require 'puppet/util/package/version/rpm'
3
+
4
+ describe Puppet::Util::Package::Version::Rpm do
5
+
6
+ context "when parsing an invalid version" do
7
+ it "raises ArgumentError" do
8
+ expect { described_class.parse(:absent)}.to raise_error(ArgumentError)
9
+ end
10
+ end
11
+
12
+ context "when creating new version" do
13
+ it "is parsing basic version" do
14
+ v = described_class.parse('1:2.8.8-1.el6')
15
+ expect([v.epoch, v.version, v.release, v.arch ]).to eq(['1', '2.8.8', '1.el6' , nil])
16
+ end
17
+
18
+ it "is parsing no epoch basic version" do
19
+ v = described_class.parse('2.8.8-1.el6')
20
+ expect([v.epoch, v.version, v.release, v.arch ]).to eq([nil, '2.8.8', '1.el6', nil])
21
+ end
22
+
23
+ it "is parsing no epoch basic short version" do
24
+ v = described_class.parse('7.15-8.fc29')
25
+ expect([v.epoch, v.version, v.release, v.arch ]).to eq([nil, '7.15', '8.fc29', nil])
26
+ end
27
+
28
+ it "is parsing no epoch and no release basic version" do
29
+ v = described_class.parse('2.8.8')
30
+ expect([v.epoch, v.version, v.release, v.arch ]).to eq([nil, '2.8.8', nil, nil])
31
+ end
32
+
33
+ it "is parsing no epoch complex version" do
34
+ v = described_class.parse('1.4-0.24.20120830CVS.fc31')
35
+ expect([v.epoch, v.version, v.release, v.arch ]).to eq([nil, '1.4', '0.24.20120830CVS.fc31', nil])
36
+ end
37
+ end
38
+
39
+ context "when comparing two versions" do
40
+ context 'with invalid version' do
41
+ it 'raises ArgumentError' do
42
+ version = described_class.parse('0:1.5.3-3.el6')
43
+ invalid = 'invalid'
44
+ expect { version < invalid }.to \
45
+ raise_error(ArgumentError, 'Cannot compare, as invalid is not a Rpm Version')
46
+ end
47
+ end
48
+
49
+ context 'with valid versions' do
50
+ it "epoch has precedence" do
51
+ lower = described_class.parse('0:1.5.3-3.el6')
52
+ higher = described_class.parse('1:1.7.0-15.fc29')
53
+ expect(lower).to be < higher
54
+ end
55
+
56
+ it 'handles no epoch as 0 epoch' do
57
+ lower = described_class.parse('1.5.3-3.el6')
58
+ higher = described_class.parse('1:1.7.0-15.fc29')
59
+ expect(lower).to be < higher
60
+ end
61
+
62
+ it "handles equals letters-only versions" do
63
+ first = described_class.parse('abd-def')
64
+ second = described_class.parse('abd-def')
65
+ expect(first).to eq(second)
66
+ end
67
+
68
+ it "shorter version is smaller letters-only versions" do
69
+ lower = described_class.parse('ab')
70
+ higher = described_class.parse('abd')
71
+ expect(lower).to be < higher
72
+ end
73
+
74
+ it "shorter version is smaller even with digits" do
75
+ lower = described_class.parse('1.7')
76
+ higher = described_class.parse('1.7.0')
77
+ expect(lower).to be < higher
78
+ end
79
+
80
+ it "shorter version is smaller when number is less" do
81
+ lower = described_class.parse('1.7.0')
82
+ higher = described_class.parse('1.7.1')
83
+ expect(lower).to be < higher
84
+ end
85
+
86
+ it "shorter release is smaller " do
87
+ lower = described_class.parse('1.7.0-11.fc26')
88
+ higher = described_class.parse('1.7.0-11.fc27')
89
+ expect(lower).to be < higher
90
+ end
91
+
92
+ it "release letters are smaller letters-only" do
93
+ lower = described_class.parse('1.7.0-abc')
94
+ higher = described_class.parse('1.7.0-abd')
95
+ expect(lower).to be < higher
96
+ end
97
+
98
+ it "shorter release is smaller" do
99
+ lower = described_class.parse('1.7.0-11.fc2')
100
+ higher = described_class.parse('1.7.0-11.fc17')
101
+ expect(lower).to be < higher
102
+ end
103
+
104
+ it "handles equal release" do
105
+ first = described_class.parse('1.7.0-11.fc27')
106
+ second = described_class.parse('1.7.0-11.fc27')
107
+ expect(first).to eq(second)
108
+ end
109
+ end
110
+
111
+ context 'when one has no epoch' do
112
+ it 'handles no epoch as zero' do
113
+ version1 = described_class.parse('1:1.2')
114
+ version2 = described_class.parse('1.4')
115
+
116
+ expect(version1).to be > version2
117
+ expect(version2).to be < version1
118
+ end
119
+ end
120
+ end
121
+ end
@@ -9,6 +9,49 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
9
9
  before(:each) do
10
10
  @lockfile = tmpfile("lock")
11
11
  @lock = Puppet::Util::Pidlock.new(@lockfile)
12
+ allow(Facter).to receive(:value).with(:kernel).and_return('Linux')
13
+ end
14
+
15
+ describe "#ps pid argument on posix", unless: Puppet::Util::Platform.windows? do
16
+ let(:other_pid) { Process.pid + 1 }
17
+
18
+ before do
19
+ # another process has locked the pidfile
20
+ File.write(@lockfile, other_pid)
21
+
22
+ # and it's still active
23
+ allow(Process).to receive(:kill).with(0, other_pid)
24
+ end
25
+
26
+ it "should fallback to '-p' when ps execution fails with '-eq' on Linux" do
27
+ allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', other_pid, '-o', 'comm=']).and_raise(Puppet::ExecutionFailure, 'Execution of command returned 1: error')
28
+
29
+ expect(Puppet::Util::Execution).to receive(:execute).with(['ps', "-p", other_pid, '-o', 'comm=']).and_return('puppet')
30
+ expect(Puppet::Util::Execution).to receive(:execute).with(['ps', "-p", other_pid, '-o', 'args=']).and_return('puppet')
31
+
32
+ expect(@lock).to be_locked
33
+ end
34
+
35
+ shared_examples_for 'a valid ps argument was provided' do |desired_kernel, ps_argument|
36
+ it "should be '#{ps_argument}' when current kernel is #{desired_kernel}" do
37
+ allow(Facter).to receive(:value).with(:kernel).and_return(desired_kernel)
38
+ allow(Puppet::Util::Execution).to receive(:execute).with(['ps', ps_argument, other_pid, '-o', 'comm=']).and_return('ruby')
39
+ allow(Puppet::Util::Execution).to receive(:execute).with(['ps', ps_argument, other_pid, '-o', 'args=']).and_return('puppet')
40
+ expect(@lock).to be_locked
41
+ end
42
+ end
43
+
44
+ context "when current kernel is Linux" do
45
+ it_should_behave_like 'a valid ps argument was provided', "Linux", "-eq"
46
+ end
47
+
48
+ context "when current kernel is AIX" do
49
+ it_should_behave_like 'a valid ps argument was provided', "AIX", "-T"
50
+ end
51
+
52
+ context "when current kernel is Darwin" do
53
+ it_should_behave_like 'a valid ps argument was provided', "Darwin", "-p"
54
+ end
12
55
  end
13
56
 
14
57
  describe "#lock" do
@@ -22,23 +65,6 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
22
65
 
23
66
  it "should become locked" do
24
67
  @lock.lock
25
- if Puppet::Util::Platform.windows?
26
- allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(@lock.lock_pid).and_return('C:\Program Files\Puppet Labs\Puppet\puppet\bin\ruby.exe')
27
- else
28
- allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', @lock.lock_pid, '-o', 'comm=']).and_return('puppet')
29
- allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', @lock.lock_pid, '-o', 'args=']).and_return('puppet')
30
- end
31
- expect(@lock).to be_locked
32
- end
33
-
34
- it "should become locked if puppet is a gem" do
35
- @lock.lock
36
- unless Puppet::Util::Platform.windows?
37
- expect(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', @lock.lock_pid, '-o', 'comm=']).and_return('ruby')
38
- expect(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', @lock.lock_pid, '-o', 'args=']).and_return('ruby /root/puppet/.bundle/ruby/2.3.0/bin/puppet agent --no-daemonize -v')
39
- else
40
- allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(@lock.lock_pid).and_return('C:\tools\ruby25\bin\ruby.exe')
41
- end
42
68
  expect(@lock).to be_locked
43
69
  end
44
70
 
@@ -117,23 +143,6 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
117
143
  describe "#locked?" do
118
144
  it "should return true if locked" do
119
145
  @lock.lock
120
- if Puppet::Util::Platform.windows?
121
- allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(@lock.lock_pid).and_return('C:\Program Files\Puppet Labs\Puppet\puppet\bin\ruby.exe')
122
- else
123
- allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', @lock.lock_pid, '-o', 'comm=']).and_return('puppet')
124
- allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', @lock.lock_pid, '-o', 'args=']).and_return('puppet')
125
- end
126
- expect(@lock).to be_locked
127
- end
128
-
129
- it "should return true if locked when puppet as gem" do
130
- @lock.lock
131
- unless Puppet::Util::Platform.windows?
132
- expect(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', @lock.lock_pid, '-o', 'comm=']).and_return('ruby')
133
- expect(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', @lock.lock_pid, '-o', 'args=']).and_return('ruby /root/puppet/.bundle/ruby/2.3.0/bin/puppet agent --no-daemonize -v')
134
- else
135
- allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(@lock.lock_pid).and_return('C:\tools\ruby25\bin\ruby.exe')
136
- end
137
146
  expect(@lock).to be_locked
138
147
  end
139
148
 
@@ -179,12 +188,6 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
179
188
  end
180
189
 
181
190
  it "should replace with new locks" do
182
- if Puppet::Util::Platform.windows?
183
- allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(6789).and_return('C:\Program Files\Puppet Labs\Puppet\puppet\bin\ruby.exe')
184
- else
185
- allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 6789, '-o', 'comm=']).and_return('puppet')
186
- allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 6789, '-o', 'args=']).and_return('puppet')
187
- end
188
191
  @lock.lock
189
192
  expect(Puppet::FileSystem.exist?(@lockfile)).to be_truthy
190
193
  expect(@lock.lock_pid).to eq(6789)
@@ -205,6 +208,49 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
205
208
  end
206
209
  end
207
210
 
211
+ describe "with no access to open the process on Windows", :if => Puppet.features.microsoft_windows? do
212
+ before(:each) do
213
+ allow(Process).to receive(:pid).and_return(6789)
214
+ @lock.lock
215
+ allow(Process).to receive(:pid).and_return(1234)
216
+ exception = Puppet::Util::Windows::Error.new('Access Denied', 5) # ERROR_ACCESS_DENIED
217
+ allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(6789).and_raise(exception)
218
+ allow(Process).to receive(:kill).with(0, 6789)
219
+ allow(Process).to receive(:kill).with(0, 1234)
220
+ end
221
+
222
+ it "should be locked" do
223
+ expect(@lock).to be_locked
224
+ end
225
+
226
+ describe "#lock" do
227
+ it "should not be possible" do
228
+ expect(@lock.lock).to be_falsey
229
+ end
230
+
231
+ it "should not overwrite the lock" do
232
+ @lock.lock
233
+ expect(@lock).not_to be_mine
234
+ end
235
+ end
236
+
237
+ describe "#unlock" do
238
+ it "should not be possible" do
239
+ expect(@lock.unlock).to be_falsey
240
+ end
241
+
242
+ it "should not remove the lock file" do
243
+ @lock.unlock
244
+ expect(Puppet::FileSystem.exist?(@lockfile)).to be_truthy
245
+ end
246
+
247
+ it "should still not be our lock" do
248
+ @lock.unlock
249
+ expect(@lock).not_to be_mine
250
+ end
251
+ end
252
+ end
253
+
208
254
  describe "with another process lock" do
209
255
  before(:each) do
210
256
  # fake our pid to be 1234
@@ -212,8 +258,8 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
212
258
  if Puppet::Util::Platform.windows?
213
259
  allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(1234).and_return('C:\Program Files\Puppet Labs\Puppet\puppet\bin\ruby.exe')
214
260
  else
215
- allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 1234, '-o', 'comm=']).and_return('puppet')
216
- allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 1234, '-o', 'args=']).and_return('puppet')
261
+ allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', 1234, '-o', 'comm=']).and_return('puppet')
262
+ allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-eq', 1234, '-o', 'args=']).and_return('puppet')
217
263
  end
218
264
  # lock the file
219
265
  @lock.lock
@@ -233,6 +279,30 @@ describe Puppet::Util::Pidlock, if: !Puppet::Util::Platform.jruby? do
233
279
  expect(@lock).not_to be_mine
234
280
  end
235
281
 
282
+ it "should be locked if the other process is a puppet gem" do
283
+ File.write(@lockfile, "1234")
284
+
285
+ if Puppet::Util::Platform.windows?
286
+ allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(1234).and_return('C:\Program Files\Puppet Labs\Puppet\puppet\bin\ruby.exe')
287
+ else
288
+ allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 1234, '-o', 'comm=']).and_return('ruby')
289
+ allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 1234, '-o', 'args=']).and_return('ruby /root/puppet/.bundle/ruby/2.3.0/bin/puppet agent --no-daemonize -v')
290
+ end
291
+ expect(@lock).to be_locked
292
+ end
293
+
294
+ it "should not be mine if the other process is a puppet gem" do
295
+ File.write(@lockfile, "1234")
296
+
297
+ if Puppet::Util::Platform.windows?
298
+ allow(Puppet::Util::Windows::Process).to receive(:get_process_image_name_by_pid).with(1234).and_return('C:\Program Files\Puppet Labs\Puppet\puppet\bin\ruby.exe')
299
+ else
300
+ allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 1234, '-o', 'comm=']).and_return('ruby')
301
+ allow(Puppet::Util::Execution).to receive(:execute).with(['ps', '-p', 1234, '-o', 'args=']).and_return('ruby /root/puppet/.bundle/ruby/2.3.0/bin/puppet agent --no-daemonize -v')
302
+ end
303
+ expect(@lock).to_not be_mine
304
+ end
305
+
236
306
  describe "#lock" do
237
307
  it "should not be possible" do
238
308
  expect(@lock.lock).to be_falsey