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.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +17 -0
- data/.github/workflows/docker.yml +9 -4
- data/.github/workflows/release.yml +3 -2
- data/.github/workflows/rspec_tests.yml +8 -10
- data/CHANGELOG.mkd +100 -0
- data/CODEOWNERS +1 -2
- data/Gemfile +2 -2
- data/README.mkd +18 -19
- data/doc/common-patterns.mkd +1 -2
- data/doc/dynamic-environments/configuration.mkd +91 -12
- data/doc/dynamic-environments/usage.mkd +4 -0
- data/doc/dynamic-environments/workflow-guide.mkd +3 -3
- data/doc/faq.mkd +1 -1
- data/doc/puppetfile.mkd +9 -3
- data/integration/Gemfile +3 -4
- data/integration/Rakefile +58 -23
- data/integration/files/pre-suite/git_config.pp.erb +1 -1
- data/integration/pre-suite/00_pe_install.rb +3 -0
- data/integration/pre-suite/10_git_config.rb +1 -3
- data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +5 -4
- data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +1 -1
- data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +2 -2
- data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +2 -2
- data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +3 -3
- data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +3 -3
- data/integration/tests/command_line/deploy_env_without_mod_update.rb +0 -3
- data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +0 -3
- data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +5 -10
- data/integration/tests/git_source/git_source_git.rb +1 -4
- data/integration/tests/git_source/git_source_repeated_remote.rb +2 -5
- data/integration/tests/git_source/git_source_submodule.rb +1 -1
- data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +1 -1
- data/integration/tests/purging/content_not_purged_at_root.rb +2 -5
- data/integration/tests/purging/default_purging.rb +0 -3
- data/integration/tests/purging/{does_not_purge_files_on_white_list.rb → does_not_purge_files_on_allowlist.rb} +2 -5
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +3 -2
- data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +1 -5
- data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +0 -3
- data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +0 -3
- data/lib/r10k/action/deploy/environment.rb +2 -19
- data/lib/r10k/action/deploy/module.rb +1 -0
- data/lib/r10k/action/puppetfile/check.rb +7 -0
- data/lib/r10k/action/puppetfile/install.rb +3 -1
- data/lib/r10k/cli/deploy.rb +15 -1
- data/lib/r10k/cli/puppetfile.rb +1 -0
- data/lib/r10k/content_synchronizer.rb +7 -2
- data/lib/r10k/environment/with_modules.rb +24 -1
- data/lib/r10k/environment.rb +0 -1
- data/lib/r10k/git/rugged/bare_repository.rb +5 -4
- data/lib/r10k/git/rugged/thin_repository.rb +7 -0
- data/lib/r10k/git/rugged/working_repository.rb +13 -7
- data/lib/r10k/git/shellgit/thin_repository.rb +5 -1
- data/lib/r10k/git/shellgit/working_repository.rb +5 -4
- data/lib/r10k/git/stateful_repository.rb +4 -4
- data/lib/r10k/module/base.rb +3 -3
- data/lib/r10k/module/git.rb +19 -5
- data/lib/r10k/module_loader/puppetfile/dsl.rb +4 -0
- data/lib/r10k/module_loader/puppetfile.rb +22 -14
- data/lib/r10k/puppetfile.rb +1 -1
- data/lib/r10k/settings/container.rb +1 -0
- data/lib/r10k/settings.rb +6 -7
- data/lib/r10k/tarball.rb +1 -1
- data/lib/r10k/version.rb +1 -1
- data/locales/r10k.pot +34 -82
- data/r10k.gemspec +8 -18
- metadata +40 -213
- data/.github/workflows/stale.yml +0 -21
- data/.travis.yml +0 -42
- data/docker/.gitignore +0 -1
- data/docker/.rspec +0 -4
- data/docker/Gemfile +0 -11
- data/docker/Makefile +0 -92
- data/docker/README.md +0 -28
- data/docker/docker-compose.yml +0 -18
- data/docker/r10k/Dockerfile +0 -68
- data/docker/r10k/adduser.sh +0 -13
- data/docker/r10k/docker-entrypoint.d/10-analytics.sh +0 -30
- data/docker/r10k/docker-entrypoint.sh +0 -10
- data/docker/r10k/release.Dockerfile +0 -55
- data/docker/spec/dockerfile_spec.rb +0 -37
- data/docker/spec/fixtures/Puppetfile +0 -2
- data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +0 -83
- data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +0 -128
- data/integration/tests/purging/invalid_whitelist_types.rb +0 -63
- data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +0 -49
- data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +0 -68
- data/lib/r10k/environment/bare.rb +0 -13
- data/spec/fixtures/empty/.empty +0 -0
- data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
- data/spec/fixtures/module/forge/bad_module/metadata.json +0 -1
- data/spec/fixtures/module/forge/eight_hundred/Modulefile +0 -8
- data/spec/fixtures/module/forge/eight_hundred/metadata.json +0 -19
- data/spec/fixtures/tarball/tarball.tar.gz +0 -0
- data/spec/fixtures/unit/action/r10k.yaml +0 -5
- data/spec/fixtures/unit/action/r10k_cachedir.yaml +0 -2
- data/spec/fixtures/unit/action/r10k_creds.yaml +0 -9
- data/spec/fixtures/unit/action/r10k_forge_auth.yaml +0 -4
- data/spec/fixtures/unit/action/r10k_forge_auth_no_url.yaml +0 -3
- data/spec/fixtures/unit/action/r10k_generate_types.yaml +0 -3
- data/spec/fixtures/unit/action/r10k_logging.yaml +0 -12
- data/spec/fixtures/unit/action/r10k_puppet_path.yaml +0 -3
- data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +0 -5
- data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +0 -10
- data/spec/fixtures/unit/puppetfile/forge-override/Puppetfile +0 -8
- data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile +0 -10
- data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile.new +0 -10
- data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/managed_symlink_file +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_allowlisted_2/ignored_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/unmanaged_symlink_dir +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_symlink_dir +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_symlink_file +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_two/.hidden/unmanaged_3 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
- data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +0 -3
- data/spec/integration/git/rugged/bare_repository_spec.rb +0 -13
- data/spec/integration/git/rugged/cache_spec.rb +0 -33
- data/spec/integration/git/rugged/thin_repository_spec.rb +0 -14
- data/spec/integration/git/rugged/working_repository_spec.rb +0 -48
- data/spec/integration/git/shellgit/bare_repository_spec.rb +0 -13
- data/spec/integration/git/shellgit/thin_repository_spec.rb +0 -14
- data/spec/integration/git/shellgit/working_repository_spec.rb +0 -13
- data/spec/integration/git/stateful_repository_spec.rb +0 -159
- data/spec/integration/util/purageable_spec.rb +0 -41
- data/spec/matchers/exit_with.rb +0 -28
- data/spec/matchers/match_realpath.rb +0 -18
- data/spec/r10k-mocks/mock_config.rb +0 -33
- data/spec/r10k-mocks/mock_env.rb +0 -18
- data/spec/r10k-mocks/mock_source.rb +0 -17
- data/spec/r10k-mocks.rb +0 -3
- data/spec/shared-contexts/git-fixtures.rb +0 -55
- data/spec/shared-contexts/tarball.rb +0 -32
- data/spec/shared-examples/deploy-actions.rb +0 -69
- data/spec/shared-examples/git/bare_repository.rb +0 -132
- data/spec/shared-examples/git/thin_repository.rb +0 -26
- data/spec/shared-examples/git/working_repository.rb +0 -207
- data/spec/shared-examples/git-repository.rb +0 -38
- data/spec/shared-examples/puppetfile-action.rb +0 -39
- data/spec/shared-examples/settings/ancestry.rb +0 -44
- data/spec/shared-examples/subprocess-runner.rb +0 -89
- data/spec/spec_helper.rb +0 -41
- data/spec/unit/action/cri_runner_spec.rb +0 -72
- data/spec/unit/action/deploy/deploy_helpers_spec.rb +0 -38
- data/spec/unit/action/deploy/display_spec.rb +0 -61
- data/spec/unit/action/deploy/environment_spec.rb +0 -640
- data/spec/unit/action/deploy/module_spec.rb +0 -476
- data/spec/unit/action/puppetfile/check_spec.rb +0 -53
- data/spec/unit/action/puppetfile/cri_runner_spec.rb +0 -47
- data/spec/unit/action/puppetfile/install_spec.rb +0 -112
- data/spec/unit/action/puppetfile/purge_spec.rb +0 -60
- data/spec/unit/action/runner_spec.rb +0 -407
- data/spec/unit/action/visitor_spec.rb +0 -39
- data/spec/unit/cli_spec.rb +0 -9
- data/spec/unit/deployment/config_spec.rb +0 -33
- data/spec/unit/deployment_spec.rb +0 -162
- data/spec/unit/environment/bare_spec.rb +0 -13
- data/spec/unit/environment/base_spec.rb +0 -122
- data/spec/unit/environment/git_spec.rb +0 -114
- data/spec/unit/environment/name_spec.rb +0 -181
- data/spec/unit/environment/plain_spec.rb +0 -8
- data/spec/unit/environment/svn_spec.rb +0 -146
- data/spec/unit/environment/tarball_spec.rb +0 -45
- data/spec/unit/environment/with_modules_spec.rb +0 -75
- data/spec/unit/errors/formatting_spec.rb +0 -84
- data/spec/unit/feature_spec.rb +0 -50
- data/spec/unit/forge/module_release_spec.rb +0 -213
- data/spec/unit/git/alternates_spec.rb +0 -116
- data/spec/unit/git/cache_spec.rb +0 -66
- data/spec/unit/git/rugged/cache_spec.rb +0 -48
- data/spec/unit/git/rugged/credentials_spec.rb +0 -215
- data/spec/unit/git/shellgit/cache_spec.rb +0 -27
- data/spec/unit/git/stateful_repository_spec.rb +0 -45
- data/spec/unit/git_spec.rb +0 -102
- data/spec/unit/initializers_spec.rb +0 -68
- data/spec/unit/instance_cache_spec.rb +0 -78
- data/spec/unit/keyed_factory_spec.rb +0 -51
- data/spec/unit/logging/terminaloutputter_spec.rb +0 -53
- data/spec/unit/logging_spec.rb +0 -68
- data/spec/unit/module/base_spec.rb +0 -118
- data/spec/unit/module/forge_spec.rb +0 -271
- data/spec/unit/module/git_spec.rb +0 -387
- data/spec/unit/module/metadata_file_spec.rb +0 -68
- data/spec/unit/module/svn_spec.rb +0 -208
- data/spec/unit/module/tarball_spec.rb +0 -70
- data/spec/unit/module_loader/puppetfile_spec.rb +0 -421
- data/spec/unit/module_spec.rb +0 -114
- data/spec/unit/puppetfile_spec.rb +0 -304
- data/spec/unit/settings/collection_spec.rb +0 -123
- data/spec/unit/settings/container_spec.rb +0 -92
- data/spec/unit/settings/definition_spec.rb +0 -79
- data/spec/unit/settings/enum_definition_spec.rb +0 -20
- data/spec/unit/settings/inheritance_spec.rb +0 -38
- data/spec/unit/settings/list_spec.rb +0 -88
- data/spec/unit/settings/loader_spec.rb +0 -110
- data/spec/unit/settings/uri_definition_spec.rb +0 -23
- data/spec/unit/settings_spec.rb +0 -303
- data/spec/unit/source/base_spec.rb +0 -31
- data/spec/unit/source/exec_spec.rb +0 -81
- data/spec/unit/source/git_spec.rb +0 -233
- data/spec/unit/source/hash_spec.rb +0 -54
- data/spec/unit/source/svn_spec.rb +0 -196
- data/spec/unit/source/yaml_spec.rb +0 -42
- data/spec/unit/source_spec.rb +0 -10
- data/spec/unit/svn/remote_spec.rb +0 -21
- data/spec/unit/svn/working_dir_spec.rb +0 -56
- data/spec/unit/tarball_spec.rb +0 -57
- data/spec/unit/util/attempt_spec.rb +0 -82
- data/spec/unit/util/cacheable_spec.rb +0 -23
- data/spec/unit/util/commands_spec.rb +0 -61
- data/spec/unit/util/downloader_spec.rb +0 -98
- data/spec/unit/util/exec_env_spec.rb +0 -56
- data/spec/unit/util/purgeable_spec.rb +0 -267
- data/spec/unit/util/setopts_spec.rb +0 -83
- data/spec/unit/util/subprocess/result_spec.rb +0 -36
- data/spec/unit/util/subprocess/runner/posix_spec.rb +0 -7
- data/spec/unit/util/subprocess/runner/pump_spec.rb +0 -79
- data/spec/unit/util/subprocess/runner/windows_spec.rb +0 -7
- data/spec/unit/util/subprocess/subprocess_error_spec.rb +0 -26
- data/spec/unit/util/subprocess_spec.rb +0 -65
- 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
|
data/spec/unit/settings_spec.rb
DELETED
@@ -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
|