r10k 3.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +1 -0
  3. data/.github/pull_request_template.md +1 -0
  4. data/.github/workflows/docker.yml +56 -0
  5. data/.github/workflows/release.yml +36 -0
  6. data/.gitignore +9 -0
  7. data/.travis.yml +45 -0
  8. data/CHANGELOG.mkd +1759 -0
  9. data/CODEOWNERS +2 -0
  10. data/CONTRIBUTING.mkd +105 -0
  11. data/Gemfile +15 -0
  12. data/LICENSE +14 -0
  13. data/README.mkd +118 -0
  14. data/Rakefile +3 -0
  15. data/azure-pipelines.yml +86 -0
  16. data/bin/r10k +17 -0
  17. data/doc/common-patterns.mkd +44 -0
  18. data/doc/dynamic-environments.mkd +31 -0
  19. data/doc/dynamic-environments/configuration.mkd +669 -0
  20. data/doc/dynamic-environments/git-environments.mkd +75 -0
  21. data/doc/dynamic-environments/introduction.mkd +69 -0
  22. data/doc/dynamic-environments/master-configuration.mkd +40 -0
  23. data/doc/dynamic-environments/quickstart.mkd +201 -0
  24. data/doc/dynamic-environments/svn-environments.mkd +45 -0
  25. data/doc/dynamic-environments/usage.mkd +132 -0
  26. data/doc/dynamic-environments/workflow-guide.mkd +247 -0
  27. data/doc/faq.mkd +164 -0
  28. data/doc/git/cloning-and-mirroring.mkd +60 -0
  29. data/doc/git/providers.mkd +111 -0
  30. data/doc/puppetfile.mkd +309 -0
  31. data/doc/updating-your-puppetfile.mkd +38 -0
  32. data/docker/.gitignore +1 -0
  33. data/docker/.rspec +4 -0
  34. data/docker/Gemfile +11 -0
  35. data/docker/Makefile +89 -0
  36. data/docker/README.md +28 -0
  37. data/docker/r10k/Dockerfile +67 -0
  38. data/docker/r10k/adduser.sh +13 -0
  39. data/docker/r10k/docker-entrypoint.d/10-analytics.sh +30 -0
  40. data/docker/r10k/docker-entrypoint.sh +11 -0
  41. data/docker/r10k/release.Dockerfile +54 -0
  42. data/docker/spec/dockerfile_spec.rb +43 -0
  43. data/docker/spec/fixtures/Puppetfile +2 -0
  44. data/integration/Gemfile +19 -0
  45. data/integration/README.mkd +29 -0
  46. data/integration/Rakefile +77 -0
  47. data/integration/component/pre-suite/05_install_dev_r10k.rb +12 -0
  48. data/integration/files/README.mkd +4 -0
  49. data/integration/files/hiera.yaml +8 -0
  50. data/integration/files/modules/helloworld/manifests/init.pp +3 -0
  51. data/integration/files/modules/hieratest/manifests/init.pp +3 -0
  52. data/integration/files/modules/unicode/files/pretend_unicode +1 -0
  53. data/integration/files/modules/unicode/manifests/init.pp +6 -0
  54. data/integration/files/pre-suite/git_config.pp.erb +19 -0
  55. data/integration/files/pre-suite/prod_env.config +3 -0
  56. data/integration/files/r10k_conf.yaml.erb +9 -0
  57. data/integration/lib/README.mkd +4 -0
  58. data/integration/lib/git_utils.rb +205 -0
  59. data/integration/lib/master_manipulator.rb +205 -0
  60. data/integration/lib/r10k_utils.rb +222 -0
  61. data/integration/manifests/README.mkd +4 -0
  62. data/integration/pre-suite/00_pe_install.rb +6 -0
  63. data/integration/pre-suite/10_git_config.rb +48 -0
  64. data/integration/pre-suite/20_pe_r10k.rb +55 -0
  65. data/integration/pre-suite/README.mkd +5 -0
  66. data/integration/tests/Puppetfile/HTTP_PROXY_affects_forge_source.rb +72 -0
  67. data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +70 -0
  68. data/integration/tests/README.mkd +4 -0
  69. data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +83 -0
  70. data/integration/tests/basic_functionality/negative/neg_deploy_with_invalid_r10k_yaml.rb +51 -0
  71. data/integration/tests/basic_functionality/negative/neg_deploy_with_missing_r10k_yaml.rb +28 -0
  72. data/integration/tests/basic_functionality/negative/neg_invalid_git_provider.rb +45 -0
  73. data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +34 -0
  74. data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +103 -0
  75. data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +128 -0
  76. data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +61 -0
  77. data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +109 -0
  78. data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +108 -0
  79. data/integration/tests/command_line/deploy_env_without_mod_update.rb +76 -0
  80. data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +77 -0
  81. data/integration/tests/command_line/negative/neg_invalid_cmd_line_arg.rb +23 -0
  82. data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +70 -0
  83. data/integration/tests/git_source/git_source_git.rb +128 -0
  84. data/integration/tests/git_source/git_source_ssh.rb +87 -0
  85. data/integration/tests/git_source/git_source_submodule.rb +70 -0
  86. data/integration/tests/git_source/negative/neg_git_broken_remote.rb +38 -0
  87. data/integration/tests/git_source/negative/neg_git_unauthorized_https.rb +46 -0
  88. data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +73 -0
  89. data/integration/tests/git_source/negative/neg_git_unicode_branch.rb +35 -0
  90. data/integration/tests/i18n/deploy_module_with_unicode_in_file_name.rb +64 -0
  91. data/integration/tests/purging/content_not_purged_at_root.rb +89 -0
  92. data/integration/tests/purging/default_purging.rb +125 -0
  93. data/integration/tests/purging/does_not_purge_files_on_white_list.rb +93 -0
  94. data/integration/tests/purging/invalid_whitelist_types.rb +63 -0
  95. data/integration/tests/user_scenario/basic_workflow/multi_env_1000_branches.rb +66 -0
  96. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +111 -0
  97. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +117 -0
  98. data/integration/tests/user_scenario/basic_workflow/multi_env_hiera.rb +100 -0
  99. data/integration/tests/user_scenario/basic_workflow/multi_env_multi_source.rb +133 -0
  100. data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +161 -0
  101. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_basedir.rb +46 -0
  102. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +48 -0
  103. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +45 -0
  104. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +43 -0
  105. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_remote.rb +45 -0
  106. data/integration/tests/user_scenario/basic_workflow/negative/neg_branch_name_collision.rb +64 -0
  107. data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +75 -0
  108. data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +44 -0
  109. data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +58 -0
  110. data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_env_name.rb +34 -0
  111. data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_puppet_file.rb +36 -0
  112. data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +49 -0
  113. data/integration/tests/user_scenario/basic_workflow/negative/neg_read_only.rb +58 -0
  114. data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +51 -0
  115. data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +75 -0
  116. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +104 -0
  117. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +81 -0
  118. data/integration/tests/user_scenario/basic_workflow/single_env_custom_module.rb +49 -0
  119. data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +75 -0
  120. data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +82 -0
  121. data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +68 -0
  122. data/integration/tests/user_scenario/basic_workflow/single_env_non-existent_base_dir.rb +94 -0
  123. data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +93 -0
  124. data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +117 -0
  125. data/integration/tests/user_scenario/basic_workflow/single_env_unicode_paths.rb +60 -0
  126. data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +166 -0
  127. data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +163 -0
  128. data/integration/tests/user_scenario/complex_workflow/multi_env_remove_re-add.rb +111 -0
  129. data/integration/tests/user_scenario/complex_workflow/multi_env_unamanaged.rb +78 -0
  130. data/integration/tests/user_scenario/complex_workflow/single_env_git_module_update.rb +100 -0
  131. data/lib/r10k.rb +11 -0
  132. data/lib/r10k/action/base.rb +31 -0
  133. data/lib/r10k/action/cri_runner.rb +72 -0
  134. data/lib/r10k/action/deploy.rb +9 -0
  135. data/lib/r10k/action/deploy/deploy_helpers.rb +34 -0
  136. data/lib/r10k/action/deploy/display.rb +89 -0
  137. data/lib/r10k/action/deploy/environment.rb +196 -0
  138. data/lib/r10k/action/deploy/module.rb +84 -0
  139. data/lib/r10k/action/puppetfile.rb +10 -0
  140. data/lib/r10k/action/puppetfile/check.rb +31 -0
  141. data/lib/r10k/action/puppetfile/cri_runner.rb +26 -0
  142. data/lib/r10k/action/puppetfile/install.rb +45 -0
  143. data/lib/r10k/action/puppetfile/purge.rb +28 -0
  144. data/lib/r10k/action/runner.rb +96 -0
  145. data/lib/r10k/action/visitor.rb +31 -0
  146. data/lib/r10k/cli.rb +51 -0
  147. data/lib/r10k/cli/deploy.rb +114 -0
  148. data/lib/r10k/cli/ext/logging.rb +15 -0
  149. data/lib/r10k/cli/help.rb +7 -0
  150. data/lib/r10k/cli/puppetfile.rb +74 -0
  151. data/lib/r10k/cli/version.rb +31 -0
  152. data/lib/r10k/deployment.rb +132 -0
  153. data/lib/r10k/deployment/config.rb +56 -0
  154. data/lib/r10k/environment.rb +37 -0
  155. data/lib/r10k/environment/bare.rb +16 -0
  156. data/lib/r10k/environment/base.rb +150 -0
  157. data/lib/r10k/environment/git.rb +81 -0
  158. data/lib/r10k/environment/name.rb +86 -0
  159. data/lib/r10k/environment/svn.rb +91 -0
  160. data/lib/r10k/environment/with_modules.rb +139 -0
  161. data/lib/r10k/errors.rb +61 -0
  162. data/lib/r10k/errors/formatting.rb +28 -0
  163. data/lib/r10k/feature.rb +56 -0
  164. data/lib/r10k/feature/collection.rb +23 -0
  165. data/lib/r10k/features.rb +20 -0
  166. data/lib/r10k/forge/module_release.rb +228 -0
  167. data/lib/r10k/git.rb +196 -0
  168. data/lib/r10k/git/alternates.rb +63 -0
  169. data/lib/r10k/git/cache.rb +108 -0
  170. data/lib/r10k/git/errors.rb +34 -0
  171. data/lib/r10k/git/rugged.rb +17 -0
  172. data/lib/r10k/git/rugged/bare_repository.rb +85 -0
  173. data/lib/r10k/git/rugged/base_repository.rb +93 -0
  174. data/lib/r10k/git/rugged/cache.rb +11 -0
  175. data/lib/r10k/git/rugged/credentials.rb +91 -0
  176. data/lib/r10k/git/rugged/thin_repository.rb +89 -0
  177. data/lib/r10k/git/rugged/working_repository.rb +145 -0
  178. data/lib/r10k/git/shellgit.rb +9 -0
  179. data/lib/r10k/git/shellgit/bare_repository.rb +43 -0
  180. data/lib/r10k/git/shellgit/base_repository.rb +137 -0
  181. data/lib/r10k/git/shellgit/cache.rb +11 -0
  182. data/lib/r10k/git/shellgit/thin_repository.rb +69 -0
  183. data/lib/r10k/git/shellgit/working_repository.rb +111 -0
  184. data/lib/r10k/git/stateful_repository.rb +95 -0
  185. data/lib/r10k/initializers.rb +67 -0
  186. data/lib/r10k/instance_cache.rb +32 -0
  187. data/lib/r10k/keyed_factory.rb +39 -0
  188. data/lib/r10k/logging.rb +109 -0
  189. data/lib/r10k/logging/terminaloutputter.rb +36 -0
  190. data/lib/r10k/module.rb +38 -0
  191. data/lib/r10k/module/base.rb +113 -0
  192. data/lib/r10k/module/forge.rb +177 -0
  193. data/lib/r10k/module/git.rb +109 -0
  194. data/lib/r10k/module/local.rb +36 -0
  195. data/lib/r10k/module/metadata_file.rb +31 -0
  196. data/lib/r10k/module/svn.rb +112 -0
  197. data/lib/r10k/puppetfile.rb +286 -0
  198. data/lib/r10k/settings.rb +194 -0
  199. data/lib/r10k/settings/collection.rb +123 -0
  200. data/lib/r10k/settings/container.rb +97 -0
  201. data/lib/r10k/settings/definition.rb +124 -0
  202. data/lib/r10k/settings/enum_definition.rb +30 -0
  203. data/lib/r10k/settings/helpers.rb +38 -0
  204. data/lib/r10k/settings/list.rb +107 -0
  205. data/lib/r10k/settings/loader.rb +99 -0
  206. data/lib/r10k/settings/mixin.rb +54 -0
  207. data/lib/r10k/settings/uri_definition.rb +19 -0
  208. data/lib/r10k/source.rb +42 -0
  209. data/lib/r10k/source/base.rb +74 -0
  210. data/lib/r10k/source/exec.rb +51 -0
  211. data/lib/r10k/source/git.rb +142 -0
  212. data/lib/r10k/source/hash.rb +182 -0
  213. data/lib/r10k/source/svn.rb +136 -0
  214. data/lib/r10k/source/yaml.rb +20 -0
  215. data/lib/r10k/source/yamldir.rb +32 -0
  216. data/lib/r10k/svn.rb +6 -0
  217. data/lib/r10k/svn/remote.rb +68 -0
  218. data/lib/r10k/svn/working_dir.rb +125 -0
  219. data/lib/r10k/util/attempt.rb +84 -0
  220. data/lib/r10k/util/basedir.rb +65 -0
  221. data/lib/r10k/util/commands.rb +31 -0
  222. data/lib/r10k/util/exec_env.rb +36 -0
  223. data/lib/r10k/util/license.rb +24 -0
  224. data/lib/r10k/util/platform.rb +42 -0
  225. data/lib/r10k/util/purgeable.rb +88 -0
  226. data/lib/r10k/util/setopts.rb +55 -0
  227. data/lib/r10k/util/subprocess.rb +84 -0
  228. data/lib/r10k/util/subprocess/result.rb +56 -0
  229. data/lib/r10k/util/subprocess/runner.rb +26 -0
  230. data/lib/r10k/util/subprocess/runner/jruby.rb +23 -0
  231. data/lib/r10k/util/subprocess/runner/posix.rb +103 -0
  232. data/lib/r10k/util/subprocess/runner/pump.rb +59 -0
  233. data/lib/r10k/util/subprocess/runner/windows.rb +23 -0
  234. data/lib/r10k/util/subprocess/subprocess_error.rb +24 -0
  235. data/lib/r10k/util/symbolize_keys.rb +35 -0
  236. data/lib/r10k/version.rb +6 -0
  237. data/locales/config.yaml +21 -0
  238. data/locales/r10k.pot +545 -0
  239. data/r10k.gemspec +50 -0
  240. data/r10k.yaml.example +112 -0
  241. data/spec/fixtures/empty/.empty +0 -0
  242. data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
  243. data/spec/fixtures/module/forge/bad_module/metadata.json +1 -0
  244. data/spec/fixtures/module/forge/eight_hundred/Modulefile +8 -0
  245. data/spec/fixtures/module/forge/eight_hundred/metadata.json +19 -0
  246. data/spec/fixtures/unit/action/r10k.yaml +5 -0
  247. data/spec/fixtures/unit/action/r10k_cachedir.yaml +2 -0
  248. data/spec/fixtures/unit/action/r10k_generate_types.yaml +3 -0
  249. data/spec/fixtures/unit/action/r10k_puppet_path.yaml +3 -0
  250. data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +1 -0
  251. data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +5 -0
  252. data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +10 -0
  253. data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +1 -0
  254. data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +1 -0
  255. data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +1 -0
  256. data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +1 -0
  257. data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +1 -0
  258. data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
  259. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
  260. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
  261. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
  262. data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
  263. data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
  264. data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +3 -0
  265. data/spec/integration/git/rugged/bare_repository_spec.rb +13 -0
  266. data/spec/integration/git/rugged/thin_repository_spec.rb +14 -0
  267. data/spec/integration/git/rugged/working_repository_spec.rb +48 -0
  268. data/spec/integration/git/shellgit/bare_repository_spec.rb +13 -0
  269. data/spec/integration/git/shellgit/thin_repository_spec.rb +14 -0
  270. data/spec/integration/git/shellgit/working_repository_spec.rb +13 -0
  271. data/spec/integration/git/stateful_repository_spec.rb +159 -0
  272. data/spec/matchers/exit_with.rb +28 -0
  273. data/spec/matchers/match_realpath.rb +18 -0
  274. data/spec/r10k-mocks.rb +3 -0
  275. data/spec/r10k-mocks/mock_config.rb +33 -0
  276. data/spec/r10k-mocks/mock_env.rb +15 -0
  277. data/spec/r10k-mocks/mock_source.rb +13 -0
  278. data/spec/shared-contexts/git-fixtures.rb +55 -0
  279. data/spec/shared-examples/deploy-actions.rb +69 -0
  280. data/spec/shared-examples/git-repository.rb +38 -0
  281. data/spec/shared-examples/git/bare_repository.rb +132 -0
  282. data/spec/shared-examples/git/thin_repository.rb +26 -0
  283. data/spec/shared-examples/git/working_repository.rb +207 -0
  284. data/spec/shared-examples/puppetfile-action.rb +39 -0
  285. data/spec/shared-examples/settings/ancestry.rb +44 -0
  286. data/spec/shared-examples/subprocess-runner.rb +83 -0
  287. data/spec/spec_helper.rb +40 -0
  288. data/spec/unit/action/cri_runner_spec.rb +72 -0
  289. data/spec/unit/action/deploy/deploy_helpers_spec.rb +38 -0
  290. data/spec/unit/action/deploy/display_spec.rb +31 -0
  291. data/spec/unit/action/deploy/environment_spec.rb +395 -0
  292. data/spec/unit/action/deploy/module_spec.rb +139 -0
  293. data/spec/unit/action/puppetfile/check_spec.rb +41 -0
  294. data/spec/unit/action/puppetfile/cri_runner_spec.rb +47 -0
  295. data/spec/unit/action/puppetfile/install_spec.rb +84 -0
  296. data/spec/unit/action/puppetfile/purge_spec.rb +42 -0
  297. data/spec/unit/action/runner_spec.rb +213 -0
  298. data/spec/unit/action/visitor_spec.rb +39 -0
  299. data/spec/unit/cli_spec.rb +9 -0
  300. data/spec/unit/deployment/config_spec.rb +33 -0
  301. data/spec/unit/deployment_spec.rb +162 -0
  302. data/spec/unit/environment/base_spec.rb +109 -0
  303. data/spec/unit/environment/git_spec.rb +97 -0
  304. data/spec/unit/environment/name_spec.rb +135 -0
  305. data/spec/unit/environment/svn_spec.rb +133 -0
  306. data/spec/unit/errors/formatting_spec.rb +84 -0
  307. data/spec/unit/feature_spec.rb +50 -0
  308. data/spec/unit/forge/module_release_spec.rb +213 -0
  309. data/spec/unit/git/alternates_spec.rb +116 -0
  310. data/spec/unit/git/cache_spec.rb +55 -0
  311. data/spec/unit/git/rugged/cache_spec.rb +29 -0
  312. data/spec/unit/git/rugged/credentials_spec.rb +109 -0
  313. data/spec/unit/git/shellgit/cache_spec.rb +27 -0
  314. data/spec/unit/git/stateful_repository_spec.rb +40 -0
  315. data/spec/unit/git_spec.rb +102 -0
  316. data/spec/unit/initializers_spec.rb +68 -0
  317. data/spec/unit/instance_cache_spec.rb +78 -0
  318. data/spec/unit/keyed_factory_spec.rb +51 -0
  319. data/spec/unit/logging/terminaloutputter_spec.rb +53 -0
  320. data/spec/unit/logging_spec.rb +68 -0
  321. data/spec/unit/module/base_spec.rb +72 -0
  322. data/spec/unit/module/forge_spec.rb +207 -0
  323. data/spec/unit/module/git_spec.rb +274 -0
  324. data/spec/unit/module/metadata_file_spec.rb +68 -0
  325. data/spec/unit/module/svn_spec.rb +178 -0
  326. data/spec/unit/module_spec.rb +29 -0
  327. data/spec/unit/puppetfile_spec.rb +300 -0
  328. data/spec/unit/settings/collection_spec.rb +123 -0
  329. data/spec/unit/settings/container_spec.rb +92 -0
  330. data/spec/unit/settings/definition_spec.rb +79 -0
  331. data/spec/unit/settings/enum_definition_spec.rb +20 -0
  332. data/spec/unit/settings/inheritance_spec.rb +38 -0
  333. data/spec/unit/settings/list_spec.rb +88 -0
  334. data/spec/unit/settings/loader_spec.rb +110 -0
  335. data/spec/unit/settings/uri_definition_spec.rb +23 -0
  336. data/spec/unit/settings_spec.rb +246 -0
  337. data/spec/unit/source/base_spec.rb +31 -0
  338. data/spec/unit/source/exec_spec.rb +81 -0
  339. data/spec/unit/source/git_spec.rb +185 -0
  340. data/spec/unit/source/hash_spec.rb +54 -0
  341. data/spec/unit/source/svn_spec.rb +196 -0
  342. data/spec/unit/source/yaml_spec.rb +42 -0
  343. data/spec/unit/source_spec.rb +10 -0
  344. data/spec/unit/svn/remote_spec.rb +21 -0
  345. data/spec/unit/svn/working_dir_spec.rb +56 -0
  346. data/spec/unit/util/attempt_spec.rb +82 -0
  347. data/spec/unit/util/commands_spec.rb +61 -0
  348. data/spec/unit/util/exec_env_spec.rb +56 -0
  349. data/spec/unit/util/purgeable_spec.rb +230 -0
  350. data/spec/unit/util/setopts_spec.rb +59 -0
  351. data/spec/unit/util/subprocess/result_spec.rb +36 -0
  352. data/spec/unit/util/subprocess/runner/posix_spec.rb +7 -0
  353. data/spec/unit/util/subprocess/runner/pump_spec.rb +79 -0
  354. data/spec/unit/util/subprocess/runner/windows_spec.rb +7 -0
  355. data/spec/unit/util/subprocess/subprocess_error_spec.rb +26 -0
  356. data/spec/unit/util/subprocess_spec.rb +65 -0
  357. data/spec/unit/util/symbolize_keys_spec.rb +67 -0
  358. metadata +582 -0
@@ -0,0 +1,139 @@
1
+ require 'spec_helper'
2
+
3
+ require 'r10k/action/deploy/module'
4
+
5
+ describe R10K::Action::Deploy::Module do
6
+
7
+ subject { described_class.new({config: "/some/nonexistent/path"}, []) }
8
+
9
+ it_behaves_like "a deploy action that requires a config file"
10
+ it_behaves_like "a deploy action that can be write locked"
11
+
12
+ describe "initializing" do
13
+ it "accepts an environment option" do
14
+ described_class.new({environment: "production"}, [])
15
+ end
16
+
17
+ it "can accept a no-force option" do
18
+ described_class.new({:'no-force' => true}, [])
19
+ end
20
+
21
+ it 'can accept a generate-types option' do
22
+ described_class.new({ 'generate-types': true }, [])
23
+ end
24
+
25
+ it 'can accept a puppet-path option' do
26
+ described_class.new({ 'puppet-path': '/nonexistent' }, [])
27
+ end
28
+
29
+ it 'can accept a cachedir option' do
30
+ described_class.new({ cachedir: '/nonexistent' }, [])
31
+ end
32
+ end
33
+
34
+ describe "with no-force" do
35
+
36
+ subject { described_class.new({ config: "/some/nonexistent/path", :'no-force' => true}, [] )}
37
+
38
+ it "tries to preserve local modifications" do
39
+ expect(subject.force).to equal(false)
40
+ end
41
+ end
42
+
43
+ describe 'generate-types' do
44
+ let(:deployment) do
45
+ R10K::Deployment.new(
46
+ sources: {
47
+ control: {
48
+ type: :mock,
49
+ basedir: '/some/nonexistent/path/control',
50
+ environments: %w[first second]
51
+ }
52
+ }
53
+ )
54
+ end
55
+
56
+ before do
57
+ allow(R10K::Deployment).to receive(:new).and_return(deployment)
58
+ end
59
+
60
+ context 'with generate-types enabled' do
61
+ subject do
62
+ described_class.new(
63
+ {
64
+ config: '/some/nonexistent/path',
65
+ 'generate-types': true
66
+ },
67
+ %w[first]
68
+ )
69
+ end
70
+
71
+ before do
72
+ allow(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
73
+ expect(environment.puppetfile).to receive(:modules).and_return(
74
+ [R10K::Module::Local.new(environment.name, '/fakedir', [], environment)]
75
+ )
76
+ original.call(environment, &block)
77
+ end
78
+ end
79
+
80
+ it 'generate_types is true' do
81
+ expect(subject.instance_variable_get(:@generate_types)).to eq(true)
82
+ end
83
+
84
+ it 'only calls puppet generate types on environments with specified module' do
85
+ expect(subject).to receive(:visit_module).and_wrap_original do |original, mod, &block|
86
+ if mod.name == 'first'
87
+ expect(mod.environment).to receive(:generate_types!)
88
+ else
89
+ expect(mod.environment).not_to receive(:generate_types!)
90
+ end
91
+ original.call(mod, &block)
92
+ end.twice
93
+ subject.call
94
+ end
95
+ end
96
+
97
+ context 'with generate-types disabled' do
98
+ subject do
99
+ described_class.new(
100
+ {
101
+ config: '/some/nonexistent/path',
102
+ 'generate-types': false
103
+ },
104
+ %w[first]
105
+ )
106
+ end
107
+
108
+ it 'generate_types is false' do
109
+ expect(subject.instance_variable_get(:@generate_types)).to eq(false)
110
+ end
111
+
112
+ it 'does not call puppet generate types' do |it|
113
+ expect(subject).to receive(:visit_environment).and_wrap_original do |original, environment, &block|
114
+ expect(environment).not_to receive(:generate_types!)
115
+ original.call(environment, &block)
116
+ end.twice
117
+ subject.call
118
+ end
119
+ end
120
+ end
121
+
122
+ describe 'with puppet-path' do
123
+
124
+ subject { described_class.new({ config: '/some/nonexistent/path', 'puppet-path': '/nonexistent' }, []) }
125
+
126
+ it 'sets puppet_path' do
127
+ expect(subject.instance_variable_get(:@puppet_path)).to eq('/nonexistent')
128
+ end
129
+ end
130
+
131
+ describe 'with cachedir' do
132
+
133
+ subject { described_class.new({ config: '/some/nonexistent/path', cachedir: '/nonexistent' }, []) }
134
+
135
+ it 'sets puppet_path' do
136
+ expect(subject.instance_variable_get(:@cachedir)).to eq('/nonexistent')
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+ require 'r10k/action/puppetfile/check'
3
+
4
+ describe R10K::Action::Puppetfile::Check do
5
+ let(:default_opts) { {root: "/some/nonexistent/path"} }
6
+ let(:puppetfile) { instance_double('R10K::Puppetfile', :load! => true) }
7
+
8
+ def checker(opts = {}, argv = [], settings = {})
9
+ opts = default_opts.merge(opts)
10
+ return described_class.new(opts, argv, settings)
11
+ end
12
+
13
+ before(:each) do
14
+ allow(R10K::Puppetfile).to receive(:new).with("/some/nonexistent/path", nil, nil).and_return(puppetfile)
15
+ end
16
+
17
+ it_behaves_like "a puppetfile action"
18
+
19
+ it "prints 'Syntax OK' when the Puppetfile syntax could be validated" do
20
+ expect($stderr).to receive(:puts).with("Syntax OK")
21
+
22
+ checker.call
23
+ end
24
+
25
+ it "prints an error message when validating the Puppetfile syntax raised an error" do
26
+ allow(puppetfile).to receive(:load!).and_raise(R10K::Error.new("Boom!"))
27
+ allow(R10K::Errors::Formatting).to receive(:format_exception).with(instance_of(R10K::Error), anything).and_return("Formatted error message")
28
+
29
+ expect($stderr).to receive(:puts).with("Formatted error message")
30
+
31
+ checker.call
32
+ end
33
+
34
+ it "respects --puppetfile option" do
35
+ allow($stderr).to receive(:puts)
36
+
37
+ expect(R10K::Puppetfile).to receive(:new).with("/some/nonexistent/path", nil, "/custom/puppetfile/path").and_return(puppetfile)
38
+
39
+ checker({puppetfile: "/custom/puppetfile/path"}).call
40
+ end
41
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+ require 'r10k/action/puppetfile/cri_runner'
3
+
4
+ describe R10K::Action::Puppetfile::CriRunner do
5
+
6
+ let(:action_class) do
7
+ Class.new do
8
+ attr_reader :opts
9
+ attr_reader :argv
10
+
11
+ def initialize(opts, argv)
12
+ @opts = opts
13
+ @argv = argv
14
+ end
15
+
16
+ def call
17
+ @opts[:runok]
18
+ end
19
+ end
20
+ end
21
+
22
+ subject(:cri_runner) { described_class.wrap(action_class) }
23
+
24
+ let(:opts) { {:value => :yep} }
25
+ let(:argv) { %w[value yes] }
26
+
27
+ describe "handling options" do
28
+ it "sets the root to the current wd" do
29
+ expect(cri_runner).to receive(:wd).and_return('/some/nonexistent')
30
+ expect(cri_runner.handle_opts({})).to include(:root => '/some/nonexistent')
31
+ end
32
+
33
+ describe "for the moduledir" do
34
+ it "sets the option from the cli option if given" do
35
+ opts = {:moduledir => '/some/other/nonexistent/modules'}
36
+ expect(cri_runner.handle_opts(opts)).to include(:moduledir => '/some/other/nonexistent/modules')
37
+ end
38
+ end
39
+
40
+ describe "for the puppetfile path" do
41
+ it "sets the option from the cli option if given" do
42
+ opts = {:puppetfile => '/some/other/nonexistent/modules'}
43
+ expect(cri_runner.handle_opts(opts)).to include(:puppetfile => '/some/other/nonexistent/modules')
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+ require 'r10k/action/puppetfile/install'
3
+
4
+ describe R10K::Action::Puppetfile::Install do
5
+ let(:default_opts) { {root: "/some/nonexistent/path"} }
6
+ let(:puppetfile) { R10K::Puppetfile.new('/some/nonexistent/path', nil, nil) }
7
+
8
+ def installer(opts = {}, argv = [], settings = {})
9
+ opts = default_opts.merge(opts)
10
+ return described_class.new(opts, argv, settings)
11
+ end
12
+
13
+ before(:each) do
14
+ allow(puppetfile).to receive(:load!).and_return(nil)
15
+ allow(R10K::Puppetfile).to receive(:new).with("/some/nonexistent/path", nil, nil, nil, nil).and_return(puppetfile)
16
+ end
17
+
18
+ it_behaves_like "a puppetfile install action"
19
+
20
+ describe "installing modules" do
21
+ let(:modules) do
22
+ (1..4).map do |idx|
23
+ R10K::Module::Base.new("author/modname#{idx}", "/some/nonexistent/path/modname#{idx}", nil)
24
+ end
25
+ end
26
+
27
+ before do
28
+ allow(puppetfile).to receive(:purge!)
29
+ allow(puppetfile).to receive(:modules).and_return(modules)
30
+ end
31
+
32
+ it "syncs each module in the Puppetfile" do
33
+ modules.each { |m| expect(m).to receive(:sync) }
34
+
35
+ expect(installer.call).to eq true
36
+ end
37
+
38
+ it "returns false if a module failed to install" do
39
+ modules[0..2].each { |m| expect(m).to receive(:sync) }
40
+ expect(modules[3]).to receive(:sync).and_raise
41
+
42
+ expect(installer.call).to eq false
43
+ end
44
+ end
45
+
46
+ describe "purging" do
47
+ before do
48
+ allow(puppetfile).to receive(:modules).and_return([])
49
+ end
50
+
51
+ it "purges the moduledir after installation" do
52
+ expect(puppetfile).to receive(:purge!)
53
+
54
+ installer.call
55
+ end
56
+ end
57
+
58
+ describe "using custom paths" do
59
+ it "can use a custom puppetfile path" do
60
+ expect(R10K::Puppetfile).to receive(:new).with("/some/nonexistent/path", nil, "/some/other/path/Puppetfile", nil, nil).and_return(puppetfile)
61
+
62
+ installer({puppetfile: "/some/other/path/Puppetfile"}).call
63
+ end
64
+
65
+ it "can use a custom moduledir path" do
66
+ expect(R10K::Puppetfile).to receive(:new).with("/some/nonexistent/path", "/some/other/path/site-modules", nil, nil, nil).and_return(puppetfile)
67
+
68
+ installer({moduledir: "/some/other/path/site-modules"}).call
69
+ end
70
+ end
71
+
72
+ describe "forcing to overwrite local changes" do
73
+ before do
74
+ allow(puppetfile).to receive(:modules).and_return([])
75
+ end
76
+
77
+ it "can use the force overwrite option" do
78
+ subject = described_class.new({root: "/some/nonexistent/path", force: true}, [])
79
+ expect(R10K::Puppetfile).to receive(:new).with("/some/nonexistent/path", nil, nil, nil, true).and_return(puppetfile)
80
+ subject.call
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ require 'r10k/action/puppetfile/purge'
3
+
4
+ describe R10K::Action::Puppetfile::Purge do
5
+ let(:default_opts) { {root: "/some/nonexistent/path"} }
6
+ let(:puppetfile) { instance_double('R10K::Puppetfile', :load! => nil) }
7
+
8
+ def purger(opts = {}, argv = [], settings = {})
9
+ opts = default_opts.merge(opts)
10
+ return described_class.new(opts, argv, settings)
11
+ end
12
+
13
+ before(:each) do
14
+ allow(R10K::Puppetfile).to receive(:new).with("/some/nonexistent/path", nil, nil).and_return(puppetfile)
15
+ end
16
+
17
+ it_behaves_like "a puppetfile action"
18
+
19
+ it "purges unmanaged entries in the Puppetfile moduledir" do
20
+ expect(puppetfile).to receive(:purge!)
21
+
22
+ purger.call
23
+ end
24
+
25
+ describe "using custom paths" do
26
+ before(:each) do
27
+ allow(puppetfile).to receive(:purge!)
28
+ end
29
+
30
+ it "can use a custom puppetfile path" do
31
+ expect(R10K::Puppetfile).to receive(:new).with("/some/nonexistent/path", nil, "/some/other/path/Puppetfile").and_return(puppetfile)
32
+
33
+ purger({puppetfile: "/some/other/path/Puppetfile"}).call
34
+ end
35
+
36
+ it "can use a custom moduledir path" do
37
+ expect(R10K::Puppetfile).to receive(:new).with("/some/nonexistent/path", "/some/other/path/site-modules", nil).and_return(puppetfile)
38
+
39
+ purger({moduledir: "/some/other/path/site-modules"}).call
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,213 @@
1
+ require 'spec_helper'
2
+ require 'r10k/action/base'
3
+ require 'puppet_forge/connection'
4
+
5
+ require 'r10k/action/runner'
6
+
7
+ describe R10K::Action::Runner do
8
+
9
+ let(:action_class) do
10
+ Class.new do
11
+ attr_reader :opts
12
+ attr_reader :argv
13
+
14
+ def initialize(opts, argv, settings = {})
15
+ @opts = opts
16
+ @argv = argv
17
+ @settings = {}
18
+ end
19
+
20
+ def call
21
+ @argv.map(&:upcase)
22
+ end
23
+ end
24
+ end
25
+
26
+ subject(:runner) { described_class.new({:opts => :yep}, %w[args yes], action_class) }
27
+
28
+ before(:each) do
29
+ expect(runner.logger).not_to receive(:error)
30
+ end
31
+
32
+ describe "instantiating the wrapped class" do
33
+ it "creates an instance of the class" do
34
+ expect(runner.instance).to be_a_kind_of action_class
35
+ end
36
+
37
+ it "passes the opts and argv to the instance" do
38
+ expect(runner.instance.opts).to eq(:opts => :yep)
39
+ expect(runner.instance.argv).to eq(%w[args yes])
40
+ end
41
+
42
+ it "strips out options that the runner handles" do
43
+ runner = described_class.new({:opts => :yep, :loglevel => 'FATAL'}, %w[args yes], action_class)
44
+ expect(runner.instance.opts).to eq(:opts => :yep)
45
+ end
46
+ end
47
+
48
+ describe "calling" do
49
+ it "configures logging" do
50
+ expect(runner).to receive(:setup_logging)
51
+ runner.call
52
+ end
53
+
54
+ it "configures settings" do
55
+ expect(runner).to receive(:setup_settings)
56
+ runner.call
57
+ end
58
+
59
+ it "configures forge authorization" do
60
+ expect(runner).to receive(:setup_authorization)
61
+ runner.call
62
+ end
63
+
64
+ it "returns the result of the wrapped class #call method" do
65
+ expect(runner.call).to eq %w[ARGS YES]
66
+ end
67
+ end
68
+
69
+ describe "configuring settings" do
70
+ subject(:runner) { described_class.new(options, %w[args yes], action_class) }
71
+
72
+ let(:global_settings) { R10K::Settings.global_settings }
73
+
74
+ before(:each) do
75
+ expect(R10K::Settings).to receive(:global_settings).and_return(global_settings)
76
+ allow(File).to receive(:executable?).and_return(true)
77
+ end
78
+
79
+ opts = {
80
+ cachedir: nil,
81
+ puppet_path: :deploy,
82
+ generate_types: :deploy,
83
+ }
84
+
85
+ opts.each do |opt, conf_path|
86
+ context "with #{opt} config setting" do
87
+ let(:options) { { config: "spec/fixtures/unit/action/r10k_#{opt}.yaml" } }
88
+
89
+ context "when not overridden" do
90
+ it "uses the config value" do
91
+ override = { "#{opt}": "/config_#{opt}" }
92
+ overrides = if conf_path.nil?
93
+ override
94
+ else
95
+ { "#{conf_path}": override }
96
+ end
97
+ expect(global_settings).to receive(:evaluate).with(hash_including(overrides)).and_call_original
98
+ runner.call
99
+ end
100
+ end
101
+
102
+ context "when overridden" do
103
+ let(:options) { super().merge("#{opt.to_s.sub('_','-')}": "/overridden_#{opt}") }
104
+
105
+ it "uses the overridden value" do
106
+ override = { "#{opt}": "/overridden_#{opt}" }
107
+ overrides = if conf_path.nil?
108
+ override
109
+ else
110
+ { "#{conf_path}": override }
111
+ end
112
+ expect(global_settings).to receive(:evaluate).with(hash_including(overrides)).and_call_original
113
+ runner.call
114
+ end
115
+ end
116
+ end
117
+
118
+ context "with complete config" do
119
+ let(:options) { { config: "spec/fixtures/unit/action/r10k.yaml" } }
120
+ let(:config) do
121
+ config = {}
122
+ opts.each do |o, path|
123
+ if path.nil?
124
+ config[o] = "/config_#{o}"
125
+ else
126
+ config[path] ||= {}
127
+ config[path][o] = "/config_#{o}"
128
+ end
129
+ end
130
+ config
131
+ end
132
+
133
+ context "when not overridden" do
134
+ it "uses the config value" do
135
+ expect(global_settings).to receive(:evaluate).with(config).and_call_original
136
+ runner.call
137
+ end
138
+ end
139
+
140
+ context "when overridden" do
141
+ let(:options) {
142
+ super().merge("#{opt.to_s.sub('_','-')}": "/overridden_#{opt}")
143
+ }
144
+
145
+ it "uses the overridden value" do
146
+ with_overrides = config
147
+ if conf_path.nil?
148
+ with_overrides[opt] = "/overridden_#{opt}"
149
+ else
150
+ with_overrides[conf_path][opt] = "/overridden_#{opt}"
151
+ end
152
+ expect(global_settings).to receive(:evaluate).with(with_overrides).and_call_original
153
+ runner.call
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ describe "configuring logging" do
161
+ it "sets the log level if :loglevel is provided" do
162
+ runner = described_class.new({:opts => :yep, :loglevel => 'FATAL'}, %w[args yes], action_class)
163
+ expect(R10K::Logging).to receive(:level=).with('FATAL')
164
+ runner.call
165
+ end
166
+
167
+ it "does not modify the loglevel if :loglevel is not provided" do
168
+ expect(R10K::Logging).to_not receive(:level=)
169
+ runner.call
170
+ end
171
+ end
172
+
173
+ describe "configuration authorization" do
174
+ context "when license is not present" do
175
+ before(:each) do
176
+ expect(R10K::Util::License).to receive(:load).and_return(nil)
177
+ end
178
+
179
+ it "does not set authorization header on connection class" do
180
+ expect(PuppetForge::Connection).not_to receive(:authorization=)
181
+ runner.setup_authorization
182
+ end
183
+ end
184
+
185
+ context "when license is present but invalid" do
186
+ before(:each) do
187
+ expect(R10K::Util::License).to receive(:load).and_raise(R10K::Error.new('invalid license'))
188
+ end
189
+
190
+ it "issues warning to logger" do
191
+ expect(runner.logger).to receive(:warn).with(/invalid license/)
192
+ runner.setup_authorization
193
+ end
194
+
195
+ it "does not set authorization header on connection class" do
196
+ expect(PuppetForge::Connection).not_to receive(:authorization=)
197
+ runner.setup_authorization
198
+ end
199
+ end
200
+
201
+ context "when license is present and valid" do
202
+ before(:each) do
203
+ mock_license = double('pe-license', :authorization_token => 'test token')
204
+ expect(R10K::Util::License).to receive(:load).and_return(mock_license)
205
+ end
206
+
207
+ it "sets authorization header on connection class" do
208
+ expect(PuppetForge::Connection).to receive(:authorization=).with('test token')
209
+ runner.setup_authorization
210
+ end
211
+ end
212
+ end
213
+ end