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,222 @@
1
+ require 'git_utils'
2
+
3
+ # Retrieve the file path for the "r10k.yaml" configuration file.
4
+ #
5
+ # ==== Attributes
6
+ #
7
+ # * +master+ - The Puppet master on which r10k is installed.
8
+ #
9
+ # ==== Returns
10
+ #
11
+ # +string+ - Absolute file path to "r10k.yaml" config file.
12
+ #
13
+ # ==== Examples
14
+ #
15
+ # get_r10k_config_file_path(master)
16
+ def get_r10k_config_file_path(master)
17
+ confdir = on(master, puppet('config print confdir')).stdout.rstrip
18
+
19
+ return File.join(File.dirname(confdir), 'r10k', 'r10k.yaml')
20
+ end
21
+
22
+ # Verify that a pristine "production" environment exists on the master.
23
+ # (And only the "production" environment!)
24
+ #
25
+ # ==== Attributes
26
+ #
27
+ # * +master+ - The Puppet master on which to verify the "production" environment.
28
+ #
29
+ # ==== Returns
30
+ #
31
+ # +nil+
32
+ #
33
+ # ==== Examples
34
+ #
35
+ # verify_production_environment(master)
36
+ def verify_production_environment(master)
37
+ environment_path = on(master, puppet('config', 'print', 'environmentpath')).stdout.rstrip
38
+ prod_env_md5sum_path = File.join(environment_path, 'production', 'manifests', '.site_pp.md5')
39
+
40
+ #Verify MD5 sum of "site.pp"
41
+ on(master, "md5sum -c #{prod_env_md5sum_path}")
42
+
43
+ #Verify that "production" is the only environment available.
44
+ on(master, "test `ls #{environment_path} | wc -l` -eq 1")
45
+ on(master, "ls #{environment_path} | grep \"production\"")
46
+ end
47
+
48
+ # Revert the Puppet environments back to a pristine 'production' branch while deleting all other branches.
49
+ #
50
+ # ==== Attributes
51
+ #
52
+ # * +host+ - One or more hosts to act upon, or a role (String or Symbol) that identifies one or more hosts.
53
+ # * +commit_sha+ - The reset 'production' branch HEAD to this commit SHA.
54
+ # * +git_repo_path+ - The path to the git repository on the target host.
55
+ #
56
+ # ==== Returns
57
+ #
58
+ # +nil+
59
+ #
60
+ # ==== Examples
61
+ #
62
+ # r10k_revert_environment(master, 'ff81c01c5', '~/git_repo')
63
+ def r10k_revert_environment(host, commit_sha, git_repo_path)
64
+ #Reset 'production' branch to know clean state.
65
+ git_on(host, 'checkout production', git_repo_path)
66
+ git_reset_hard(host, commit_sha, git_repo_path)
67
+
68
+ #Get all branches except for 'production'.
69
+ local_branches = git_on(host, 'branch | grep -v "production" | xargs', git_repo_path).stdout()
70
+
71
+ #Delete all other branches except for 'production' locally and remotely.
72
+ if local_branches != "\n"
73
+ git_on(host, "branch -D #{local_branches}", git_repo_path)
74
+ end
75
+
76
+ #Force push changes to remote.
77
+ git_on(host, 'push origin --mirror --force', git_repo_path)
78
+ git_on(host, 'push origin --mirror --force', git_repo_path)
79
+
80
+ #Remove r10k cache
81
+ cachedir = '/var/cache/r10k'
82
+ on(master, "rm -rf #{cachedir}")
83
+ end
84
+
85
+ # Clean-up the r10k environment on the master to bring it back to a known good state.
86
+ #
87
+ # ==== Attributes
88
+ #
89
+ # * +host+ - The Puppet master on which to verify the "production" environment.
90
+ # * +commit_sha+ - The reset HEAD to this commit SHA.
91
+ # * +git_repo_path+ - The path to the git repository on the target host.
92
+ #
93
+ # ==== Returns
94
+ #
95
+ # +nil+
96
+ #
97
+ # ==== Examples
98
+ #
99
+ # clean_up_r10k(master, 'ff81c01c5', '~/git_repo')
100
+ def clean_up_r10k(master, commit_sha, git_repo_path)
101
+ environment_path = on(master, puppet('config', 'print', 'environmentpath')).stdout.rstrip
102
+ prod_env_modules_path = File.join(environment_path, 'production', 'modules')
103
+ prod_env_site_path = File.join(environment_path, 'production', 'site')
104
+ r10k_fqp = get_r10k_fqp(master)
105
+
106
+ step 'Reset Git Repo to Known Good State'
107
+ r10k_revert_environment(master, commit_sha, git_repo_path)
108
+
109
+ # RK-297 workaround. Without this, tests will fail with an error like the following:
110
+ # [2017-06-02 11:11:46 - ERROR] Object not found - no match for id (60e4ea82c9fdf86974a13f78b839a497325de04b)
111
+ # This cleanup should not be necessary when RK-297 has been resolved.
112
+ #
113
+ step 'Remove git directories from codedir to prevent cache errors'
114
+ on(master, "find #{environment_path } -name .git -type d -print0 | xargs -r0 -- rm -r")
115
+
116
+ step 'Restore Original "production" Environment'
117
+ on(master, "#{r10k_fqp} deploy environment -v")
118
+
119
+ step 'Verify "production" Environment is at Original State'
120
+ verify_production_environment(master)
121
+
122
+ step 'Remove Any Modules from the "production" Environment'
123
+ on(master, "rm -rf #{prod_env_modules_path}/*")
124
+ on(master, "rm -rf #{prod_env_site_path}/*")
125
+ end
126
+
127
+ # Create a new r10k Git source that is copied from the current "production" environment.
128
+ #
129
+ # ==== Attributes
130
+ #
131
+ # * +master+ - The Puppet master on which to create a new Git source.
132
+ # * +git_repo_parent_path+ - The parent path that contains the desired Git repository.
133
+ # * +git_repo_name+ - The name of the repository.
134
+ # * +git_clone_path+ - The destination path for the git clone.
135
+ # * +env_name+ - The initial branch name (environment) for first commit.
136
+ # * +deploy?+ - A flag indicating if r10k environment deployment should be kicked off after cloning.
137
+ #
138
+ # ==== Returns
139
+ #
140
+ # +string+ - The path to the newly created Git repository.
141
+ #
142
+ # ==== Examples
143
+ #
144
+ # init_r10k_source_from_prod(master, '/git/repos', 'environments', '~/repos/r10k', 'test', deploy=true)
145
+ def init_r10k_source_from_prod(master, git_repo_parent_path, git_repo_name, git_clone_path, env_name, deploy=false)
146
+ #Init
147
+ env_path = on(master, puppet('config print environmentpath')).stdout.rstrip
148
+ prod_env_path = File.join(env_path, 'production')
149
+ r10k_fqp = get_r10k_fqp(master)
150
+
151
+ local_files_root_path = ENV['FILES'] || 'files'
152
+ prod_env_config_path = 'pre-suite/prod_env.config'
153
+ prod_env_config = File.read(File.join(local_files_root_path, prod_env_config_path))
154
+
155
+ #Create Git origin repo and clone.
156
+ git_init_bare_repo_and_clone(master, git_repo_parent_path, git_repo_name, git_clone_path)
157
+
158
+ #Copy current contents of production environment to the git clone path
159
+ on(master, "cp -r #{prod_env_path}/* #{git_clone_path}")
160
+
161
+ #Create hidden files in the "site" and "modules" folders so that git copies the directories.
162
+ on(master, "mkdir -p #{git_clone_path}/modules #{git_clone_path}/site")
163
+ on(master, "touch #{git_clone_path}/modules/.keep;touch #{git_clone_path}/site/.keep")
164
+
165
+ #Create MD5 sum file for the "site.pp" file.
166
+ on(master, "md5sum #{git_clone_path}/manifests/site.pp > #{git_clone_path}/manifests/.site_pp.md5")
167
+
168
+ #Add environment config that specifies module lookup path for production.
169
+ create_remote_file(master, "#{git_clone_path}/environment.conf", prod_env_config)
170
+ git_on(master, "add #{git_clone_path}/*", git_clone_path)
171
+ git_on(master, "commit -m \"Add #{env_name} environment.\"", git_clone_path)
172
+ git_on(master, "branch -m #{env_name}", git_clone_path)
173
+ git_on(master, "push -u origin #{env_name}", git_clone_path)
174
+
175
+ #Attempt to deploy environments.
176
+ if deploy
177
+ on(master, "#{r10k_fqp} deploy environment -v")
178
+ end
179
+ end
180
+
181
+ # Get the fully qualified path for r10k.
182
+ #
183
+ # ==== Arguments
184
+ #
185
+ # * +host+ - The Beaker host to introspect
186
+ #
187
+ # ==== Returns
188
+ #
189
+ # +string+ - The fully qualified path for r10k
190
+ #
191
+ # ==== Examples
192
+ #
193
+ # get_r10k_fqp(master)
194
+ def get_r10k_fqp(host)
195
+ puppet_version = get_puppet_version(host)
196
+ if puppet_version < 4.0
197
+ fqp = '/opt/puppet/bin/r10k'
198
+ else
199
+ fqp = '/opt/puppetlabs/puppet/bin/r10k'
200
+ end
201
+ fqp
202
+ end
203
+
204
+ # Get the version of puppet that is installed on a host.
205
+ #
206
+ # ==== Arguments
207
+ #
208
+ # * +host+ - The Beaker host to introspect
209
+ #
210
+ # ==== Returns
211
+ #
212
+ # +float+ - the version of puppet as a float
213
+ #
214
+ # ==== Examples
215
+ #
216
+ # get_puppet_version(master)
217
+ def get_puppet_version(host)
218
+ on(host, puppet('--version')) do |result|
219
+ @version = result.stdout.match(/(\d){1}.(\d){1,2}.(\d){1,2}/)[0].to_f
220
+ end
221
+ @version
222
+ end
@@ -0,0 +1,4 @@
1
+ Manifests
2
+ ===========================
3
+
4
+ This folder contains manifests used for testing the r10k project. The manifests are organized by test suite.
@@ -0,0 +1,6 @@
1
+ require 'beaker-pe'
2
+
3
+ test_name 'CODEMGMT-20 - C48 - Install Puppet Enterprise'
4
+
5
+ step 'Install PE'
6
+ install_pe
@@ -0,0 +1,48 @@
1
+ require 'erb'
2
+ require 'git_utils'
3
+ require 'r10k_utils'
4
+ require 'master_manipulator'
5
+ test_name 'CODEMGMT-20 - C59120 - Install and Configure Git for r10k'
6
+
7
+ #Init
8
+ env_path = on(master, puppet('config print environmentpath')).stdout.rstrip
9
+ prod_env_path = File.join(env_path, 'production')
10
+
11
+ git_repo_path = '/git_repos'
12
+ git_repo_name = 'environments'
13
+ git_control_remote = File.join(git_repo_path, "#{git_repo_name}.git")
14
+ git_control_remote_head_path = File.join(git_control_remote, 'HEAD')
15
+ git_environments_path = File.join('/root', git_repo_name)
16
+
17
+ local_files_root_path = ENV['FILES'] || 'files'
18
+ git_manifest_template_path = File.join(local_files_root_path, 'pre-suite', 'git_config.pp.erb')
19
+ git_manifest = ERB.new(File.read(git_manifest_template_path)).result(binding)
20
+
21
+ step 'Get PE Version'
22
+ pe_version = get_puppet_version(master)
23
+ fail_test('This pre-suite requires PE 3.7 or above!') if pe_version < 3.7
24
+
25
+ #Setup
26
+ step 'Stub Forge on Master'
27
+ stub_forge_on(master)
28
+
29
+ step 'Read module path'
30
+ on(master, puppet('config print basemodulepath')) do |result|
31
+ (result.stdout.include? ':') ? separator = ':' : separator = ';'
32
+ @module_path = result.stdout.split(separator).first
33
+ end
34
+
35
+ step 'Install "git" Module'
36
+ on(master, puppet("module install puppetlabs-git --modulepath #{@module_path}"))
37
+
38
+ step 'Install and Configure Git'
39
+ on(master, puppet('apply'), :stdin => git_manifest, :acceptable_exit_codes => [0,2]) do |result|
40
+ assert_no_match(/Error:/, result.stderr, 'Unexpected error was detected!')
41
+ end
42
+
43
+ step 'Create "production" Environment on Git'
44
+ init_r10k_source_from_prod(master, git_repo_path, git_repo_name, git_environments_path, 'production')
45
+
46
+ step 'Change Default Branch to "production" on Git Control Remote'
47
+ create_remote_file(master, git_control_remote_head_path, "ref: refs/heads/production\n")
48
+ on(master, "chmod 644 #{git_control_remote_head_path}")
@@ -0,0 +1,55 @@
1
+ require 'git_utils'
2
+ require 'r10k_utils'
3
+ require 'master_manipulator'
4
+ test_name 'CODEMGMT-21 - C59119 - Configure r10k for Puppet Enterprise'
5
+
6
+ #Init
7
+ env_path = on(master, puppet('config print environmentpath')).stdout.rstrip
8
+ prod_env_path = File.join(env_path, 'production')
9
+
10
+ r10k_config_path = get_r10k_config_file_path(master)
11
+
12
+ git_repo_path = '/git_repos'
13
+ git_repo_name = 'environments'
14
+ git_control_remote = File.join(git_repo_path, "#{git_repo_name}.git")
15
+ git_provider = ENV['GIT_PROVIDER'] || 'shellgit'
16
+ r10k_fqp = get_r10k_fqp(master)
17
+
18
+ step 'Get PE Version'
19
+ pe_version = get_puppet_version(master)
20
+ fail_test('This pre-suite requires PE 3.7 or above!') if pe_version < 3.7
21
+
22
+ #In-line files
23
+ r10k_conf = <<-CONF
24
+ cachedir: '/var/cache/r10k'
25
+ git:
26
+ provider: '#{git_provider}'
27
+ sources:
28
+ control:
29
+ basedir: "#{env_path}"
30
+ remote: "#{git_control_remote}"
31
+ CONF
32
+
33
+ #Setup
34
+ step 'Remove Current Puppet "production" Environment'
35
+ on(master, "rm -rf #{prod_env_path}")
36
+
37
+ step 'Configure r10k'
38
+ create_remote_file(master, r10k_config_path, r10k_conf)
39
+ on(master, "chmod 644 #{r10k_config_path}")
40
+
41
+ step 'Deploy "production" Environment via r10k'
42
+ on(master, "#{r10k_fqp} deploy environment -v")
43
+
44
+ step 'Disable Environment Caching on Master'
45
+ on(master, puppet('config set environment_timeout 0 --section main'))
46
+
47
+ #This should be temporary until we get a better solution.
48
+ step 'Disable Node Classifier'
49
+ on(master, puppet('config', 'set node_terminus plain', '--section master'))
50
+
51
+ step 'Restart the Puppet Server Service'
52
+ restart_puppet_server(master)
53
+
54
+ step 'Run Puppet Agent on All Nodes'
55
+ on(agents, puppet('agent', '--test', '--environment production'))
@@ -0,0 +1,5 @@
1
+ Pre-suite
2
+ ===========================
3
+
4
+ This folder contains the [Beaker](https://github.com/puppetlabs/beaker) pre-suite tasks that configures test
5
+ test infrastructure for testing.
@@ -0,0 +1,72 @@
1
+ require 'git_utils'
2
+ require 'r10k_utils'
3
+ require 'master_manipulator'
4
+ test_name 'CODEMGMT-730 - C97981 - HTTP_PROXY affects git source in puppetfile'
5
+
6
+ #Init
7
+ env_path = on(master, puppet('config print environmentpath')).stdout.rstrip
8
+ r10k_fqp = get_r10k_fqp(master)
9
+
10
+ git_repo_path = '/git_repos'
11
+ git_repo_name = 'environments'
12
+ git_control_remote = File.join(git_repo_path, "#{git_repo_name}.git")
13
+ git_environments_path = '/root/environments'
14
+ last_commit = git_last_commit(master, git_environments_path)
15
+ git_provider = ENV['GIT_PROVIDER']
16
+
17
+ r10k_config_path = get_r10k_config_file_path(master)
18
+ r10k_config_bak_path = "#{r10k_config_path}.bak"
19
+
20
+ puppetfile =<<-EOS
21
+ mod 'puppetlabs/apache', '0.10.0'
22
+ EOS
23
+
24
+ proxy_env_value = 'http://iloveferrits.net:3219'
25
+
26
+ #In-line files
27
+ r10k_conf = <<-CONF
28
+ proxy: 'http://ilovedogs.com:3128'
29
+ cachedir: '/var/cache/r10k'
30
+ git:
31
+ provider: '#{git_provider}'
32
+ sources:
33
+ control:
34
+ basedir: "#{env_path}"
35
+ remote: "#{git_control_remote}"
36
+ forge:
37
+ proxy: "http://ilovecats.net:3128"
38
+ CONF
39
+
40
+ teardown do
41
+ master.clear_env_var('HTTP_PROXY')
42
+
43
+ step 'Restore Original "r10k" Config'
44
+ on(master, "mv #{r10k_config_bak_path} #{r10k_config_path}")
45
+
46
+ step 'cleanup r10k'
47
+ clean_up_r10k(master, last_commit, git_environments_path)
48
+ end
49
+
50
+ master.add_env_var('HTTP_PROXY', proxy_env_value)
51
+
52
+ step 'Backup Current "r10k" Config'
53
+ on(master, "mv #{r10k_config_path} #{r10k_config_bak_path}")
54
+
55
+ step 'Update the "r10k" Config'
56
+ create_remote_file(master, r10k_config_path, r10k_conf)
57
+
58
+ step 'Checkout "production" Branch'
59
+ git_on(master, 'checkout production', git_environments_path)
60
+
61
+ step 'Copy Puppetfile to "production" Environment Git Repo'
62
+ create_remote_file(master, "#{git_environments_path}/Puppetfile", puppetfile)
63
+
64
+ step 'Push Changes'
65
+ git_add_commit_push(master, 'production', 'add Puppetfile', git_environments_path)
66
+
67
+ #test
68
+ on(master, "#{r10k_fqp} deploy environment -p", :accept_all_exit_codes => true) do |r|
69
+ regex = /using proxy http:\/\/ilovecats\.net:3128/i
70
+ assert(r.exit_code == 1, 'expected error code was not observed')
71
+ assert_match(regex, r.stderr, 'The expected error message was not observed' )
72
+ end
@@ -0,0 +1,70 @@
1
+ require 'git_utils'
2
+ require 'r10k_utils'
3
+ require 'master_manipulator'
4
+ test_name 'CODEMGMT-730 - C97982 - HTTP_PROXY affects git source in puppetfile'
5
+
6
+ #Init
7
+ env_path = on(master, puppet('config print environmentpath')).stdout.rstrip
8
+ r10k_fqp = get_r10k_fqp(master)
9
+
10
+ git_repo_path = '/git_repos'
11
+ git_repo_name = 'environments'
12
+ git_control_remote = File.join(git_repo_path, "#{git_repo_name}.git")
13
+ git_environments_path = '/root/environments'
14
+ last_commit = git_last_commit(master, git_environments_path)
15
+ git_provider = ENV['GIT_PROVIDER']
16
+
17
+ r10k_config_path = get_r10k_config_file_path(master)
18
+ r10k_config_bak_path = "#{r10k_config_path}.bak"
19
+
20
+ puppetfile =<<-EOS
21
+ mod 'motd',
22
+ :git => 'https://github.com/puppetlabs/puppetlabs-motd'
23
+ EOS
24
+
25
+ proxy_env_value = 'http://ferritsarebest.net:3219'
26
+
27
+ #In-line files
28
+ r10k_conf = <<-CONF
29
+ cachedir: '/var/cache/r10k'
30
+ git:
31
+ provider: '#{git_provider}'
32
+ sources:
33
+ control:
34
+ basedir: "#{env_path}"
35
+ remote: "#{git_control_remote}"
36
+ CONF
37
+
38
+ teardown do
39
+ master.clear_env_var('HTTP_PROXY')
40
+
41
+ step 'Restore Original "r10k" Config'
42
+ on(master, "mv #{r10k_config_bak_path} #{r10k_config_path}")
43
+
44
+ step 'cleanup r10k'
45
+ clean_up_r10k(master, last_commit, git_environments_path)
46
+ end
47
+
48
+ master.add_env_var('HTTP_PROXY', proxy_env_value)
49
+
50
+ step 'Backup Current "r10k" Config'
51
+ on(master, "mv #{r10k_config_path} #{r10k_config_bak_path}")
52
+
53
+ step 'Update the "r10k" Config'
54
+ create_remote_file(master, r10k_config_path, r10k_conf)
55
+
56
+ step 'Checkout "production" Branch'
57
+ git_on(master, 'checkout production', git_environments_path)
58
+
59
+ step 'Copy Puppetfile to "production" Environment Git Repo'
60
+ create_remote_file(master, "#{git_environments_path}/Puppetfile", puppetfile)
61
+
62
+ step 'Push Changes'
63
+ git_add_commit_push(master, 'production', 'add Puppetfile', git_environments_path)
64
+
65
+ #test
66
+ on(master, "#{r10k_fqp} deploy environment -p", :accept_all_exit_codes => true) do |r|
67
+ regex = /(Couldn't|Could not) resolve proxy.*ferritsarebest\.net/i
68
+ assert(r.exit_code == 1, 'expected error code was not observed')
69
+ assert_match(regex, r.stderr, 'The expected error message was not observed' )
70
+ end