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,84 @@
1
+ require 'r10k/deployment'
2
+ require 'r10k/action/visitor'
3
+ require 'r10k/action/base'
4
+ require 'r10k/action/deploy/deploy_helpers'
5
+
6
+ module R10K
7
+ module Action
8
+ module Deploy
9
+ class Module < R10K::Action::Base
10
+
11
+ include R10K::Action::Deploy::DeployHelpers
12
+
13
+ attr_reader :force
14
+
15
+ def initialize(opts, argv, settings = nil)
16
+ settings ||= {}
17
+
18
+ super
19
+
20
+ # @force here is used to make it easier to reason about
21
+ @force = !@no_force
22
+ end
23
+
24
+ def call
25
+ @visit_ok = true
26
+
27
+ expect_config!
28
+ deployment = R10K::Deployment.new(@settings)
29
+ check_write_lock!(@settings)
30
+
31
+ deployment.accept(self)
32
+ @visit_ok
33
+ end
34
+
35
+ include R10K::Action::Visitor
36
+
37
+ private
38
+
39
+ def visit_deployment(deployment)
40
+ yield
41
+ end
42
+
43
+ def visit_source(source)
44
+ yield
45
+ end
46
+
47
+ def visit_environment(environment)
48
+ if @opts[:environment] && (@opts[:environment] != environment.dirname)
49
+ logger.debug1(_("Only updating modules in environment %{opt_env} skipping environment %{env_path}") % {opt_env: @opts[:environment], env_path: environment.path})
50
+ else
51
+ logger.debug1(_("Updating modules %{modules} in environment %{env_path}") % {modules: @argv.inspect, env_path: environment.path})
52
+ yield
53
+ end
54
+ end
55
+
56
+ def visit_puppetfile(puppetfile)
57
+ puppetfile.load
58
+ yield
59
+ end
60
+
61
+ def visit_module(mod)
62
+ if @argv.include?(mod.name)
63
+ logger.info _("Deploying module %{mod_path}") % {mod_path: mod.path}
64
+ mod.sync(force: @force)
65
+ if mod.environment && @generate_types
66
+ logger.debug("Generating puppet types for environment '#{mod.environment.dirname}'...")
67
+ mod.environment.generate_types!
68
+ end
69
+ else
70
+ logger.debug1(_("Only updating modules %{modules}, skipping module %{mod_name}") % {modules: @argv.inspect, mod_name: mod.name})
71
+ end
72
+ end
73
+
74
+ def allowed_initialize_opts
75
+ super.merge(environment: true,
76
+ cachedir: :self,
77
+ 'no-force': :self,
78
+ 'generate-types': :self,
79
+ 'puppet-path': :self)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,10 @@
1
+ module R10K
2
+ module Action
3
+ module Puppetfile
4
+ require 'r10k/action/puppetfile/cri_runner'
5
+ require 'r10k/action/puppetfile/install'
6
+ require 'r10k/action/puppetfile/check'
7
+ require 'r10k/action/puppetfile/purge'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,31 @@
1
+ require 'r10k/puppetfile'
2
+ require 'r10k/action/base'
3
+ require 'r10k/errors/formatting'
4
+
5
+ module R10K
6
+ module Action
7
+ module Puppetfile
8
+ class Check < R10K::Action::Base
9
+
10
+ def call
11
+ pf = R10K::Puppetfile.new(@root, @moduledir, @puppetfile)
12
+ begin
13
+ pf.load!
14
+ $stderr.puts _("Syntax OK")
15
+ true
16
+ rescue => e
17
+ $stderr.puts R10K::Errors::Formatting.format_exception(e, @trace)
18
+ false
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def allowed_initialize_opts
25
+ super.merge(root: :self, puppetfile: :self, moduledir: :self)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,26 @@
1
+ require 'r10k/action/cri_runner'
2
+
3
+ module R10K
4
+ module Action
5
+ module Puppetfile
6
+ # Extend the default Cri Runner with Puppetfile specific opts
7
+ #
8
+ # @api private
9
+ class CriRunner < R10K::Action::CriRunner
10
+
11
+ include R10K::Logging
12
+
13
+ def handle_opts(opts)
14
+ opts[:root] ||= wd
15
+ super(opts)
16
+ end
17
+
18
+ private
19
+
20
+ def wd
21
+ Dir.getwd
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,45 @@
1
+ require 'r10k/puppetfile'
2
+ require 'r10k/errors/formatting'
3
+ require 'r10k/action/visitor'
4
+ require 'r10k/action/base'
5
+
6
+ module R10K
7
+ module Action
8
+ module Puppetfile
9
+ class Install < R10K::Action::Base
10
+
11
+ def call
12
+ @visit_ok = true
13
+ pf = R10K::Puppetfile.new(@root, @moduledir, @puppetfile, nil , @force)
14
+ pf.accept(self)
15
+ @visit_ok
16
+ end
17
+
18
+ private
19
+
20
+ include R10K::Action::Visitor
21
+
22
+ def visit_puppetfile(pf)
23
+ pf.load!
24
+ yield
25
+ pf.purge!
26
+ end
27
+
28
+ def visit_module(mod)
29
+ @force ||= false
30
+ logger.info _("Updating module %{mod_path}") % {mod_path: mod.path}
31
+
32
+ if mod.respond_to?(:desired_ref) && mod.desired_ref == :control_branch
33
+ logger.warn _("Cannot track control repo branch for content '%{name}' when not part of a 'deploy' action, will use default if available." % {name: mod.name})
34
+ end
35
+
36
+ mod.sync(force: @force)
37
+ end
38
+
39
+ def allowed_initialize_opts
40
+ super.merge(root: :self, puppetfile: :self, moduledir: :self, force: :self )
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,28 @@
1
+ require 'r10k/puppetfile'
2
+ require 'r10k/action/base'
3
+ require 'r10k/errors/formatting'
4
+
5
+ module R10K
6
+ module Action
7
+ module Puppetfile
8
+ class Purge < R10K::Action::Base
9
+
10
+ def call
11
+ pf = R10K::Puppetfile.new(@root, @moduledir, @puppetfile)
12
+ pf.load!
13
+ pf.purge!
14
+ true
15
+ rescue => e
16
+ logger.error R10K::Errors::Formatting.format_exception(e, @trace)
17
+ false
18
+ end
19
+
20
+ private
21
+
22
+ def allowed_initialize_opts
23
+ super.merge(root: :self, puppetfile: :self, moduledir: :self)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,96 @@
1
+ require 'r10k/logging'
2
+ require 'r10k/errors'
3
+ require 'r10k/util/license'
4
+ require 'puppet_forge/connection'
5
+
6
+ module R10K
7
+ module Action
8
+ class Runner
9
+ include R10K::Logging
10
+
11
+ def initialize(opts, argv, klass)
12
+ @opts = opts
13
+ @argv = argv
14
+ @klass = klass
15
+
16
+ @settings = {}
17
+ end
18
+
19
+ def instance
20
+ if @_instance.nil?
21
+ iopts = @opts.dup
22
+ iopts.delete(:loglevel)
23
+ @_instance = @klass.new(iopts, @argv, @settings)
24
+ end
25
+ @_instance
26
+ end
27
+
28
+ def call
29
+ setup_logging
30
+ setup_settings
31
+ # @todo check arguments
32
+ setup_authorization
33
+ instance.call
34
+ end
35
+
36
+ def setup_logging
37
+ if @opts.key?(:loglevel)
38
+ R10K::Logging.level = @opts[:loglevel]
39
+ end
40
+ end
41
+
42
+ def setup_settings
43
+ config_settings = settings_from_config(@opts[:config])
44
+
45
+ overrides = {}
46
+ overrides[:cachedir] = @opts[:cachedir] if @opts.key?(:cachedir)
47
+ overrides[:deploy] = {} if @opts.key?(:'puppet-path') || @opts.key?(:'generate-types')
48
+ overrides[:deploy][:puppet_path] = @opts[:'puppet-path'] if @opts.key?(:'puppet-path')
49
+ overrides[:deploy][:generate_types] = @opts[:'generate-types'] if @opts.key?(:'generate-types')
50
+
51
+ with_overrides = config_settings.merge(overrides) do |key, oldval, newval|
52
+ newval = oldval.merge(newval) if oldval.is_a? Hash
53
+ logger.debug2 _("Overriding config file setting '%{key}': '%{old_val}' -> '%{new_val}'") % {key: key, old_val: oldval, new_val: newval}
54
+ newval
55
+ end
56
+
57
+ @settings = R10K::Settings.global_settings.evaluate(with_overrides)
58
+
59
+ R10K::Initializers::GlobalInitializer.new(@settings).call
60
+ rescue R10K::Settings::Collection::ValidationError => e
61
+ logger.error e.format
62
+ exit(8)
63
+ end
64
+
65
+ def setup_authorization
66
+ begin
67
+ license = R10K::Util::License.load
68
+
69
+ if license.respond_to?(:authorization_token)
70
+ PuppetForge::Connection.authorization = license.authorization_token
71
+ end
72
+ rescue R10K::Error => e
73
+ logger.warn e.message
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def settings_from_config(override_path)
80
+ loader = R10K::Settings::Loader.new
81
+ path = loader.search(override_path)
82
+ results = {}
83
+
84
+ if path
85
+ @opts[:config] = path
86
+ logger.debug2 _("Reading configuration from %{config_path}") % {config_path: path.inspect}
87
+ results = loader.read(path)
88
+ else
89
+ logger.debug2 _("No config file explicitly given and no default config file could be found, default settings will be used.")
90
+ end
91
+
92
+ results
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,31 @@
1
+ require 'r10k/errors/formatting'
2
+
3
+ module R10K
4
+ module Action
5
+ # Implement the Visitor pattern via pseudo double dispatch.
6
+ #
7
+ # Visitor classes must implement #visit_type methods for each type that may
8
+ # be visited. If the visitor should descend into child objects the #visit_
9
+ # method should yield to the passed block.
10
+ #
11
+ # Visitor classes must implement #logger so that error messages can be logged.
12
+ #
13
+ # @api private
14
+ module Visitor
15
+
16
+ # Dispatch to the type specific visitor method
17
+ #
18
+ # @param type [Symbol] The object type to dispatch for
19
+ # @param other [Object] The actual object to pass to the visitor method
20
+ # @param block [Proc] The block that the called visitor method may yield
21
+ # to in case recursion is desired.
22
+ # @return [void]
23
+ def visit(type, other, &block)
24
+ send("visit_#{type}", other, &block)
25
+ rescue => e
26
+ logger.error R10K::Errors::Formatting.format_exception(e, @trace)
27
+ @visit_ok = false
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,51 @@
1
+ require 'r10k'
2
+ require 'r10k/version'
3
+ require 'r10k/cli/ext/logging'
4
+
5
+ require 'cri'
6
+
7
+ module R10K::CLI
8
+ def self.command
9
+ @cmd ||= Cri::Command.define do
10
+ name 'r10k'
11
+ usage 'r10k <subcommand> [options]'
12
+ summary 'Killer robot powered Puppet environment deployment'
13
+ description <<-EOD
14
+ r10k is a suite of commands to help deploy and manage puppet code for
15
+ complex environments.
16
+ EOD
17
+
18
+
19
+ flag :h, :help, 'Show help for this command' do |value, cmd|
20
+ # This is evil because we may not necessarily be called from the
21
+ # command line and have a meaningful ARGV to scan. However the best
22
+ # way of having a globally useful --help command is to define the
23
+ # behavior in the block of the option to immediately handle it and exit
24
+ # and we don't have access to the verbose option, so the simple method
25
+ # is to simply scan ARGV.
26
+ verbose = (ARGV.include?('-v') || ARGV.include?('--verbose'))
27
+ puts cmd.help(:verbose => verbose)
28
+ exit 0
29
+ end
30
+
31
+ flag :t, :trace, 'Display stack traces on application crash'
32
+
33
+ loglevels = R10K::Logging::LOG_LEVELS.reverse.map(&:downcase).join(", ")
34
+ optional :v, :verbose, "Set log verbosity. Valid values: #{loglevels}"
35
+
36
+ flag nil, :color, 'Enable colored log messages'
37
+
38
+ required :c, :config, 'Specify a global configuration file'
39
+
40
+ run do |opts, args, cmd|
41
+ puts cmd.help(:verbose => opts[:verbose])
42
+ exit 0
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ require 'r10k/cli/deploy'
49
+ require 'r10k/cli/puppetfile'
50
+ require 'r10k/cli/version'
51
+ require 'r10k/cli/help'
@@ -0,0 +1,114 @@
1
+ require 'r10k/cli'
2
+ require 'r10k/deployment'
3
+ require 'r10k/deployment/config'
4
+
5
+ require 'r10k/action/cri_runner'
6
+ require 'r10k/action/deploy'
7
+
8
+
9
+ require 'cri'
10
+
11
+ module R10K::CLI
12
+ module Deploy
13
+ def self.command
14
+ @cmd ||= Cri::Command.define do
15
+ name 'deploy'
16
+ usage 'deploy <subcommand>'
17
+ summary 'Puppet dynamic environment deployment'
18
+
19
+ description <<-DESCRIPTION
20
+ `r10k deploy` implements the Git branch to Puppet environment workflow
21
+ (https://puppet.com/docs/puppet/latest/environments_about.html).
22
+ DESCRIPTION
23
+
24
+ required nil, :cachedir, 'Specify a cachedir, overriding the value in config'
25
+ flag nil, :'no-force', 'Prevent the overwriting of local module modifications'
26
+ flag nil, :'generate-types', 'Run `puppet generate types` after updating an environment'
27
+ option nil, :'puppet-path', 'Path to puppet executable', argument: :required do |value, cmd|
28
+ unless File.executable? value
29
+ $stderr.puts "The specified puppet executable #{value} is not executable."
30
+ puts cmd.help
31
+ exit 1
32
+ end
33
+ end
34
+
35
+ run do |opts, args, cmd|
36
+ puts cmd.help(:verbose => opts[:verbose])
37
+ exit 0
38
+ end
39
+ end
40
+ end
41
+
42
+ module Environment
43
+ def self.command
44
+ @cmd ||= Cri::Command.define do
45
+ name 'environment'
46
+ usage 'environment <options> <environment> <...>'
47
+ summary 'Deploy environments and their dependent modules'
48
+
49
+ description <<-DESCRIPTION
50
+ `r10k deploy environment` creates and updates Puppet environments based on Git
51
+ branches.
52
+
53
+ Environments can provide a Puppetfile at the root of the directory to deploy
54
+ independent Puppet modules. To recursively deploy an environment, pass the
55
+ `--puppetfile` flag to the command.
56
+
57
+ **NOTE**: If an environment has a Puppetfile when it is instantiated a
58
+ recursive update will be forced. It is assumed that environments are dependent
59
+ on modules specified in the Puppetfile and an update will be automatically
60
+ scheduled. On subsequent deployments, Puppetfile deployment will default to off.
61
+ DESCRIPTION
62
+
63
+ flag :p, :puppetfile, 'Deploy modules from a puppetfile'
64
+ required nil, :'default-branch-override', 'Specify a branchname to override the default branch in the puppetfile'
65
+
66
+ runner R10K::Action::CriRunner.wrap(R10K::Action::Deploy::Environment)
67
+ end
68
+ end
69
+ end
70
+
71
+ module Module
72
+ def self.command
73
+ @cmd ||= Cri::Command.define do
74
+ name 'module'
75
+ usage 'module [module] <module ...>'
76
+ summary 'Deploy modules in all environments'
77
+
78
+ description <<-DESCRIPTION
79
+ `r10k deploy module` Deploys and updates modules inside of Puppet environments.
80
+ It will load the Puppetfile configurations out of all environments, and will
81
+ try to deploy the given module names in all environments.
82
+ DESCRIPTION
83
+
84
+ required :e, :environment, 'Update the modules in the given environment'
85
+
86
+ runner R10K::Action::CriRunner.wrap(R10K::Action::Deploy::Module)
87
+ end
88
+ end
89
+ end
90
+
91
+ module Display
92
+ def self.command
93
+ @cmd ||= Cri::Command.define do
94
+ name 'display'
95
+ aliases 'list'
96
+ usage 'display'
97
+ summary 'Display environments and modules in the deployment'
98
+
99
+ flag :p, :puppetfile, 'Display Puppetfile modules'
100
+ flag nil, :detail, 'Display detailed information'
101
+ flag nil, :fetch, 'Update available environment lists from all remote sources'
102
+ required nil, :format, 'Display output in a specific format. Valid values: json, yaml. Default: yaml'
103
+
104
+ runner R10K::Action::CriRunner.wrap(R10K::Action::Deploy::Display)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ R10K::CLI.command.add_command(R10K::CLI::Deploy.command)
112
+ R10K::CLI::Deploy.command.add_command(R10K::CLI::Deploy::Environment.command)
113
+ R10K::CLI::Deploy.command.add_command(R10K::CLI::Deploy::Module.command)
114
+ R10K::CLI::Deploy.command.add_command(R10K::CLI::Deploy::Display.command)