r10k 3.14.1 → 5.0.1

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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +17 -0
  3. data/.github/workflows/docker.yml +9 -4
  4. data/.github/workflows/release.yml +3 -2
  5. data/.github/workflows/rspec_tests.yml +8 -10
  6. data/CHANGELOG.mkd +100 -0
  7. data/CODEOWNERS +1 -2
  8. data/Gemfile +2 -2
  9. data/README.mkd +18 -19
  10. data/doc/common-patterns.mkd +1 -2
  11. data/doc/dynamic-environments/configuration.mkd +91 -12
  12. data/doc/dynamic-environments/usage.mkd +4 -0
  13. data/doc/dynamic-environments/workflow-guide.mkd +3 -3
  14. data/doc/faq.mkd +1 -1
  15. data/doc/puppetfile.mkd +9 -3
  16. data/integration/Gemfile +3 -4
  17. data/integration/Rakefile +58 -23
  18. data/integration/files/pre-suite/git_config.pp.erb +1 -1
  19. data/integration/pre-suite/00_pe_install.rb +3 -0
  20. data/integration/pre-suite/10_git_config.rb +1 -3
  21. data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +5 -4
  22. data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +1 -1
  23. data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +2 -2
  24. data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +2 -2
  25. data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +3 -3
  26. data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +3 -3
  27. data/integration/tests/command_line/deploy_env_without_mod_update.rb +0 -3
  28. data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +0 -3
  29. data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +5 -10
  30. data/integration/tests/git_source/git_source_git.rb +1 -4
  31. data/integration/tests/git_source/git_source_repeated_remote.rb +2 -5
  32. data/integration/tests/git_source/git_source_submodule.rb +1 -1
  33. data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +1 -1
  34. data/integration/tests/purging/content_not_purged_at_root.rb +2 -5
  35. data/integration/tests/purging/default_purging.rb +0 -3
  36. data/integration/tests/purging/{does_not_purge_files_on_white_list.rb → does_not_purge_files_on_allowlist.rb} +2 -5
  37. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +1 -4
  38. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +1 -4
  39. data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +1 -4
  40. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +0 -3
  41. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +1 -1
  42. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +1 -1
  43. data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +1 -1
  44. data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +0 -3
  45. data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +3 -2
  46. data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +1 -5
  47. data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +1 -1
  48. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +1 -4
  49. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +0 -3
  50. data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +1 -1
  51. data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +0 -3
  52. data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +0 -3
  53. data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +1 -4
  54. data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +0 -3
  55. data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +0 -3
  56. data/lib/r10k/action/deploy/environment.rb +2 -19
  57. data/lib/r10k/action/deploy/module.rb +1 -0
  58. data/lib/r10k/action/puppetfile/check.rb +7 -0
  59. data/lib/r10k/action/puppetfile/install.rb +3 -1
  60. data/lib/r10k/cli/deploy.rb +15 -1
  61. data/lib/r10k/cli/puppetfile.rb +1 -0
  62. data/lib/r10k/content_synchronizer.rb +7 -2
  63. data/lib/r10k/environment/with_modules.rb +24 -1
  64. data/lib/r10k/environment.rb +0 -1
  65. data/lib/r10k/git/rugged/bare_repository.rb +5 -4
  66. data/lib/r10k/git/rugged/thin_repository.rb +7 -0
  67. data/lib/r10k/git/rugged/working_repository.rb +13 -7
  68. data/lib/r10k/git/shellgit/thin_repository.rb +5 -1
  69. data/lib/r10k/git/shellgit/working_repository.rb +5 -4
  70. data/lib/r10k/git/stateful_repository.rb +4 -4
  71. data/lib/r10k/module/base.rb +3 -3
  72. data/lib/r10k/module/git.rb +19 -5
  73. data/lib/r10k/module_loader/puppetfile/dsl.rb +4 -0
  74. data/lib/r10k/module_loader/puppetfile.rb +22 -14
  75. data/lib/r10k/puppetfile.rb +1 -1
  76. data/lib/r10k/settings/container.rb +1 -0
  77. data/lib/r10k/settings.rb +6 -7
  78. data/lib/r10k/tarball.rb +1 -1
  79. data/lib/r10k/version.rb +1 -1
  80. data/locales/r10k.pot +34 -82
  81. data/r10k.gemspec +8 -18
  82. metadata +40 -213
  83. data/.github/workflows/stale.yml +0 -21
  84. data/.travis.yml +0 -42
  85. data/docker/.gitignore +0 -1
  86. data/docker/.rspec +0 -4
  87. data/docker/Gemfile +0 -11
  88. data/docker/Makefile +0 -92
  89. data/docker/README.md +0 -28
  90. data/docker/docker-compose.yml +0 -18
  91. data/docker/r10k/Dockerfile +0 -68
  92. data/docker/r10k/adduser.sh +0 -13
  93. data/docker/r10k/docker-entrypoint.d/10-analytics.sh +0 -30
  94. data/docker/r10k/docker-entrypoint.sh +0 -10
  95. data/docker/r10k/release.Dockerfile +0 -55
  96. data/docker/spec/dockerfile_spec.rb +0 -37
  97. data/docker/spec/fixtures/Puppetfile +0 -2
  98. data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +0 -83
  99. data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +0 -128
  100. data/integration/tests/purging/invalid_whitelist_types.rb +0 -63
  101. data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +0 -49
  102. data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +0 -68
  103. data/lib/r10k/environment/bare.rb +0 -13
  104. data/spec/fixtures/empty/.empty +0 -0
  105. data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
  106. data/spec/fixtures/module/forge/bad_module/metadata.json +0 -1
  107. data/spec/fixtures/module/forge/eight_hundred/Modulefile +0 -8
  108. data/spec/fixtures/module/forge/eight_hundred/metadata.json +0 -19
  109. data/spec/fixtures/tarball/tarball.tar.gz +0 -0
  110. data/spec/fixtures/unit/action/r10k.yaml +0 -5
  111. data/spec/fixtures/unit/action/r10k_cachedir.yaml +0 -2
  112. data/spec/fixtures/unit/action/r10k_creds.yaml +0 -9
  113. data/spec/fixtures/unit/action/r10k_forge_auth.yaml +0 -4
  114. data/spec/fixtures/unit/action/r10k_forge_auth_no_url.yaml +0 -3
  115. data/spec/fixtures/unit/action/r10k_generate_types.yaml +0 -3
  116. data/spec/fixtures/unit/action/r10k_logging.yaml +0 -12
  117. data/spec/fixtures/unit/action/r10k_puppet_path.yaml +0 -3
  118. data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +0 -1
  119. data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +0 -5
  120. data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +0 -10
  121. data/spec/fixtures/unit/puppetfile/forge-override/Puppetfile +0 -8
  122. data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +0 -1
  123. data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +0 -1
  124. data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +0 -1
  125. data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +0 -1
  126. data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +0 -1
  127. data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile +0 -10
  128. data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile.new +0 -10
  129. data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
  130. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/managed_symlink_file +0 -1
  131. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_allowlisted_2/ignored_1 +0 -0
  132. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
  133. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
  134. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/unmanaged_symlink_dir +0 -1
  135. data/spec/fixtures/unit/util/purgeable/managed_one/managed_symlink_dir +0 -1
  136. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
  137. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_symlink_file +0 -1
  138. data/spec/fixtures/unit/util/purgeable/managed_two/.hidden/unmanaged_3 +0 -0
  139. data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
  140. data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
  141. data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +0 -3
  142. data/spec/integration/git/rugged/bare_repository_spec.rb +0 -13
  143. data/spec/integration/git/rugged/cache_spec.rb +0 -33
  144. data/spec/integration/git/rugged/thin_repository_spec.rb +0 -14
  145. data/spec/integration/git/rugged/working_repository_spec.rb +0 -48
  146. data/spec/integration/git/shellgit/bare_repository_spec.rb +0 -13
  147. data/spec/integration/git/shellgit/thin_repository_spec.rb +0 -14
  148. data/spec/integration/git/shellgit/working_repository_spec.rb +0 -13
  149. data/spec/integration/git/stateful_repository_spec.rb +0 -159
  150. data/spec/integration/util/purageable_spec.rb +0 -41
  151. data/spec/matchers/exit_with.rb +0 -28
  152. data/spec/matchers/match_realpath.rb +0 -18
  153. data/spec/r10k-mocks/mock_config.rb +0 -33
  154. data/spec/r10k-mocks/mock_env.rb +0 -18
  155. data/spec/r10k-mocks/mock_source.rb +0 -17
  156. data/spec/r10k-mocks.rb +0 -3
  157. data/spec/shared-contexts/git-fixtures.rb +0 -55
  158. data/spec/shared-contexts/tarball.rb +0 -32
  159. data/spec/shared-examples/deploy-actions.rb +0 -69
  160. data/spec/shared-examples/git/bare_repository.rb +0 -132
  161. data/spec/shared-examples/git/thin_repository.rb +0 -26
  162. data/spec/shared-examples/git/working_repository.rb +0 -207
  163. data/spec/shared-examples/git-repository.rb +0 -38
  164. data/spec/shared-examples/puppetfile-action.rb +0 -39
  165. data/spec/shared-examples/settings/ancestry.rb +0 -44
  166. data/spec/shared-examples/subprocess-runner.rb +0 -89
  167. data/spec/spec_helper.rb +0 -41
  168. data/spec/unit/action/cri_runner_spec.rb +0 -72
  169. data/spec/unit/action/deploy/deploy_helpers_spec.rb +0 -38
  170. data/spec/unit/action/deploy/display_spec.rb +0 -61
  171. data/spec/unit/action/deploy/environment_spec.rb +0 -640
  172. data/spec/unit/action/deploy/module_spec.rb +0 -476
  173. data/spec/unit/action/puppetfile/check_spec.rb +0 -53
  174. data/spec/unit/action/puppetfile/cri_runner_spec.rb +0 -47
  175. data/spec/unit/action/puppetfile/install_spec.rb +0 -112
  176. data/spec/unit/action/puppetfile/purge_spec.rb +0 -60
  177. data/spec/unit/action/runner_spec.rb +0 -407
  178. data/spec/unit/action/visitor_spec.rb +0 -39
  179. data/spec/unit/cli_spec.rb +0 -9
  180. data/spec/unit/deployment/config_spec.rb +0 -33
  181. data/spec/unit/deployment_spec.rb +0 -162
  182. data/spec/unit/environment/bare_spec.rb +0 -13
  183. data/spec/unit/environment/base_spec.rb +0 -122
  184. data/spec/unit/environment/git_spec.rb +0 -114
  185. data/spec/unit/environment/name_spec.rb +0 -181
  186. data/spec/unit/environment/plain_spec.rb +0 -8
  187. data/spec/unit/environment/svn_spec.rb +0 -146
  188. data/spec/unit/environment/tarball_spec.rb +0 -45
  189. data/spec/unit/environment/with_modules_spec.rb +0 -75
  190. data/spec/unit/errors/formatting_spec.rb +0 -84
  191. data/spec/unit/feature_spec.rb +0 -50
  192. data/spec/unit/forge/module_release_spec.rb +0 -213
  193. data/spec/unit/git/alternates_spec.rb +0 -116
  194. data/spec/unit/git/cache_spec.rb +0 -66
  195. data/spec/unit/git/rugged/cache_spec.rb +0 -48
  196. data/spec/unit/git/rugged/credentials_spec.rb +0 -215
  197. data/spec/unit/git/shellgit/cache_spec.rb +0 -27
  198. data/spec/unit/git/stateful_repository_spec.rb +0 -45
  199. data/spec/unit/git_spec.rb +0 -102
  200. data/spec/unit/initializers_spec.rb +0 -68
  201. data/spec/unit/instance_cache_spec.rb +0 -78
  202. data/spec/unit/keyed_factory_spec.rb +0 -51
  203. data/spec/unit/logging/terminaloutputter_spec.rb +0 -53
  204. data/spec/unit/logging_spec.rb +0 -68
  205. data/spec/unit/module/base_spec.rb +0 -118
  206. data/spec/unit/module/forge_spec.rb +0 -271
  207. data/spec/unit/module/git_spec.rb +0 -387
  208. data/spec/unit/module/metadata_file_spec.rb +0 -68
  209. data/spec/unit/module/svn_spec.rb +0 -208
  210. data/spec/unit/module/tarball_spec.rb +0 -70
  211. data/spec/unit/module_loader/puppetfile_spec.rb +0 -421
  212. data/spec/unit/module_spec.rb +0 -114
  213. data/spec/unit/puppetfile_spec.rb +0 -304
  214. data/spec/unit/settings/collection_spec.rb +0 -123
  215. data/spec/unit/settings/container_spec.rb +0 -92
  216. data/spec/unit/settings/definition_spec.rb +0 -79
  217. data/spec/unit/settings/enum_definition_spec.rb +0 -20
  218. data/spec/unit/settings/inheritance_spec.rb +0 -38
  219. data/spec/unit/settings/list_spec.rb +0 -88
  220. data/spec/unit/settings/loader_spec.rb +0 -110
  221. data/spec/unit/settings/uri_definition_spec.rb +0 -23
  222. data/spec/unit/settings_spec.rb +0 -303
  223. data/spec/unit/source/base_spec.rb +0 -31
  224. data/spec/unit/source/exec_spec.rb +0 -81
  225. data/spec/unit/source/git_spec.rb +0 -233
  226. data/spec/unit/source/hash_spec.rb +0 -54
  227. data/spec/unit/source/svn_spec.rb +0 -196
  228. data/spec/unit/source/yaml_spec.rb +0 -42
  229. data/spec/unit/source_spec.rb +0 -10
  230. data/spec/unit/svn/remote_spec.rb +0 -21
  231. data/spec/unit/svn/working_dir_spec.rb +0 -56
  232. data/spec/unit/tarball_spec.rb +0 -57
  233. data/spec/unit/util/attempt_spec.rb +0 -82
  234. data/spec/unit/util/cacheable_spec.rb +0 -23
  235. data/spec/unit/util/commands_spec.rb +0 -61
  236. data/spec/unit/util/downloader_spec.rb +0 -98
  237. data/spec/unit/util/exec_env_spec.rb +0 -56
  238. data/spec/unit/util/purgeable_spec.rb +0 -267
  239. data/spec/unit/util/setopts_spec.rb +0 -83
  240. data/spec/unit/util/subprocess/result_spec.rb +0 -36
  241. data/spec/unit/util/subprocess/runner/posix_spec.rb +0 -7
  242. data/spec/unit/util/subprocess/runner/pump_spec.rb +0 -79
  243. data/spec/unit/util/subprocess/runner/windows_spec.rb +0 -7
  244. data/spec/unit/util/subprocess/subprocess_error_spec.rb +0 -26
  245. data/spec/unit/util/subprocess_spec.rb +0 -65
  246. data/spec/unit/util/symbolize_keys_spec.rb +0 -67
@@ -1,60 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/action/puppetfile/purge'
3
-
4
- describe R10K::Action::Puppetfile::Purge do
5
- let(:default_opts) { {root: "/some/nonexistent/path"} }
6
- let(:puppetfile) do
7
- instance_double('R10K::ModuleLoader::Puppetfile',
8
- :load! => {
9
- :modules => %w{mod},
10
- :managed_directories => %w{foo},
11
- :desired_contents => %w{bar},
12
- :purge_exclusions => %w{baz}
13
- })
14
- end
15
-
16
- def purger(opts = {}, argv = [], settings = {})
17
- opts = default_opts.merge(opts)
18
- return described_class.new(opts, argv, settings)
19
- end
20
-
21
- before(:each) do
22
- allow(R10K::ModuleLoader::Puppetfile).to receive(:new).
23
- with({basedir: "/some/nonexistent/path"}).
24
- and_return(puppetfile)
25
- end
26
-
27
- it_behaves_like "a puppetfile action"
28
-
29
- it "purges unmanaged entries in the Puppetfile moduledir" do
30
- mock_cleaner = double("cleaner")
31
-
32
- expect(R10K::Util::Cleaner).to receive(:new).
33
- with(["foo"], ["bar"], ["baz"]).
34
- and_return(mock_cleaner)
35
-
36
- expect(mock_cleaner).to receive(:purge!)
37
-
38
- purger.call
39
- end
40
-
41
- describe "using custom paths" do
42
- it "can use a custom puppetfile path" do
43
- expect(R10K::ModuleLoader::Puppetfile).to receive(:new).
44
- with({basedir: "/some/nonexistent/path",
45
- puppetfile: "/some/other/path/Puppetfile"}).
46
- and_return(puppetfile)
47
-
48
- purger({puppetfile: "/some/other/path/Puppetfile"}).call
49
- end
50
-
51
- it "can use a custom moduledir path" do
52
- expect(R10K::ModuleLoader::Puppetfile).to receive(:new).
53
- with({basedir: "/some/nonexistent/path",
54
- moduledir: "/some/other/path/site-modules"}).
55
- and_return(puppetfile)
56
-
57
- purger({moduledir: "/some/other/path/site-modules"}).call
58
- end
59
- end
60
- end
@@ -1,407 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/action/base'
3
- require 'puppet_forge/connection'
4
-
5
- require 'r10k/action/runner'
6
-
7
- describe R10K::Action::Runner do
8
-
9
- let(:action_class) do
10
- Class.new do
11
- attr_reader :opts
12
- attr_reader :argv
13
- attr_reader :settings
14
-
15
- def initialize(opts, argv, settings = {})
16
- @opts = opts
17
- @argv = argv
18
- @settings = settings
19
- end
20
-
21
- def call
22
- @argv.map(&:upcase)
23
- end
24
- end
25
- end
26
-
27
- subject(:runner) { described_class.new({:opts => :yep}, %w[args yes], action_class) }
28
-
29
- before(:each) do
30
- expect(runner.logger).not_to receive(:error)
31
- end
32
-
33
- describe "instantiating the wrapped class" do
34
- it "creates an instance of the class" do
35
- expect(runner.instance).to be_a_kind_of action_class
36
- end
37
-
38
- it "passes the opts and argv to the instance" do
39
- expect(runner.instance.opts).to eq(:opts => :yep)
40
- expect(runner.instance.argv).to eq(%w[args yes])
41
- end
42
-
43
- it "strips out options that the runner handles" do
44
- runner = described_class.new({:opts => :yep, :loglevel => 'FATAL'}, %w[args yes], action_class)
45
- expect(runner.instance.opts).to eq(:opts => :yep)
46
- end
47
- end
48
-
49
- describe "calling" do
50
- it "configures logging" do
51
- expect(runner).to receive(:setup_logging)
52
- runner.call
53
- end
54
-
55
- it "configures settings" do
56
- expect(runner).to receive(:setup_settings)
57
- runner.call
58
- end
59
-
60
- it "configures forge authorization" do
61
- expect(runner).to receive(:setup_authorization)
62
- runner.call
63
- end
64
-
65
- it "returns the result of the wrapped class #call method" do
66
- expect(runner.call).to eq %w[ARGS YES]
67
- end
68
- end
69
-
70
- describe "configuring settings" do
71
- subject(:runner) { described_class.new(options, %w[args yes], action_class) }
72
-
73
- let(:global_settings) { R10K::Settings.global_settings }
74
-
75
- before(:each) do
76
- expect(R10K::Settings).to receive(:global_settings).and_return(global_settings)
77
- allow(File).to receive(:executable?).and_return(true)
78
- end
79
-
80
- opts = {
81
- cachedir: nil,
82
- puppet_path: :deploy,
83
- generate_types: :deploy,
84
- }
85
-
86
- opts.each do |opt, conf_path|
87
- context "with #{opt} config setting" do
88
- let(:options) { { config: "spec/fixtures/unit/action/r10k_#{opt}.yaml" } }
89
-
90
- context "when not overridden" do
91
- it "uses the config value" do
92
- override = { "#{opt}": "/config_#{opt}" }
93
- overrides = if conf_path.nil?
94
- override
95
- else
96
- { "#{conf_path}": override }
97
- end
98
- expect(global_settings).to receive(:evaluate).with(hash_including(overrides)).and_call_original
99
- runner.call
100
- end
101
- end
102
-
103
- context "when overridden" do
104
- let(:options) { super().merge("#{opt.to_s.sub('_','-')}": "/overridden_#{opt}") }
105
-
106
- it "uses the overridden value" do
107
- override = { "#{opt}": "/overridden_#{opt}" }
108
- overrides = if conf_path.nil?
109
- override
110
- else
111
- { "#{conf_path}": override }
112
- end
113
- expect(global_settings).to receive(:evaluate).with(hash_including(overrides)).and_call_original
114
- runner.call
115
- end
116
- end
117
- end
118
-
119
- context "with complete config" do
120
- let(:options) { { config: "spec/fixtures/unit/action/r10k.yaml" } }
121
- let(:config) do
122
- config = {}
123
- opts.each do |o, path|
124
- if path.nil?
125
- config[o] = "/config_#{o}"
126
- else
127
- config[path] ||= {}
128
- config[path][o] = "/config_#{o}"
129
- end
130
- end
131
- config
132
- end
133
-
134
- context "when not overridden" do
135
- it "uses the config value" do
136
- expect(global_settings).to receive(:evaluate).with(config).and_call_original
137
- runner.call
138
- end
139
- end
140
-
141
- context "when overridden" do
142
- let(:options) {
143
- super().merge("#{opt.to_s.sub('_','-')}": "/overridden_#{opt}")
144
- }
145
-
146
- it "uses the overridden value" do
147
- with_overrides = config
148
- if conf_path.nil?
149
- with_overrides[opt] = "/overridden_#{opt}"
150
- else
151
- with_overrides[conf_path][opt] = "/overridden_#{opt}"
152
- end
153
- expect(global_settings).to receive(:evaluate).with(with_overrides).and_call_original
154
- runner.call
155
- end
156
- end
157
- end
158
- end
159
- end
160
-
161
- describe "configuring logging" do
162
- before(:each) do
163
- R10K::Logging.outputters.clear
164
- end
165
-
166
- it "sets the log level if :loglevel is provided" do
167
- runner = described_class.new({:opts => :yep, :loglevel => 'FATAL'}, %w[args yes], action_class)
168
- # The settings/overrides system causes the level to be set twice
169
- expect(R10K::Logging).to receive(:level=).with('FATAL').twice
170
- runner.call
171
- end
172
-
173
- # The logging fixture tests require a platform with syslog
174
- if !R10K::Util::Platform.windows?
175
- it "sets the log level if the logging.level setting is provided" do
176
- runner = described_class.new({ opts: :yep, config: 'spec/fixtures/unit/action/r10k_logging.yaml'}, %w[args yes], action_class)
177
- expect(R10K::Logging).to receive(:level=).with('FATAL')
178
- runner.call
179
- end
180
-
181
- it "sets the outputters if logging.outputs is provided" do
182
- runner = described_class.new({ opts: :yep, config: 'spec/fixtures/unit/action/r10k_logging.yaml' }, %w[args yes], action_class)
183
- expect(R10K::Logging).to receive(:add_outputters).with([
184
- { type: 'file', parameters: { filename: 'r10k.log' } },
185
- { type: 'syslog' }
186
- ])
187
- runner.call
188
- end
189
-
190
- it "disables the default outputter if the logging.disable_default_stderr setting is provided" do
191
- runner = described_class.new({ opts: :yep, config: 'spec/fixtures/unit/action/r10k_logging.yaml'}, %w[args yes], action_class)
192
- expect(R10K::Logging).to receive(:disable_default_stderr=).with(true)
193
- runner.call
194
- end
195
-
196
- it "adds additional log outputs if the logging.outputs setting is provided" do
197
- runner = described_class.new({ opts: :yep, config: 'spec/fixtures/unit/action/r10k_logging.yaml'}, %w[args yes], action_class)
198
- runner.call
199
- expect(R10K::Logging.outputters).to_not be_empty
200
- end
201
-
202
- it "disables the default output if the logging.disable_default_stderr setting is provided" do
203
- runner = described_class.new({ opts: :yep, config: 'spec/fixtures/unit/action/r10k_logging.yaml'}, %w[args yes], action_class)
204
- runner.call
205
- expect(runner.logger.outputters).to satisfy { |outputs| outputs.any? { |output| output.is_a?(R10K::Logging::TerminalOutputter) && output.level == Log4r::OFF } }
206
- end
207
- end
208
-
209
- it "doesn't add additional log outputs if the logging.outputs setting is not provided" do
210
- runner.call
211
- expect(R10K::Logging.outputters).to be_empty
212
- end
213
-
214
- it "includes the default stderr outputter" do
215
- runner.call
216
- expect(runner.logger.outputters).to satisfy { |outputs| outputs.any? { |output| output.is_a? R10K::Logging::TerminalOutputter } }
217
- end
218
-
219
- it "does not modify the loglevel if :loglevel is not provided" do
220
- expect(R10K::Logging).to_not receive(:level=)
221
- runner.call
222
- end
223
- end
224
-
225
- describe "configuring github app credentials" do
226
- it 'errors if app id is passed without ssl key' do
227
- runner = described_class.new(
228
- { 'github-app-id': '/nonexistent', },
229
- %w[args yes],
230
- action_class
231
- )
232
- expect{ runner.call }.to raise_error(R10K::Error, /Must specify both id and SSL private key/)
233
- end
234
-
235
- it 'errors if ssl key is passed without app id' do
236
- runner = described_class.new(
237
- { 'github-app-key': '/nonexistent', },
238
- %w[args yes],
239
- action_class
240
- )
241
- expect{ runner.call }.to raise_error(R10K::Error, /Must specify both id and SSL private key/)
242
- end
243
-
244
- it 'errors if both app id and token paths are passed' do
245
- runner = described_class.new(
246
- { 'github-app-id': '/nonexistent', 'oauth-token': '/also/fake' },
247
- %w[args yes],
248
- action_class
249
- )
250
- expect{ runner.call }.to raise_error(R10K::Error, /Cannot specify both/)
251
- end
252
-
253
- it 'errors if both ssl key and token paths are passed' do
254
- runner = described_class.new(
255
- { 'github-app-key': '/nonexistent', 'oauth-token': '/also/fake' },
256
- %w[args yes],
257
- action_class
258
- )
259
- expect{ runner.call }.to raise_error(R10K::Error, /Cannot specify both/)
260
- end
261
-
262
- it 'errors if both ssl key and ssh key paths are passed' do
263
- runner = described_class.new(
264
- { 'github-app-key': '/nonexistent', 'private-key': '/also/fake' },
265
- %w[args yes],
266
- action_class
267
- )
268
- expect{ runner.call }.to raise_error(R10K::Error, /Cannot specify both/)
269
- end
270
-
271
- it 'errors if both app id and ssh key are passed' do
272
- runner = described_class.new(
273
- { 'github-app-id': '/nonexistent', 'private-key': '/also/fake' },
274
- %w[args yes],
275
- action_class
276
- )
277
- expect{ runner.call }.to raise_error(R10K::Error, /Cannot specify both/)
278
- end
279
-
280
- it 'saves the parameters in settings hash' do
281
- runner = described_class.new(
282
- { 'github-app-id': '123456', 'github-app-key': '/my/ssl/key', 'github-app-ttl': '600' },
283
- %w[args yes],
284
- action_class
285
- )
286
- runner.call
287
- expect(runner.instance.settings[:git][:github_app_id]).to eq('123456')
288
- expect(runner.instance.settings[:git][:github_app_key]).to eq('/my/ssl/key')
289
- expect(runner.instance.settings[:git][:github_app_ttl]).to eq('600')
290
- end
291
-
292
- it 'saves the parameters in settings hash without ttl and uses its default value' do
293
- runner = described_class.new(
294
- { 'github-app-id': '123456', 'github-app-key': '/my/ssl/key', },
295
- %w[args yes],
296
- action_class
297
- )
298
- runner.call
299
- expect(runner.instance.settings[:git][:github_app_id]).to eq('123456')
300
- expect(runner.instance.settings[:git][:github_app_key]).to eq('/my/ssl/key')
301
- expect(runner.instance.settings[:git][:github_app_ttl]).to eq('120')
302
- end
303
- end
304
-
305
- describe "configuring git credentials" do
306
- it 'errors if both token and key paths are passed' do
307
- runner = described_class.new({ 'oauth-token': '/nonexistent',
308
- 'private-key': '/also/fake' }, %w[args yes], action_class)
309
- expect{ runner.call }.to raise_error(R10K::Error, /Cannot specify both/)
310
- end
311
-
312
- it 'saves the sshkey path in settings hash' do
313
- runner = described_class.new({ 'private-key': '/my/ssh/key' }, %w[args yes], action_class)
314
- runner.call
315
- expect(runner.instance.settings[:git][:private_key]).to eq('/my/ssh/key')
316
- end
317
-
318
- it 'overrides per-repo sshkey in settings hash' do
319
- runner = described_class.new({ config: "spec/fixtures/unit/action/r10k_creds.yaml",
320
- 'private-key': '/my/ssh/key' },
321
- %w[args yes],
322
- action_class)
323
- runner.call
324
- expect(runner.instance.settings[:git][:private_key]).to eq('/my/ssh/key')
325
- expect(runner.instance.settings[:git][:repositories].count).to eq(2)
326
- runner.instance.settings[:git][:repositories].each do |repo_settings|
327
- expect(repo_settings[:private_key]).to eq('/my/ssh/key')
328
- end
329
- end
330
-
331
- it 'saves the token path in settings hash' do
332
- runner = described_class.new({ 'oauth-token': '/my/token/path' }, %w[args yes], action_class)
333
- runner.call
334
- expect(runner.instance.settings[:git][:oauth_token]).to eq('/my/token/path')
335
- end
336
-
337
- it 'overrides per-repo oauth token in settings hash' do
338
- runner = described_class.new({ config: "spec/fixtures/unit/action/r10k_creds.yaml",
339
- 'oauth-token': '/my/token' },
340
- %w[args yes],
341
- action_class)
342
- runner.call
343
- expect(runner.instance.settings[:git][:oauth_token]).to eq('/my/token')
344
- expect(runner.instance.settings[:git][:repositories].count).to eq(2)
345
- runner.instance.settings[:git][:repositories].each do |repo_settings|
346
- expect(repo_settings[:oauth_token]).to eq('/my/token')
347
- end
348
- end
349
- end
350
-
351
- describe "configuration authorization" do
352
- context "settings auth" do
353
- it "sets the configured token as the forge authorization header" do
354
- options = { config: "spec/fixtures/unit/action/r10k_forge_auth.yaml" }
355
- runner = described_class.new(options, %w[args yes], action_class)
356
-
357
- expect(PuppetForge).to receive(:host=).with('http://private-forge.com')
358
- expect(PuppetForge::Connection).to receive(:authorization=).with('faketoken')
359
- expect(PuppetForge::Connection).to receive(:authorization).and_return('faketoken')
360
- expect(R10K::Util::License).not_to receive(:load)
361
- runner.setup_settings
362
- runner.setup_authorization
363
- end
364
- end
365
-
366
- context "license auth" do
367
- context "when license is not present" do
368
- before(:each) do
369
- expect(R10K::Util::License).to receive(:load).and_return(nil)
370
- end
371
-
372
- it "does not set authorization header on connection class" do
373
- expect(PuppetForge::Connection).not_to receive(:authorization=)
374
- runner.setup_authorization
375
- end
376
- end
377
-
378
- context "when license is present but invalid" do
379
- before(:each) do
380
- expect(R10K::Util::License).to receive(:load).and_raise(R10K::Error.new('invalid license'))
381
- end
382
-
383
- it "issues warning to logger" do
384
- expect(runner.logger).to receive(:warn).with(/invalid license/)
385
- runner.setup_authorization
386
- end
387
-
388
- it "does not set authorization header on connection class" do
389
- expect(PuppetForge::Connection).not_to receive(:authorization=)
390
- runner.setup_authorization
391
- end
392
- end
393
-
394
- context "when license is present and valid" do
395
- before(:each) do
396
- mock_license = double('pe-license', :authorization_token => 'test token')
397
- expect(R10K::Util::License).to receive(:load).and_return(mock_license)
398
- end
399
-
400
- it "sets authorization header on connection class" do
401
- expect(PuppetForge::Connection).to receive(:authorization=).with('test token')
402
- runner.setup_authorization
403
- end
404
- end
405
- end
406
- end
407
- end
@@ -1,39 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/action/visitor'
3
- require 'r10k/logging'
4
-
5
- describe R10K::Action::Visitor do
6
- let(:visitor_class) do
7
- Class.new do
8
- include R10K::Action::Visitor
9
- include R10K::Logging
10
- attr_accessor :trace
11
-
12
- def visit_error(other)
13
- raise ArgumentError, "no soup for you"
14
- end
15
- end
16
- end
17
-
18
- subject { visitor_class.new }
19
-
20
- it "dispatches visit invocations to the type specific method" do
21
- expect(subject).to receive(:visit_sym).with(:hi)
22
- subject.visit(:sym, :hi)
23
- end
24
-
25
- describe "when a visit_ method raises an error" do
26
-
27
- [true, false].each do |trace|
28
- msg = trace ? "a" : "no"
29
- it "logs the error with #{msg} backtrace when trace is #{trace}" do
30
- subject.trace = trace
31
- expect(R10K::Errors::Formatting).to(
32
- receive(:format_exception).with(instance_of(ArgumentError), trace)
33
- ).and_return("errmsg")
34
- expect(subject.logger).to receive(:error).with('errmsg')
35
- subject.visit(:error, :hi)
36
- end
37
- end
38
- end
39
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe 'basic cli sanity check' do
4
- it 'can load the R10K::CLI namespace' do
5
- expect {
6
- require 'r10k/cli'
7
- }.not_to raise_exception
8
- end
9
- end
@@ -1,33 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe R10K::Deployment::Config do
4
- let(:loader) { instance_double('R10K::Settings::Loader') }
5
- let(:initializer) { instance_double('R10K::Initializers::GlobalInitializer') }
6
-
7
- describe "applying global settings" do
8
- before do
9
- expect(R10K::Settings::Loader).to receive(:new).and_return(loader)
10
- expect(R10K::Initializers::GlobalInitializer).to receive(:new).and_return(initializer)
11
- end
12
-
13
- it 'runs application initialization' do
14
- config = instance_double('Hash')
15
- allow(loader).to receive(:read).and_return({})
16
- expect(initializer).to receive(:call)
17
- described_class.new('some/path')
18
- end
19
- end
20
-
21
- describe "overriding settings" do
22
- before do
23
- expect(R10K::Settings::Loader).to receive(:new).and_return(loader)
24
- end
25
-
26
- it 'allows settings from config to be overridden' do
27
- allow(loader).to receive(:read).and_return({:cachedir => 'fromfile'})
28
- expect(R10K::Initializers::GlobalInitializer).to receive(:new).with(hash_including(:cachedir => 'fromoverride')).and_return(initializer)
29
- expect(initializer).to receive(:call)
30
- described_class.new('some/path', {:cachedir => 'fromoverride'})
31
- end
32
- end
33
- end