puppet 6.12.0 → 6.17.0

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

Potentially problematic release.


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

Files changed (412) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +39 -36
  6. data/README.md +18 -25
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/windows/service/daemon.rb +3 -3
  9. data/lib/puppet.rb +52 -13
  10. data/lib/puppet/agent.rb +20 -14
  11. data/lib/puppet/application/agent.rb +26 -17
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/resource.rb +1 -1
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +65 -69
  19. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  20. data/lib/puppet/confine.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +154 -58
  24. data/lib/puppet/environments.rb +27 -20
  25. data/lib/puppet/face/facts.rb +8 -5
  26. data/lib/puppet/face/help.rb +29 -3
  27. data/lib/puppet/face/module/search.rb +5 -0
  28. data/lib/puppet/face/plugin.rb +2 -2
  29. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  30. data/lib/puppet/file_serving/metadata.rb +4 -1
  31. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  32. data/lib/puppet/file_system/file_impl.rb +14 -10
  33. data/lib/puppet/file_system/memory_file.rb +6 -0
  34. data/lib/puppet/file_system/memory_impl.rb +13 -0
  35. data/lib/puppet/file_system/uniquefile.rb +12 -16
  36. data/lib/puppet/file_system/windows.rb +7 -10
  37. data/lib/puppet/forge.rb +1 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge/repository.rb +4 -7
  40. data/lib/puppet/functions/call.rb +1 -1
  41. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  42. data/lib/puppet/functions/filter.rb +1 -0
  43. data/lib/puppet/functions/reduce.rb +2 -4
  44. data/lib/puppet/http.rb +5 -0
  45. data/lib/puppet/http/client.rb +293 -73
  46. data/lib/puppet/http/errors.rb +2 -0
  47. data/lib/puppet/http/external_client.rb +90 -0
  48. data/lib/puppet/http/redirector.rb +43 -7
  49. data/lib/puppet/http/resolver.rb +46 -3
  50. data/lib/puppet/http/resolver/server_list.rb +76 -16
  51. data/lib/puppet/http/resolver/settings.rb +23 -3
  52. data/lib/puppet/http/resolver/srv.rb +29 -3
  53. data/lib/puppet/http/response.rb +87 -1
  54. data/lib/puppet/http/retry_after_handler.rb +39 -0
  55. data/lib/puppet/http/service.rb +151 -7
  56. data/lib/puppet/http/service/ca.rb +76 -14
  57. data/lib/puppet/http/service/compiler.rb +319 -0
  58. data/lib/puppet/http/service/file_server.rb +206 -0
  59. data/lib/puppet/http/service/report.rb +49 -23
  60. data/lib/puppet/http/session.rb +103 -7
  61. data/lib/puppet/indirector.rb +1 -1
  62. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  63. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  64. data/lib/puppet/indirector/facts/rest.rb +42 -0
  65. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  66. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  67. data/lib/puppet/indirector/file_content/http.rb +5 -0
  68. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  69. data/lib/puppet/indirector/file_metadata/http.rb +27 -8
  70. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  71. data/lib/puppet/indirector/json.rb +1 -1
  72. data/lib/puppet/indirector/msgpack.rb +1 -1
  73. data/lib/puppet/indirector/node/rest.rb +24 -0
  74. data/lib/puppet/indirector/report/rest.rb +19 -0
  75. data/lib/puppet/indirector/report/yaml.rb +23 -0
  76. data/lib/puppet/indirector/request.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +12 -0
  78. data/lib/puppet/indirector/status/rest.rb +18 -0
  79. data/lib/puppet/loaders.rb +6 -0
  80. data/lib/puppet/metatype/manager.rb +80 -80
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  83. data/lib/puppet/network/http/base_pool.rb +7 -2
  84. data/lib/puppet/network/http/compression.rb +7 -0
  85. data/lib/puppet/network/http/connection.rb +6 -0
  86. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  87. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  88. data/lib/puppet/network/http/pool.rb +13 -6
  89. data/lib/puppet/network/http_pool.rb +2 -1
  90. data/lib/puppet/node/environment.rb +11 -1
  91. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  92. data/lib/puppet/pal/pal_impl.rb +4 -29
  93. data/lib/puppet/parser/ast/leaf.rb +5 -5
  94. data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
  95. data/lib/puppet/parser/compiler.rb +43 -33
  96. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  97. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  98. data/lib/puppet/parser/environment_compiler.rb +4 -1
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/filter.rb +1 -0
  101. data/lib/puppet/parser/resource.rb +3 -2
  102. data/lib/puppet/parser/resource/param.rb +6 -0
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
  105. data/lib/puppet/pops/issues.rb +5 -0
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/parser/evaluating_parser.rb +5 -7
  109. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  110. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  111. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  112. data/lib/puppet/pops/validation/checker4_0.rb +11 -1
  113. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  114. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  115. data/lib/puppet/provider/aix_object.rb +4 -2
  116. data/lib/puppet/provider/group/aix.rb +1 -0
  117. data/lib/puppet/provider/group/groupadd.rb +57 -24
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/package/aix.rb +17 -2
  120. data/lib/puppet/provider/package/apt.rb +78 -4
  121. data/lib/puppet/provider/package/aptitude.rb +1 -1
  122. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  123. data/lib/puppet/provider/package/dpkg.rb +14 -7
  124. data/lib/puppet/provider/package/fink.rb +20 -3
  125. data/lib/puppet/provider/package/gem.rb +41 -7
  126. data/lib/puppet/provider/package/openbsd.rb +13 -1
  127. data/lib/puppet/provider/package/pacman.rb +2 -5
  128. data/lib/puppet/provider/package/pip.rb +143 -48
  129. data/lib/puppet/provider/package/pip3.rb +0 -2
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +2 -2
  134. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  135. data/lib/puppet/provider/package/rpm.rb +6 -213
  136. data/lib/puppet/provider/package/yum.rb +109 -25
  137. data/lib/puppet/provider/package/zypper.rb +59 -1
  138. data/lib/puppet/provider/service/systemd.rb +22 -4
  139. data/lib/puppet/provider/service/windows.rb +23 -7
  140. data/lib/puppet/provider/user/aix.rb +1 -0
  141. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  142. data/lib/puppet/provider/user/useradd.rb +22 -12
  143. data/lib/puppet/reports/http.rb +15 -9
  144. data/lib/puppet/reports/store.rb +1 -1
  145. data/lib/puppet/resource.rb +2 -1
  146. data/lib/puppet/resource/type.rb +8 -0
  147. data/lib/puppet/resource/type_collection.rb +20 -16
  148. data/lib/puppet/runtime.rb +31 -1
  149. data/lib/puppet/settings.rb +4 -0
  150. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  151. data/lib/puppet/ssl.rb +1 -0
  152. data/lib/puppet/ssl/certificate.rb +2 -1
  153. data/lib/puppet/ssl/host.rb +4 -4
  154. data/lib/puppet/ssl/oids.rb +1 -0
  155. data/lib/puppet/ssl/ssl_context.rb +2 -2
  156. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  157. data/lib/puppet/ssl/state_machine.rb +81 -35
  158. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  159. data/lib/puppet/test/test_helper.rb +15 -11
  160. data/lib/puppet/transaction/report.rb +2 -2
  161. data/lib/puppet/transaction/resource_harness.rb +1 -1
  162. data/lib/puppet/trusted_external.rb +29 -1
  163. data/lib/puppet/type.rb +18 -6
  164. data/lib/puppet/type/file.rb +51 -13
  165. data/lib/puppet/type/file/checksum.rb +4 -4
  166. data/lib/puppet/type/file/source.rb +51 -60
  167. data/lib/puppet/type/group.rb +2 -2
  168. data/lib/puppet/type/package.rb +102 -10
  169. data/lib/puppet/type/service.rb +55 -8
  170. data/lib/puppet/type/user.rb +3 -28
  171. data/lib/puppet/util.rb +39 -15
  172. data/lib/puppet/util/at_fork.rb +1 -1
  173. data/lib/puppet/util/autoload.rb +4 -18
  174. data/lib/puppet/util/checksums.rb +19 -4
  175. data/lib/puppet/util/fileparsing.rb +2 -2
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/package/version/debian.rb +175 -0
  179. data/lib/puppet/util/package/version/gem.rb +15 -0
  180. data/lib/puppet/util/package/version/pip.rb +167 -0
  181. data/lib/puppet/util/package/version/range.rb +53 -0
  182. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  183. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  185. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  187. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  188. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  189. data/lib/puppet/util/package/version/rpm.rb +73 -0
  190. data/lib/puppet/util/pidlock.rb +36 -10
  191. data/lib/puppet/util/platform.rb +5 -0
  192. data/lib/puppet/util/plist.rb +6 -0
  193. data/lib/puppet/util/provider_features.rb +1 -1
  194. data/lib/puppet/util/reference.rb +1 -1
  195. data/lib/puppet/util/rpm_compare.rb +193 -0
  196. data/lib/puppet/util/storage.rb +0 -1
  197. data/lib/puppet/util/windows/adsi.rb +2 -2
  198. data/lib/puppet/util/windows/api_types.rb +45 -32
  199. data/lib/puppet/util/windows/eventlog.rb +1 -6
  200. data/lib/puppet/util/windows/principal.rb +8 -6
  201. data/lib/puppet/util/windows/process.rb +15 -14
  202. data/lib/puppet/util/windows/registry.rb +11 -11
  203. data/lib/puppet/util/windows/security.rb +1 -0
  204. data/lib/puppet/util/windows/service.rb +43 -26
  205. data/lib/puppet/util/windows/sid.rb +3 -3
  206. data/lib/puppet/util/windows/user.rb +23 -8
  207. data/lib/puppet/util/yaml.rb +1 -1
  208. data/lib/puppet/version.rb +1 -1
  209. data/locales/puppet.pot +707 -574
  210. data/man/man5/puppet.conf.5 +74 -14
  211. data/man/man8/puppet-agent.8 +7 -7
  212. data/man/man8/puppet-apply.8 +1 -1
  213. data/man/man8/puppet-catalog.8 +1 -1
  214. data/man/man8/puppet-config.8 +1 -1
  215. data/man/man8/puppet-describe.8 +1 -1
  216. data/man/man8/puppet-device.8 +2 -2
  217. data/man/man8/puppet-doc.8 +1 -1
  218. data/man/man8/puppet-epp.8 +1 -1
  219. data/man/man8/puppet-facts.8 +1 -1
  220. data/man/man8/puppet-filebucket.8 +17 -2
  221. data/man/man8/puppet-generate.8 +1 -1
  222. data/man/man8/puppet-help.8 +6 -3
  223. data/man/man8/puppet-key.8 +1 -1
  224. data/man/man8/puppet-lookup.8 +1 -1
  225. data/man/man8/puppet-man.8 +1 -1
  226. data/man/man8/puppet-module.8 +4 -1
  227. data/man/man8/puppet-node.8 +1 -1
  228. data/man/man8/puppet-parser.8 +1 -1
  229. data/man/man8/puppet-plugin.8 +1 -1
  230. data/man/man8/puppet-report.8 +1 -1
  231. data/man/man8/puppet-resource.8 +1 -1
  232. data/man/man8/puppet-script.8 +1 -1
  233. data/man/man8/puppet-ssl.8 +2 -2
  234. data/man/man8/puppet-status.8 +1 -1
  235. data/man/man8/puppet.8 +2 -2
  236. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  237. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  238. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  239. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  240. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  241. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  242. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  243. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  244. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  247. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  248. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  249. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  250. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  251. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  252. data/spec/integration/application/agent_spec.rb +483 -0
  253. data/spec/integration/application/apply_spec.rb +132 -3
  254. data/spec/integration/application/filebucket_spec.rb +190 -0
  255. data/spec/integration/application/plugin_spec.rb +73 -0
  256. data/spec/integration/configurer_spec.rb +26 -7
  257. data/spec/integration/defaults_spec.rb +1 -2
  258. data/spec/integration/http/client_spec.rb +47 -37
  259. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  260. data/spec/integration/indirector/report/yaml.rb +83 -0
  261. data/spec/integration/module_tool/forge_spec.rb +2 -15
  262. data/spec/integration/network/http_pool_spec.rb +93 -20
  263. data/spec/integration/node/environment_spec.rb +15 -0
  264. data/spec/integration/parser/compiler_spec.rb +11 -0
  265. data/spec/integration/type/file_spec.rb +1 -1
  266. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  267. data/spec/integration/util/windows/registry_spec.rb +7 -7
  268. data/spec/integration/util/windows/user_spec.rb +40 -5
  269. data/spec/lib/puppet/test_ca.rb +2 -2
  270. data/spec/lib/puppet_spec/https.rb +16 -7
  271. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  272. data/spec/shared_contexts/https.rb +29 -0
  273. data/spec/unit/agent_spec.rb +80 -26
  274. data/spec/unit/application/agent_spec.rb +9 -5
  275. data/spec/unit/application/apply_spec.rb +2 -12
  276. data/spec/unit/application/describe_spec.rb +88 -50
  277. data/spec/unit/application/device_spec.rb +2 -2
  278. data/spec/unit/application/filebucket_spec.rb +22 -2
  279. data/spec/unit/application/resource_spec.rb +2 -2
  280. data/spec/unit/configurer/fact_handler_spec.rb +4 -8
  281. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  282. data/spec/unit/configurer_spec.rb +17 -18
  283. data/spec/unit/context/trusted_information_spec.rb +25 -2
  284. data/spec/unit/daemon_spec.rb +5 -64
  285. data/spec/unit/defaults_spec.rb +25 -2
  286. data/spec/unit/environments_spec.rb +65 -28
  287. data/spec/unit/face/facts_spec.rb +24 -20
  288. data/spec/unit/face/module/search_spec.rb +17 -0
  289. data/spec/unit/face/plugin_spec.rb +12 -10
  290. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  291. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  292. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  293. data/spec/unit/file_system_spec.rb +26 -2
  294. data/spec/unit/functions/lookup_spec.rb +13 -0
  295. data/spec/unit/http/client_spec.rb +327 -35
  296. data/spec/unit/http/external_client_spec.rb +201 -0
  297. data/spec/unit/http/resolver_spec.rb +34 -2
  298. data/spec/unit/http/response_spec.rb +75 -0
  299. data/spec/unit/http/service/ca_spec.rb +53 -11
  300. data/spec/unit/http/service/compiler_spec.rb +627 -0
  301. data/spec/unit/http/service/file_server_spec.rb +308 -0
  302. data/spec/unit/http/service/report_spec.rb +27 -9
  303. data/spec/unit/http/service_spec.rb +98 -5
  304. data/spec/unit/http/session_spec.rb +190 -7
  305. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  306. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  307. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  308. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  309. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  310. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  311. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  312. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  313. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  314. data/spec/unit/indirector/request_spec.rb +1 -1
  315. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  316. data/spec/unit/indirector/rest_spec.rb +13 -0
  317. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  318. data/spec/unit/interface_spec.rb +3 -3
  319. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  320. data/spec/unit/network/http/connection_spec.rb +559 -175
  321. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  322. data/spec/unit/network/http/pool_spec.rb +89 -11
  323. data/spec/unit/network/http_pool_spec.rb +63 -57
  324. data/spec/unit/network/http_spec.rb +1 -1
  325. data/spec/unit/node/environment_spec.rb +16 -0
  326. data/spec/unit/node/facts_spec.rb +2 -1
  327. data/spec/unit/node_spec.rb +7 -4
  328. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  329. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  330. data/spec/unit/parser/scope_spec.rb +1 -1
  331. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  332. data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
  333. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  334. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  335. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  336. data/spec/unit/provider/aix_object_spec.rb +16 -2
  337. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  338. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  339. data/spec/unit/provider/package/aix_spec.rb +29 -0
  340. data/spec/unit/provider/package/apt_spec.rb +43 -2
  341. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  342. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  343. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  344. data/spec/unit/provider/package/gem_spec.rb +40 -0
  345. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  346. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  347. data/spec/unit/provider/package/pip_spec.rb +68 -19
  348. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  349. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  350. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  351. data/spec/unit/provider/package/portage_spec.rb +5 -0
  352. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  353. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  354. data/spec/unit/provider/package/yum_spec.rb +292 -0
  355. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  356. data/spec/unit/provider/service/init_spec.rb +1 -0
  357. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  358. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  359. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  360. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  361. data/spec/unit/provider/service/windows_spec.rb +22 -14
  362. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  363. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  364. data/spec/unit/provider/user/useradd_spec.rb +43 -24
  365. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  366. data/spec/unit/puppet_pal_2pec.rb +0 -26
  367. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  368. data/spec/unit/puppet_spec.rb +47 -0
  369. data/spec/unit/reports/http_spec.rb +70 -52
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  372. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  373. data/spec/unit/ssl/certificate_spec.rb +7 -0
  374. data/spec/unit/ssl/host_spec.rb +4 -2
  375. data/spec/unit/ssl/oids_spec.rb +1 -0
  376. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  377. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  378. data/spec/unit/test/test_helper_spec.rb +17 -0
  379. data/spec/unit/transaction/persistence_spec.rb +1 -10
  380. data/spec/unit/transaction/report_spec.rb +5 -1
  381. data/spec/unit/transaction_spec.rb +0 -2
  382. data/spec/unit/type/file/ensure_spec.rb +1 -2
  383. data/spec/unit/type/file/source_spec.rb +89 -38
  384. data/spec/unit/type/file_spec.rb +122 -96
  385. data/spec/unit/type/package_spec.rb +8 -0
  386. data/spec/unit/type/service_spec.rb +185 -8
  387. data/spec/unit/type/user_spec.rb +1 -2
  388. data/spec/unit/type_spec.rb +50 -0
  389. data/spec/unit/util/at_fork_spec.rb +3 -2
  390. data/spec/unit/util/autoload_spec.rb +2 -1
  391. data/spec/unit/util/checksums_spec.rb +16 -0
  392. data/spec/unit/util/log/destinations_spec.rb +1 -29
  393. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  394. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  395. data/spec/unit/util/package/version/range_spec.rb +175 -0
  396. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  397. data/spec/unit/util/pidlock_spec.rb +112 -42
  398. data/spec/unit/util/plist_spec.rb +20 -0
  399. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  400. data/spec/unit/util/storage_spec.rb +1 -8
  401. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  402. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  403. data/spec/unit/util/windows/service_spec.rb +4 -4
  404. data/spec/unit/util/windows/sid_spec.rb +2 -2
  405. data/spec/unit/util_spec.rb +3 -3
  406. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  407. data/tasks/generate_cert_fixtures.rake +15 -1
  408. data/tasks/manpages.rake +5 -35
  409. metadata +73 -12
  410. data/COMMITTERS.md +0 -244
  411. data/spec/integration/faces/plugin_spec.rb +0 -61
  412. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -8,7 +8,7 @@ describe Puppet::Network::HTTP::NoCachePool do
8
8
  let(:verifier) { double('verifier', :setup_connection => nil) }
9
9
 
10
10
  it 'yields a started connection' do
11
- http = double('http', start: nil, finish: nil)
11
+ http = double('http', start: nil, finish: nil, started?: true)
12
12
 
13
13
  factory = Puppet::Network::HTTP::Factory.new
14
14
  allow(factory).to receive(:create_connection).and_return(http)
@@ -20,8 +20,8 @@ describe Puppet::Network::HTTP::NoCachePool do
20
20
  end
21
21
 
22
22
  it 'yields a new connection each time' do
23
- http1 = double('http1', start: nil, finish: nil)
24
- http2 = double('http2', start: nil, finish: nil)
23
+ http1 = double('http1', start: nil, finish: nil, started?: true)
24
+ http2 = double('http2', start: nil, finish: nil, started?: true)
25
25
 
26
26
  factory = Puppet::Network::HTTP::Factory.new
27
27
  allow(factory).to receive(:create_connection).and_return(http1, http2)
@@ -39,4 +39,26 @@ describe Puppet::Network::HTTP::NoCachePool do
39
39
  it 'has a close method' do
40
40
  Puppet::Network::HTTP::NoCachePool.new.close
41
41
  end
42
+
43
+ it 'logs a deprecation warning' do
44
+ http = double('http', start: nil, finish: nil, started?: true)
45
+
46
+ factory = Puppet::Network::HTTP::Factory.new
47
+ allow(factory).to receive(:create_connection).and_return(http)
48
+ Puppet::Network::HTTP::NoCachePool.new(factory)
49
+
50
+ expect(@logs).to include(an_object_having_attributes(level: :warning, message: /Puppet::Network::HTTP::NoCachePool is deprecated/))
51
+ end
52
+
53
+ it 'omits the warning when deprecations are disabled' do
54
+ Puppet[:disable_warnings] = 'deprecations'
55
+
56
+ http = double('http', start: nil, finish: nil, started?: true)
57
+
58
+ factory = Puppet::Network::HTTP::Factory.new
59
+ allow(factory).to receive(:create_connection).and_return(http)
60
+ Puppet::Network::HTTP::NoCachePool.new(factory)
61
+
62
+ expect(@logs).to eq([])
63
+ end
42
64
  end
@@ -26,17 +26,25 @@ describe Puppet::Network::HTTP::Pool do
26
26
  end
27
27
 
28
28
  def create_pool
29
- Puppet::Network::HTTP::Pool.new
29
+ Puppet::Network::HTTP::Pool.new(15)
30
30
  end
31
31
 
32
32
  def create_pool_with_connections(site, *connections)
33
- pool = Puppet::Network::HTTP::Pool.new
33
+ pool = Puppet::Network::HTTP::Pool.new(15)
34
34
  connections.each do |conn|
35
35
  pool.release(site, verifier, conn)
36
36
  end
37
37
  pool
38
38
  end
39
39
 
40
+ def create_pool_with_http_connections(site, *connections)
41
+ pool = Puppet::Network::HTTP::Pool.new(15)
42
+ connections.each do |conn|
43
+ pool.release(site, nil, conn)
44
+ end
45
+ pool
46
+ end
47
+
40
48
  def create_pool_with_expired_connections(site, *connections)
41
49
  # setting keepalive timeout to -1 ensures any newly added
42
50
  # connections have already expired
@@ -51,6 +59,10 @@ describe Puppet::Network::HTTP::Pool do
51
59
  double(site.addr, :started? => false, :start => nil, :finish => nil, :use_ssl? => true, :verify_mode => OpenSSL::SSL::VERIFY_PEER)
52
60
  end
53
61
 
62
+ def create_http_connection(site)
63
+ double(site.addr, :started? => false, :start => nil, :finish => nil, :use_ssl? => false)
64
+ end
65
+
54
66
  context 'when yielding a connection' do
55
67
  it 'yields a connection' do
56
68
  conn = create_connection(site)
@@ -63,6 +75,8 @@ describe Puppet::Network::HTTP::Pool do
63
75
 
64
76
  it 'returns the connection to the pool' do
65
77
  conn = create_connection(site)
78
+ expect(conn).to receive(:started?).and_return(true)
79
+
66
80
  pool = create_pool
67
81
  pool.release(site, verifier, conn)
68
82
 
@@ -140,6 +154,7 @@ describe Puppet::Network::HTTP::Pool do
140
154
  it 'releases HTTP connections' do
141
155
  conn = create_connection(site)
142
156
  expect(conn).to receive(:use_ssl?).and_return(false)
157
+ expect(conn).to receive(:started?).and_return(true)
143
158
 
144
159
  pool = create_pool_with_connections(site, conn)
145
160
  expect(pool).to receive(:release).with(site, verifier, conn)
@@ -151,6 +166,7 @@ describe Puppet::Network::HTTP::Pool do
151
166
  conn = create_connection(site)
152
167
  expect(conn).to receive(:use_ssl?).and_return(true)
153
168
  expect(conn).to receive(:verify_mode).and_return(OpenSSL::SSL::VERIFY_PEER)
169
+ expect(conn).to receive(:started?).and_return(true)
154
170
 
155
171
  pool = create_pool_with_connections(site, conn)
156
172
  expect(pool).to receive(:release).with(site, verifier, conn)
@@ -169,6 +185,19 @@ describe Puppet::Network::HTTP::Pool do
169
185
 
170
186
  pool.with_connection(site, verifier) {|c| }
171
187
  end
188
+
189
+ it "doesn't add a closed connection back to the pool" do
190
+ http = Net::HTTP.new(site.addr)
191
+ http.use_ssl = true
192
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
193
+ http.start
194
+
195
+ pool = create_pool_with_connections(site, http)
196
+
197
+ pool.with_connection(site, verifier) {|c| c.finish}
198
+
199
+ expect(pool.pool[site]).to be_nil
200
+ end
172
201
  end
173
202
  end
174
203
 
@@ -177,7 +206,6 @@ describe Puppet::Network::HTTP::Pool do
177
206
  conn = create_connection(site)
178
207
  pool = create_pool
179
208
  expect(pool.factory).to receive(:create_connection).with(site).and_return(conn)
180
- expect(pool).to receive(:setsockopts)
181
209
 
182
210
  expect(pool.borrow(site, verifier)).to eq(conn)
183
211
  end
@@ -197,15 +225,37 @@ describe Puppet::Network::HTTP::Pool do
197
225
 
198
226
  conn = create_connection(site)
199
227
  expect(pool.factory).to receive(:create_connection).with(site).and_return(conn)
200
- expect(pool).to receive(:setsockopts)
201
228
 
202
229
  expect(pool.borrow(site, verifier)).to eq(conn)
203
230
  end
204
231
 
232
+ it 'returns a new HTTP connection if the cached connection is HTTPS' do
233
+ https_site = Puppet::Network::HTTP::Site.new('https', 'www.example.com', 443)
234
+ old_conn = create_connection(https_site)
235
+ pool = create_pool_with_connections(https_site, old_conn)
236
+
237
+ http_site = Puppet::Network::HTTP::Site.new('http', 'www.example.com', 443)
238
+ new_conn = create_http_connection(http_site)
239
+ allow(pool.factory).to receive(:create_connection).with(http_site).and_return(new_conn)
240
+
241
+ expect(pool.borrow(http_site, nil)).to eq(new_conn)
242
+ end
243
+
244
+ it 'returns a new HTTPS connection if the cached connection is HTTP' do
245
+ http_site = Puppet::Network::HTTP::Site.new('http', 'www.example.com', 443)
246
+ old_conn = create_http_connection(http_site)
247
+ pool = create_pool_with_http_connections(http_site, old_conn)
248
+
249
+ https_site = Puppet::Network::HTTP::Site.new('https', 'www.example.com', 443)
250
+ new_conn = create_connection(https_site)
251
+ allow(pool.factory).to receive(:create_connection).with(https_site).and_return(new_conn)
252
+
253
+ expect(pool.borrow(https_site, verifier)).to eq(new_conn)
254
+ end
255
+
205
256
  it 'returns a new connection if the ssl contexts are different' do
206
257
  old_conn = create_connection(site)
207
258
  pool = create_pool_with_connections(site, old_conn)
208
- allow(pool).to receive(:setsockopts)
209
259
 
210
260
  new_conn = create_connection(site)
211
261
  allow(pool.factory).to receive(:create_connection).with(site).and_return(new_conn)
@@ -220,7 +270,6 @@ describe Puppet::Network::HTTP::Pool do
220
270
  it 'returns a cached connection if the ssl contexts are the same' do
221
271
  old_conn = create_connection(site)
222
272
  pool = create_pool_with_connections(site, old_conn)
223
- allow(pool).to receive(:setsockopts)
224
273
 
225
274
  expect(pool.factory).not_to receive(:create_connection)
226
275
 
@@ -229,13 +278,21 @@ describe Puppet::Network::HTTP::Pool do
229
278
  expect(pool.borrow(site, new_verifier)).to equal(old_conn)
230
279
  end
231
280
 
281
+ it 'returns a cached connection if both connections are http' do
282
+ http_site = Puppet::Network::HTTP::Site.new('http', 'www.example.com', 80)
283
+ old_conn = create_http_connection(http_site)
284
+ pool = create_pool_with_http_connections(http_site, old_conn)
285
+
286
+ # 'equal' tests that it's the same object
287
+ expect(pool.borrow(http_site, nil)).to equal(old_conn)
288
+ end
289
+
232
290
  it 'returns started connections' do
233
291
  conn = create_connection(site)
234
292
  expect(conn).to receive(:start)
235
293
 
236
294
  pool = create_pool
237
295
  expect(pool.factory).to receive(:create_connection).with(site).and_return(conn)
238
- expect(pool).to receive(:setsockopts)
239
296
 
240
297
  expect(pool.borrow(site, verifier)).to eq(conn)
241
298
  end
@@ -258,11 +315,11 @@ describe Puppet::Network::HTTP::Pool do
258
315
 
259
316
  it 'finishes expired connections' do
260
317
  conn = create_connection(site)
318
+ allow(conn).to receive(:started?).and_return(true)
261
319
  expect(conn).to receive(:finish)
262
320
 
263
321
  pool = create_pool_with_expired_connections(site, conn)
264
- expect(pool.factory).to receive(:create_connection).and_return(double('conn', :start => nil))
265
- expect(pool).to receive(:setsockopts)
322
+ expect(pool.factory).to receive(:create_connection).and_return(double('conn', :start => nil, :use_ssl? => true))
266
323
 
267
324
  pool.borrow(site, verifier)
268
325
  end
@@ -271,13 +328,21 @@ describe Puppet::Network::HTTP::Pool do
271
328
  expect(Puppet).to receive(:log_exception).with(be_a(IOError), "Failed to close connection for #{site}: read timeout")
272
329
 
273
330
  conn = create_connection(site)
331
+ expect(conn).to receive(:started?).and_return(true)
274
332
  expect(conn).to receive(:finish).and_raise(IOError, 'read timeout')
275
333
 
276
334
  pool = create_pool_with_expired_connections(site, conn)
277
- expect(pool.factory).to receive(:create_connection).and_return(double('open_conn', :start => nil))
278
- expect(pool).to receive(:setsockopts)
335
+ expect(pool.factory).to receive(:create_connection).and_return(double('open_conn', :start => nil, :use_ssl? => true))
336
+
337
+ pool.borrow(site, verifier)
338
+ end
279
339
 
340
+ it 'deletes the session when the last connection is borrowed' do
341
+ conn = create_connection(site)
342
+ pool = create_pool_with_connections(site, conn)
280
343
  pool.borrow(site, verifier)
344
+
345
+ expect(pool.pool[site]).to be_nil
281
346
  end
282
347
  end
283
348
 
@@ -319,10 +384,23 @@ describe Puppet::Network::HTTP::Pool do
319
384
 
320
385
  it 'closes all cached connections' do
321
386
  conn = create_connection(site)
387
+ allow(conn).to receive(:started?).and_return(true)
322
388
  expect(conn).to receive(:finish)
323
389
 
324
390
  pool = create_pool_with_connections(site, conn)
325
391
  pool.close
326
392
  end
393
+
394
+ it 'allows a connection to be closed multiple times safely' do
395
+ http = Net::HTTP.new(site.addr)
396
+ http.use_ssl = true
397
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
398
+ http.start
399
+
400
+ pool = create_pool
401
+
402
+ expect(pool.close_connection(site, http)).to eq(true)
403
+ expect(pool.close_connection(site, http)).to eq(false)
404
+ end
327
405
  end
328
406
  end
@@ -1,41 +1,65 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/network/http_pool'
3
3
 
4
+ class Puppet::Network::HttpPool::FooClient
5
+ def initialize(host, port, options = {})
6
+ @host = host
7
+ @port = port
8
+ end
9
+ attr_reader :host, :port
10
+ end
11
+
4
12
  describe Puppet::Network::HttpPool do
5
- before :each do
6
- Puppet::SSL::Key.indirection.terminus_class = :memory
7
- Puppet::SSL::CertificateRequest.indirection.terminus_class = :memory
13
+ include PuppetSpec::Files
14
+
15
+ describe "when registering an http client class" do
16
+ let(:http_impl) { Puppet::Network::HttpPool::FooClient }
17
+
18
+ around :each do |example|
19
+ orig_class = Puppet::Network::HttpPool.http_client_class
20
+ begin
21
+ example.run
22
+ ensure
23
+ Puppet::Network::HttpPool.http_client_class = orig_class
24
+ end
25
+ end
26
+
27
+ it "returns instances of the http client class" do
28
+ Puppet::Network::HttpPool.http_client_class = http_impl
29
+ http = Puppet::Network::HttpPool.http_instance("me", 54321)
30
+ expect(http).to be_an_instance_of(http_impl)
31
+ expect(http.host).to eq('me')
32
+ expect(http.port).to eq(54321)
33
+ end
34
+
35
+ it "uses the default http client" do
36
+ expect(Puppet.runtime[:http]).to be_an_instance_of(Puppet::HTTP::Client)
37
+ end
38
+
39
+ it "switches to the external client implementation" do
40
+ Puppet::Network::HttpPool.http_client_class = http_impl
41
+
42
+ expect(Puppet.runtime[:http]).to be_an_instance_of(Puppet::HTTP::ExternalClient)
43
+ end
44
+
45
+ it "always uses an explicitly registered http implementation" do
46
+ Puppet::Network::HttpPool.http_client_class = http_impl
47
+
48
+ new_impl = double('new_http_impl')
49
+ Puppet.initialize_settings([], true, true, http: new_impl)
50
+
51
+ expect(Puppet.runtime[:http]).to eq(new_impl)
52
+ end
8
53
  end
9
54
 
10
55
  describe "when managing http instances" do
11
56
  it "should return an http instance created with the passed host and port" do
12
57
  http = Puppet::Network::HttpPool.http_instance("me", 54321)
13
- expect(http).to be_an_instance_of Puppet::Network::HTTP::Connection
58
+ expect(http).to be_a_kind_of Puppet::Network::HTTP::Connection
14
59
  expect(http.address).to eq('me')
15
60
  expect(http.port).to eq(54321)
16
61
  end
17
62
 
18
- it "should support using an alternate http client implementation" do
19
- begin
20
- class FooClient
21
- def initialize(host, port, options = {})
22
- @host = host
23
- @port = port
24
- end
25
- attr_reader :host, :port
26
- end
27
-
28
- orig_class = Puppet::Network::HttpPool.http_client_class
29
- Puppet::Network::HttpPool.http_client_class = FooClient
30
- http = Puppet::Network::HttpPool.http_instance("me", 54321)
31
- expect(http).to be_an_instance_of FooClient
32
- expect(http.host).to eq('me')
33
- expect(http.port).to eq(54321)
34
- ensure
35
- Puppet::Network::HttpPool.http_client_class = orig_class
36
- end
37
- end
38
-
39
63
  it "should enable ssl on the http instance by default" do
40
64
  expect(Puppet::Network::HttpPool.http_instance("me", 54321)).to be_use_ssl
41
65
  end
@@ -82,53 +106,35 @@ describe Puppet::Network::HttpPool do
82
106
  end
83
107
 
84
108
  describe 'peer verification' do
85
- def setup_standard_ssl_configuration
86
- ca_cert_file = File.expand_path('/path/to/ssl/certs/ca_cert.pem')
87
-
88
- Puppet[:ssl_client_ca_auth] = ca_cert_file
89
- allow(Puppet::FileSystem).to receive(:exist?).with(ca_cert_file).and_return(true)
90
- end
91
-
92
- def setup_standard_hostcert
93
- host_cert_file = File.expand_path('/path/to/ssl/certs/host_cert.pem')
94
- allow(Puppet::FileSystem).to receive(:exist?).with(host_cert_file).and_return(true)
95
-
96
- Puppet[:hostcert] = host_cert_file
97
- end
98
-
99
- def setup_standard_ssl_host
100
- cert = double('cert', :content => 'real_cert')
101
- key = double('key', :content => 'real_key')
102
- host = double('host', :certificate => cert, :key => key, :ssl_store => double('store'))
103
109
 
104
- allow(Puppet::SSL::Host).to receive(:localhost).and_return(host)
105
- end
110
+ before(:each) do
111
+ Puppet[:ssldir] = tmpdir('ssl')
112
+ Puppet.settings.use(:main)
106
113
 
107
- before do
108
- setup_standard_ssl_configuration
109
- setup_standard_hostcert
110
- setup_standard_ssl_host
114
+ Puppet[:certname] = 'signed'
115
+ File.write(Puppet[:localcacert], cert_fixture('ca.pem'))
116
+ File.write(Puppet[:hostcrl], crl_fixture('crl.pem'))
117
+ File.write(Puppet[:hostcert], cert_fixture('signed.pem'))
118
+ File.write(Puppet[:hostprivkey], key_fixture('signed-key.pem'))
111
119
  end
112
120
 
113
121
  it 'enables peer verification by default' do
114
- response = Net::HTTPOK.new('1.1', 200, 'body')
122
+ stub_request(:get, "https://me:54321")
123
+
115
124
  conn = Puppet::Network::HttpPool.http_instance("me", 54321, true)
116
- expect(conn).to receive(:execute_request) do |http, _|
125
+ expect_any_instance_of(Net::HTTP).to receive(:start) do |http|
117
126
  expect(http.verify_mode).to eq(OpenSSL::SSL::VERIFY_PEER)
118
-
119
- response
120
127
  end
121
128
 
122
129
  conn.get('/')
123
130
  end
124
131
 
125
132
  it 'can disable peer verification' do
126
- response = Net::HTTPOK.new('1.1', 200, 'body')
133
+ stub_request(:get, "https://me:54321")
134
+
127
135
  conn = Puppet::Network::HttpPool.http_instance("me", 54321, true, false)
128
- expect(conn).to receive(:execute_request) do |http, _|
136
+ expect_any_instance_of(Net::HTTP).to receive(:start) do |http|
129
137
  expect(http.verify_mode).to eq(OpenSSL::SSL::VERIFY_NONE)
130
-
131
- response
132
138
  end
133
139
 
134
140
  conn.get('/')
@@ -4,6 +4,6 @@ require 'puppet/network/http'
4
4
  describe Puppet::Network::HTTP do
5
5
  it 'defines an http_pool context' do
6
6
  pool = Puppet.lookup(:http_pool)
7
- expect(pool).to be_a(Puppet::Network::HTTP::NoCachePool)
7
+ expect(pool).to be_a(Puppet::Network::HTTP::Pool)
8
8
  end
9
9
  end
@@ -422,6 +422,22 @@ describe Puppet::Node::Environment do
422
422
 
423
423
  env.modules
424
424
  end
425
+
426
+ it "includes the Bolt project in modules if it's defined" do
427
+ path = tmpdir('project')
428
+ PuppetSpec::Modules.generate_files('bolt_project', path)
429
+ project = Struct.new("Project", :name, :path).new('bolt_project', path)
430
+
431
+ Puppet.override(bolt_project: project) do
432
+ %w{foo bar}.each do |mod_name|
433
+ PuppetSpec::Modules.generate_files(mod_name, first_modulepath)
434
+ end
435
+ %w{bee baz}.each do |mod_name|
436
+ PuppetSpec::Modules.generate_files(mod_name, second_modulepath)
437
+ end
438
+ expect(env.modules.collect{|mod| mod.name}.sort).to eq(%w{bolt_project foo bar bee baz}.sort)
439
+ end
440
+ end
425
441
  end
426
442
  end
427
443
  end