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,39 @@
1
+ require 'spec_helper'
2
+ require 'r10k/action/visitor'
3
+ require 'r10k/logging'
4
+
5
+ describe R10K::Action::Visitor do
6
+ let(:visitor_class) do
7
+ Class.new do
8
+ include R10K::Action::Visitor
9
+ include R10K::Logging
10
+ attr_accessor :trace
11
+
12
+ def visit_error(other)
13
+ raise ArgumentError, "no soup for you"
14
+ end
15
+ end
16
+ end
17
+
18
+ subject { visitor_class.new }
19
+
20
+ it "dispatches visit invocations to the type specific method" do
21
+ expect(subject).to receive(:visit_sym).with(:hi)
22
+ subject.visit(:sym, :hi)
23
+ end
24
+
25
+ describe "when a visit_ method raises an error" do
26
+
27
+ [true, false].each do |trace|
28
+ msg = trace ? "a" : "no"
29
+ it "logs the error with #{msg} backtrace when trace is #{trace}" do
30
+ subject.trace = trace
31
+ expect(R10K::Errors::Formatting).to(
32
+ receive(:format_exception).with(instance_of(ArgumentError), trace)
33
+ ).and_return("errmsg")
34
+ expect(subject.logger).to receive(:error).with('errmsg')
35
+ subject.visit(:error, :hi)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'basic cli sanity check' do
4
+ it 'can load the R10K::CLI namespace' do
5
+ expect {
6
+ require 'r10k/cli'
7
+ }.not_to raise_exception
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe R10K::Deployment::Config do
4
+ let(:loader) { instance_double('R10K::Settings::Loader') }
5
+ let(:initializer) { instance_double('R10K::Initializers::GlobalInitializer') }
6
+
7
+ describe "applying global settings" do
8
+ before do
9
+ expect(R10K::Settings::Loader).to receive(:new).and_return(loader)
10
+ expect(R10K::Initializers::GlobalInitializer).to receive(:new).and_return(initializer)
11
+ end
12
+
13
+ it 'runs application initialization' do
14
+ config = instance_double('Hash')
15
+ allow(loader).to receive(:read).and_return({})
16
+ expect(initializer).to receive(:call)
17
+ described_class.new('some/path')
18
+ end
19
+ end
20
+
21
+ describe "overriding settings" do
22
+ before do
23
+ expect(R10K::Settings::Loader).to receive(:new).and_return(loader)
24
+ end
25
+
26
+ it 'allows settings from config to be overridden' do
27
+ allow(loader).to receive(:read).and_return({:cachedir => 'fromfile'})
28
+ expect(R10K::Initializers::GlobalInitializer).to receive(:new).with(hash_including(:cachedir => 'fromoverride')).and_return(initializer)
29
+ expect(initializer).to receive(:call)
30
+ described_class.new('some/path', {:cachedir => 'fromoverride'})
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+ require 'r10k/deployment'
3
+ require 'tmpdir'
4
+
5
+ describe R10K::Deployment do
6
+
7
+ let(:confdir) { Dir.mktmpdir }
8
+
9
+ let(:config) do
10
+ R10K::Deployment::MockConfig.new(
11
+ :sources => {
12
+ :control => {
13
+ :type => :mock,
14
+ :basedir => File.join(confdir, 'environments'),
15
+ :environments => %w[first second third],
16
+ },
17
+ :hiera => {
18
+ :type => :mock,
19
+ :basedir => File.join(confdir, 'hiera'),
20
+ :environments => %w[fourth fifth sixth],
21
+ }
22
+ }
23
+ )
24
+ end
25
+
26
+ subject(:deployment) { described_class.new(config) }
27
+
28
+ let(:control) { deployment.sources.find { |source| source.name == :control } }
29
+ let(:hiera) { deployment.sources.find { |source| source.name == :hiera } }
30
+
31
+ describe "loading" do
32
+ describe "sources" do
33
+ it "creates a source for each key in the ':sources' config entry" do
34
+ expect(control.basedir).to eq(File.join(confdir, 'environments'))
35
+ expect(hiera.basedir).to eq(File.join(confdir, 'hiera'))
36
+ end
37
+ end
38
+
39
+ describe "loading environments" do
40
+ it "loads environments from each source" do
41
+ %w[first second third fourth fifth sixth].each do |env|
42
+ expect(deployment.environments.map(&:name)).to include(env)
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "preloading" do
49
+ it "invokes #preload! on each source" do
50
+ deployment.sources.each do |source|
51
+ expect(source).to receive(:preload!)
52
+ end
53
+ deployment.preload!
54
+ end
55
+ end
56
+
57
+ describe "paths" do
58
+ it "retrieves the path for each source" do
59
+ expect(deployment.paths).to include(File.join(confdir, 'environments'))
60
+ expect(deployment.paths).to include(File.join(confdir, 'hiera'))
61
+ end
62
+ end
63
+
64
+ describe "paths and sources" do
65
+ it "retrieves the path for each source" do
66
+ p_a_s = deployment.paths_and_sources
67
+
68
+ expect(p_a_s[File.join(confdir, 'environments')]).to eq([control])
69
+ expect(p_a_s[File.join(confdir, 'hiera')]).to eq([hiera])
70
+ end
71
+ end
72
+
73
+ describe "purging" do
74
+ it "purges each managed directory" do
75
+ env_basedir = double("basedir environments")
76
+ hiera_basedir = double("basedir hiera")
77
+
78
+ expect(env_basedir).to receive(:purge!)
79
+ expect(hiera_basedir).to receive(:purge!)
80
+
81
+ expect(R10K::Util::Basedir).to receive(:new).with(File.join(confdir, 'environments'), [control]).and_return(env_basedir)
82
+ expect(R10K::Util::Basedir).to receive(:new).with(File.join(confdir, 'hiera'), [hiera]).and_return(hiera_basedir)
83
+
84
+ deployment.purge!
85
+ end
86
+ end
87
+
88
+ describe "accepting a visitor" do
89
+ it "passes itself to the visitor" do
90
+ visitor = spy('visitor')
91
+ expect(visitor).to receive(:visit).with(:deployment, subject)
92
+ subject.accept(visitor)
93
+ end
94
+
95
+ it "passes the visitor to each environment if the visitor yields" do
96
+ visitor = spy('visitor')
97
+ expect(visitor).to receive(:visit) do |type, other, &block|
98
+ expect(type).to eq :deployment
99
+ expect(other).to eq subject
100
+ block.call
101
+ end
102
+
103
+ source1 = spy('source')
104
+ expect(source1).to receive(:accept).with(visitor)
105
+ source2 = spy('source')
106
+ expect(source2).to receive(:accept).with(visitor)
107
+
108
+ expect(subject).to receive(:sources).and_return([source1, source2])
109
+ subject.accept(visitor)
110
+ end
111
+ end
112
+ end
113
+
114
+ describe R10K::Deployment, "with environment collisions" do
115
+
116
+ let(:confdir) { Dir.mktmpdir }
117
+
118
+ let(:config) do
119
+ R10K::Deployment::MockConfig.new(
120
+ :sources => {
121
+ :s1 => {
122
+ :type => :mock,
123
+ :basedir => File.join(confdir, 'environments'),
124
+ :environments => %w[first second third],
125
+ },
126
+ :s2 => {
127
+ :type => :mock,
128
+ :basedir => File.join(confdir, 'environments'),
129
+ :environments => %w[third fourth fifth],
130
+ }
131
+ }
132
+ )
133
+ end
134
+
135
+ subject(:deployment) { described_class.new(config) }
136
+
137
+ it "raises an error when validating" do
138
+ expect {
139
+ deployment.validate!
140
+ }.to raise_error(R10K::Error, /Environment collision at .* between s\d:third and s\d:third/)
141
+ end
142
+ end
143
+
144
+ describe R10K::Deployment, "checking the 'sources' key" do
145
+
146
+ {
147
+ "when missing" => {},
148
+ "when empty" => {:sources => []},
149
+ }.each_pair do |desc, config_hash|
150
+ describe desc do
151
+
152
+ let(:config) { R10K::Deployment::MockConfig.new(config_hash) }
153
+ subject(:deployment) { described_class.new(config) }
154
+
155
+ it "raises an error when enumerating sources" do
156
+ expect {
157
+ deployment.sources
158
+ }.to raise_error(R10K::Error, "Unable to load sources; the supplied configuration does not define the 'sources' key")
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+ require 'r10k/environment'
3
+
4
+ describe R10K::Environment::Base do
5
+
6
+ subject(:environment) { described_class.new('envname', '/some/imaginary/path', 'env_name', {}) }
7
+
8
+ it "can return the fully qualified path" do
9
+ expect(environment.path).to eq(Pathname.new('/some/imaginary/path/env_name'))
10
+ end
11
+
12
+ it "raises an exception when #sync is called" do
13
+ expect { environment.sync }.to raise_error(NotImplementedError)
14
+ end
15
+
16
+ describe "accepting a visitor" do
17
+ it "passes itself to the visitor" do
18
+ visitor = spy('visitor')
19
+ expect(visitor).to receive(:visit).with(:environment, subject)
20
+ subject.accept(visitor)
21
+ end
22
+
23
+ it "passes the visitor to the puppetfile if the visitor yields" do
24
+ visitor = spy('visitor')
25
+ expect(visitor).to receive(:visit) do |type, other, &block|
26
+ expect(type).to eq :environment
27
+ expect(other).to eq subject
28
+ block.call
29
+ end
30
+
31
+ pf = spy('puppetfile')
32
+ expect(pf).to receive(:accept).with(visitor)
33
+
34
+ expect(subject).to receive(:puppetfile).and_return(pf)
35
+ subject.accept(visitor)
36
+ end
37
+ end
38
+
39
+ describe "#whitelist" do
40
+ let(:whitelist) do
41
+ ['**/*.xpp', 'custom', '*.tmp']
42
+ end
43
+
44
+ it "combines given patterns with full_path to env" do
45
+ expect(subject.whitelist(whitelist)).to all(start_with(subject.path.to_s))
46
+ end
47
+ end
48
+
49
+ describe "#purge_exclusions" do
50
+ let(:mock_env) { instance_double("R10K::Environment::Base") }
51
+ let(:mock_puppetfile) { instance_double("R10K::Puppetfile", :environment= => true, :environment => mock_env) }
52
+
53
+ before(:each) do
54
+ allow(mock_puppetfile).to receive(:managed_directories).and_return([])
55
+ allow(mock_puppetfile).to receive(:desired_contents).and_return([])
56
+ allow(R10K::Puppetfile).to receive(:new).and_return(mock_puppetfile)
57
+ end
58
+
59
+ it "excludes .r10k-deploy.json" do
60
+ expect(subject.purge_exclusions).to include(/r10k-deploy\.json/)
61
+ end
62
+
63
+ it "excludes puppetfile managed directories" do
64
+ managed_dirs = [
65
+ '/some/imaginary/path/env_name/modules',
66
+ '/some/imaginary/path/env_name/data',
67
+ ]
68
+
69
+ expect(mock_puppetfile).to receive(:managed_directories).and_return(managed_dirs)
70
+
71
+ exclusions = subject.purge_exclusions
72
+
73
+ managed_dirs.each do |dir|
74
+ expect(exclusions).to include(dir)
75
+ end
76
+ end
77
+
78
+ describe "puppetfile desired contents" do
79
+ let(:desired_contents) do
80
+ basedir = subject.path.to_s
81
+
82
+ [ 'modules/apache', 'data/local/site' ].collect do |c|
83
+ File.join(basedir, c)
84
+ end
85
+ end
86
+
87
+ before(:each) do
88
+ allow(File).to receive(:directory?).with(/^\/some\/imaginary\/path/).and_return(true)
89
+
90
+ expect(mock_puppetfile).to receive(:desired_contents).and_return(desired_contents)
91
+ end
92
+
93
+ it "excludes desired directory contents with glob" do
94
+ exclusions = subject.purge_exclusions
95
+
96
+ expect(exclusions).to include(/#{Regexp.escape(File.join('apache', '**', '*'))}$/)
97
+ expect(exclusions).to include(/#{Regexp.escape(File.join('site', '**', '*'))}$/)
98
+ end
99
+
100
+ it "excludes ancestors of desired directories" do
101
+ exclusions = subject.purge_exclusions
102
+
103
+ expect(exclusions).to include(/modules$/)
104
+ expect(exclusions).to include(/data\/local$/)
105
+ expect(exclusions).to include(/data$/)
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+ require 'r10k/environment'
3
+
4
+ describe R10K::Environment::Git do
5
+
6
+ subject do
7
+ described_class.new(
8
+ 'myenv',
9
+ '/some/nonexistent/environmentdir',
10
+ 'gitref',
11
+ {
12
+ :remote => 'git://git-server.site/my-repo.git',
13
+ :ref => 'd026ea677116424d2968edb9cee8cbc24d09322b',
14
+ }
15
+ )
16
+ end
17
+
18
+ describe "storing attributes" do
19
+ it "can return the environment name" do
20
+ expect(subject.name).to eq 'myenv'
21
+ end
22
+
23
+ it "can return the environment basedir" do
24
+ expect(subject.basedir).to eq '/some/nonexistent/environmentdir'
25
+ end
26
+
27
+ it "can return the environment dirname" do
28
+ expect(subject.dirname).to eq 'gitref'
29
+ end
30
+
31
+ it "can return the environment remote" do
32
+ expect(subject.remote).to eq 'git://git-server.site/my-repo.git'
33
+ end
34
+
35
+ it "can return the environment ref" do
36
+ expect(subject.ref).to eq 'd026ea677116424d2968edb9cee8cbc24d09322b'
37
+ end
38
+ end
39
+
40
+ describe "synchronizing the environment" do
41
+ it "syncs the git repository" do
42
+ expect(subject.repo).to receive(:sync)
43
+ subject.sync
44
+ end
45
+ end
46
+
47
+ describe "generating a puppetfile for the environment" do
48
+ let(:puppetfile) { subject.puppetfile }
49
+
50
+ it "creates a puppetfile at the full path to the environment" do
51
+ expect(puppetfile.basedir).to eq '/some/nonexistent/environmentdir/gitref'
52
+ end
53
+
54
+ it "sets the moduledir to 'modules' relative to the environment path" do
55
+ expect(puppetfile.moduledir).to eq '/some/nonexistent/environmentdir/gitref/modules'
56
+ end
57
+
58
+ it "sets the puppetfile path to 'Puppetfile' relative to the environment path" do
59
+ expect(puppetfile.puppetfile_path).to eq '/some/nonexistent/environmentdir/gitref/Puppetfile'
60
+ end
61
+ end
62
+
63
+ describe "enumerating modules" do
64
+ it "loads the Puppetfile and returns modules in that puppetfile" do
65
+ expect(subject.puppetfile).to receive(:load)
66
+ expect(subject.puppetfile).to receive(:modules).and_return [:modules]
67
+ expect(subject.modules).to eq([:modules])
68
+ end
69
+ end
70
+
71
+ describe "determining the status" do
72
+ it "delegates to the repo" do
73
+ expect(subject.repo).to receive(:status).and_return :some_status
74
+ expect(subject.status).to eq :some_status
75
+ end
76
+ end
77
+
78
+ describe "environment signature" do
79
+ it "returns the git sha of HEAD" do
80
+ expect(subject.repo).to receive(:head).and_return 'f00b00'
81
+ expect(subject.signature).to eq 'f00b00'
82
+ end
83
+ end
84
+
85
+ describe "info hash" do
86
+ let(:info_hash) { subject.info }
87
+
88
+ before(:each) do
89
+ allow(subject.repo).to receive(:head).and_return 'f00b00'
90
+ end
91
+
92
+ it "includes name and signature" do
93
+ expect(info_hash.keys).to include :name, :signature
94
+ expect(info_hash).not_to have_value(nil)
95
+ end
96
+ end
97
+ end