puppet 6.12.0-x86-mingw32 → 6.17.0-x86-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
@@ -88,7 +88,8 @@ describe Puppet::Node::Facts, "when indirecting" do
88
88
  @facts.sanitize
89
89
  fact_value = @facts.values['test']
90
90
  expect(fact_value).to eq(an_alien.to_s)
91
- expect(fact_value.encoding).to eq(Encoding::UTF_8)
91
+ # JRuby 9.2.8 reports US-ASCII which is a subset of UTF-8
92
+ expect(fact_value.encoding).to eq(Encoding::UTF_8).or eq(Encoding::US_ASCII)
92
93
  end
93
94
 
94
95
  end
@@ -417,7 +417,9 @@ end
417
417
 
418
418
  describe Puppet::Node, "when generating the list of names to search through" do
419
419
  before do
420
- @node = Puppet::Node.new("foo.domain.com", :parameters => {"hostname" => "yay", "domain" => "domain.com"})
420
+ Puppet[:strict_hostname_checking] = false
421
+ @node = Puppet::Node.new("foo.domain.com",
422
+ :parameters => {"hostname" => "yay", "domain" => "domain.com"})
421
423
  end
422
424
 
423
425
  it "returns an array of names" do
@@ -448,7 +450,6 @@ describe Puppet::Node, "when generating the list of names to search through" do
448
450
 
449
451
  describe "and :node_name is set to 'cert'" do
450
452
  before do
451
- Puppet[:strict_hostname_checking] = false
452
453
  Puppet[:node_name] = "cert"
453
454
  end
454
455
 
@@ -457,8 +458,11 @@ describe Puppet::Node, "when generating the list of names to search through" do
457
458
  end
458
459
 
459
460
  describe "and strict hostname checking is enabled" do
460
- it "only uses the passed-in key" do
461
+ before do
461
462
  Puppet[:strict_hostname_checking] = true
463
+ end
464
+
465
+ it "only uses the passed-in key" do
462
466
  expect(@node.names).to eq(["foo.domain.com"])
463
467
  end
464
468
  end
@@ -466,7 +470,6 @@ describe Puppet::Node, "when generating the list of names to search through" do
466
470
 
467
471
  describe "and :node_name is set to 'facter'" do
468
472
  before do
469
- Puppet[:strict_hostname_checking] = false
470
473
  Puppet[:node_name] = "facter"
471
474
  end
472
475
 
@@ -12,7 +12,7 @@ describe 'Puppet::Parser::AST::BlockExpression' do
12
12
  NO_SCOPE = nil
13
13
 
14
14
  def depth_probe
15
- StackDepthAST.new({})
15
+ StackDepthAST.new
16
16
  end
17
17
 
18
18
  def sequence_probe(name)
@@ -366,6 +366,13 @@ EOS
366
366
  }.to raise_error(/'Cap\[cap\]' is exported by both 'Prod\[one\]' and 'Prod\[two\]'/)
367
367
  end
368
368
 
369
+ it "issues deprecation warnings" do
370
+ expect {compile_collect_log(MANIFEST_WO_NODE)}.not_to raise_error
371
+ expect(warnings).to include(/Capability Mapping is deprecated/) # there are two of these
372
+ expect(warnings).to include(/Application is deprecated/)
373
+ expect(warnings).to include(/Site Definition is deprecated/)
374
+ end
375
+
369
376
  context "for producing node" do
370
377
  let(:compiled_node) { Puppet::Node.new('first', :environment => env) }
371
378
  let(:compiled_catalog) { compile_to_catalog(MANIFEST, compiled_node)}
@@ -105,7 +105,7 @@ describe Puppet::Parser::Scope do
105
105
 
106
106
  it "should fail if something that isn't a compiler is supplied" do
107
107
  expect {
108
- Puppet::Parser::Scope.new(:compiler => true)
108
+ Puppet::Parser::Scope.new(nil)
109
109
  }.to raise_error(Puppet::DevError, /you must pass a compiler instance/)
110
110
  end
111
111
 
@@ -1578,7 +1578,10 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
1578
1578
  let(:applicator) { double('apply_executor') }
1579
1579
 
1580
1580
  it 'invokes an apply_executor' do
1581
- expect(applicator).to receive(:apply).with(['arg1', 'arg2'], nil, scope).and_return(:result)
1581
+ expect(applicator).to receive(:apply).with(
1582
+ ['arg1', 'arg2'],
1583
+ instance_of(Puppet::Pops::Model::BlockExpression),
1584
+ scope).and_return(:result)
1582
1585
  src = "apply('arg1', 'arg2') { }"
1583
1586
  Puppet.override(apply_executor: applicator) do
1584
1587
  expect(parser.evaluate_string(scope, src)).to eq(:result)
@@ -1595,6 +1598,17 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
1595
1598
  expect(parser.evaluate_string(scope, src)).to eq(:result)
1596
1599
  end
1597
1600
  end
1601
+
1602
+ it 'returns a BlockExpression with an empty apply block' do
1603
+ expect(applicator).to receive(:apply).with(
1604
+ [['arg1']],
1605
+ instance_of(Puppet::Pops::Model::BlockExpression),
1606
+ scope).and_return(:result)
1607
+ src = "apply(['arg1']) { }"
1608
+ Puppet.override(apply_executor: applicator) do
1609
+ expect(parser.evaluate_string(scope, src)).to eq(:result)
1610
+ end
1611
+ end
1598
1612
  end
1599
1613
  end
1600
1614
 
@@ -461,7 +461,7 @@ describe 'loaders' do
461
461
  it "a function with syntax error has helpful error message" do
462
462
  expect {
463
463
  loader.load_typed(typed_name(:function, 'func_with_syntax_error'))
464
- }.to raise_error(/syntax error, unexpected (keyword_)?end/)
464
+ }.to raise_error(/syntax error, unexpected (keyword_|`)?end/)
465
465
  end
466
466
  end
467
467
 
@@ -296,10 +296,15 @@ module Serialization
296
296
  expect(val2).to be_a(Types::PObjectTypeExtension)
297
297
  expect(val2).to eql(val)
298
298
  end
299
+
300
+ it 'with POjbectTypeExtension type being converted' do
301
+ val = { 'ObjectExtension' => type.create(34) }
302
+ expect(to_converter.convert(val))
303
+ .to eq({"ObjectExtension"=>{"__ptype"=>"MyType", "x"=>34}})
304
+ end
299
305
  end
300
306
  end
301
307
 
302
-
303
308
  it 'Array of rich data' do
304
309
  # Sensitive omitted because it doesn't respond to ==
305
310
  val = [
@@ -1334,8 +1334,6 @@ describe 'The type calculator' do
1334
1334
 
1335
1335
  it 'should recognize mapped ruby types' do
1336
1336
  { Integer => PIntegerType::DEFAULT,
1337
- Fixnum => PIntegerType::DEFAULT,
1338
- Bignum => PIntegerType::DEFAULT,
1339
1337
  Float => PFloatType::DEFAULT,
1340
1338
  Numeric => PNumericType::DEFAULT,
1341
1339
  NilClass => PUndefType::DEFAULT,
@@ -2147,14 +2145,6 @@ describe 'The type calculator' do
2147
2145
  end
2148
2146
 
2149
2147
  context 'when converting a ruby class' do
2150
- it 'should yield \'PIntegerType\' for Fixnum' do
2151
- expect(calculator.type(Fixnum).class).to eq(PIntegerType)
2152
- end
2153
-
2154
- it 'should yield \'PIntegerType\' for Bignum' do
2155
- expect(calculator.type(Bignum).class).to eq(PIntegerType)
2156
- end
2157
-
2158
2148
  it 'should yield \'PIntegerType\' for Integer' do
2159
2149
  expect(calculator.type(Integer).class).to eq(PIntegerType)
2160
2150
  end
@@ -2275,7 +2265,7 @@ describe 'The type calculator' do
2275
2265
  it 'should infer PTypeType as the type of ruby classes' do
2276
2266
  class Foo
2277
2267
  end
2278
- [Object, Numeric, Integer, Fixnum, Bignum, Float, String, Regexp, Array, Hash, Foo].each do |c|
2268
+ [Object, Numeric, Integer, Float, String, Regexp, Array, Hash, Foo].each do |c|
2279
2269
  expect(calculator.infer(c).is_a?(PTypeType)).to eq(true)
2280
2270
  end
2281
2271
  end
@@ -486,10 +486,15 @@ describe "validating 4x" do
486
486
  expect(acceptor).to have_issue(Puppet::Pops::Issues::EXPRESSION_NOT_SUPPORTED_WHEN_SCRIPTING)
487
487
  end
488
488
 
489
- it 'produces an error for node expressions' do
489
+ it 'allows node expressions' do
490
490
  acceptor = validate(parse('apply("foo.example.com") { node default {} }'))
491
+ expect(acceptor.error_count).to eql(0)
492
+ end
493
+
494
+ it 'produces an error for node expressions nested in a block' do
495
+ acceptor = validate(parse('apply("foo.example.com") { if true { node default {} } }'))
491
496
  expect(acceptor.error_count).to eql(1)
492
- expect(acceptor).to have_issue(Puppet::Pops::Issues::EXPRESSION_NOT_SUPPORTED_WHEN_SCRIPTING)
497
+ expect(acceptor).to have_issue(Puppet::Pops::Issues::NOT_TOP_LEVEL)
493
498
  end
494
499
 
495
500
  it 'produces an error for resource definitions' do
@@ -418,15 +418,29 @@ bin:2
418
418
  end
419
419
 
420
420
  describe '#ia_module_args' do
421
- it 'returns no arguments if the ia_load_module parameter is not specified' do
421
+ it 'returns no arguments if ia_load_module parameter or forcelocal parameter are not specified' do
422
422
  allow(provider.resource).to receive(:[]).with(:ia_load_module).and_return(nil)
423
+ allow(provider.resource).to receive(:[]).with(:forcelocal).and_return(nil)
423
424
  expect(provider.ia_module_args).to eql([])
424
425
  end
425
426
 
426
- it 'returns the ia_load_module as a CLI argument' do
427
+ it 'returns the ia_load_module as a CLI argument when ia_load_module is specified' do
427
428
  allow(provider.resource).to receive(:[]).with(:ia_load_module).and_return('module')
429
+ allow(provider.resource).to receive(:[]).with(:forcelocal).and_return(nil)
428
430
  expect(provider.ia_module_args).to eql(['-R', 'module'])
429
431
  end
432
+
433
+ it 'returns "files" as a CLI argument when forcelocal is specified' do
434
+ allow(provider.resource).to receive(:[]).with(:ia_load_module).and_return(nil)
435
+ allow(provider.resource).to receive(:[]).with(:forcelocal).and_return(true)
436
+ expect(provider.ia_module_args).to eql(['-R', 'files'])
437
+ end
438
+
439
+ it 'raises argument error when both ia_load_module and forcelocal parameters are set' do
440
+ allow(provider.resource).to receive(:[]).with(:ia_load_module).and_return('files')
441
+ allow(provider.resource).to receive(:[]).with(:forcelocal).and_return(true)
442
+ expect { provider.ia_module_args }.to raise_error(ArgumentError, "Cannot have both 'forcelocal' and 'ia_load_module' at the same time!")
443
+ end
430
444
  end
431
445
 
432
446
  describe '#lscmd' do
@@ -14,10 +14,11 @@ describe Puppet::Type.type(:group).provider(:groupadd) do
14
14
 
15
15
  let(:resource) { Puppet::Type.type(:group).new(:name => 'mygroup', :provider => provider) }
16
16
  let(:provider) { described_class.new(:name => 'mygroup') }
17
+ let(:members) { ['user2', 'user1', 'user3'] }
17
18
 
18
19
  describe "#create" do
19
20
  before do
20
- allow(provider).to receive(:exists?).and_return(false)
21
+ allow(provider).to receive(:exists?).and_return(false)
21
22
  end
22
23
 
23
24
  it "should add -o when allowdupe is enabled and the group is being created" do
@@ -42,77 +43,149 @@ describe Puppet::Type.type(:group).provider(:groupadd) do
42
43
  end
43
44
  end
44
45
 
45
- describe "on systems with the libuser and forcelocal=true" do
46
- before do
47
- described_class.has_feature(:libuser)
48
- resource[:forcelocal] = :true
49
- end
50
-
51
- it "should use lgroupadd instead of groupadd" do
52
- expect(provider).to receive(:execute).with(including('/usr/sbin/lgroupadd'), hash_including(:custom_environment => hash_including('LIBUSER_CONF')))
53
- provider.create
54
- end
46
+ describe "on systems with libuser" do
47
+ describe "with forcelocal=true" do
48
+ before do
49
+ described_class.has_feature(:manages_local_users_and_groups)
50
+ resource[:forcelocal] = :true
51
+ end
55
52
 
56
- it "should NOT pass -o to lgroupadd" do
57
- resource[:allowdupe] = :true
58
- expect(provider).to receive(:execute).with(excluding('-o'), hash_including(:custom_environment => hash_including('LIBUSER_CONF')))
59
- provider.create
53
+ it "should use lgroupadd instead of groupadd" do
54
+ expect(provider).to receive(:execute).with(including('/usr/sbin/lgroupadd'), hash_including(:custom_environment => hash_including('LIBUSER_CONF')))
55
+ provider.create
56
+ end
57
+
58
+ it "should NOT pass -o to lgroupadd" do
59
+ resource[:allowdupe] = :true
60
+ expect(provider).to receive(:execute).with(excluding('-o'), hash_including(:custom_environment => hash_including('LIBUSER_CONF')))
61
+ provider.create
62
+ end
63
+
64
+ it "should raise an exception for duplicate GID if allowdupe is not set and duplicate GIDs exist" do
65
+ resource[:gid] = 505
66
+ allow(provider).to receive(:findgroup).and_return(true)
67
+ expect { provider.create }.to raise_error(Puppet::Error, "GID 505 already exists, use allowdupe to force group creation")
68
+ end
60
69
  end
61
70
 
62
- it "should raise an exception for duplicate GID if allowdupe is not set and duplicate GIDs exist" do
63
- resource[:gid] = 505
64
- allow(provider).to receive(:findgroup).and_return(true)
65
- expect { provider.create }.to raise_error(Puppet::Error, "GID 505 already exists, use allowdupe to force group creation")
66
- end
71
+ describe "with a list of members" do
72
+ before do
73
+ members.each { |m| allow(Etc).to receive(:getpwnam).with(m).and_return(true) }
74
+
75
+ described_class.has_feature(:manages_members)
76
+ resource[:forcelocal] = false
77
+ resource[:members] = members
78
+ end
79
+
80
+ it "should use lgroupmod to add the members" do
81
+ allow(provider).to receive(:execute).with(['/usr/sbin/groupadd', 'mygroup'], hash_including({:failonfail => true, :combine => true, :custom_environment => {}})).and_return(true)
82
+ expect(provider).to receive(:execute).with(['/usr/sbin/lgroupmod', '-M', members.join(','), 'mygroup'], hash_including(:custom_environment => hash_including('LIBUSER_CONF')))
83
+ provider.create
84
+ end
85
+ end
67
86
  end
68
87
  end
69
88
 
70
89
  describe "#modify" do
71
90
  before do
72
- allow(provider).to receive(:exists?).and_return(true)
91
+ allow(provider).to receive(:exists?).and_return(true)
73
92
  end
74
93
 
75
- describe "on systems with the libuser and forcelocal=false" do
76
- before do
77
- described_class.has_feature(:libuser)
78
- resource[:forcelocal] = :false
79
- end
94
+ describe "on systems with libuser" do
95
+ describe "with forcelocal=false" do
96
+ before do
97
+ described_class.has_feature(:manages_local_users_and_groups)
98
+ resource[:forcelocal] = :false
99
+ end
80
100
 
81
- it "should use groupmod" do
82
- expect(provider).to receive(:execute).with(['/usr/sbin/groupmod', '-g', 150, 'mygroup'], hash_including({:failonfail => true, :combine => true, :custom_environment => {}}))
83
- provider.gid = 150
84
- end
101
+ it "should use groupmod" do
102
+ expect(provider).to receive(:execute).with(['/usr/sbin/groupmod', '-g', 150, 'mygroup'], hash_including({:failonfail => true, :combine => true, :custom_environment => {}}))
103
+ provider.gid = 150
104
+ end
85
105
 
86
- it "should pass -o to groupmod" do
87
- resource[:allowdupe] = :true
88
- expect(provider).to receive(:execute).with(['/usr/sbin/groupmod', '-g', 150, '-o', 'mygroup'], hash_including({:failonfail => true, :combine => true, :custom_environment => {}}))
89
- provider.gid = 150
106
+ it "should pass -o to groupmod" do
107
+ resource[:allowdupe] = :true
108
+ expect(provider).to receive(:execute).with(['/usr/sbin/groupmod', '-g', 150, '-o', 'mygroup'], hash_including({:failonfail => true, :combine => true, :custom_environment => {}}))
109
+ provider.gid = 150
110
+ end
90
111
  end
91
- end
92
112
 
93
- describe "on systems with the libuser and forcelocal=true" do
94
- before do
95
- described_class.has_feature(:libuser)
96
- resource[:forcelocal] = :true
97
- end
113
+ describe "with forcelocal=true" do
114
+ before do
115
+ described_class.has_feature(:manages_local_users_and_groups)
116
+ resource[:forcelocal] = :true
117
+ end
98
118
 
99
- it "should use lgroupmod instead of groupmod" do
100
- expect(provider).to receive(:execute).with(['/usr/sbin/lgroupmod', '-g', 150, 'mygroup'], hash_including(:custom_environment => hash_including('LIBUSER_CONF')))
101
- provider.gid = 150
102
- end
119
+ it "should use lgroupmod instead of groupmod" do
120
+ expect(provider).to receive(:execute).with(['/usr/sbin/lgroupmod', '-g', 150, 'mygroup'], hash_including(:custom_environment => hash_including('LIBUSER_CONF')))
121
+ provider.gid = 150
122
+ end
123
+
124
+ it "should NOT pass -o to lgroupmod" do
125
+ resource[:allowdupe] = :true
126
+ expect(provider).to receive(:execute).with(['/usr/sbin/lgroupmod', '-g', 150, 'mygroup'], hash_including(:custom_environment => hash_including('LIBUSER_CONF')))
127
+ provider.gid = 150
128
+ end
103
129
 
104
- it "should NOT pass -o to lgroupmod" do
105
- resource[:allowdupe] = :true
106
- expect(provider).to receive(:execute).with(['/usr/sbin/lgroupmod', '-g', 150, 'mygroup'], hash_including(:custom_environment => hash_including('LIBUSER_CONF')))
107
- provider.gid = 150
130
+ it "should raise an exception for duplicate GID if allowdupe is not set and duplicate GIDs exist" do
131
+ resource[:gid] = 150
132
+ resource[:allowdupe] = :false
133
+ allow(provider).to receive(:findgroup).and_return(true)
134
+ expect { provider.gid = 150 }.to raise_error(Puppet::Error, "GID 150 already exists, use allowdupe to force group creation")
135
+ end
108
136
  end
109
137
 
110
- it "should raise an exception for duplicate GID if allowdupe is not set and duplicate GIDs exist" do
111
- resource[:gid] = 150
112
- resource[:allowdupe] = :false
113
- allow(provider).to receive(:findgroup).and_return(true)
114
- expect { provider.gid = 150 }.to raise_error(Puppet::Error, "GID 150 already exists, use allowdupe to force group creation")
115
- end
138
+ describe "with members=something" do
139
+ before do
140
+ described_class.has_feature(:manages_members)
141
+ allow(Etc).to receive(:getpwnam).and_return(true)
142
+ resource[:members] = members
143
+ end
144
+
145
+ describe "with auth_membership on" do
146
+ before { resource[:auth_membership] = true }
147
+
148
+ it "should purge existing users before adding" do
149
+ allow(provider).to receive(:members).and_return(members)
150
+ expect(provider).to receive(:localmodify).with('-m', members.join(','), 'mygroup')
151
+ provider.modifycmd(:members, ['user1'])
152
+ end
153
+ end
154
+
155
+ describe "with auth_membership off" do
156
+ before { resource[:auth_membership] = false }
157
+
158
+ it "should add to the existing users" do
159
+ new_members = ['user1', 'user2', 'user3', 'user4']
160
+ allow(provider).to receive(:members).and_return(members)
161
+ expect(provider).not_to receive(:localmodify).with('-m', members.join(','), 'mygroup')
162
+ expect(provider).to receive(:execute).with(['/usr/sbin/lgroupmod', '-M', new_members.join(','), 'mygroup'], kind_of(Hash))
163
+ provider.members = new_members
164
+ end
165
+ end
166
+
167
+ it "should validate members" do
168
+ expect(Etc).to receive(:getpwnam).with('user3').and_return(true)
169
+ provider.modifycmd(:members, ['user3'])
170
+ end
171
+
172
+ it "should validate members list " do
173
+ expect(Etc).to receive(:getpwnam).with('user3').and_return(true)
174
+ expect(Etc).to receive(:getpwnam).with('user4').and_return(true)
175
+ provider.modifycmd(:members, ['user3', 'user4'])
176
+ end
177
+
178
+ it "should validate members list separated by commas" do
179
+ expect(Etc).to receive(:getpwnam).with('user3').and_return(true)
180
+ expect(Etc).to receive(:getpwnam).with('user4').and_return(true)
181
+ provider.modifycmd(:members, ['user3, user4'])
182
+ end
183
+
184
+ it "should raise is validation fails" do
185
+ expect(Etc).to receive(:getpwnam).with('user3').and_throw(ArgumentError)
186
+ expect { provider.modifycmd(:members, ['user3']) }.to raise_error(ArgumentError)
187
+ end
188
+ end
116
189
  end
117
190
  end
118
191
 
@@ -124,6 +197,35 @@ describe Puppet::Type.type(:group).provider(:groupadd) do
124
197
  end
125
198
  end
126
199
 
200
+ describe "#findgroup" do
201
+ before { allow(File).to receive(:read).with('/etc/group').and_return(content) }
202
+
203
+ let(:content) { "sample_group_name:sample_password:sample_gid:sample_user_list" }
204
+ let(:output) do
205
+ {
206
+ group_name: 'sample_group_name',
207
+ password: 'sample_password',
208
+ gid: 'sample_gid',
209
+ user_list: 'sample_user_list',
210
+ }
211
+ end
212
+
213
+ [:group_name, :password, :gid, :user_list].each do |key|
214
+ it "finds a group by #{key} when asked" do
215
+ expect(provider.send(:findgroup, key, "sample_#{key}")).to eq(output)
216
+ end
217
+ end
218
+
219
+ it "returns false when specified key/value pair is not found" do
220
+ expect(provider.send(:findgroup, :group_name, 'invalid_group_name')).to eq(false)
221
+ end
222
+
223
+ it "reads the group file only once per resource" do
224
+ expect(File).to receive(:read).with('/etc/group').once
225
+ 5.times { provider.send(:findgroup, :group_name, 'sample_group_name') }
226
+ end
227
+ end
228
+
127
229
  describe "#delete" do
128
230
  before do
129
231
  allow(provider).to receive(:exists?).and_return(true)
@@ -131,7 +233,7 @@ describe Puppet::Type.type(:group).provider(:groupadd) do
131
233
 
132
234
  describe "on systems with the libuser and forcelocal=false" do
133
235
  before do
134
- described_class.has_feature(:libuser)
236
+ described_class.has_feature(:manages_local_users_and_groups)
135
237
  resource[:forcelocal] = :false
136
238
  end
137
239
 
@@ -143,7 +245,7 @@ describe Puppet::Type.type(:group).provider(:groupadd) do
143
245
 
144
246
  describe "on systems with the libuser and forcelocal=true" do
145
247
  before do
146
- described_class.has_feature(:libuser)
248
+ described_class.has_feature(:manages_local_users_and_groups)
147
249
  resource[:forcelocal] = :true
148
250
  end
149
251
 
@@ -153,4 +255,27 @@ describe Puppet::Type.type(:group).provider(:groupadd) do
153
255
  end
154
256
  end
155
257
  end
258
+
259
+ describe "group type :members property helpers" do
260
+ describe "#members_to_s" do
261
+ it "should return an empty string on non-array input" do
262
+ [Object.new, {}, 1, :symbol, ''].each do |input|
263
+ expect(provider.members_to_s(input)).to be_empty
264
+ end
265
+ end
266
+
267
+ it "should return an empty string on empty or nil users" do
268
+ expect(provider.members_to_s([])).to be_empty
269
+ expect(provider.members_to_s(nil)).to be_empty
270
+ end
271
+
272
+ it "should return a user string for a single user" do
273
+ expect(provider.members_to_s(['user1'])).to eq('user1')
274
+ end
275
+
276
+ it "should return a user string for multiple users" do
277
+ expect(provider.members_to_s(['user1', 'user2'])).to eq('user1,user2')
278
+ end
279
+ end
280
+ end
156
281
  end