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,11 @@
1
+ require 'gettext-setup'
2
+
3
+ module R10K
4
+ GettextSetup.initialize(File.absolute_path('../locales', File.dirname(__FILE__)))
5
+
6
+ # Attempt to set the R10k error and log message locale
7
+ FastGettext.locale = ENV["LANG"]
8
+ end
9
+
10
+ require 'r10k/version'
11
+ require 'r10k/logging'
@@ -0,0 +1,31 @@
1
+ require 'r10k/util/setopts'
2
+ require 'r10k/logging'
3
+
4
+ module R10K
5
+ module Action
6
+ class Base
7
+
8
+ include R10K::Logging
9
+ include R10K::Util::Setopts
10
+
11
+ attr_accessor :settings
12
+
13
+ def initialize(opts, argv, settings = {})
14
+ @opts = opts
15
+ @argv = argv
16
+ @settings = settings
17
+
18
+ setopts(opts, allowed_initialize_opts)
19
+ end
20
+
21
+ private
22
+
23
+ def allowed_initialize_opts
24
+ {
25
+ :config => true,
26
+ :trace => true,
27
+ }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,72 @@
1
+ require 'r10k/action/runner'
2
+
3
+ module R10K
4
+ module Action
5
+
6
+ # Adapt the Cri runner interface to the R10K::Action::Runner interface
7
+ #
8
+ # This class provides the necessary glue to translate behavior specific
9
+ # to Cri and the CLI component in general to the interface agnostic runner
10
+ # class.
11
+ #
12
+ # @api private
13
+ class CriRunner
14
+
15
+ def self.wrap(klass)
16
+ new(klass)
17
+ end
18
+
19
+ def initialize(klass)
20
+ @klass = klass
21
+ end
22
+
23
+ # Intercept any instatiations of klass
24
+ #
25
+ # Defining #new allows this object to proxy method calls on the wrapped
26
+ # runner and decorate various methods. Doing so allows this class to
27
+ # manage CLI specific behaviors and isolate the underlying code from
28
+ # having to deal with those particularities
29
+ #
30
+ # @param opts [Hash]
31
+ # @param argv [Array<String>]
32
+ # @param _cmd [Cri::Command] The command that was invoked. This value
33
+ # is not used and is only present to adapt the Cri interface to r10k.
34
+ # @return [self]
35
+ def new(opts, argv, _cmd = nil)
36
+ handle_opts(opts)
37
+ handle_argv(argv)
38
+ @runner = R10K::Action::Runner.new(@opts, @argv, @klass)
39
+ self
40
+ end
41
+
42
+ # @return [Hash] The adapted options for the runner
43
+ def handle_opts(opts)
44
+ if opts[:verbose]
45
+ # Translate from the Cri verbose logging option to the internal logging setting.
46
+ opts[:loglevel] = opts.delete(:verbose)
47
+ end
48
+
49
+ # Colored logging is only appropriate for CLI interactions, so we
50
+ # handle this while we're still in CLI specific code.
51
+ use_color = opts.delete(:color)
52
+ if use_color
53
+ R10K::Logging.use_color = use_color
54
+ end
55
+
56
+ @opts = opts
57
+ end
58
+
59
+ # @return [Array] The adapted arguments for the runner
60
+ def handle_argv(argv)
61
+ @argv = argv
62
+ end
63
+
64
+ # Invoke the wrapped behavior, determine if it succeeded, and exit with
65
+ # the resulting exit code.
66
+ def call
67
+ rv = @runner.call
68
+ exit(rv ? 0 : 1)
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,9 @@
1
+ module R10K
2
+ module Action
3
+ module Deploy
4
+ require 'r10k/action/deploy/environment'
5
+ require 'r10k/action/deploy/module'
6
+ require 'r10k/action/deploy/display'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,34 @@
1
+ module R10K
2
+ module Action
3
+ module Deploy
4
+ module DeployHelpers
5
+
6
+ # Ensure that a config file has been found (and presumably loaded) and exit
7
+ # with a helpful error if it hasn't.
8
+ #
9
+ # @raise [SystemExit] If no config file was loaded
10
+ def expect_config!
11
+ if @config.nil?
12
+ logger.fatal(_("No configuration file given, no config file found in current directory, and no global config present"))
13
+ exit(8)
14
+ end
15
+ end
16
+
17
+ # Check to see if the deploy write_lock setting has been set, and log the lock message
18
+ # and exit if it has been set.
19
+ #
20
+ # @param config [Hash] The r10k config hash
21
+ #
22
+ # @raise [SystemExit] if the deploy write_lock setting has been set
23
+ def check_write_lock!(config)
24
+ write_lock = config.fetch(:deploy, {})[:write_lock]
25
+ if write_lock
26
+ logger.fatal(_("Making changes to deployed environments has been administratively disabled."))
27
+ logger.fatal(_("Reason: %{write_lock}") % {write_lock: write_lock})
28
+ exit(16)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,89 @@
1
+ require 'r10k/deployment'
2
+ require 'r10k/action/base'
3
+ require 'r10k/action/deploy/deploy_helpers'
4
+
5
+ module R10K
6
+ module Action
7
+ module Deploy
8
+ class Display < R10K::Action::Base
9
+
10
+ include R10K::Action::Deploy::DeployHelpers
11
+
12
+ def call
13
+ expect_config!
14
+ deployment = R10K::Deployment.new(@settings)
15
+
16
+ if @fetch
17
+ deployment.preload!
18
+ end
19
+
20
+ output = { :sources => deployment.sources.map { |source| source_info(source, @argv) } }
21
+
22
+ case @format
23
+ when 'json' then json_format(output)
24
+ else yaml_format(output)
25
+ end
26
+
27
+ # exit 0
28
+ true
29
+ rescue => e
30
+ logger.error R10K::Errors::Formatting.format_exception(e, @trace)
31
+ false
32
+ end
33
+
34
+ private
35
+
36
+ def json_format(output)
37
+ require 'json'
38
+ puts JSON.pretty_generate(output)
39
+ end
40
+
41
+ def yaml_format(output)
42
+ require 'yaml'
43
+ puts output.to_yaml
44
+ end
45
+
46
+ def source_info(source, argv=[])
47
+ source_info = {
48
+ :name => source.name,
49
+ :basedir => source.basedir,
50
+ }
51
+
52
+ source_info[:prefix] = source.prefix if source.prefix
53
+ source_info[:remote] = source.remote if source.respond_to?(:remote)
54
+
55
+ env_list = source.environments.select { |env| argv.empty? || argv.include?(env.name) }
56
+ source_info[:environments] = env_list.map { |env| environment_info(env) }
57
+
58
+ source_info
59
+ end
60
+
61
+ def environment_info(env)
62
+ if !@puppetfile && !@detail
63
+ env.dirname
64
+ else
65
+ env_info = env.info.merge({
66
+ :status => (env.status rescue nil),
67
+ })
68
+
69
+ env_info[:modules] = env.modules.map { |mod| module_info(mod) } if @puppetfile
70
+
71
+ env_info
72
+ end
73
+ end
74
+
75
+ def module_info(mod)
76
+ if @detail
77
+ { :name => mod.title, :properties => mod.properties }
78
+ else
79
+ mod.title
80
+ end
81
+ end
82
+
83
+ def allowed_initialize_opts
84
+ super.merge(puppetfile: :self, detail: :self, format: :self, fetch: :self)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,196 @@
1
+ require 'r10k/util/setopts'
2
+ require 'r10k/deployment'
3
+ require 'r10k/logging'
4
+ require 'r10k/action/visitor'
5
+ require 'r10k/action/base'
6
+ require 'r10k/action/deploy/deploy_helpers'
7
+ require 'json'
8
+
9
+ module R10K
10
+ module Action
11
+ module Deploy
12
+ class Environment < R10K::Action::Base
13
+
14
+ include R10K::Action::Deploy::DeployHelpers
15
+
16
+ attr_reader :force
17
+
18
+ def initialize(opts, argv, settings = nil)
19
+ settings ||= {}
20
+ @purge_levels = settings.fetch(:deploy, {}).fetch(:purge_levels, [])
21
+ @user_purge_whitelist = settings.fetch(:deploy, {}).fetch(:purge_whitelist, [])
22
+ @generate_types = settings.fetch(:deploy, {}).fetch(:generate_types, false)
23
+
24
+ super
25
+
26
+ # @force here is used to make it easier to reason about
27
+ @force = !@no_force
28
+ @argv = @argv.map { |arg| arg.gsub(/\W/,'_') }
29
+ end
30
+
31
+ def call
32
+ @visit_ok = true
33
+
34
+ expect_config!
35
+ deployment = R10K::Deployment.new(@settings)
36
+ check_write_lock!(@settings)
37
+
38
+ deployment.accept(self)
39
+ @visit_ok
40
+ end
41
+
42
+ include R10K::Action::Visitor
43
+
44
+ private
45
+
46
+ def visit_deployment(deployment)
47
+ # Ensure that everything can be preloaded. If we cannot preload all
48
+ # sources then we can't fully enumerate all environments which
49
+ # could be dangerous. If this fails then an exception will be raised
50
+ # and execution will be halted.
51
+ deployment.preload!
52
+ deployment.validate!
53
+
54
+ undeployable = undeployable_environment_names(deployment.environments, @argv)
55
+ if !undeployable.empty?
56
+ @visit_ok = false
57
+ logger.error _("Environment(s) \'%{environments}\' cannot be found in any source and will not be deployed.") % {environments: undeployable.join(", ")}
58
+ end
59
+
60
+ yield
61
+
62
+ if @purge_levels.include?(:deployment)
63
+ logger.debug("Purging unmanaged environments for deployment...")
64
+ deployment.purge!
65
+ end
66
+ ensure
67
+ if (postcmd = @settings[:postrun])
68
+ if postcmd.grep('$modifiedenvs').any?
69
+ envs = deployment.environments.map { |e| e.dirname }
70
+ envs.reject! { |e| !@argv.include?(e) } if @argv.any?
71
+ postcmd = postcmd.map { |e| e.gsub('$modifiedenvs', envs.join(' ')) }
72
+ end
73
+ subproc = R10K::Util::Subprocess.new(postcmd)
74
+ subproc.logger = logger
75
+ subproc.execute
76
+ end
77
+ end
78
+
79
+ def visit_source(source)
80
+ yield
81
+ end
82
+
83
+ def visit_environment(environment)
84
+ if !(@argv.empty? || @argv.any? { |name| environment.dirname == name })
85
+ logger.debug1(_("Environment %{env_dir} does not match environment name filter, skipping") % {env_dir: environment.dirname})
86
+ return
87
+ end
88
+
89
+ started_at = Time.new
90
+ @environment_ok = true
91
+
92
+ status = environment.status
93
+ logger.info _("Deploying environment %{env_path}") % {env_path: environment.path}
94
+
95
+ environment.sync
96
+ logger.info _("Environment %{env_dir} is now at %{env_signature}") % {env_dir: environment.dirname, env_signature: environment.signature}
97
+
98
+ if status == :absent || @puppetfile
99
+ if status == :absent
100
+ logger.debug(_("Environment %{env_dir} is new, updating all modules") % {env_dir: environment.dirname})
101
+ end
102
+
103
+ previous_ok = @visit_ok
104
+ @visit_ok = true
105
+ yield
106
+ @environment_ok = @visit_ok
107
+ @visit_ok &&= previous_ok
108
+ end
109
+
110
+ if @purge_levels.include?(:environment)
111
+ if @visit_ok
112
+ logger.debug("Purging unmanaged content for environment '#{environment.dirname}'...")
113
+ environment.purge!(:recurse => true, :whitelist => environment.whitelist(@user_purge_whitelist))
114
+ else
115
+ logger.debug("Not purging unmanaged content for environment '#{environment.dirname}' due to prior deploy failures.")
116
+ end
117
+ end
118
+
119
+ if @generate_types
120
+ if @environment_ok
121
+ logger.debug("Generating puppet types for environment '#{environment.dirname}'...")
122
+ environment.generate_types!
123
+ else
124
+ logger.debug("Not generating puppet types for environment '#{environment.dirname}' due to puppetfile failures.")
125
+ end
126
+ end
127
+
128
+ write_environment_info!(environment, started_at, @visit_ok)
129
+ end
130
+
131
+ def visit_puppetfile(puppetfile)
132
+ puppetfile.load(@opts[:'default-branch-override'])
133
+
134
+ yield
135
+
136
+ if @purge_levels.include?(:puppetfile)
137
+ logger.debug("Purging unmanaged Puppetfile content for environment '#{puppetfile.environment.dirname}'...")
138
+ puppetfile.purge!
139
+ end
140
+ end
141
+
142
+ def visit_module(mod)
143
+ logger.info _("Deploying %{origin} content %{path}") % {origin: mod.origin, path: mod.path}
144
+ mod.sync(force: @force)
145
+ end
146
+
147
+ def write_environment_info!(environment, started_at, success)
148
+ module_deploys = []
149
+ begin
150
+ environment.modules.each do |mod|
151
+ name = mod.name
152
+ version = mod.version
153
+ sha = mod.repo.head rescue nil
154
+ module_deploys.push({:name => name, :version => version, :sha => sha})
155
+ end
156
+ rescue
157
+ logger.debug("Unable to get environment module deploy data for .r10k-deploy.json at #{environment.path}")
158
+ end
159
+
160
+ # make this file write as atomic as possible in pure ruby
161
+ final = "#{environment.path}/.r10k-deploy.json"
162
+ staging = "#{environment.path}/.r10k-deploy.json~"
163
+ File.open(staging, 'w') do |f|
164
+ deploy_info = environment.info.merge({
165
+ :started_at => started_at,
166
+ :finished_at => Time.new,
167
+ :deploy_success => success,
168
+ :module_deploys => module_deploys,
169
+ })
170
+
171
+ f.puts(JSON.pretty_generate(deploy_info))
172
+ end
173
+ FileUtils.mv(staging, final)
174
+ end
175
+
176
+ def undeployable_environment_names(environments, expected_names)
177
+ if expected_names.empty?
178
+ []
179
+ else
180
+ known_names = environments.map(&:dirname)
181
+ expected_names - known_names
182
+ end
183
+ end
184
+
185
+ def allowed_initialize_opts
186
+ super.merge(puppetfile: :self,
187
+ cachedir: :self,
188
+ 'no-force': :self,
189
+ 'generate-types': :self,
190
+ 'puppet-path': :self,
191
+ 'default-branch-override': :self)
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end