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,88 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/settings/list'
3
- require 'r10k/settings/collection'
4
- require 'r10k/settings/definition'
5
- require 'r10k/settings/uri_definition'
6
-
7
- describe R10K::Settings::List do
8
- let(:item_proc) do
9
- lambda { R10K::Settings::URIDefinition.new(nil, { :desc => "A URI in a list" }) }
10
- end
11
-
12
- subject do
13
- described_class.new(:test_list, item_proc, { :desc => "A test setting list" })
14
- end
15
-
16
- it_behaves_like "a setting with ancestors"
17
-
18
- describe '#assign' do
19
- it "calls item_proc for each item assigned" do
20
- expect(R10K::Settings::URIDefinition).to receive(:new).and_call_original.exactly(3).times
21
-
22
- subject.assign([ "uri_1", "uri_2", "uri_3"])
23
- end
24
-
25
- it "claims ownership of newly added items" do
26
- subject.assign([ "uri_1", "uri_2", "uri_3"])
27
-
28
- item_parents = subject.instance_variable_get(:@items).collect { |i| i.parent }
29
- expect(item_parents).to all(eq subject)
30
- end
31
-
32
- it "assigns value to each item" do
33
- new_values = [ "uri_1", "uri_2", "uri_3"]
34
- subject.assign(new_values)
35
-
36
- item_values = subject.instance_variable_get(:@items).collect { |i| i.value }
37
- expect(item_values).to eq new_values
38
- end
39
-
40
- it "silently ignores attempts to assign nil" do
41
- subject.assign(nil)
42
- end
43
- end
44
-
45
- describe '#validate' do
46
- it "raises an error containing a list of every item with validation errors" do
47
- subject.assign([ "uri 1", "uri 2", "http://www.example.com"])
48
-
49
- expect { subject.validate }.to raise_error do |error|
50
- expect(error).to be_a_kind_of(R10K::Settings::List::ValidationError)
51
- errors = error.errors.collect { |key, val| val }
52
- expect(errors.size).to eq 2
53
- expect(errors).to all(be_a_kind_of(ArgumentError))
54
- expect(errors.collect { |e| e.message }).to all(match /requires a URL.*could not be parsed/i)
55
- end
56
- end
57
-
58
- it "it does not raise an error if no errors were found" do
59
- subject.assign([ "http://www.example.com" ])
60
- expect(subject.validate).to be_nil
61
- end
62
- end
63
-
64
- describe '#resolve' do
65
- it "returns a frozen list of all items" do
66
- subject.assign([ "uri_1", "uri_2" ])
67
-
68
- rv = subject.resolve
69
-
70
- expect(rv).to be_frozen
71
- expect(rv).to eq([ "uri_1", "uri_2" ])
72
- end
73
- end
74
- end
75
-
76
- describe R10K::Settings::List::ValidationError do
77
- subject do
78
- described_class.new("Sample List Validation Errors", errors: {
79
- 2 => ArgumentError.new("Sample List Item Error"),
80
- })
81
- end
82
-
83
- it "generates a human readable error message for the invalid item" do
84
- message = subject.format
85
-
86
- expect(message).to match /sample list validation errors.*item 2.*sample list item error/im
87
- end
88
- end
@@ -1,110 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/settings/loader'
3
-
4
- describe R10K::Settings::Loader do
5
-
6
- context 'populate_loadpath' do
7
- it 'includes /etc/puppetlabs/r10k/r10k.yaml in the loadpath' do
8
- expect(subject.loadpath).to include('/etc/puppetlabs/r10k/r10k.yaml')
9
- end
10
-
11
- it 'includes /etc/r10k.yaml in the loadpath' do
12
- expect(subject.loadpath).to include('/etc/r10k.yaml')
13
- end
14
-
15
- it 'does include the current working directory in the loadpath' do
16
- allow(Dir).to receive(:getwd).and_return '/some/random/path/westvletren'
17
- expect(subject.loadpath).to include('/some/random/path/westvletren/r10k.yaml')
18
- end
19
-
20
- it 'does not include /some/random/path/atomium/r10k.yaml in the loadpath' do
21
- expect(subject.loadpath).not_to include('/some/random/path/atomium/r10k.yaml')
22
- end
23
-
24
- end
25
-
26
- context 'search' do
27
- it 'returns the correct default location' do
28
- allow(File).to receive(:file?).and_return false
29
- allow(File).to receive(:file?).with('/etc/puppetlabs/r10k/r10k.yaml').and_return true
30
- allow(File).to receive(:file?).with('/etc/r10k.yaml').and_return true
31
- expect(subject.search).to eq '/etc/puppetlabs/r10k/r10k.yaml'
32
- end
33
-
34
- it 'issues a warning if both default locations are present' do
35
- allow(File).to receive(:file?).and_return false
36
- allow(File).to receive(:file?).with('/etc/puppetlabs/r10k/r10k.yaml').and_return true
37
- allow(File).to receive(:file?).with('/etc/r10k.yaml').and_return true
38
-
39
- logger_dbl = double('Logging')
40
- allow(subject).to receive(:logger).and_return logger_dbl
41
-
42
- expect(logger_dbl).to receive(:warn).with('Both /etc/puppetlabs/r10k/r10k.yaml and /etc/r10k.yaml configuration files exist.')
43
- expect(logger_dbl).to receive(:warn).with('/etc/puppetlabs/r10k/r10k.yaml will be used.')
44
-
45
- subject.search
46
- end
47
-
48
- it 'issues a warning if the old location is used' do
49
- allow(File).to receive(:file?).and_return false
50
- allow(File).to receive(:file?).with('/etc/puppetlabs/r10k/r10k.yaml').and_return false
51
- allow(File).to receive(:file?).with('/etc/r10k.yaml').and_return true
52
-
53
- logger_dbl = double('Logging')
54
- allow(subject).to receive(:logger).and_return logger_dbl
55
-
56
- expect(logger_dbl).to receive(:warn).with("The r10k configuration file at /etc/r10k.yaml is deprecated.")
57
- expect(logger_dbl).to receive(:warn).with('Please move your r10k configuration to /etc/puppetlabs/r10k/r10k.yaml.')
58
-
59
- subject.search
60
- end
61
-
62
- describe 'using an override value' do
63
- it 'uses the override when set and ignores files in the load path' do
64
- expect(File).to_not receive(:file?)
65
- expect(subject.search('/some/override/r10k.yaml')).to eq '/some/override/r10k.yaml'
66
- end
67
-
68
- it 'ignores a nil override value' do
69
- allow(File).to receive(:file?).and_return false
70
- allow(File).to receive(:file?).with('/etc/puppetlabs/r10k/r10k.yaml').and_return true
71
- allow(File).to receive(:file?).with('/etc/r10k.yaml').and_return true
72
- expect(subject.search(nil)).to eq('/etc/puppetlabs/r10k/r10k.yaml')
73
- end
74
- end
75
- end
76
-
77
- context '#read' do
78
- it "raises an error if no config file could be found" do
79
- expect(subject).to receive(:search).and_return nil
80
- expect {
81
- subject.read
82
- }.to raise_error(R10K::Settings::Loader::ConfigError, "No configuration file given, no config file found in current directory, and no global config present")
83
- end
84
-
85
- it "raises an error if the YAML file load raises an error" do
86
- expect(subject).to receive(:search).and_return '/some/path/r10k.yaml'
87
- expect(YAML).to receive(:load_file).and_raise(Errno::ENOENT, "/no/such/file")
88
- expect {
89
- subject.read
90
- }.to raise_error(R10K::Settings::Loader::ConfigError, "Couldn't load config file: No such file or directory - /no/such/file")
91
- end
92
-
93
- it "recursively replaces string keys with symbol keys in the parsed structure" do
94
- expect(subject).to receive(:search).and_return '/some/path/r10k.yaml'
95
- expect(YAML).to receive(:load_file).and_return({
96
- 'cachedir' => '/var/cache/r10k',
97
- 'git' => {
98
- 'provider' => 'rugged',
99
- }
100
- })
101
-
102
- expect(subject.read).to eq({
103
- :cachedir => '/var/cache/r10k',
104
- :git => {
105
- :provider => 'rugged',
106
- }
107
- })
108
- end
109
- end
110
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/settings/uri_definition'
3
-
4
- describe R10K::Settings::URIDefinition do
5
-
6
- subject { described_class.new(:uri) }
7
-
8
- it "passes validation if a value has not been set" do
9
- expect(subject.validate).to be_nil
10
- end
11
-
12
- it "passes validation when given a valid url" do
13
- subject.assign("http://definitely.a/url")
14
- expect(subject.validate).to be_nil
15
- end
16
-
17
- it "raises an error when given an invalid URL" do
18
- subject.assign("That's no URI!")
19
- expect {
20
- subject.validate
21
- }.to raise_error(ArgumentError, "Setting uri requires a URL but 'That's no URI!' could not be parsed as a URL")
22
- end
23
- end
@@ -1,303 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/settings'
3
- require 'r10k/util/exec_env'
4
-
5
- describe R10K::Settings do
6
- describe "git settings" do
7
- subject { described_class.git_settings }
8
-
9
- describe "provider" do
10
- it "normalizes valid values to a symbol" do
11
- output = subject.evaluate("provider" => "rugged")
12
- expect(output[:provider]).to eq(:rugged)
13
- end
14
- end
15
-
16
- describe "username" do
17
- it "defaults to the current user" do
18
- expect(Etc).to receive(:getlogin).and_return("puppet")
19
- output = subject.evaluate({})
20
- expect(output[:username]).to eq("puppet")
21
- end
22
-
23
- it "passes values through unchanged" do
24
- output = subject.evaluate("username" => "git")
25
- expect(output[:username]).to eq("git")
26
- end
27
- end
28
-
29
- describe "private_key" do
30
- it "passes values through unchanged" do
31
- output = subject.evaluate("private_key" => "/etc/puppetlabs/r10k/id_rsa")
32
- expect(output[:private_key]).to eq("/etc/puppetlabs/r10k/id_rsa")
33
- end
34
- end
35
-
36
- describe "proxy" do
37
- it "accepts valid URIs" do
38
- output = subject.evaluate("proxy" => "http://proxy.tessier-ashpool.freeside:3128")
39
- expect(output[:proxy]).to eq "http://proxy.tessier-ashpool.freeside:3128"
40
- end
41
-
42
- it "rejects invalid URIs" do
43
- expect {
44
- subject.evaluate("proxy" => "that's no proxy!")
45
- }.to raise_error do |err|
46
- expect(err.message).to match(/Validation failed for 'git' settings group/)
47
- expect(err.errors.size).to eq 1
48
- expect(err.errors[:proxy]).to be_a_kind_of(ArgumentError)
49
- expect(err.errors[:proxy].message).to match(/could not be parsed as a URL/)
50
- end
51
- end
52
- end
53
- end
54
-
55
- describe "forge settings" do
56
- subject { described_class.forge_settings }
57
-
58
- describe "proxy" do
59
- it "accepts valid URIs" do
60
- output = subject.evaluate("proxy" => "http://proxy.tessier-ashpool.freeside:3128")
61
- expect(output[:proxy]).to eq "http://proxy.tessier-ashpool.freeside:3128"
62
- end
63
-
64
- it "rejects invalid URIs" do
65
- expect {
66
- subject.evaluate("proxy" => "that's no proxy!")
67
- }.to raise_error do |err|
68
- expect(err.message).to match(/Validation failed for 'forge' settings group/)
69
- expect(err.errors.size).to eq 1
70
- expect(err.errors[:proxy]).to be_a_kind_of(ArgumentError)
71
- expect(err.errors[:proxy].message).to match(/could not be parsed as a URL/)
72
- end
73
- end
74
- end
75
-
76
- describe "baseurl" do
77
- it "accepts valid URIs" do
78
- output = subject.evaluate("baseurl" => "https://forge.tessier-ashpool.freeside")
79
- expect(output[:baseurl]).to eq "https://forge.tessier-ashpool.freeside"
80
- end
81
-
82
- it "rejects invalid URIs" do
83
- expect {
84
- subject.evaluate("baseurl" => "that's no forge!")
85
- }.to raise_error do |err|
86
- expect(err.message).to match(/Validation failed for 'forge' settings group/)
87
- expect(err.errors.size).to eq 1
88
- expect(err.errors[:baseurl]).to be_a_kind_of(ArgumentError)
89
- expect(err.errors[:baseurl].message).to match(/could not be parsed as a URL/)
90
- end
91
- end
92
- end
93
-
94
- describe "allow_puppetfile_override" do
95
- it 'is false by default' do
96
- expect(subject.evaluate({})[:allow_puppetfile_override]).to eq(false)
97
- end
98
-
99
- it 'can be set to true' do
100
- expect(subject.evaluate({"allow_puppetfile_override" => true})[:allow_puppetfile_override]).to eq(true)
101
- end
102
-
103
- it "raises an error for non-boolean values" do
104
- expect {
105
- subject.evaluate({"allow_puppetfile_override" => 'invalid_string'})
106
- }.to raise_error do |err|
107
- expect(err.message).to match(/Validation failed for 'forge' settings group/)
108
- expect(err.errors.size).to eq 1
109
- expect(err.errors[:allow_puppetfile_override]).to be_a_kind_of(ArgumentError)
110
- expect(err.errors[:allow_puppetfile_override].message).to match(/`allow_puppetfile_override` can only be a boolean value, not 'invalid_string'/)
111
- end
112
- end
113
- end
114
- end
115
-
116
- describe "deploy settings" do
117
- subject { described_class.deploy_settings }
118
-
119
- describe 'exclude_spec' do
120
- it 'is false by default' do
121
- expect(subject.evaluate({})[:exclude_spec]).to eq(false)
122
- end
123
- it 'can be set to true' do
124
- expect(subject.evaluate({"exclude_spec" => true})[:exclude_spec]).to eq(true)
125
- end
126
- it "raises an error for non-boolean values" do
127
- expect {
128
- subject.evaluate({"exclude_spec" => 'invalid_string'})
129
- }.to raise_error do |err|
130
- expect(err.message).to match(/Validation failed for 'deploy' settings group/)
131
- expect(err.errors.size).to eq 1
132
- expect(err.errors[:exclude_spec]).to be_a_kind_of(ArgumentError)
133
- expect(err.errors[:exclude_spec].message).to match(/`exclude_spec` can only be a boolean value, not 'invalid_string'/)
134
- end
135
- end
136
- end
137
- describe "write_lock" do
138
- it "accepts a string with a reason for the write lock" do
139
- output = subject.evaluate("write_lock" => "No maintenance window active, code freeze till 2038-01-19")
140
- expect(output[:write_lock]).to eq("No maintenance window active, code freeze till 2038-01-19")
141
- end
142
-
143
- it "accepts false and null values for the write lock" do
144
- output = subject.evaluate("write_lock" => false)
145
- expect(output[:write_lock]).to eq false
146
- end
147
-
148
- it "rejects non-string truthy values for the write lock" do
149
- expect {
150
- subject.evaluate("write_lock" => %w[list of reasons why deploys are locked])
151
- }.to raise_error do |err|
152
- expect(err.message).to match(/Validation failed for 'deploy' settings group/)
153
- expect(err.errors.size).to eq 1
154
- expect(err.errors[:write_lock]).to be_a_kind_of(ArgumentError)
155
- expect(err.errors[:write_lock].message).to match(/should be a string containing the reason/)
156
- end
157
- end
158
- end
159
-
160
- describe 'puppet_path' do
161
- it 'when executable raises no error' do
162
- expect(File).to receive(:executable?).with('/nonexistent').and_return(true)
163
- expect { subject.evaluate('puppet_path' => '/nonexistent') }.not_to raise_error
164
- end
165
-
166
- it 'when not executable raises error' do
167
- expect(File).to receive(:executable?).with('/nonexistent')
168
- expect { subject.evaluate('puppet_path' => '/nonexistent') }.to raise_error(R10K::Settings::Collection::ValidationError)
169
- end
170
- end
171
-
172
- describe 'puppet_conf' do
173
- it 'when file raises no error' do
174
- allow(File).to receive(:readable?).with('/nonexistent').and_return(true)
175
- expect { subject.evaluate('puppet_conf' => '/nonexistent') }.not_to raise_error
176
- end
177
-
178
- it 'when not file raises error' do
179
- allow(File).to receive(:readable?).with('/nonexistent').and_return(false)
180
- expect { subject.evaluate('puppet_conf' => '/nonexistent') }.to raise_error(R10K::Settings::Collection::ValidationError)
181
- end
182
- end
183
- end
184
-
185
- describe "global settings" do
186
- subject { described_class.global_settings }
187
- describe "sources" do
188
- it "passes values through unchanged" do
189
- output = subject.evaluate("sources" => {"puppet" => {"remote" => "https://git.tessier-ashpool.freeside"}})
190
- expect(output[:sources]).to eq({"puppet" => {"remote" => "https://git.tessier-ashpool.freeside"}})
191
- end
192
- end
193
-
194
- describe "cachedir" do
195
- it "passes values through unchanged" do
196
- output = subject.evaluate("cachedir" => "/srv/r10k/git")
197
- expect(output[:cachedir]).to eq("/srv/r10k/git")
198
- end
199
- end
200
-
201
- describe "postrun" do
202
- it "accepts an argument vector" do
203
- output = subject.evaluate("postrun" => ["curl", "-F", "deploy=done", "http://reporting.tessier-ashpool.freeside/r10k"])
204
- expect(output[:postrun]).to eq(["curl", "-F", "deploy=done", "http://reporting.tessier-ashpool.freeside/r10k"])
205
- end
206
-
207
- it "rejects a string command" do
208
- expect {
209
- subject.evaluate("postrun" => "curl -F 'deploy=done' https://reporting.tessier-ashpool.freeside/r10k")
210
- }.to raise_error do |err|
211
- expect(err.message).to match(/Validation failed for 'global' settings group/)
212
- expect(err.errors.size).to eq 1
213
- expect(err.errors[:postrun]).to be_a_kind_of(ArgumentError)
214
- expect(err.errors[:postrun].message).to eq("The postrun setting should be an array of strings, not a String")
215
- end
216
- end
217
- end
218
-
219
- describe "pool_size" do
220
- it "accepts integers greater than zero" do
221
- output = subject.evaluate("pool_size" => 5)
222
- expect(output[:pool_size]).to eq 5
223
- end
224
-
225
- it "rejects non integer values" do
226
- expect {
227
- subject.evaluate("pool_size" => "5")
228
- }.to raise_error do |err|
229
- expect(err.errors.size).to eq 1
230
- expect(err.errors[:pool_size]).to be_a_kind_of(ArgumentError)
231
- expect(err.errors[:pool_size].message).to match(/The pool_size setting should be an integer/)
232
- end
233
- end
234
-
235
- it "rejects integers smaller than one" do
236
- expect {
237
- subject.evaluate("pool_size" => 0)
238
- }.to raise_error do |err|
239
- expect(err.errors.size).to eq 1
240
- expect(err.errors[:pool_size]).to be_a_kind_of(ArgumentError)
241
- expect(err.errors[:pool_size].message).to match(/The pool_size setting should be greater than zero/)
242
- end
243
-
244
- expect {
245
- subject.evaluate("pool_size" => -3)
246
- }.to raise_error do |err|
247
- expect(err.errors.size).to eq 1
248
- expect(err.errors[:pool_size]).to be_a_kind_of(ArgumentError)
249
- expect(err.errors[:pool_size].message).to match(/The pool_size setting should be greater than zero/)
250
- end
251
- end
252
- end
253
-
254
- describe "proxy" do
255
- it "accepts valid URIs" do
256
- output = subject.evaluate("proxy" => "http://proxy.tessier-ashpool.freeside:3128")
257
- expect(output[:proxy]).to eq "http://proxy.tessier-ashpool.freeside:3128"
258
- end
259
-
260
- it "rejects invalid URIs" do
261
- expect {
262
- subject.evaluate("proxy" => "that's no proxy!")
263
- }.to raise_error do |err|
264
- expect(err.message).to match(/Validation failed for 'global' settings group/)
265
- expect(err.errors.size).to eq 1
266
- expect(err.errors[:proxy]).to be_a_kind_of(ArgumentError)
267
- expect(err.errors[:proxy].message).to match(/could not be parsed as a URL/)
268
- end
269
- end
270
-
271
- describe "setting a default value" do
272
- %w[HTTPS_PROXY https_proxy HTTP_PROXY http_proxy].each do |env_var|
273
- it "respects the #{env_var} environment variable" do
274
- R10K::Util::ExecEnv.withenv(env_var => "http://proxy.value/#{env_var}") do
275
- output = subject.evaluate({})
276
- expect(output[:proxy]).to eq("http://proxy.value/#{env_var}")
277
- end
278
- end
279
- end
280
- end
281
- end
282
-
283
- describe "git settings" do
284
- it "passes settings through to the git settings" do
285
- output = subject.evaluate("git" => {"provider" => "shellgit", "username" => "git"})
286
- expect(output[:git]).to include(:provider => :shellgit, :username => "git")
287
- end
288
- end
289
-
290
- describe "forge settings" do
291
- it "passes settings through to the forge settings" do
292
- output = subject.evaluate("forge" => {"baseurl" => "https://forge.tessier-ashpool.freeside",
293
- "proxy" => "https://proxy.tessier-ashpool.freesize:3128",
294
- "authorization_token" => "faketoken",
295
- "allow_puppetfile_override" => true})
296
- expect(output[:forge]).to eq(:baseurl => "https://forge.tessier-ashpool.freeside",
297
- :proxy => "https://proxy.tessier-ashpool.freesize:3128",
298
- :authorization_token => "faketoken",
299
- :allow_puppetfile_override => true)
300
- end
301
- end
302
- end
303
- end
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/source'
3
-
4
- describe R10K::Source::Base do
5
- subject { described_class.new('base', '/some/nonexistent/path') }
6
-
7
- describe "accepting a visitor" do
8
- it "passes itself to the visitor" do
9
- visitor = spy('visitor')
10
- expect(visitor).to receive(:visit).with(:source, subject)
11
- subject.accept(visitor)
12
- end
13
-
14
- it "passes the visitor to each environment if the visitor yields" do
15
- visitor = spy('visitor')
16
- expect(visitor).to receive(:visit) do |type, other, &block|
17
- expect(type).to eq :source
18
- expect(other).to eq subject
19
- block.call
20
- end
21
-
22
- env1 = spy('environment')
23
- expect(env1).to receive(:accept).with(visitor)
24
- env2 = spy('environment')
25
- expect(env2).to receive(:accept).with(visitor)
26
-
27
- expect(subject).to receive(:environments).and_return([env1, env2])
28
- subject.accept(visitor)
29
- end
30
- end
31
- end
@@ -1,81 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/source'
3
- require 'json'
4
- require 'yaml'
5
-
6
- describe R10K::Source::Exec do
7
-
8
- let(:environments_hash) do
9
- {
10
- 'production' => {
11
- 'remote' => 'https://git.example.com/puppet/control-repo.git',
12
- 'ref' => 'release-141',
13
- 'modules' => {
14
- 'puppetlabs-stdlib' => '6.1.0',
15
- 'puppetlabs-ntp' => '8.1.0',
16
- 'example-myapp1' => {
17
- 'git' => 'https://git.example.com/puppet/example-myapp1.git',
18
- 'ref' => 'v1.3.0'
19
- }
20
- }
21
- },
22
- 'development' => {
23
- 'remote' => 'https://git.example.com/puppet/control-repo.git',
24
- 'ref' => 'master',
25
- 'modules' => {
26
- 'puppetlabs-stdlib' => '6.1.0',
27
- 'puppetlabs-ntp' => '8.1.0',
28
- 'example-myapp1' => {
29
- 'git' => 'https://git.example.com/puppet/example-myapp1.git',
30
- 'ref' => 'v1.3.1'
31
- }
32
- }
33
- }
34
- }
35
- end
36
-
37
- describe 'initialize' do
38
- context 'with a valid command' do
39
- context 'that produces valid output' do
40
- it 'accepts json' do
41
- allow_any_instance_of(R10K::Util::Subprocess)
42
- .to receive(:execute)
43
- .and_return(double('result', stdout: environments_hash.to_json))
44
-
45
- source = described_class.new('execsource', '/some/nonexistent/dir', command: '/path/to/command')
46
- expect(source.environments.map(&:name)).to contain_exactly('production', 'development')
47
- end
48
-
49
- it 'accepts yaml' do
50
- allow_any_instance_of(R10K::Util::Subprocess)
51
- .to receive(:execute)
52
- .and_return(double('result', stdout: environments_hash.to_yaml))
53
-
54
- source = described_class.new('execsource', '/some/nonexistent/dir', command: '/path/to/command')
55
- expect(source.environments.map(&:name)).to contain_exactly('production', 'development')
56
- end
57
-
58
- end
59
-
60
- context 'that produces invalid output' do
61
- it 'raises an error for non-json, non-yaml data' do
62
- allow_any_instance_of(R10K::Util::Subprocess)
63
- .to receive(:execute)
64
- .and_return(double('result', stdout: "one:\ntwo\n"))
65
-
66
- source = described_class.new('execsource', '/some/nonexistent/dir', command: '/path/to/command')
67
- expect { source.environments }.to raise_error(/Error parsing command output/)
68
- end
69
-
70
- it 'raises an error for yaml data that is not a hash' do
71
- allow_any_instance_of(R10K::Util::Subprocess)
72
- .to receive(:execute)
73
- .and_return(double('result', stdout: "[one, two]"))
74
-
75
- source = described_class.new('execsource', '/some/nonexistent/dir', command: '/path/to/command')
76
- expect { source.environments }.to raise_error(R10K::Error, /Environment source execsource.*did not return valid environment data.*one.*two.*/m)
77
- end
78
- end
79
- end
80
- end
81
- end