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,194 @@
1
+ require 'etc'
2
+
3
+ module R10K
4
+ module Settings
5
+ require 'r10k/settings/container'
6
+ require 'r10k/settings/mixin'
7
+
8
+ require 'r10k/settings/collection'
9
+ require 'r10k/settings/definition'
10
+ require 'r10k/settings/list'
11
+
12
+ class << self
13
+ # Path to puppet executable
14
+ attr_accessor :puppet_path
15
+ end
16
+
17
+ def self.git_settings
18
+ R10K::Settings::Collection.new(:git, [
19
+
20
+ EnumDefinition.new(:provider, {
21
+ :desc => "The Git provider to use. Valid values: 'shellgit', 'rugged'",
22
+ :normalize => lambda { |input| input.to_sym },
23
+ :enum => [:shellgit, :rugged],
24
+ }),
25
+
26
+ Definition.new(:username, {
27
+ :desc => "The username to use for Git SSH remotes that do not specify a user.
28
+ Only used by the 'rugged' Git provider.
29
+ Default: the current user",
30
+ :default => lambda { Etc.getlogin },
31
+ }),
32
+
33
+ Definition.new(:private_key, {
34
+ :desc => "The path to the SSH private key for Git SSH remotes.
35
+ Only used by the 'rugged' Git provider.",
36
+ }),
37
+
38
+ URIDefinition.new(:proxy, {
39
+ :desc => "An optional proxy server to use when interacting with Git sources via HTTP(S).",
40
+ :default => :inherit,
41
+ }),
42
+
43
+ List.new(:repositories, lambda {
44
+ R10K::Settings::Collection.new(nil, [
45
+ Definition.new(:remote, {
46
+ :desc => "Remote source that repository-specific settings should apply to.",
47
+ }),
48
+
49
+ Definition.new(:private_key, {
50
+ :desc => "The path to the SSH private key for Git SSH remotes.
51
+ Only used by the 'rugged' Git provider.",
52
+ :default => :inherit,
53
+ }),
54
+
55
+ URIDefinition.new(:proxy, {
56
+ :desc => "An optional proxy server to use when interacting with Git sources via HTTP(S).",
57
+ :default => :inherit,
58
+ }),
59
+
60
+ Definition.new(:ignore_branch_prefixes, {
61
+ :desc => "Array of strings used to prefix branch names that will not be deployed as environments.",
62
+ }),
63
+ ])
64
+ },
65
+ {
66
+ :desc => "Repository specific configuration.",
67
+ :default => [],
68
+ }),
69
+ ])
70
+ end
71
+
72
+ def self.forge_settings
73
+ R10K::Settings::Collection.new(:forge, [
74
+ URIDefinition.new(:proxy, {
75
+ :desc => "An optional proxy server to use when downloading modules from the forge.",
76
+ :default => :inherit,
77
+ }),
78
+
79
+ URIDefinition.new(:baseurl, {
80
+ :desc => "The URL to the Puppet Forge to use for downloading modules."
81
+ }),
82
+ ])
83
+ end
84
+
85
+ def self.deploy_settings
86
+ R10K::Settings::Collection.new(:deploy, [
87
+ Definition.new(:write_lock, {
88
+ :desc => "Whether r10k deploy actions should be locked out in case r10k is being managed
89
+ by another application. The value should be a string containing the reason for the write lock.",
90
+ :validate => lambda do |value|
91
+ if value && !value.is_a?(String)
92
+ raise ArgumentError, "The write_lock setting should be a string containing the reason for the write lock, not a #{value.class}"
93
+ end
94
+ end
95
+ }),
96
+
97
+ EnumDefinition.new(:purge_levels, {
98
+ :desc => "Controls how aggressively r10k will purge unmanaged content from the target directory. Should be a list of values indicating at what levels unmanaged content should be purged. Options are 'deployment', 'environment', and 'puppetfile'. For backwards compatibility, the default is ['deployment', 'puppetfile'].",
99
+ :multi => true,
100
+ :enum => [:deployment, :environment, :puppetfile],
101
+ :default => [:deployment, :puppetfile],
102
+ :normalize => lambda do |input|
103
+ if input.respond_to?(:collect)
104
+ input.collect { |val| val.to_sym }
105
+ else
106
+ # Convert single values to a list of one symbolized value.
107
+ [input.to_sym]
108
+ end
109
+ end,
110
+ }),
111
+
112
+ Definition.new(:purge_whitelist, {
113
+ :desc => "A list of filename patterns to be excluded from any purge operations. Patterns are matched relative to the root of each deployed environment, if you want a pattern to match recursively you need to use the '**' glob in your pattern. Basic shell style globs are supported.",
114
+ :default => [],
115
+ }),
116
+
117
+ Definition.new(:generate_types, {
118
+ :desc => "Controls whether to generate puppet types after deploying an environment. Defaults to false.",
119
+ :default => false,
120
+ :normalize => lambda do |input|
121
+ input.to_s == 'true'
122
+ end,
123
+ }),
124
+
125
+ Definition.new(:puppet_path, {
126
+ :desc => "Path to puppet executable. Defaults to /opt/puppetlabs/bin/puppet.",
127
+ :default => '/opt/puppetlabs/bin/puppet',
128
+ :validate => lambda do |value|
129
+ unless File.executable? value
130
+ raise ArgumentError, "The specified puppet executable #{value} is not executable"
131
+ end
132
+ end
133
+ }),
134
+ ])
135
+ end
136
+
137
+ def self.global_settings
138
+ R10K::Settings::Collection.new(:global, [
139
+ Definition.new(:sources, {
140
+ :desc => "Where r10k should retrieve sources when deploying environments.
141
+ Only used for r10k environment deployment.",
142
+ }),
143
+
144
+ Definition.new(:purgedirs, {
145
+ :desc => "The purgedirs setting was deprecated in r10k 1.0.0 and is no longer respected.",
146
+ }),
147
+
148
+ Definition.new(:cachedir, {
149
+ :desc => "Where r10k should store cached Git repositories.",
150
+ }),
151
+
152
+ Definition.new(:postrun, {
153
+ :desc => "The command r10k should run after deploying environments.",
154
+ :validate => lambda do |value|
155
+ if !value.is_a?(Array)
156
+ raise ArgumentError, "The postrun setting should be an array of strings, not a #{value.class}"
157
+ end
158
+ end
159
+ }),
160
+
161
+ Definition.new(:pool_size, {
162
+ :desc => "The amount of threads used to concurrently install modules. The default value is 1: install one module at a time.",
163
+ :default => 1,
164
+ :validate => lambda do |value|
165
+ if !value.is_a?(Integer)
166
+ raise ArgumentError, "The pool_size setting should be an integer, not a #{value.class}"
167
+ end
168
+ if !(value > 0)
169
+ raise ArgumentError, "The pool_size setting should be greater than zero."
170
+ end
171
+ end
172
+ }),
173
+
174
+ URIDefinition.new(:proxy, {
175
+ :desc => "Proxy to use for all r10k operations which occur over HTTP(S).",
176
+ :default => lambda {
177
+ [
178
+ ENV['HTTPS_PROXY'],
179
+ ENV['https_proxy'],
180
+ ENV['HTTP_PROXY'],
181
+ ENV['http_proxy']
182
+ ].find { |value| value }
183
+ },
184
+ }),
185
+
186
+ R10K::Settings.forge_settings,
187
+
188
+ R10K::Settings.git_settings,
189
+
190
+ R10K::Settings.deploy_settings,
191
+ ])
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,123 @@
1
+ require 'r10k/settings/helpers'
2
+ require 'r10k/settings/definition'
3
+ require 'r10k/util/setopts'
4
+ require 'r10k/util/symbolize_keys'
5
+ require 'r10k/errors'
6
+
7
+ module R10K
8
+ module Settings
9
+
10
+ # Define a group of settings, which can be single definitions or nested
11
+ # collections.
12
+ class Collection
13
+ include R10K::Settings::Helpers
14
+
15
+ # @!attribute [r] name
16
+ # @return [String] The name of this collection
17
+ attr_reader :name
18
+
19
+ # @param name [Symbol] The name of the collection
20
+ # @param settings [Array] All settings in this collection
21
+ def initialize(name, settings)
22
+ @name = name
23
+
24
+ @settings = {}
25
+
26
+ # iterate through settings and adopt them
27
+ settings.each do |s|
28
+ s.parent = self
29
+ @settings[s.name] = s
30
+ end
31
+ end
32
+
33
+ # Assign new values, perform validation checks, and return the final
34
+ # values for this collection
35
+ def evaluate(newvalues)
36
+ assign(newvalues)
37
+ validate
38
+ resolve
39
+ end
40
+
41
+ # Assign a hash of values to the settings in this collection.
42
+ #
43
+ # If the passed hash contains any invalid settings values, the names
44
+ # of those settings are stored for use in the {#validate} method.
45
+ #
46
+ # @param newvalues [Hash]
47
+ # @return [void]
48
+ def assign(newvalues)
49
+ return if newvalues.nil?
50
+
51
+ R10K::Util::SymbolizeKeys.symbolize_keys!(newvalues)
52
+
53
+ @settings.each_pair do |name, setting|
54
+ if newvalues.key?(name)
55
+ setting.assign(newvalues[name])
56
+ end
57
+ end
58
+ end
59
+
60
+ # Validate all settings and return validation errors
61
+ #
62
+ # @return [nil, Hash] If all validation passed nil will be returned; if
63
+ # validation failed then a hash of those errors will be returned.
64
+ def validate
65
+ errors = {}
66
+
67
+ @settings.each_pair do |name, setting|
68
+ begin
69
+ setting.validate
70
+ rescue => error
71
+ errors[name] = error
72
+ end
73
+ end
74
+
75
+ if !errors.empty?
76
+ if @name
77
+ msg = _("Validation failed for '%{name}' settings group") % {name: @name}
78
+ else
79
+ msg = _("Validation failed for settings group")
80
+ end
81
+
82
+ raise ValidationError.new(msg, :errors => errors)
83
+ end
84
+ end
85
+
86
+ # Evaluate all settings and return a frozen hash of the final values.
87
+ # @return [Hash]
88
+ def resolve
89
+ rv = {}
90
+
91
+ @settings.each_pair do |name, setting|
92
+ rv[name] = setting.resolve
93
+ end
94
+
95
+ rv.freeze
96
+ end
97
+
98
+ # Access individual settings via a Hash-like interface.
99
+ def [](name)
100
+ @settings[name]
101
+ end
102
+
103
+ class ValidationError < R10K::Error
104
+
105
+ attr_reader :errors
106
+
107
+ def initialize(mesg, options = {})
108
+ super
109
+ @errors = options[:errors]
110
+ end
111
+
112
+ def format
113
+ struct = []
114
+ struct << "#{message}:"
115
+ @errors.each_pair do |name, nested|
116
+ struct << indent(structure_exception(name, nested))
117
+ end
118
+ struct.join("\n")
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,97 @@
1
+ # Defines a collection for application settings
2
+ #
3
+ # This implements a hierarchical interface to application settings. Containers
4
+ # can define an optional parent container that will be used for default options
5
+ # if those options aren't set on the given container.
6
+ class R10K::Settings::Container
7
+
8
+ # @!attribute [r] valid_keys
9
+ # @return [Set<Symbol>] All valid keys defined on the container or parent container.
10
+ attr_accessor :valid_keys
11
+
12
+ # @param parent [R10K::Settings::Container] An optional parent container
13
+ def initialize(parent = nil)
14
+ @parent = parent
15
+
16
+ @valid_keys = Set.new
17
+ @settings = {}
18
+ end
19
+
20
+ # Look up a value in the container. The lookup checks the current container,
21
+ # and then falls back to the parent container if it's given.
22
+ #
23
+ # @param key [Symbol] The lookup key
24
+ #
25
+ # @return [Object, nil] The retrieved value if present.
26
+ #
27
+ # @raise [R10K::Settings::Container::InvalidKey] If the looked up key isn't
28
+ # a valid key.
29
+ def [](key)
30
+ validate_key! key
31
+
32
+ if @settings[key]
33
+ @settings[key]
34
+ elsif @parent && (pkey = @parent[key])
35
+ begin
36
+ @settings[key] = pkey.dup
37
+ rescue TypeError
38
+ @settings[key] = pkey
39
+ end
40
+ @settings[key]
41
+ end
42
+ end
43
+
44
+ # Set a value on the container
45
+ #
46
+ # @param key [Symbol] The lookup key
47
+ # @param value [Object] The value to store in the container
48
+ #
49
+ # @raise [R10K::Settings::Container::InvalidKey] If the looked up key isn't
50
+ # a valid key.
51
+ def []=(key, value)
52
+ validate_key! key
53
+
54
+ @settings[key] = value
55
+ end
56
+
57
+ # Define a valid container key
58
+ #
59
+ # @note This should only be used by {#R10K::Settings::ClassSettings}
60
+ #
61
+ # @param key [Symbol]
62
+ # @return [void]
63
+ def add_valid_key(key)
64
+ @valid_keys.add(key)
65
+ end
66
+
67
+ # Determine if a key is a valid setting.
68
+ #
69
+ # @param key [Symbol]
70
+ #
71
+ # @return [true, false]
72
+ def valid_key?(key)
73
+ if @valid_keys.include?(key)
74
+ true
75
+ elsif @parent and @parent.valid_key?(key)
76
+ @valid_keys.add(key)
77
+ true
78
+ end
79
+ end
80
+
81
+ # Clear all existing settings in this container. Valid settings are left alone.
82
+ # @return [void]
83
+ def reset!
84
+ @settings = {}
85
+ end
86
+
87
+ private
88
+
89
+ def validate_key!(key)
90
+ unless valid_key?(key)
91
+ raise InvalidKey, _("Key %{key} is not a valid key") % {key: key}
92
+ end
93
+ end
94
+
95
+ # @api private
96
+ class InvalidKey < StandardError; end
97
+ end
@@ -0,0 +1,124 @@
1
+ require 'r10k/settings/helpers'
2
+ require 'r10k/util/setopts'
3
+
4
+ module R10K
5
+ module Settings
6
+
7
+ # Define a single setting and additional attributes like descriptions,
8
+ # default values, and validation.
9
+ class Definition
10
+ require 'r10k/settings/uri_definition'
11
+ require 'r10k/settings/enum_definition'
12
+
13
+ include R10K::Settings::Helpers
14
+ include R10K::Util::Setopts
15
+
16
+ # @!attribute [r] name
17
+ # @return [String] The name of this setting
18
+ attr_reader :name
19
+
20
+ # @!attribute [r] value
21
+ # @return [Object] An explicitly set value. This should only be used if
22
+ # an optional default value should not be used; otherwise use {#resolve}.
23
+ attr_reader :value
24
+
25
+ # @!attribute [r] desc
26
+ # @return [String] An optional documentation string for this setting.
27
+ attr_reader :desc
28
+
29
+ # @param name [Symbol] The name of the setting for this definition.
30
+ # @param opts [Hash] Additional options for this definition to control
31
+ # validation, normalization, and the like.
32
+ #
33
+ # @option opts [Proc, Object] :default An optional proc or object for
34
+ # this setting. If no value has been set and the default is a Proc then
35
+ # it will be called and the result will be returned, otherwise if the
36
+ # value is not set the default value itself is returned.
37
+ #
38
+ # @options opts [Proc] :validate An optional proc that can be used to
39
+ # validate an assigned value. Default values are not assigned.
40
+ #
41
+ # @options opts [Proc] :normalize An optional proc that can be used to
42
+ # normalize an explicitly assigned value.
43
+ def initialize(name, opts = {})
44
+ @name = name
45
+ setopts(opts, allowed_initialize_opts)
46
+ end
47
+
48
+ # Assign new values, perform validation checks, and return the final
49
+ # values for this collection
50
+ def evaluate(newvalue)
51
+ assign(newvalue)
52
+ validate
53
+ resolve
54
+ end
55
+
56
+ # Store an explicit value for this definition
57
+ #
58
+ # If a :normalize hook has been given then it will be called with the
59
+ # new value and the returned value will be stored.
60
+ #
61
+ # @param newvalue [Object] The value to store for this setting
62
+ # @return [void]
63
+ def assign(newvalue)
64
+ if @normalize
65
+ @value = @normalize.call(newvalue)
66
+ else
67
+ @value = newvalue
68
+ end
69
+ end
70
+
71
+ # Call any validation hooks for this definition.
72
+ #
73
+ # The :validate hook will be called if the hook has been set and an
74
+ # explicit value has been assigned to this definition. Validation
75
+ # failures should be indicated by the :validate hook raising an exception.
76
+ #
77
+ # @raise [Exception] An exception class indicating that validation failed.
78
+ # @return [nil]
79
+ def validate
80
+ if @value && @validate
81
+ @validate.call(@value)
82
+ end
83
+ nil
84
+ end
85
+
86
+ # Compute the final value of this setting. If a value has not been
87
+ # assigned the default value will be used.
88
+ #
89
+ # @return [Object] The final value of this definition.
90
+ def resolve
91
+ if !@value.nil?
92
+ @value
93
+ elsif @default
94
+ if @default == :inherit
95
+ # walk all the way up to root, starting with grandparent
96
+ ancestor = parent
97
+
98
+ while ancestor = ancestor.parent
99
+ return ancestor[@name].resolve if ancestor.respond_to?(:[]) && ancestor[@name]
100
+ end
101
+ elsif @default.is_a?(Proc)
102
+ @default.call
103
+ else
104
+ @default
105
+ end
106
+ end
107
+ end
108
+
109
+ private
110
+
111
+ # Subclasses may define additional params that are accepted at
112
+ # initialization; they should override this method to add any
113
+ # additional fields that should be respected.
114
+ def allowed_initialize_opts
115
+ {
116
+ :desc => true,
117
+ :default => true,
118
+ :validate => true,
119
+ :normalize => true,
120
+ }
121
+ end
122
+ end
123
+ end
124
+ end