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,15 @@
1
+ require 'cri'
2
+
3
+ module Cri
4
+ class CommandDSL
5
+ include R10K::Logging
6
+
7
+ def logger
8
+ unless @logger
9
+ @logger = Log4r::Logger.new(@command.name)
10
+ @logger.add R10K::Logging.outputter
11
+ end
12
+ @logger
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ require 'r10k/cli'
2
+ require 'cri'
3
+
4
+ module R10K::CLI
5
+ help_cmd = Cri::Command.new_basic_help
6
+ self.command.add_command(help_cmd)
7
+ end
@@ -0,0 +1,74 @@
1
+ require 'r10k/cli'
2
+ require 'r10k/puppetfile'
3
+ require 'r10k/action/puppetfile'
4
+
5
+ require 'cri'
6
+
7
+ module R10K::CLI
8
+ module Puppetfile
9
+ def self.command
10
+ @cmd ||= Cri::Command.define do
11
+ name 'puppetfile'
12
+ usage 'puppetfile <subcommand>'
13
+ summary 'Perform operations on a Puppetfile'
14
+
15
+ description <<-DESCRIPTION
16
+ `r10k puppetfile` provides an implementation of the librarian-puppet style
17
+ Puppetfile (http://bombasticmonkey.com/librarian-puppet/).
18
+ DESCRIPTION
19
+
20
+ run do |opts, args, cmd|
21
+ puts cmd.help(:verbose => opts[:verbose])
22
+ exit 0
23
+ end
24
+ end
25
+ end
26
+
27
+ module Install
28
+ def self.command
29
+ @cmd ||= Cri::Command.define do
30
+ name 'install'
31
+ usage 'install'
32
+ summary 'Install all modules from a Puppetfile'
33
+ required nil, :moduledir, 'Path to install modules to'
34
+ required nil, :puppetfile, 'Path to puppetfile'
35
+ flag nil, :force, 'Force locally changed files to be overwritten'
36
+ runner R10K::Action::Puppetfile::CriRunner.wrap(R10K::Action::Puppetfile::Install)
37
+ end
38
+ end
39
+ end
40
+
41
+ module Check
42
+ def self.command
43
+ @cmd ||= Cri::Command.define do
44
+ name 'check'
45
+ usage 'check'
46
+ summary 'Try and load the Puppetfile to verify the syntax is correct.'
47
+
48
+ required nil, :puppetfile, 'Path to Puppetfile'
49
+ runner R10K::Action::Puppetfile::CriRunner.wrap(R10K::Action::Puppetfile::Check)
50
+ end
51
+ end
52
+ end
53
+
54
+ module Purge
55
+ def self.command
56
+ @cmd ||= Cri::Command.define do
57
+ name 'purge'
58
+ usage 'purge'
59
+ summary 'Purge unmanaged modules from a Puppetfile managed directory'
60
+
61
+ required nil, :moduledir, 'Path to install modules to'
62
+ required nil, :puppetfile, 'Path to Puppetfile'
63
+ runner R10K::Action::Puppetfile::CriRunner.wrap(R10K::Action::Puppetfile::Purge)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ R10K::CLI.command.add_command(R10K::CLI::Puppetfile.command)
71
+
72
+ R10K::CLI::Puppetfile.command.add_command(R10K::CLI::Puppetfile::Install.command)
73
+ R10K::CLI::Puppetfile.command.add_command(R10K::CLI::Puppetfile::Check.command)
74
+ R10K::CLI::Puppetfile.command.add_command(R10K::CLI::Puppetfile::Purge.command)
@@ -0,0 +1,31 @@
1
+ require 'r10k/cli'
2
+ require 'r10k/version'
3
+
4
+ require 'cri'
5
+
6
+ module R10K::CLI
7
+ module Version
8
+ def self.command
9
+ @cmd ||= Cri::Command.define do
10
+ name 'version'
11
+ usage 'version'
12
+ summary 'Print the version of r10k'
13
+
14
+ run do |opts, args, cmd|
15
+ puts "r10k #{R10K::VERSION}"
16
+ if opts[:verbose]
17
+ puts RUBY_DESCRIPTION
18
+ cmdpath = caller.last.slice(/\A.*#{$PROGRAM_NAME}/)
19
+ puts "Command path: #{cmdpath}"
20
+ puts "Interpreter path: #{Gem.ruby}"
21
+ if RUBY_VERSION >= '1.9'
22
+ puts "Default encoding: #{Encoding.default_external.name}"
23
+ end
24
+ end
25
+ exit 0
26
+ end
27
+ end
28
+ end
29
+ end
30
+ self.command.add_command(Version.command)
31
+ end
@@ -0,0 +1,132 @@
1
+ require 'r10k/source'
2
+ require 'r10k/util/basedir'
3
+ require 'r10k/errors'
4
+ require 'set'
5
+
6
+ module R10K
7
+ # A deployment models the entire state of the configuration that a Puppet
8
+ # master can use. It contains a set of sources that can produce environments
9
+ # and manages the contents of directories where environments are deployed.
10
+ #
11
+ # @api private
12
+ class Deployment
13
+
14
+ require 'r10k/deployment/config'
15
+
16
+ # Generate a deployment object based on a config
17
+ #
18
+ # @deprecated
19
+ #
20
+ # @param path [String] The path to the deployment config
21
+ # @return [R10K::Deployment] The deployment loaded with the given config
22
+ def self.load_config(path, overrides={})
23
+ config = R10K::Deployment::Config.new(path, overrides)
24
+ new(config)
25
+ end
26
+
27
+ # @!attribute [r] config
28
+ # @return [R10K::Deployment::Config]
29
+ attr_reader :config
30
+
31
+ def initialize(config)
32
+ @config = config
33
+ end
34
+
35
+ def preload!
36
+ sources.each(&:preload!)
37
+ end
38
+
39
+ # Lazily load all sources
40
+ #
41
+ # This instantiates the @_sources instance variable, but should not be
42
+ # used directly as it could be legitimately unset if we're doing lazy
43
+ # loading.
44
+ #
45
+ # @return [Array<R10K::Source::Base>] All repository sources
46
+ # specified in the config
47
+ def sources
48
+ load_sources if @_sources.nil?
49
+ @_sources
50
+ end
51
+
52
+ # Lazily load all environments
53
+ #
54
+ # This instantiates the @_environments instance variable, but should not be
55
+ # used directly as it could be legitimately unset if we're doing lazy
56
+ # loading.
57
+ #
58
+ # @return [Array<R10K::Environment::Base>] All enviroments across
59
+ # all sources
60
+ def environments
61
+ load_environments if @_environments.nil?
62
+ @_environments
63
+ end
64
+
65
+ # @return [Array<String>] The paths used by all contained sources
66
+ def paths
67
+ paths_and_sources.keys
68
+ end
69
+
70
+ # @return [Hash<String, Array<R10K::Source::Base>]
71
+ def paths_and_sources
72
+ pathmap = Hash.new { |h, k| h[k] = [] }
73
+ sources.each { |source| pathmap[source.basedir] << source }
74
+ pathmap
75
+ end
76
+
77
+ # Remove unmanaged content from all source paths
78
+ def purge!
79
+ paths_and_sources.each_pair do |path, sources_at_path|
80
+ R10K::Util::Basedir.new(path, sources_at_path).purge!
81
+ end
82
+ end
83
+
84
+ def validate!
85
+ hash = {}
86
+ sources.each do |source|
87
+ source.environments.each do |environment|
88
+ if hash.key?(environment.path)
89
+ osource, oenvironment = hash[environment.path]
90
+ msg = _("Environment collision at %{env_path} between %{source}:%{env_name} and %{osource}:%{oenv_name}") %
91
+ {env_path: environment.path,
92
+ source: source.name,
93
+ env_name: environment.name,
94
+ osource: osource.name,
95
+ oenv_name: oenvironment.name}
96
+
97
+ raise R10K::Error, msg
98
+ else
99
+ hash[environment.path] = [source, environment]
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ def accept(visitor)
106
+ visitor.visit(:deployment, self) do
107
+ sources.each do |source|
108
+ source.accept(visitor)
109
+ end
110
+ end
111
+ end
112
+
113
+ private
114
+
115
+ def load_sources
116
+ sources = @config[:sources]
117
+ if sources.nil? || sources.empty?
118
+ raise R10K::Error, _("Unable to load sources; the supplied configuration does not define the 'sources' key")
119
+ end
120
+ @_sources = sources.map do |(name, hash)|
121
+ R10K::Source.from_hash(name, hash)
122
+ end
123
+ end
124
+
125
+ def load_environments
126
+ @_environments = []
127
+ sources.each do |source|
128
+ @_environments += source.environments
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,56 @@
1
+ require 'r10k/deployment'
2
+ require 'r10k/settings/loader'
3
+ require 'r10k/util/symbolize_keys'
4
+ require 'r10k/errors'
5
+ require 'r10k/initializers'
6
+ require 'yaml'
7
+
8
+ module R10K
9
+ class Deployment
10
+ class Config
11
+
12
+ include R10K::Logging
13
+
14
+ attr_accessor :configfile
15
+
16
+ def initialize(configfile, overrides={})
17
+ @configfile = configfile
18
+ @overrides = overrides
19
+
20
+ load_config
21
+ end
22
+
23
+ # Perform a scan for key and check for both string and symbol keys
24
+ def setting(key)
25
+ @config[key]
26
+ end
27
+
28
+ alias [] setting
29
+
30
+ def settings
31
+ @config
32
+ end
33
+
34
+ # Load and store a config file, and set relevant options
35
+ #
36
+ # @param [String] configfile The path to the YAML config file
37
+ def load_config
38
+ loader = R10K::Settings::Loader.new
39
+ hash = loader.read(@configfile)
40
+
41
+ with_overrides = hash.merge(@overrides) do |key, oldval, newval|
42
+ logger.debug2 _("Overriding config file setting '%{key}': '%{old_val}' -> '%{new_val}'") % {key: key, old_val: oldval, new_val: newval}
43
+ newval
44
+ end
45
+
46
+ @config = R10K::Settings.global_settings.evaluate(with_overrides)
47
+
48
+ initializer = R10K::Initializers::GlobalInitializer.new(@config)
49
+ initializer.call
50
+ end
51
+
52
+ class ConfigError < R10K::Error
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,37 @@
1
+ module R10K
2
+ module Environment
3
+ def self.factory
4
+ @factory ||= R10K::KeyedFactory.new
5
+ end
6
+
7
+ def self.register(key, klass)
8
+ factory.register(key, klass)
9
+ end
10
+
11
+ def self.retrieve(key)
12
+ factory.retrieve(key)
13
+ end
14
+
15
+ def self.generate(type, name, basedir, dirname, options = {})
16
+ factory.generate(type, name, basedir, dirname, options)
17
+ end
18
+
19
+ def self.from_hash(name, hash)
20
+ R10K::Util::SymbolizeKeys.symbolize_keys!(hash)
21
+
22
+ basedir = hash.delete(:basedir)
23
+ dirname = hash.delete(:dirname) || name
24
+
25
+ type = hash.delete(:type)
26
+ type = type.is_a?(String) ? type.to_sym : type
27
+
28
+ generate(type, name, basedir, dirname, hash)
29
+ end
30
+
31
+ require 'r10k/environment/base'
32
+ require 'r10k/environment/with_modules'
33
+ require 'r10k/environment/bare'
34
+ require 'r10k/environment/git'
35
+ require 'r10k/environment/svn'
36
+ end
37
+ end
@@ -0,0 +1,16 @@
1
+ class R10K::Environment::Bare < R10K::Environment::WithModules
2
+
3
+ R10K::Environment.register(:bare, self)
4
+
5
+ def sync
6
+ path.mkpath
7
+ end
8
+
9
+ def status
10
+ :not_applicable
11
+ end
12
+
13
+ def signature
14
+ 'bare-default'
15
+ end
16
+ end
@@ -0,0 +1,150 @@
1
+ require 'r10k/util/subprocess'
2
+
3
+ # This class defines a common interface for environment implementations.
4
+ #
5
+ # @since 1.3.0
6
+ class R10K::Environment::Base
7
+
8
+ # @!attribute [r] name
9
+ # @return [String] A name for this environment that is unique to the given source
10
+ attr_reader :name
11
+
12
+ # @!attribute [r] basedir
13
+ # @return [String] The path that this environment will be created in
14
+ attr_reader :basedir
15
+
16
+ # @!attribute [r] dirname
17
+ # @return [String] The directory name for the given environment
18
+ attr_reader :dirname
19
+
20
+ # @!attribute [r] path
21
+ # @return [Pathname] The full path to the given environment
22
+ attr_reader :path
23
+
24
+ # @!attribute [r] puppetfile
25
+ # @api public
26
+ # @return [R10K::Puppetfile] The puppetfile instance associated with this environment
27
+ attr_reader :puppetfile
28
+
29
+ # @!attribute [r] puppetfile_name
30
+ # @api public
31
+ # @return [String] The puppetfile name (relative)
32
+ attr_reader :puppetfile_name
33
+
34
+ # Initialize the given environment.
35
+ #
36
+ # @param name [String] The unique name describing this environment.
37
+ # @param basedir [String] The base directory where this environment will be created.
38
+ # @param dirname [String] The directory name for this environment.
39
+ # @param options [Hash] An additional set of options for this environment.
40
+ # The semantics of this environment may depend on the environment implementation.
41
+ def initialize(name, basedir, dirname, options = {})
42
+ @name = name
43
+ @basedir = basedir
44
+ @dirname = dirname
45
+ @options = options
46
+ @puppetfile_name = options[:puppetfile_name]
47
+
48
+ @full_path = File.join(@basedir, @dirname)
49
+ @path = Pathname.new(File.join(@basedir, @dirname))
50
+
51
+ @puppetfile = R10K::Puppetfile.new(@full_path, nil, nil, @puppetfile_name)
52
+ @puppetfile.environment = self
53
+ end
54
+
55
+ # Synchronize the given environment.
56
+ #
57
+ # @api public
58
+ # @abstract
59
+ # @return [void]
60
+ def sync
61
+ raise NotImplementedError, _("%{class} has not implemented method %{method}") % {class: self.class, method: __method__}
62
+ end
63
+
64
+ # Determine the current status of the environment.
65
+ #
66
+ # This can return the following values:
67
+ #
68
+ # * :absent - there is no module installed
69
+ # * :mismatched - there is a module installed but it must be removed and reinstalled
70
+ # * :outdated - the correct module is installed but it needs to be updated
71
+ # * :insync - the correct module is installed and up to date, or the module is actually a boy band.
72
+ #
73
+ # @api public
74
+ # @abstract
75
+ # @return [Symbol]
76
+ def status
77
+ raise NotImplementedError, _("%{class} has not implemented method %{method}") % {class: self.class, method: __method__}
78
+ end
79
+
80
+ # Returns a unique identifier for the environment's current state.
81
+ #
82
+ # @api public
83
+ # @abstract
84
+ # @return [String]
85
+ def signature
86
+ raise NotImplementedError, _("%{class} has not implemented method %{method}") %{class: self.class, method: __method__}
87
+ end
88
+
89
+ # Returns a hash describing the current state of the environment.
90
+ #
91
+ # @return [Hash]
92
+ def info
93
+ {
94
+ :name => self.name,
95
+ :signature => self.signature,
96
+ }
97
+ end
98
+
99
+ # @return [Array<R10K::Module::Base>] All modules defined in the Puppetfile
100
+ # associated with this environment.
101
+ def modules
102
+ @puppetfile.load
103
+ @puppetfile.modules
104
+ end
105
+
106
+ def accept(visitor)
107
+ visitor.visit(:environment, self) do
108
+ puppetfile.accept(visitor)
109
+ end
110
+ end
111
+
112
+ def whitelist(user_whitelist=[])
113
+ user_whitelist.collect { |pattern| File.join(@full_path, pattern) }
114
+ end
115
+
116
+ def purge_exclusions
117
+ list = [File.join(@full_path, '.r10k-deploy.json')].to_set
118
+
119
+ list += @puppetfile.managed_directories
120
+
121
+ list += @puppetfile.desired_contents.flat_map do |item|
122
+ desired_tree = []
123
+
124
+ if File.directory?(item)
125
+ desired_tree << File.join(item, '**', '*')
126
+ end
127
+
128
+ Pathname.new(item).ascend do |path|
129
+ break if path.to_s == @full_path
130
+ desired_tree << path.to_s
131
+ end
132
+
133
+ desired_tree
134
+ end
135
+
136
+ list.to_a
137
+ end
138
+
139
+ def generate_types!
140
+ argv = [R10K::Settings.puppet_path, 'generate', 'types', '--environment', dirname, '--environmentpath', basedir]
141
+ subproc = R10K::Util::Subprocess.new(argv)
142
+ subproc.raise_on_fail = true
143
+ subproc.logger = logger
144
+ result = subproc.execute
145
+ unless result.stderr.empty?
146
+ logger.warn "There were problems generating types for environment #{dirname}:"
147
+ result.stderr.split(%r{\n}).map { |msg| logger.warn msg }
148
+ end
149
+ end
150
+ end