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,12 @@
1
+ test_name "Install PE r10k" do
2
+
3
+ step "Install PE r10k" do
4
+ variant, version, arch, codename = master['platform'].to_array
5
+ if variant == 'ubuntu' && version.split('.').first.to_i >= 18
6
+ on master, "echo 'Acquire::AllowInsecureRepositories \"true\";' > /etc/apt/apt.conf.d/90insecure"
7
+ end
8
+
9
+ install_dev_repos_on('pe-r10k', master, ENV['SHA'], '/tmp/repo_configs', {:dev_builds_url => 'http://builds.delivery.puppetlabs.net'})
10
+ master.install_package('pe-r10k')
11
+ end
12
+ end
@@ -0,0 +1,4 @@
1
+ Files
2
+ ===========================
3
+
4
+ This folder contains files used for testing the r10k project. The files are organized by test suite.
@@ -0,0 +1,8 @@
1
+ ---
2
+ :backends:
3
+ - yaml
4
+ :hierarchy:
5
+ - "%{environment}"
6
+
7
+ :yaml:
8
+ :datadir: "/etc/puppetlabs/puppet/environments/%{environment}/hiera"
@@ -0,0 +1,3 @@
1
+ class helloworld {
2
+ notify { "Hello world!": message => "I am in the ${environment} environment"}
3
+ }
@@ -0,0 +1,3 @@
1
+ class hieratest ($hiera_message = "default text") {
2
+ notify { "Hiera test!": message => $hiera_message}
3
+ }
@@ -0,0 +1 @@
1
+ Ha ha ha! I am in Korean!
@@ -0,0 +1,6 @@
1
+ class unicode {
2
+ file { '/tmp/unicode.file':
3
+ ensure => file,
4
+ source => "puppet:///modules/unicode/굢챣샃뻧븣럩윕컾뾐깩"
5
+ }
6
+ }
@@ -0,0 +1,19 @@
1
+ $git_package = $osfamily ? {
2
+ 'Debian' => 'git-core',
3
+ default => 'git'
4
+ }
5
+ class { 'git':
6
+ package_name => $git_package
7
+ }
8
+ ->
9
+ git::config { 'user.name':
10
+ value => 'Tester',
11
+ }
12
+ ->
13
+ git::config { 'user.email':
14
+ value => 'tester@puppetlabs.com',
15
+ }
16
+ ->
17
+ file { '<%= git_repo_path %>':
18
+ ensure => directory
19
+ }
@@ -0,0 +1,3 @@
1
+ # Puppet Enterprise requires $basemodulepath
2
+ modulepath = site:dist:modules:$basemodulepath
3
+ manifest = manifests/site.pp
@@ -0,0 +1,9 @@
1
+ cachedir: '/var/cache/r10k'
2
+ git:
3
+ provider: '<%= git_provider %>'
4
+ sources:
5
+ <% for source in sources %>
6
+ <%= source.repo_name %>:
7
+ basedir: "<%= env_path %>"
8
+ remote: "<%= source.control_remote %>"
9
+ <% end %>
@@ -0,0 +1,4 @@
1
+ Lib
2
+ ===========================
3
+
4
+ This folder contains Ruby files that extends Beaker.
@@ -0,0 +1,205 @@
1
+ # Execute a git command on a host.
2
+ #
3
+ # ==== Attributes
4
+ #
5
+ # * +host+ - One or more hosts to act upon, or a role (String or Symbol) that identifies one or more hosts.
6
+ # * +git_sub_command+ - The git sub-command to execute including arguments. (The 'git' command is assumed.)
7
+ # * +git_repo_path+ - The path to the git repository on the target host.
8
+ # * +opts+ - Options to alter execution.
9
+ #
10
+ # ==== Returns
11
+ #
12
+ # +nil+
13
+ #
14
+ # ==== Examples
15
+ #
16
+ # git_on(master, 'add file.txt', '~/git_repo')
17
+ def git_on(host, git_sub_command, git_repo_path, opts = {})
18
+ git_command = "git --git-dir=#{git_repo_path}/.git --work-tree=#{git_repo_path} #{git_sub_command}"
19
+
20
+ on(host, git_command, opts)
21
+ end
22
+
23
+ # Add all uncommitted files located in a repository.
24
+ #
25
+ # ==== Attributes
26
+ #
27
+ # * +host+ - One or more hosts to act upon, or a role (String or Symbol) that identifies one or more hosts.
28
+ # * +git_repo_path+ - The path to the git repository on the target host.
29
+ #
30
+ # ==== Returns
31
+ #
32
+ # +nil+
33
+ #
34
+ # ==== Examples
35
+ #
36
+ # git_add_everything(master, '~/git_repo')
37
+ def git_add_everything(host, git_repo_path)
38
+ git_on(host, "add #{git_repo_path}/*", git_repo_path)
39
+ end
40
+
41
+ # Push branch to origin remote.
42
+ #
43
+ # ==== Attributes
44
+ #
45
+ # * +host+ - One or more hosts to act upon, or a role (String or Symbol) that identifies one or more hosts.
46
+ # * +branch+ - The branch to push.
47
+ # * +git_repo_path+ - The path to the git repository on the target host.
48
+ #
49
+ # ==== Returns
50
+ #
51
+ # +nil+
52
+ #
53
+ # ==== Examples
54
+ #
55
+ # git_push(master, 'production', '~/git_repo')
56
+ def git_push(host, branch, git_repo_path)
57
+ git_on(host, "push origin #{branch}", git_repo_path)
58
+ end
59
+
60
+ # Commit changes and push branch to origin remote.
61
+ #
62
+ # ==== Attributes
63
+ #
64
+ # * +host+ - One or more hosts to act upon, or a role (String or Symbol) that identifies one or more hosts.
65
+ # * +branch+ - The branch to push.
66
+ # * +message+ - A single-line commit message. (Don't quote message!)
67
+ # * +git_repo_path+ - The path to the git repository on the target host.
68
+ #
69
+ # ==== Returns
70
+ #
71
+ # +nil+
72
+ #
73
+ # ==== Examples
74
+ #
75
+ # git_commit_push(master, 'production', 'Awesome stuff!', '~/git_repo')
76
+ def git_commit_push(host, branch, message, git_repo_path)
77
+ git_on(host, "commit -m \"#{message}\"", git_repo_path)
78
+ git_push(host, branch, git_repo_path)
79
+ end
80
+
81
+ # Add all uncommitted files located in a repository, commit changes and push branch to origin remote.
82
+ #
83
+ # ==== Attributes
84
+ #
85
+ # * +host+ - One or more hosts to act upon, or a role (String or Symbol) that identifies one or more hosts.
86
+ # * +branch+ - The branch to push.
87
+ # * +message+ - A single-line commit message. (Don't quote message!)
88
+ # * +git_repo_path+ - The path to the git repository on the target host.
89
+ #
90
+ # ==== Returns
91
+ #
92
+ # +nil+
93
+ #
94
+ # ==== Examples
95
+ #
96
+ # git_add_commit_push(master, 'production', 'Awesome stuff!', '~/git_repo')
97
+ def git_add_commit_push(host, branch, message, git_repo_path)
98
+ git_add_everything(host, git_repo_path)
99
+ git_commit_push(host, branch, message, git_repo_path)
100
+ end
101
+
102
+ # Get the last commit SHA.
103
+ #
104
+ # ==== Attributes
105
+ #
106
+ # * +host+ - One or more hosts to act upon, or a role (String or Symbol) that identifies one or more hosts.
107
+ # * +git_repo_path+ - The path to the git repository on the target host.
108
+ #
109
+ # ==== Returns
110
+ #
111
+ # +string+ - The SHA of the last commit.
112
+ #
113
+ # ==== Examples
114
+ #
115
+ # last_commit = git_last_commit(master, '~/git_repo')
116
+ def git_last_commit(host, git_repo_path)
117
+ sha_regex = /commit (\w{40})/
118
+
119
+ return sha_regex.match(git_on(host, 'log', git_repo_path).stdout)[1]
120
+ end
121
+
122
+ # Hard reset the git repository to a specific commit.
123
+ #
124
+ # ==== Attributes
125
+ #
126
+ # * +host+ - One or more hosts to act upon, or a role (String or Symbol) that identifies one or more hosts.
127
+ # * +commit_sha+ - The reset HEAD to this commit SHA.
128
+ # * +git_repo_path+ - The path to the git repository on the target host.
129
+ #
130
+ # ==== Returns
131
+ #
132
+ # +nil+
133
+ #
134
+ # ==== Examples
135
+ #
136
+ # git_reset_hard(master, 'ff81c01c5', '~/git_repo')
137
+ def git_reset_hard(host, commit_sha, git_repo_path)
138
+ git_on(host, "reset --hard #{commit_sha}", git_repo_path)
139
+ end
140
+
141
+ # Create a bare Git repository.
142
+ #
143
+ # ==== Attributes
144
+ #
145
+ # * +host+ - The Puppet host on which to create a bare git repo.
146
+ # * +git_repo_parent_path+ - The parent path that contains the desired Git repository.
147
+ # * +git_repo_name+ - The name of the repository.
148
+ #
149
+ # ==== Returns
150
+ #
151
+ # +string+ - The path to the newly created Git repository.
152
+ #
153
+ # ==== Examples
154
+ #
155
+ # git_init_bare_repo(master, '/git/repos', 'environments')
156
+ def git_init_bare_repo(host, git_repo_parent_path, git_repo_name)
157
+ #Init
158
+ git_repo_path = File.join(git_repo_parent_path, "#{git_repo_name}.git")
159
+
160
+ #Initialize bare Git repository
161
+ on(host, "mkdir -p #{git_repo_path}")
162
+ on(host, "git init --bare #{git_repo_path}")
163
+
164
+ return git_repo_path
165
+ end
166
+
167
+ # Clone a Git repository.
168
+ #
169
+ # ==== Attributes
170
+ #
171
+ # * +host+ - The Puppet host on which to create a bare git repo.
172
+ # * +git_clone_path+ - The destination path for the git clone.
173
+ # * +git_source+ - The origin from which to clone.
174
+ #
175
+ # ==== Returns
176
+ #
177
+ # +nil+
178
+ #
179
+ # ==== Examples
180
+ #
181
+ # git_clone_repo(master, '~/repos/r10k', '/git/repos/environments.git')
182
+ def git_clone_repo(host, git_clone_path, git_source)
183
+ on(host, "git clone #{git_source} #{git_clone_path}")
184
+ end
185
+
186
+ # Create a bare Git repository and then clone the repository.
187
+ #
188
+ # ==== Attributes
189
+ #
190
+ # * +host+ - The Puppet host on which to create a bare git repo.
191
+ # * +git_repo_parent_path+ - The parent path that contains the desired Git repository.
192
+ # * +git_repo_name+ - The name of the repository.
193
+ # * +git_clone_path+ - The destination path for the git clone.
194
+ #
195
+ # ==== Returns
196
+ #
197
+ # +string+ - The path to the newly created Git repository.
198
+ #
199
+ # ==== Examples
200
+ #
201
+ # git_init_bare_repo_and_clone(master, '/git/repos', 'environments', '~/repos/r10k')
202
+ def git_init_bare_repo_and_clone(host, git_repo_parent_path, git_repo_name, git_clone_path)
203
+ origin_git_repo_path = git_init_bare_repo(host, git_repo_parent_path, git_repo_name)
204
+ git_clone_repo(host, git_clone_path, origin_git_repo_path)
205
+ end
@@ -0,0 +1,205 @@
1
+ # Create a "site.pp" file with file bucket enabled. Also, allow
2
+ # the creation of a custom node definition or use the 'default'
3
+ # node definition.
4
+ #
5
+ # ==== Attributes
6
+ #
7
+ # * +master_certname+ - Certificate name of Puppet master.
8
+ # * +manifest+ - A Puppet manifest to inject into the node definition.
9
+ # * +node_def_name+ - A node definition pattern or name.
10
+ #
11
+ # ==== Returns
12
+ #
13
+ # +string+ - A combined manifest with node definition containing input manifest
14
+ #
15
+ # ==== Examples
16
+ #
17
+ # site_pp = create_site_pp("puppetmaster", '', node_def_name='agent')
18
+ def create_site_pp(master_certname, manifest='', node_def_name='default')
19
+ default_def = <<-MANIFEST
20
+ node default {
21
+ }
22
+ MANIFEST
23
+
24
+ node_def = <<-MANIFEST
25
+ node #{node_def_name} {
26
+
27
+ #{manifest}
28
+ }
29
+ MANIFEST
30
+
31
+ if node_def_name != 'default'
32
+ node_def = "#{default_def}\n#{node_def}"
33
+ end
34
+
35
+ site_pp = <<-MANIFEST
36
+ filebucket { 'main':
37
+ server => '#{master_certname}',
38
+ path => false,
39
+ }
40
+
41
+ File { backup => 'main' }
42
+
43
+ #{node_def}
44
+ MANIFEST
45
+
46
+ return site_pp
47
+ end
48
+
49
+ # Read a Puppet manifest file and inject the content into a
50
+ # "default" node definition. (Used mostly to overide site.pp)
51
+ #
52
+ # ==== Attributes
53
+ #
54
+ # * +manifest_path+ - The file path to target manifest.
55
+ # * +master_certname+ - Certificate name of Puppet master.
56
+ #
57
+ # ==== Returns
58
+ #
59
+ # +string+ - A combined manifest with node definition containg input manifest
60
+ #
61
+ # ==== Examples
62
+ #
63
+ # site_pp = create_node_manifest("/tmp/test.pp", "master")
64
+ def create_node_manifest(manifest_path, master_certname, node_def_name='default')
65
+ manifest = File.read(manifest_path)
66
+
67
+ site_pp = <<-MANIFEST
68
+ filebucket { 'main':
69
+ server => '#{master_certname}',
70
+ path => false,
71
+ }
72
+
73
+ File { backup => 'main' }
74
+
75
+ node default {
76
+
77
+ #{manifest}
78
+ }
79
+ MANIFEST
80
+
81
+ return site_pp
82
+ end
83
+
84
+ # Set mode, owner and group on a remote path.
85
+ #
86
+ # ==== Attributes
87
+ #
88
+ # * +host+ - The remote host containing the target path.
89
+ # * +path+ - The path to set mode, user and group upon.
90
+ # * +mode+ - The desired mode to set on the path in as a string.
91
+ # * +owner+ - The owner to set on the path. (Puppet user if not specified.)
92
+ # * +group+ - The group to set on the path. (Puppet group if not specified.)
93
+ #
94
+ # ==== Returns
95
+ #
96
+ # nil
97
+ #
98
+ # ==== Examples
99
+ #
100
+ # set_perms_on_remote(master, "/tmp/test/site.pp", "777")
101
+ def set_perms_on_remote(host, path, mode, owner=nil, group=nil)
102
+ if (owner.nil?)
103
+ owner = on(host, puppet('config', 'print', 'user')).stdout.rstrip
104
+ end
105
+
106
+ if (group.nil?)
107
+ group = on(host, puppet('config', 'print', 'group')).stdout.rstrip
108
+ end
109
+
110
+ on(host, "chmod -R #{mode} #{path}")
111
+ on(host, "chown -R #{owner}:#{group} #{path}")
112
+ end
113
+
114
+ # Inject temporary "site.pp" onto target host. This will also create
115
+ # a "modules" folder in the target remote directory.
116
+ #
117
+ # ==== Attributes
118
+ #
119
+ # * +master+ - The target master for injection.
120
+ # * +site_pp_path+ - A path on the remote host into which the site.pp will be injected.
121
+ # * +manifest+ - The manifest content to inject into "site.pp" to the host target path.
122
+ #
123
+ # ==== Returns
124
+ #
125
+ # nil
126
+ #
127
+ # ==== Examples
128
+ #
129
+ # site_pp = inject_site_pp(master, "/tmp/test/site.pp", manifest)
130
+ def inject_site_pp(master, site_pp_path, manifest)
131
+ site_pp_dir = File.dirname(site_pp_path)
132
+ create_remote_file(master, site_pp_path, manifest)
133
+
134
+ set_perms_on_remote(master, site_pp_dir, "777")
135
+ end
136
+
137
+ # Create a temporary directory environment and inject a "site.pp" for the target environment.
138
+ #
139
+ # ==== Attributes
140
+ #
141
+ # * +master+ - The master on which to create a new Puppet environment.
142
+ # * +env_root_path+ - The base path on the master that contains all environments.
143
+ # * +env_seed_name+ - The seed name to use for generating an environment name.
144
+ # * +manifest+ - The manifest content to inject into "site.pp" of the newly created environment.
145
+ #
146
+ # ==== Returns
147
+ #
148
+ # +string+ - The environment name that was generated.
149
+ #
150
+ # ==== Examples
151
+ #
152
+ # temp_env_name = create_temp_dir_env(master, "/tmp/test/site.pp", "stuff", manifest)
153
+ def create_temp_dir_env(master, env_root_path, env_seed_name, manifest)
154
+ env_name = "#{env_seed_name}" + rand(36**16).to_s(36)
155
+ env_path = "#{env_root_path}/#{env_name}"
156
+ env_site_pp_path = "#{env_path}/manifests/site.pp"
157
+
158
+ on(master, "mkdir -p #{env_path}/manifests #{env_path}/modules")
159
+ set_perms_on_remote(master, env_path, "777")
160
+
161
+ inject_site_pp(master, env_site_pp_path, manifest)
162
+
163
+ return env_name
164
+ end
165
+
166
+ # Restart the puppet server and wait for it to come back up
167
+ # ==== Attributes
168
+ # *+host+ - the host that this should operate on
169
+ # *+opts+ - an options hash - not required
170
+ # *+:timeout+ - the amount of time in seconds to wait for success
171
+ # *+:frequency+ - The time to wait between retries
172
+ #
173
+ # Raises a standard error if the wait is uncessfull
174
+ #
175
+ # ==== Example
176
+ # restart_puppet_server(master)
177
+ # restart_puppet_server(master, {:time_out => 200, :frequency => 10})
178
+ def restart_puppet_server(host, opts = {})
179
+
180
+ on(host, "puppet resource service pe-puppetserver ensure=stopped")
181
+ on(host, "puppet resource service pe-puppetserver ensure=running")
182
+ masterHostName = on(host, "hostname").stdout.chomp
183
+ opts[:time_out] ||= 100
184
+ opts[:frequency] ||= 5
185
+ i = 0
186
+
187
+ # -k to ignore HTTPS error that isn't relevant to us
188
+ curl_call = "-I -k https://#{masterHostName}:8140/production/certificate_statuses/all"
189
+
190
+ while i < opts[:time_out] do
191
+ sleep opts[:frequency]
192
+ i += 1
193
+ exit_code = curl_on(host, curl_call, :acceptable_exit_codes => [0,1,7]).exit_code
194
+
195
+ # Exit code 7 is "connection refused"
196
+ if exit_code != '7'
197
+ sleep 20
198
+ puts 'Restarting the Puppet Server was successful!'
199
+ return
200
+ end
201
+ end
202
+
203
+ raise StandardError, 'Attempting to restart the puppet server was not successful in the time alloted.'
204
+
205
+ end