r10k 3.14.1 → 3.15.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/docker.yml +5 -0
  3. data/.github/workflows/rspec_tests.yml +1 -0
  4. data/CHANGELOG.mkd +19 -0
  5. data/CODEOWNERS +2 -2
  6. data/README.mkd +2 -2
  7. data/doc/dynamic-environments/configuration.mkd +78 -11
  8. data/doc/dynamic-environments/usage.mkd +4 -0
  9. data/doc/dynamic-environments/workflow-guide.mkd +3 -3
  10. data/doc/faq.mkd +1 -1
  11. data/docker/Makefile +17 -10
  12. data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +1 -1
  13. data/integration/tests/git_source/git_source_repeated_remote.rb +2 -2
  14. data/integration/tests/purging/content_not_purged_at_root.rb +2 -2
  15. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +1 -1
  16. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +1 -1
  17. data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +1 -1
  18. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +1 -1
  19. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +1 -1
  20. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +1 -1
  21. data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +1 -1
  22. data/lib/r10k/environment/with_modules.rb +24 -1
  23. data/lib/r10k/git/rugged/thin_repository.rb +7 -0
  24. data/lib/r10k/git/rugged/working_repository.rb +7 -3
  25. data/lib/r10k/git/shellgit/thin_repository.rb +4 -0
  26. data/lib/r10k/git/shellgit/working_repository.rb +3 -2
  27. data/lib/r10k/git/stateful_repository.rb +4 -4
  28. data/lib/r10k/module/git.rb +1 -1
  29. data/lib/r10k/module_loader/puppetfile.rb +8 -5
  30. data/lib/r10k/settings/container.rb +1 -0
  31. data/lib/r10k/version.rb +1 -1
  32. data/r10k.gemspec +5 -7
  33. metadata +16 -154
  34. data/.travis.yml +0 -42
  35. data/spec/fixtures/empty/.empty +0 -0
  36. data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
  37. data/spec/fixtures/module/forge/bad_module/metadata.json +0 -1
  38. data/spec/fixtures/module/forge/eight_hundred/Modulefile +0 -8
  39. data/spec/fixtures/module/forge/eight_hundred/metadata.json +0 -19
  40. data/spec/fixtures/tarball/tarball.tar.gz +0 -0
  41. data/spec/fixtures/unit/action/r10k.yaml +0 -5
  42. data/spec/fixtures/unit/action/r10k_cachedir.yaml +0 -2
  43. data/spec/fixtures/unit/action/r10k_creds.yaml +0 -9
  44. data/spec/fixtures/unit/action/r10k_forge_auth.yaml +0 -4
  45. data/spec/fixtures/unit/action/r10k_forge_auth_no_url.yaml +0 -3
  46. data/spec/fixtures/unit/action/r10k_generate_types.yaml +0 -3
  47. data/spec/fixtures/unit/action/r10k_logging.yaml +0 -12
  48. data/spec/fixtures/unit/action/r10k_puppet_path.yaml +0 -3
  49. data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +0 -1
  50. data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +0 -5
  51. data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +0 -10
  52. data/spec/fixtures/unit/puppetfile/forge-override/Puppetfile +0 -8
  53. data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +0 -1
  54. data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +0 -1
  55. data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +0 -1
  56. data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +0 -1
  57. data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +0 -1
  58. data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile +0 -10
  59. data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile.new +0 -10
  60. data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
  61. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/managed_symlink_file +0 -1
  62. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_allowlisted_2/ignored_1 +0 -0
  63. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
  64. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
  65. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/unmanaged_symlink_dir +0 -1
  66. data/spec/fixtures/unit/util/purgeable/managed_one/managed_symlink_dir +0 -1
  67. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
  68. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_symlink_file +0 -1
  69. data/spec/fixtures/unit/util/purgeable/managed_two/.hidden/unmanaged_3 +0 -0
  70. data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
  71. data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
  72. data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +0 -3
  73. data/spec/integration/git/rugged/bare_repository_spec.rb +0 -13
  74. data/spec/integration/git/rugged/cache_spec.rb +0 -33
  75. data/spec/integration/git/rugged/thin_repository_spec.rb +0 -14
  76. data/spec/integration/git/rugged/working_repository_spec.rb +0 -48
  77. data/spec/integration/git/shellgit/bare_repository_spec.rb +0 -13
  78. data/spec/integration/git/shellgit/thin_repository_spec.rb +0 -14
  79. data/spec/integration/git/shellgit/working_repository_spec.rb +0 -13
  80. data/spec/integration/git/stateful_repository_spec.rb +0 -159
  81. data/spec/integration/util/purageable_spec.rb +0 -41
  82. data/spec/matchers/exit_with.rb +0 -28
  83. data/spec/matchers/match_realpath.rb +0 -18
  84. data/spec/r10k-mocks/mock_config.rb +0 -33
  85. data/spec/r10k-mocks/mock_env.rb +0 -18
  86. data/spec/r10k-mocks/mock_source.rb +0 -17
  87. data/spec/r10k-mocks.rb +0 -3
  88. data/spec/shared-contexts/git-fixtures.rb +0 -55
  89. data/spec/shared-contexts/tarball.rb +0 -32
  90. data/spec/shared-examples/deploy-actions.rb +0 -69
  91. data/spec/shared-examples/git/bare_repository.rb +0 -132
  92. data/spec/shared-examples/git/thin_repository.rb +0 -26
  93. data/spec/shared-examples/git/working_repository.rb +0 -207
  94. data/spec/shared-examples/git-repository.rb +0 -38
  95. data/spec/shared-examples/puppetfile-action.rb +0 -39
  96. data/spec/shared-examples/settings/ancestry.rb +0 -44
  97. data/spec/shared-examples/subprocess-runner.rb +0 -89
  98. data/spec/spec_helper.rb +0 -41
  99. data/spec/unit/action/cri_runner_spec.rb +0 -72
  100. data/spec/unit/action/deploy/deploy_helpers_spec.rb +0 -38
  101. data/spec/unit/action/deploy/display_spec.rb +0 -61
  102. data/spec/unit/action/deploy/environment_spec.rb +0 -640
  103. data/spec/unit/action/deploy/module_spec.rb +0 -476
  104. data/spec/unit/action/puppetfile/check_spec.rb +0 -53
  105. data/spec/unit/action/puppetfile/cri_runner_spec.rb +0 -47
  106. data/spec/unit/action/puppetfile/install_spec.rb +0 -112
  107. data/spec/unit/action/puppetfile/purge_spec.rb +0 -60
  108. data/spec/unit/action/runner_spec.rb +0 -407
  109. data/spec/unit/action/visitor_spec.rb +0 -39
  110. data/spec/unit/cli_spec.rb +0 -9
  111. data/spec/unit/deployment/config_spec.rb +0 -33
  112. data/spec/unit/deployment_spec.rb +0 -162
  113. data/spec/unit/environment/bare_spec.rb +0 -13
  114. data/spec/unit/environment/base_spec.rb +0 -122
  115. data/spec/unit/environment/git_spec.rb +0 -114
  116. data/spec/unit/environment/name_spec.rb +0 -181
  117. data/spec/unit/environment/plain_spec.rb +0 -8
  118. data/spec/unit/environment/svn_spec.rb +0 -146
  119. data/spec/unit/environment/tarball_spec.rb +0 -45
  120. data/spec/unit/environment/with_modules_spec.rb +0 -75
  121. data/spec/unit/errors/formatting_spec.rb +0 -84
  122. data/spec/unit/feature_spec.rb +0 -50
  123. data/spec/unit/forge/module_release_spec.rb +0 -213
  124. data/spec/unit/git/alternates_spec.rb +0 -116
  125. data/spec/unit/git/cache_spec.rb +0 -66
  126. data/spec/unit/git/rugged/cache_spec.rb +0 -48
  127. data/spec/unit/git/rugged/credentials_spec.rb +0 -215
  128. data/spec/unit/git/shellgit/cache_spec.rb +0 -27
  129. data/spec/unit/git/stateful_repository_spec.rb +0 -45
  130. data/spec/unit/git_spec.rb +0 -102
  131. data/spec/unit/initializers_spec.rb +0 -68
  132. data/spec/unit/instance_cache_spec.rb +0 -78
  133. data/spec/unit/keyed_factory_spec.rb +0 -51
  134. data/spec/unit/logging/terminaloutputter_spec.rb +0 -53
  135. data/spec/unit/logging_spec.rb +0 -68
  136. data/spec/unit/module/base_spec.rb +0 -118
  137. data/spec/unit/module/forge_spec.rb +0 -271
  138. data/spec/unit/module/git_spec.rb +0 -387
  139. data/spec/unit/module/metadata_file_spec.rb +0 -68
  140. data/spec/unit/module/svn_spec.rb +0 -208
  141. data/spec/unit/module/tarball_spec.rb +0 -70
  142. data/spec/unit/module_loader/puppetfile_spec.rb +0 -421
  143. data/spec/unit/module_spec.rb +0 -114
  144. data/spec/unit/puppetfile_spec.rb +0 -304
  145. data/spec/unit/settings/collection_spec.rb +0 -123
  146. data/spec/unit/settings/container_spec.rb +0 -92
  147. data/spec/unit/settings/definition_spec.rb +0 -79
  148. data/spec/unit/settings/enum_definition_spec.rb +0 -20
  149. data/spec/unit/settings/inheritance_spec.rb +0 -38
  150. data/spec/unit/settings/list_spec.rb +0 -88
  151. data/spec/unit/settings/loader_spec.rb +0 -110
  152. data/spec/unit/settings/uri_definition_spec.rb +0 -23
  153. data/spec/unit/settings_spec.rb +0 -303
  154. data/spec/unit/source/base_spec.rb +0 -31
  155. data/spec/unit/source/exec_spec.rb +0 -81
  156. data/spec/unit/source/git_spec.rb +0 -233
  157. data/spec/unit/source/hash_spec.rb +0 -54
  158. data/spec/unit/source/svn_spec.rb +0 -196
  159. data/spec/unit/source/yaml_spec.rb +0 -42
  160. data/spec/unit/source_spec.rb +0 -10
  161. data/spec/unit/svn/remote_spec.rb +0 -21
  162. data/spec/unit/svn/working_dir_spec.rb +0 -56
  163. data/spec/unit/tarball_spec.rb +0 -57
  164. data/spec/unit/util/attempt_spec.rb +0 -82
  165. data/spec/unit/util/cacheable_spec.rb +0 -23
  166. data/spec/unit/util/commands_spec.rb +0 -61
  167. data/spec/unit/util/downloader_spec.rb +0 -98
  168. data/spec/unit/util/exec_env_spec.rb +0 -56
  169. data/spec/unit/util/purgeable_spec.rb +0 -267
  170. data/spec/unit/util/setopts_spec.rb +0 -83
  171. data/spec/unit/util/subprocess/result_spec.rb +0 -36
  172. data/spec/unit/util/subprocess/runner/posix_spec.rb +0 -7
  173. data/spec/unit/util/subprocess/runner/pump_spec.rb +0 -79
  174. data/spec/unit/util/subprocess/runner/windows_spec.rb +0 -7
  175. data/spec/unit/util/subprocess/subprocess_error_spec.rb +0 -26
  176. data/spec/unit/util/subprocess_spec.rb +0 -65
  177. 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