puppet 6.11.1 → 6.16.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (395) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +3 -8
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +39 -36
  6. data/README.md +17 -24
  7. data/ext/build_defaults.yaml +1 -0
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/windows/service/daemon.rb +25 -20
  10. data/lib/puppet.rb +52 -13
  11. data/lib/puppet/agent.rb +20 -14
  12. data/lib/puppet/application/agent.rb +12 -14
  13. data/lib/puppet/application/describe.rb +7 -5
  14. data/lib/puppet/application/device.rb +2 -2
  15. data/lib/puppet/application/filebucket.rb +19 -15
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/resource.rb +1 -1
  18. data/lib/puppet/application/ssl.rb +4 -4
  19. data/lib/puppet/concurrent.rb +2 -0
  20. data/lib/puppet/concurrent/lock.rb +16 -0
  21. data/lib/puppet/concurrent/synchronized.rb +15 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
  23. data/lib/puppet/configurer.rb +85 -83
  24. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  25. data/lib/puppet/context/trusted_information.rb +14 -8
  26. data/lib/puppet/daemon.rb +13 -27
  27. data/lib/puppet/defaults.rb +158 -40
  28. data/lib/puppet/environments.rb +30 -20
  29. data/lib/puppet/error.rb +9 -1
  30. data/lib/puppet/face/facts.rb +8 -5
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/plugin.rb +2 -2
  34. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  35. data/lib/puppet/file_system/file_impl.rb +13 -9
  36. data/lib/puppet/file_system/memory_file.rb +6 -0
  37. data/lib/puppet/file_system/memory_impl.rb +13 -0
  38. data/lib/puppet/file_system/uniquefile.rb +4 -0
  39. data/lib/puppet/file_system/windows.rb +7 -10
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/forge/errors.rb +2 -2
  42. data/lib/puppet/forge/repository.rb +31 -86
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/camelcase.rb +2 -2
  45. data/lib/puppet/functions/epp.rb +4 -4
  46. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/find_file.rb +9 -9
  49. data/lib/puppet/functions/find_template.rb +63 -0
  50. data/lib/puppet/functions/inline_epp.rb +5 -5
  51. data/lib/puppet/functions/reduce.rb +2 -4
  52. data/lib/puppet/http.rb +7 -0
  53. data/lib/puppet/http/client.rb +341 -54
  54. data/lib/puppet/http/errors.rb +2 -0
  55. data/lib/puppet/http/external_client.rb +90 -0
  56. data/lib/puppet/http/redirector.rb +34 -0
  57. data/lib/puppet/http/resolver.rb +57 -1
  58. data/lib/puppet/http/resolver/server_list.rb +98 -0
  59. data/lib/puppet/http/resolver/settings.rb +23 -2
  60. data/lib/puppet/http/resolver/srv.rb +36 -4
  61. data/lib/puppet/http/response.rb +68 -1
  62. data/lib/puppet/http/retry_after_handler.rb +39 -0
  63. data/lib/puppet/http/service.rb +179 -3
  64. data/lib/puppet/http/service/ca.rb +84 -21
  65. data/lib/puppet/http/service/compiler.rb +319 -0
  66. data/lib/puppet/http/service/file_server.rb +206 -0
  67. data/lib/puppet/http/service/report.rb +66 -0
  68. data/lib/puppet/http/session.rb +106 -31
  69. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  70. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  71. data/lib/puppet/indirector/facts/rest.rb +42 -0
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  73. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  74. data/lib/puppet/indirector/file_content/http.rb +5 -0
  75. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  76. data/lib/puppet/indirector/file_metadata/http.rb +4 -4
  77. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  78. data/lib/puppet/indirector/json.rb +1 -1
  79. data/lib/puppet/indirector/msgpack.rb +1 -1
  80. data/lib/puppet/indirector/node/rest.rb +24 -0
  81. data/lib/puppet/indirector/report/rest.rb +19 -0
  82. data/lib/puppet/indirector/report/yaml.rb +23 -0
  83. data/lib/puppet/indirector/rest.rb +12 -0
  84. data/lib/puppet/indirector/status/rest.rb +18 -0
  85. data/lib/puppet/loaders.rb +6 -0
  86. data/lib/puppet/metatype/manager.rb +80 -80
  87. data/lib/puppet/network/http/base_pool.rb +19 -1
  88. data/lib/puppet/network/http/compression.rb +7 -0
  89. data/lib/puppet/network/http/connection.rb +6 -0
  90. data/lib/puppet/network/http/connection_adapter.rb +182 -0
  91. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  92. data/lib/puppet/network/http/pool.rb +13 -6
  93. data/lib/puppet/network/http_pool.rb +2 -1
  94. data/lib/puppet/node/environment.rb +24 -8
  95. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  96. data/lib/puppet/pal/pal_impl.rb +9 -29
  97. data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
  98. data/lib/puppet/parser/compiler.rb +42 -32
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/epp.rb +3 -3
  101. data/lib/puppet/parser/functions/filter.rb +1 -0
  102. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  105. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/lookup/invocation.rb +10 -3
  109. data/lib/puppet/pops/model/pn_transformer.rb +5 -9
  110. data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
  111. data/lib/puppet/pops/serialization/json_path.rb +3 -3
  112. data/lib/puppet/pops/time/timespan.rb +3 -5
  113. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  114. data/lib/puppet/pops/types/string_converter.rb +6 -9
  115. data/lib/puppet/pops/types/type_calculator.rb +30 -10
  116. data/lib/puppet/pops/types/type_formatter.rb +9 -11
  117. data/lib/puppet/pops/types/type_parser.rb +3 -3
  118. data/lib/puppet/pops/validation/checker4_0.rb +1 -1
  119. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  120. data/lib/puppet/provider/aix_object.rb +4 -2
  121. data/lib/puppet/provider/group/aix.rb +1 -0
  122. data/lib/puppet/provider/group/groupadd.rb +57 -24
  123. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +78 -4
  126. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  127. data/lib/puppet/provider/package/dpkg.rb +14 -7
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +41 -7
  130. data/lib/puppet/provider/package/openbsd.rb +13 -1
  131. data/lib/puppet/provider/package/pacman.rb +2 -5
  132. data/lib/puppet/provider/package/pip.rb +143 -48
  133. data/lib/puppet/provider/package/pip3.rb +0 -2
  134. data/lib/puppet/provider/package/pkg.rb +18 -5
  135. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  136. data/lib/puppet/provider/package/pkgng.rb +16 -4
  137. data/lib/puppet/provider/package/portage.rb +5 -5
  138. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  139. data/lib/puppet/provider/package/rpm.rb +6 -213
  140. data/lib/puppet/provider/package/yum.rb +108 -24
  141. data/lib/puppet/provider/package/zypper.rb +59 -1
  142. data/lib/puppet/provider/package_targetable.rb +5 -4
  143. data/lib/puppet/provider/service/systemd.rb +23 -5
  144. data/lib/puppet/provider/user/aix.rb +1 -0
  145. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  146. data/lib/puppet/provider/user/hpux.rb +1 -1
  147. data/lib/puppet/provider/user/useradd.rb +11 -8
  148. data/lib/puppet/reports/http.rb +13 -9
  149. data/lib/puppet/reports/store.rb +1 -1
  150. data/lib/puppet/resource/type_collection.rb +20 -16
  151. data/lib/puppet/runtime.rb +32 -1
  152. data/lib/puppet/settings.rb +4 -0
  153. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  154. data/lib/puppet/ssl.rb +1 -0
  155. data/lib/puppet/ssl/certificate.rb +2 -1
  156. data/lib/puppet/ssl/host.rb +4 -4
  157. data/lib/puppet/ssl/oids.rb +1 -0
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -0
  159. data/lib/puppet/ssl/state_machine.rb +81 -35
  160. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  161. data/lib/puppet/test/test_helper.rb +7 -1
  162. data/lib/puppet/transaction.rb +33 -11
  163. data/lib/puppet/transaction/report.rb +2 -2
  164. data/lib/puppet/transaction/resource_harness.rb +1 -1
  165. data/lib/puppet/type.rb +7 -2
  166. data/lib/puppet/type/file.rb +13 -0
  167. data/lib/puppet/type/file/data_sync.rb +5 -1
  168. data/lib/puppet/type/file/source.rb +49 -58
  169. data/lib/puppet/type/group.rb +5 -4
  170. data/lib/puppet/type/package.rb +102 -10
  171. data/lib/puppet/type/service.rb +6 -8
  172. data/lib/puppet/type/user.rb +6 -30
  173. data/lib/puppet/util.rb +34 -11
  174. data/lib/puppet/util/at_fork.rb +1 -1
  175. data/lib/puppet/util/autoload.rb +4 -18
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/logging.rb +30 -18
  179. data/lib/puppet/util/package/version/debian.rb +175 -0
  180. data/lib/puppet/util/package/version/gem.rb +15 -0
  181. data/lib/puppet/util/package/version/pip.rb +167 -0
  182. data/lib/puppet/util/package/version/range.rb +53 -0
  183. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  185. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  187. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  188. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  189. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  190. data/lib/puppet/util/package/version/rpm.rb +73 -0
  191. data/lib/puppet/util/pidlock.rb +36 -10
  192. data/lib/puppet/util/platform.rb +5 -0
  193. data/lib/puppet/util/plist.rb +6 -0
  194. data/lib/puppet/util/rpm_compare.rb +193 -0
  195. data/lib/puppet/util/storage.rb +0 -1
  196. data/lib/puppet/util/windows/adsi.rb +50 -20
  197. data/lib/puppet/util/windows/process.rb +15 -14
  198. data/lib/puppet/util/windows/security.rb +1 -0
  199. data/lib/puppet/util/windows/sid.rb +3 -3
  200. data/lib/puppet/util/yaml.rb +1 -1
  201. data/lib/puppet/version.rb +1 -1
  202. data/lib/puppet/x509/cert_provider.rb +9 -5
  203. data/locales/puppet.pot +640 -521
  204. data/man/man5/puppet.conf.5 +88 -9
  205. data/man/man8/puppet-agent.8 +6 -6
  206. data/man/man8/puppet-apply.8 +1 -1
  207. data/man/man8/puppet-catalog.8 +1 -1
  208. data/man/man8/puppet-config.8 +1 -1
  209. data/man/man8/puppet-describe.8 +1 -1
  210. data/man/man8/puppet-device.8 +2 -2
  211. data/man/man8/puppet-doc.8 +1 -1
  212. data/man/man8/puppet-epp.8 +1 -1
  213. data/man/man8/puppet-facts.8 +1 -1
  214. data/man/man8/puppet-filebucket.8 +17 -2
  215. data/man/man8/puppet-generate.8 +1 -1
  216. data/man/man8/puppet-help.8 +6 -3
  217. data/man/man8/puppet-key.8 +1 -1
  218. data/man/man8/puppet-lookup.8 +1 -1
  219. data/man/man8/puppet-man.8 +1 -1
  220. data/man/man8/puppet-module.8 +4 -1
  221. data/man/man8/puppet-node.8 +1 -1
  222. data/man/man8/puppet-parser.8 +1 -1
  223. data/man/man8/puppet-plugin.8 +1 -1
  224. data/man/man8/puppet-report.8 +1 -1
  225. data/man/man8/puppet-resource.8 +1 -1
  226. data/man/man8/puppet-script.8 +1 -1
  227. data/man/man8/puppet-ssl.8 +2 -2
  228. data/man/man8/puppet-status.8 +1 -1
  229. data/man/man8/puppet.8 +2 -2
  230. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  231. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  232. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  233. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  234. data/spec/fixtures/unit/forge/bacula.json +76 -0
  235. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  236. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  238. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  239. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  241. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  242. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  243. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  244. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  247. data/spec/integration/application/agent_spec.rb +394 -0
  248. data/spec/integration/application/apply_spec.rb +132 -3
  249. data/spec/integration/application/filebucket_spec.rb +190 -0
  250. data/spec/integration/application/plugin_spec.rb +73 -0
  251. data/spec/integration/configurer_spec.rb +26 -7
  252. data/spec/integration/http/client_spec.rb +154 -0
  253. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  254. data/spec/integration/indirector/report/yaml.rb +83 -0
  255. data/spec/integration/module_tool/forge_spec.rb +51 -0
  256. data/spec/integration/network/http_pool_spec.rb +76 -20
  257. data/spec/integration/node/environment_spec.rb +15 -0
  258. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  259. data/spec/lib/puppet/test_ca.rb +2 -2
  260. data/spec/lib/puppet_spec/https.rb +20 -9
  261. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  262. data/spec/shared_contexts/https.rb +29 -0
  263. data/spec/spec_helper.rb +6 -2
  264. data/spec/unit/agent_spec.rb +80 -26
  265. data/spec/unit/application/agent_spec.rb +9 -5
  266. data/spec/unit/application/apply_spec.rb +2 -12
  267. data/spec/unit/application/describe_spec.rb +88 -50
  268. data/spec/unit/application/device_spec.rb +2 -2
  269. data/spec/unit/application/filebucket_spec.rb +22 -2
  270. data/spec/unit/application/resource_spec.rb +2 -2
  271. data/spec/unit/concurrent/lock_spec.rb +29 -0
  272. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  273. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  274. data/spec/unit/configurer_spec.rb +400 -406
  275. data/spec/unit/context/trusted_information_spec.rb +17 -0
  276. data/spec/unit/daemon_spec.rb +5 -64
  277. data/spec/unit/defaults_spec.rb +38 -4
  278. data/spec/unit/environments_spec.rb +65 -28
  279. data/spec/unit/face/facts_spec.rb +24 -20
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/plugin_spec.rb +12 -10
  282. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  283. data/spec/unit/file_system_spec.rb +26 -2
  284. data/spec/unit/forge/errors_spec.rb +1 -1
  285. data/spec/unit/forge/forge_spec.rb +12 -54
  286. data/spec/unit/forge/module_release_spec.rb +19 -6
  287. data/spec/unit/forge/repository_spec.rb +63 -157
  288. data/spec/unit/forge_spec.rb +46 -116
  289. data/spec/unit/functions/find_template_spec.rb +69 -0
  290. data/spec/unit/functions/lookup_spec.rb +13 -0
  291. data/spec/unit/http/client_spec.rb +395 -27
  292. data/spec/unit/http/external_client_spec.rb +201 -0
  293. data/spec/unit/http/resolver_spec.rb +81 -12
  294. data/spec/unit/http/response_spec.rb +69 -0
  295. data/spec/unit/http/service/ca_spec.rb +100 -7
  296. data/spec/unit/http/service/compiler_spec.rb +627 -0
  297. data/spec/unit/http/service/file_server_spec.rb +308 -0
  298. data/spec/unit/http/service/report_spec.rb +118 -0
  299. data/spec/unit/http/service_spec.rb +117 -4
  300. data/spec/unit/http/session_spec.rb +237 -19
  301. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  302. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  303. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  304. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  305. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  306. data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
  307. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  308. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  309. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  310. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  311. data/spec/unit/indirector/rest_spec.rb +13 -0
  312. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  313. data/spec/unit/network/http/connection_spec.rb +549 -176
  314. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  315. data/spec/unit/network/http/pool_spec.rb +89 -11
  316. data/spec/unit/network/http_pool_spec.rb +63 -57
  317. data/spec/unit/network/http_spec.rb +1 -1
  318. data/spec/unit/node/environment_spec.rb +16 -0
  319. data/spec/unit/node/facts_spec.rb +2 -1
  320. data/spec/unit/node_spec.rb +7 -4
  321. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  322. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  323. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  324. data/spec/unit/provider/aix_object_spec.rb +16 -2
  325. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  326. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  327. data/spec/unit/provider/package/aix_spec.rb +29 -0
  328. data/spec/unit/provider/package/apt_spec.rb +43 -2
  329. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  330. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  331. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  332. data/spec/unit/provider/package/gem_spec.rb +40 -0
  333. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  334. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  335. data/spec/unit/provider/package/pip_spec.rb +68 -19
  336. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  337. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  338. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  339. data/spec/unit/provider/package/portage_spec.rb +9 -4
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  341. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  342. data/spec/unit/provider/package/yum_spec.rb +292 -0
  343. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  344. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  345. data/spec/unit/provider/service/init_spec.rb +1 -0
  346. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  347. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  348. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  349. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  350. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  351. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  352. data/spec/unit/provider/user/useradd_spec.rb +21 -8
  353. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  354. data/spec/unit/puppet_pal_2pec.rb +0 -26
  355. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  356. data/spec/unit/puppet_spec.rb +47 -0
  357. data/spec/unit/reports/http_spec.rb +70 -52
  358. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  359. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  360. data/spec/unit/ssl/certificate_spec.rb +7 -0
  361. data/spec/unit/ssl/host_spec.rb +4 -2
  362. data/spec/unit/ssl/oids_spec.rb +1 -0
  363. data/spec/unit/ssl/ssl_provider_spec.rb +71 -0
  364. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  365. data/spec/unit/transaction/persistence_spec.rb +1 -10
  366. data/spec/unit/transaction/report_spec.rb +4 -0
  367. data/spec/unit/transaction_spec.rb +45 -1
  368. data/spec/unit/type/file/content_spec.rb +9 -3
  369. data/spec/unit/type/file/ensure_spec.rb +1 -2
  370. data/spec/unit/type/file/source_spec.rb +86 -35
  371. data/spec/unit/type/package_spec.rb +8 -0
  372. data/spec/unit/type/service_spec.rb +9 -8
  373. data/spec/unit/type/user_spec.rb +1 -2
  374. data/spec/unit/util/at_fork_spec.rb +3 -2
  375. data/spec/unit/util/autoload_spec.rb +2 -1
  376. data/spec/unit/util/log/destinations_spec.rb +1 -29
  377. data/spec/unit/util/log_spec.rb +0 -138
  378. data/spec/unit/util/logging_spec.rb +200 -0
  379. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  380. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  381. data/spec/unit/util/package/version/range_spec.rb +175 -0
  382. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  383. data/spec/unit/util/pidlock_spec.rb +112 -42
  384. data/spec/unit/util/plist_spec.rb +20 -0
  385. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  386. data/spec/unit/util/storage_spec.rb +1 -8
  387. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  388. data/spec/unit/util/windows/sid_spec.rb +2 -2
  389. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  390. data/tasks/generate_cert_fixtures.rake +15 -1
  391. data/tasks/manpages.rake +6 -35
  392. metadata +92 -12
  393. data/COMMITTERS.md +0 -244
  394. data/spec/integration/faces/plugin_spec.rb +0 -61
  395. data/spec/lib/puppet_spec/validators.rb +0 -37
@@ -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
 
@@ -478,21 +478,26 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
478
478
  }.each do |source, coerced_val|
479
479
  it "should warn about numeric coercion in '#{source}' when strict = warning" do
480
480
  Puppet[:strict] = :warning
481
+ expect(Puppet::Pops::Evaluator::Runtime3Support::EvaluationError).not_to receive(:new)
481
482
  collect_notices(source)
482
483
  expect(warnings).to include(/The string '#{coerced_val}' was automatically coerced to the numerical value #{coerced_val}/)
483
484
  end
484
485
 
485
486
  it "should not warn about numeric coercion in '#{source}' if strict = off" do
486
487
  Puppet[:strict] = :off
488
+ expect(Puppet::Pops::Evaluator::Runtime3Support::EvaluationError).not_to receive(:new)
487
489
  collect_notices(source)
488
490
  expect(warnings).to_not include(/The string '#{coerced_val}' was automatically coerced to the numerical value #{coerced_val}/)
489
491
  end
490
492
 
491
493
  it "should error when finding numeric coercion in '#{source}' if strict = error" do
492
494
  Puppet[:strict] = :error
493
- expect { parser.evaluate_string(scope, source, __FILE__) }.to raise_error(
494
- /The string '#{coerced_val}' was automatically coerced to the numerical value #{coerced_val}/
495
- )
495
+ expect {
496
+ parser.evaluate_string(scope, source, __FILE__)
497
+ }.to raise_error {|error|
498
+ expect(error.message).to match(/The string '#{coerced_val}' was automatically coerced to the numerical value #{coerced_val}/)
499
+ expect(error.backtrace.first).to match(/runtime3_support\.rb.+optionally_fail/)
500
+ }
496
501
  end
497
502
  end
498
503
 
@@ -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 = [
@@ -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
@@ -33,13 +33,18 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
33
33
  let(:user1) { double(:account => 'user1', :domain => '.', :sid => 'user1sid') }
34
34
  let(:user2) { double(:account => 'user2', :domain => '.', :sid => 'user2sid') }
35
35
  let(:user3) { double(:account => 'user3', :domain => '.', :sid => 'user3sid') }
36
+ let(:user_without_domain) { double(:account => 'user_without_domain', :domain => nil, :sid => 'user_without_domain_sid') }
37
+
36
38
  let(:invalid_user) { SecureRandom.uuid }
39
+ let(:invalid_user_principal) { double(:account => "#{invalid_user}", :domain => nil, :sid => "#{invalid_user}") }
37
40
 
38
41
  before :each do
39
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1').and_return(user1)
40
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2').and_return(user2)
41
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3').and_return(user3)
42
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1', any_args).and_return(user1)
43
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2', any_args).and_return(user2)
44
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3', any_args).and_return(user3)
45
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user_without_domain', any_args).and_return(user_without_domain)
42
46
  allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with(invalid_user).and_return(nil)
47
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with(invalid_user, true).and_return(invalid_user_principal)
43
48
  end
44
49
 
45
50
  describe "#members_insync?" do
@@ -199,7 +204,15 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
199
204
  ]
200
205
  expect(provider.members_insync?(current, ['user2','user1'])).to be_truthy
201
206
  end
207
+
208
+ it "should return true even if a current user is unresolvable if should is included" do
209
+ current = [
210
+ "#{invalid_user}",
211
+ 'user2',
212
+ ]
213
+ expect(provider.members_insync?(current, ['user2'])).to be_truthy
202
214
  end
215
+ end
203
216
  end
204
217
 
205
218
  describe "#members_to_s" do
@@ -222,8 +235,8 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
222
235
  expect(provider.members_to_s(['user1', 'user2'])).to eq('.\user1,.\user2')
223
236
  end
224
237
 
225
- it "should return the username when it cannot be resolved to a SID (for the sake of resource_harness error messages)" do
226
- expect(provider.members_to_s([invalid_user])).to eq("#{invalid_user}")
238
+ it "should return a user string without domain if domain is not set" do
239
+ expect(provider.members_to_s(['user_without_domain'])).to eq('user_without_domain')
227
240
  end
228
241
 
229
242
  it "should return the username when it cannot be resolved to a SID (for the sake of resource_harness error messages)" do
@@ -237,10 +250,14 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
237
250
  let(:user2) { double(:account => 'user2', :domain => '.', :sid => 'user2sid') }
238
251
  let(:user3) { double(:account => 'user3', :domain => '.', :sid => 'user3sid') }
239
252
 
253
+ let(:invalid_user) { SecureRandom.uuid }
254
+ let(:invalid_user_principal) { double(:account => "#{invalid_user}", :domain => nil, :sid => "#{invalid_user}") }
255
+
240
256
  before :each do
241
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1').and_return(user1)
242
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2').and_return(user2)
243
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3').and_return(user3)
257
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user1', any_args).and_return(user1)
258
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2', any_args).and_return(user2)
259
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3', any_args).and_return(user3)
260
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with(invalid_user, true).and_return(invalid_user_principal)
244
261
 
245
262
  resource[:auth_membership] = true
246
263
  end
@@ -261,6 +278,22 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
261
278
  expect(provider.members).to match_array(expected_members)
262
279
  end
263
280
 
281
+ it "should be able to handle unresolvable SID in list of members" do
282
+ allow(provider.group).to receive(:members).and_return([
283
+ 'user1',
284
+ "#{invalid_user}",
285
+ 'user3',
286
+ ])
287
+
288
+ expected_member_sids = [user1.sid, invalid_user_principal.sid, user3.sid]
289
+ expected_members = ['user1', "#{invalid_user}", 'user3']
290
+ allow(provider).to receive(:members_to_s)
291
+ .with(expected_member_sids)
292
+ .and_return(expected_members.join(','))
293
+
294
+ expect(provider.members).to match_array(expected_members)
295
+ end
296
+
264
297
  it "should be able to set group members" do
265
298
  allow(provider.group).to receive(:members).and_return(['user1', 'user2'])
266
299
 
@@ -272,8 +305,8 @@ describe Puppet::Type.type(:group).provider(:windows_adsi), :if => Puppet::Util:
272
305
 
273
306
  allow(provider.group).to receive(:member_sids).and_return(member_sids[0..1])
274
307
 
275
- expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2').and_return(member_sids[1])
276
- expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3').and_return(member_sids[2])
308
+ expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user2', any_args).and_return(member_sids[1])
309
+ expect(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('user3', any_args).and_return(member_sids[2])
277
310
 
278
311
  expect(provider.group).to receive(:remove_member_sids).with(member_sids[0])
279
312
  expect(provider.group).to receive(:add_member_sids).with(member_sids[2])