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,60 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/action/puppetfile/purge'
|
3
|
-
|
4
|
-
describe R10K::Action::Puppetfile::Purge do
|
5
|
-
let(:default_opts) { {root: "/some/nonexistent/path"} }
|
6
|
-
let(:puppetfile) do
|
7
|
-
instance_double('R10K::ModuleLoader::Puppetfile',
|
8
|
-
:load! => {
|
9
|
-
:modules => %w{mod},
|
10
|
-
:managed_directories => %w{foo},
|
11
|
-
:desired_contents => %w{bar},
|
12
|
-
:purge_exclusions => %w{baz}
|
13
|
-
})
|
14
|
-
end
|
15
|
-
|
16
|
-
def purger(opts = {}, argv = [], settings = {})
|
17
|
-
opts = default_opts.merge(opts)
|
18
|
-
return described_class.new(opts, argv, settings)
|
19
|
-
end
|
20
|
-
|
21
|
-
before(:each) do
|
22
|
-
allow(R10K::ModuleLoader::Puppetfile).to receive(:new).
|
23
|
-
with({basedir: "/some/nonexistent/path"}).
|
24
|
-
and_return(puppetfile)
|
25
|
-
end
|
26
|
-
|
27
|
-
it_behaves_like "a puppetfile action"
|
28
|
-
|
29
|
-
it "purges unmanaged entries in the Puppetfile moduledir" do
|
30
|
-
mock_cleaner = double("cleaner")
|
31
|
-
|
32
|
-
expect(R10K::Util::Cleaner).to receive(:new).
|
33
|
-
with(["foo"], ["bar"], ["baz"]).
|
34
|
-
and_return(mock_cleaner)
|
35
|
-
|
36
|
-
expect(mock_cleaner).to receive(:purge!)
|
37
|
-
|
38
|
-
purger.call
|
39
|
-
end
|
40
|
-
|
41
|
-
describe "using custom paths" do
|
42
|
-
it "can use a custom puppetfile path" do
|
43
|
-
expect(R10K::ModuleLoader::Puppetfile).to receive(:new).
|
44
|
-
with({basedir: "/some/nonexistent/path",
|
45
|
-
puppetfile: "/some/other/path/Puppetfile"}).
|
46
|
-
and_return(puppetfile)
|
47
|
-
|
48
|
-
purger({puppetfile: "/some/other/path/Puppetfile"}).call
|
49
|
-
end
|
50
|
-
|
51
|
-
it "can use a custom moduledir path" do
|
52
|
-
expect(R10K::ModuleLoader::Puppetfile).to receive(:new).
|
53
|
-
with({basedir: "/some/nonexistent/path",
|
54
|
-
moduledir: "/some/other/path/site-modules"}).
|
55
|
-
and_return(puppetfile)
|
56
|
-
|
57
|
-
purger({moduledir: "/some/other/path/site-modules"}).call
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
@@ -1,407 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/action/base'
|
3
|
-
require 'puppet_forge/connection'
|
4
|
-
|
5
|
-
require 'r10k/action/runner'
|
6
|
-
|
7
|
-
describe R10K::Action::Runner do
|
8
|
-
|
9
|
-
let(:action_class) do
|
10
|
-
Class.new do
|
11
|
-
attr_reader :opts
|
12
|
-
attr_reader :argv
|
13
|
-
attr_reader :settings
|
14
|
-
|
15
|
-
def initialize(opts, argv, settings = {})
|
16
|
-
@opts = opts
|
17
|
-
@argv = argv
|
18
|
-
@settings = settings
|
19
|
-
end
|
20
|
-
|
21
|
-
def call
|
22
|
-
@argv.map(&:upcase)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
subject(:runner) { described_class.new({:opts => :yep}, %w[args yes], action_class) }
|
28
|
-
|
29
|
-
before(:each) do
|
30
|
-
expect(runner.logger).not_to receive(:error)
|
31
|
-
end
|
32
|
-
|
33
|
-
describe "instantiating the wrapped class" do
|
34
|
-
it "creates an instance of the class" do
|
35
|
-
expect(runner.instance).to be_a_kind_of action_class
|
36
|
-
end
|
37
|
-
|
38
|
-
it "passes the opts and argv to the instance" do
|
39
|
-
expect(runner.instance.opts).to eq(:opts => :yep)
|
40
|
-
expect(runner.instance.argv).to eq(%w[args yes])
|
41
|
-
end
|
42
|
-
|
43
|
-
it "strips out options that the runner handles" do
|
44
|
-
runner = described_class.new({:opts => :yep, :loglevel => 'FATAL'}, %w[args yes], action_class)
|
45
|
-
expect(runner.instance.opts).to eq(:opts => :yep)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe "calling" do
|
50
|
-
it "configures logging" do
|
51
|
-
expect(runner).to receive(:setup_logging)
|
52
|
-
runner.call
|
53
|
-
end
|
54
|
-
|
55
|
-
it "configures settings" do
|
56
|
-
expect(runner).to receive(:setup_settings)
|
57
|
-
runner.call
|
58
|
-
end
|
59
|
-
|
60
|
-
it "configures forge authorization" do
|
61
|
-
expect(runner).to receive(:setup_authorization)
|
62
|
-
runner.call
|
63
|
-
end
|
64
|
-
|
65
|
-
it "returns the result of the wrapped class #call method" do
|
66
|
-
expect(runner.call).to eq %w[ARGS YES]
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
describe "configuring settings" do
|
71
|
-
subject(:runner) { described_class.new(options, %w[args yes], action_class) }
|
72
|
-
|
73
|
-
let(:global_settings) { R10K::Settings.global_settings }
|
74
|
-
|
75
|
-
before(:each) do
|
76
|
-
expect(R10K::Settings).to receive(:global_settings).and_return(global_settings)
|
77
|
-
allow(File).to receive(:executable?).and_return(true)
|
78
|
-
end
|
79
|
-
|
80
|
-
opts = {
|
81
|
-
cachedir: nil,
|
82
|
-
puppet_path: :deploy,
|
83
|
-
generate_types: :deploy,
|
84
|
-
}
|
85
|
-
|
86
|
-
opts.each do |opt, conf_path|
|
87
|
-
context "with #{opt} config setting" do
|
88
|
-
let(:options) { { config: "spec/fixtures/unit/action/r10k_#{opt}.yaml" } }
|
89
|
-
|
90
|
-
context "when not overridden" do
|
91
|
-
it "uses the config value" do
|
92
|
-
override = { "#{opt}": "/config_#{opt}" }
|
93
|
-
overrides = if conf_path.nil?
|
94
|
-
override
|
95
|
-
else
|
96
|
-
{ "#{conf_path}": override }
|
97
|
-
end
|
98
|
-
expect(global_settings).to receive(:evaluate).with(hash_including(overrides)).and_call_original
|
99
|
-
runner.call
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
context "when overridden" do
|
104
|
-
let(:options) { super().merge("#{opt.to_s.sub('_','-')}": "/overridden_#{opt}") }
|
105
|
-
|
106
|
-
it "uses the overridden value" do
|
107
|
-
override = { "#{opt}": "/overridden_#{opt}" }
|
108
|
-
overrides = if conf_path.nil?
|
109
|
-
override
|
110
|
-
else
|
111
|
-
{ "#{conf_path}": override }
|
112
|
-
end
|
113
|
-
expect(global_settings).to receive(:evaluate).with(hash_including(overrides)).and_call_original
|
114
|
-
runner.call
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
context "with complete config" do
|
120
|
-
let(:options) { { config: "spec/fixtures/unit/action/r10k.yaml" } }
|
121
|
-
let(:config) do
|
122
|
-
config = {}
|
123
|
-
opts.each do |o, path|
|
124
|
-
if path.nil?
|
125
|
-
config[o] = "/config_#{o}"
|
126
|
-
else
|
127
|
-
config[path] ||= {}
|
128
|
-
config[path][o] = "/config_#{o}"
|
129
|
-
end
|
130
|
-
end
|
131
|
-
config
|
132
|
-
end
|
133
|
-
|
134
|
-
context "when not overridden" do
|
135
|
-
it "uses the config value" do
|
136
|
-
expect(global_settings).to receive(:evaluate).with(config).and_call_original
|
137
|
-
runner.call
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
context "when overridden" do
|
142
|
-
let(:options) {
|
143
|
-
super().merge("#{opt.to_s.sub('_','-')}": "/overridden_#{opt}")
|
144
|
-
}
|
145
|
-
|
146
|
-
it "uses the overridden value" do
|
147
|
-
with_overrides = config
|
148
|
-
if conf_path.nil?
|
149
|
-
with_overrides[opt] = "/overridden_#{opt}"
|
150
|
-
else
|
151
|
-
with_overrides[conf_path][opt] = "/overridden_#{opt}"
|
152
|
-
end
|
153
|
-
expect(global_settings).to receive(:evaluate).with(with_overrides).and_call_original
|
154
|
-
runner.call
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
describe "configuring logging" do
|
162
|
-
before(:each) do
|
163
|
-
R10K::Logging.outputters.clear
|
164
|
-
end
|
165
|
-
|
166
|
-
it "sets the log level if :loglevel is provided" do
|
167
|
-
runner = described_class.new({:opts => :yep, :loglevel => 'FATAL'}, %w[args yes], action_class)
|
168
|
-
# The settings/overrides system causes the level to be set twice
|
169
|
-
expect(R10K::Logging).to receive(:level=).with('FATAL').twice
|
170
|
-
runner.call
|
171
|
-
end
|
172
|
-
|
173
|
-
# The logging fixture tests require a platform with syslog
|
174
|
-
if !R10K::Util::Platform.windows?
|
175
|
-
it "sets the log level if the logging.level setting is provided" do
|
176
|
-
runner = described_class.new({ opts: :yep, config: 'spec/fixtures/unit/action/r10k_logging.yaml'}, %w[args yes], action_class)
|
177
|
-
expect(R10K::Logging).to receive(:level=).with('FATAL')
|
178
|
-
runner.call
|
179
|
-
end
|
180
|
-
|
181
|
-
it "sets the outputters if logging.outputs is provided" do
|
182
|
-
runner = described_class.new({ opts: :yep, config: 'spec/fixtures/unit/action/r10k_logging.yaml' }, %w[args yes], action_class)
|
183
|
-
expect(R10K::Logging).to receive(:add_outputters).with([
|
184
|
-
{ type: 'file', parameters: { filename: 'r10k.log' } },
|
185
|
-
{ type: 'syslog' }
|
186
|
-
])
|
187
|
-
runner.call
|
188
|
-
end
|
189
|
-
|
190
|
-
it "disables the default outputter if the logging.disable_default_stderr setting is provided" do
|
191
|
-
runner = described_class.new({ opts: :yep, config: 'spec/fixtures/unit/action/r10k_logging.yaml'}, %w[args yes], action_class)
|
192
|
-
expect(R10K::Logging).to receive(:disable_default_stderr=).with(true)
|
193
|
-
runner.call
|
194
|
-
end
|
195
|
-
|
196
|
-
it "adds additional log outputs if the logging.outputs setting is provided" do
|
197
|
-
runner = described_class.new({ opts: :yep, config: 'spec/fixtures/unit/action/r10k_logging.yaml'}, %w[args yes], action_class)
|
198
|
-
runner.call
|
199
|
-
expect(R10K::Logging.outputters).to_not be_empty
|
200
|
-
end
|
201
|
-
|
202
|
-
it "disables the default output if the logging.disable_default_stderr setting is provided" do
|
203
|
-
runner = described_class.new({ opts: :yep, config: 'spec/fixtures/unit/action/r10k_logging.yaml'}, %w[args yes], action_class)
|
204
|
-
runner.call
|
205
|
-
expect(runner.logger.outputters).to satisfy { |outputs| outputs.any? { |output| output.is_a?(R10K::Logging::TerminalOutputter) && output.level == Log4r::OFF } }
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
it "doesn't add additional log outputs if the logging.outputs setting is not provided" do
|
210
|
-
runner.call
|
211
|
-
expect(R10K::Logging.outputters).to be_empty
|
212
|
-
end
|
213
|
-
|
214
|
-
it "includes the default stderr outputter" do
|
215
|
-
runner.call
|
216
|
-
expect(runner.logger.outputters).to satisfy { |outputs| outputs.any? { |output| output.is_a? R10K::Logging::TerminalOutputter } }
|
217
|
-
end
|
218
|
-
|
219
|
-
it "does not modify the loglevel if :loglevel is not provided" do
|
220
|
-
expect(R10K::Logging).to_not receive(:level=)
|
221
|
-
runner.call
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
describe "configuring github app credentials" do
|
226
|
-
it 'errors if app id is passed without ssl key' do
|
227
|
-
runner = described_class.new(
|
228
|
-
{ 'github-app-id': '/nonexistent', },
|
229
|
-
%w[args yes],
|
230
|
-
action_class
|
231
|
-
)
|
232
|
-
expect{ runner.call }.to raise_error(R10K::Error, /Must specify both id and SSL private key/)
|
233
|
-
end
|
234
|
-
|
235
|
-
it 'errors if ssl key is passed without app id' do
|
236
|
-
runner = described_class.new(
|
237
|
-
{ 'github-app-key': '/nonexistent', },
|
238
|
-
%w[args yes],
|
239
|
-
action_class
|
240
|
-
)
|
241
|
-
expect{ runner.call }.to raise_error(R10K::Error, /Must specify both id and SSL private key/)
|
242
|
-
end
|
243
|
-
|
244
|
-
it 'errors if both app id and token paths are passed' do
|
245
|
-
runner = described_class.new(
|
246
|
-
{ 'github-app-id': '/nonexistent', 'oauth-token': '/also/fake' },
|
247
|
-
%w[args yes],
|
248
|
-
action_class
|
249
|
-
)
|
250
|
-
expect{ runner.call }.to raise_error(R10K::Error, /Cannot specify both/)
|
251
|
-
end
|
252
|
-
|
253
|
-
it 'errors if both ssl key and token paths are passed' do
|
254
|
-
runner = described_class.new(
|
255
|
-
{ 'github-app-key': '/nonexistent', 'oauth-token': '/also/fake' },
|
256
|
-
%w[args yes],
|
257
|
-
action_class
|
258
|
-
)
|
259
|
-
expect{ runner.call }.to raise_error(R10K::Error, /Cannot specify both/)
|
260
|
-
end
|
261
|
-
|
262
|
-
it 'errors if both ssl key and ssh key paths are passed' do
|
263
|
-
runner = described_class.new(
|
264
|
-
{ 'github-app-key': '/nonexistent', 'private-key': '/also/fake' },
|
265
|
-
%w[args yes],
|
266
|
-
action_class
|
267
|
-
)
|
268
|
-
expect{ runner.call }.to raise_error(R10K::Error, /Cannot specify both/)
|
269
|
-
end
|
270
|
-
|
271
|
-
it 'errors if both app id and ssh key are passed' do
|
272
|
-
runner = described_class.new(
|
273
|
-
{ 'github-app-id': '/nonexistent', 'private-key': '/also/fake' },
|
274
|
-
%w[args yes],
|
275
|
-
action_class
|
276
|
-
)
|
277
|
-
expect{ runner.call }.to raise_error(R10K::Error, /Cannot specify both/)
|
278
|
-
end
|
279
|
-
|
280
|
-
it 'saves the parameters in settings hash' do
|
281
|
-
runner = described_class.new(
|
282
|
-
{ 'github-app-id': '123456', 'github-app-key': '/my/ssl/key', 'github-app-ttl': '600' },
|
283
|
-
%w[args yes],
|
284
|
-
action_class
|
285
|
-
)
|
286
|
-
runner.call
|
287
|
-
expect(runner.instance.settings[:git][:github_app_id]).to eq('123456')
|
288
|
-
expect(runner.instance.settings[:git][:github_app_key]).to eq('/my/ssl/key')
|
289
|
-
expect(runner.instance.settings[:git][:github_app_ttl]).to eq('600')
|
290
|
-
end
|
291
|
-
|
292
|
-
it 'saves the parameters in settings hash without ttl and uses its default value' do
|
293
|
-
runner = described_class.new(
|
294
|
-
{ 'github-app-id': '123456', 'github-app-key': '/my/ssl/key', },
|
295
|
-
%w[args yes],
|
296
|
-
action_class
|
297
|
-
)
|
298
|
-
runner.call
|
299
|
-
expect(runner.instance.settings[:git][:github_app_id]).to eq('123456')
|
300
|
-
expect(runner.instance.settings[:git][:github_app_key]).to eq('/my/ssl/key')
|
301
|
-
expect(runner.instance.settings[:git][:github_app_ttl]).to eq('120')
|
302
|
-
end
|
303
|
-
end
|
304
|
-
|
305
|
-
describe "configuring git credentials" do
|
306
|
-
it 'errors if both token and key paths are passed' do
|
307
|
-
runner = described_class.new({ 'oauth-token': '/nonexistent',
|
308
|
-
'private-key': '/also/fake' }, %w[args yes], action_class)
|
309
|
-
expect{ runner.call }.to raise_error(R10K::Error, /Cannot specify both/)
|
310
|
-
end
|
311
|
-
|
312
|
-
it 'saves the sshkey path in settings hash' do
|
313
|
-
runner = described_class.new({ 'private-key': '/my/ssh/key' }, %w[args yes], action_class)
|
314
|
-
runner.call
|
315
|
-
expect(runner.instance.settings[:git][:private_key]).to eq('/my/ssh/key')
|
316
|
-
end
|
317
|
-
|
318
|
-
it 'overrides per-repo sshkey in settings hash' do
|
319
|
-
runner = described_class.new({ config: "spec/fixtures/unit/action/r10k_creds.yaml",
|
320
|
-
'private-key': '/my/ssh/key' },
|
321
|
-
%w[args yes],
|
322
|
-
action_class)
|
323
|
-
runner.call
|
324
|
-
expect(runner.instance.settings[:git][:private_key]).to eq('/my/ssh/key')
|
325
|
-
expect(runner.instance.settings[:git][:repositories].count).to eq(2)
|
326
|
-
runner.instance.settings[:git][:repositories].each do |repo_settings|
|
327
|
-
expect(repo_settings[:private_key]).to eq('/my/ssh/key')
|
328
|
-
end
|
329
|
-
end
|
330
|
-
|
331
|
-
it 'saves the token path in settings hash' do
|
332
|
-
runner = described_class.new({ 'oauth-token': '/my/token/path' }, %w[args yes], action_class)
|
333
|
-
runner.call
|
334
|
-
expect(runner.instance.settings[:git][:oauth_token]).to eq('/my/token/path')
|
335
|
-
end
|
336
|
-
|
337
|
-
it 'overrides per-repo oauth token in settings hash' do
|
338
|
-
runner = described_class.new({ config: "spec/fixtures/unit/action/r10k_creds.yaml",
|
339
|
-
'oauth-token': '/my/token' },
|
340
|
-
%w[args yes],
|
341
|
-
action_class)
|
342
|
-
runner.call
|
343
|
-
expect(runner.instance.settings[:git][:oauth_token]).to eq('/my/token')
|
344
|
-
expect(runner.instance.settings[:git][:repositories].count).to eq(2)
|
345
|
-
runner.instance.settings[:git][:repositories].each do |repo_settings|
|
346
|
-
expect(repo_settings[:oauth_token]).to eq('/my/token')
|
347
|
-
end
|
348
|
-
end
|
349
|
-
end
|
350
|
-
|
351
|
-
describe "configuration authorization" do
|
352
|
-
context "settings auth" do
|
353
|
-
it "sets the configured token as the forge authorization header" do
|
354
|
-
options = { config: "spec/fixtures/unit/action/r10k_forge_auth.yaml" }
|
355
|
-
runner = described_class.new(options, %w[args yes], action_class)
|
356
|
-
|
357
|
-
expect(PuppetForge).to receive(:host=).with('http://private-forge.com')
|
358
|
-
expect(PuppetForge::Connection).to receive(:authorization=).with('faketoken')
|
359
|
-
expect(PuppetForge::Connection).to receive(:authorization).and_return('faketoken')
|
360
|
-
expect(R10K::Util::License).not_to receive(:load)
|
361
|
-
runner.setup_settings
|
362
|
-
runner.setup_authorization
|
363
|
-
end
|
364
|
-
end
|
365
|
-
|
366
|
-
context "license auth" do
|
367
|
-
context "when license is not present" do
|
368
|
-
before(:each) do
|
369
|
-
expect(R10K::Util::License).to receive(:load).and_return(nil)
|
370
|
-
end
|
371
|
-
|
372
|
-
it "does not set authorization header on connection class" do
|
373
|
-
expect(PuppetForge::Connection).not_to receive(:authorization=)
|
374
|
-
runner.setup_authorization
|
375
|
-
end
|
376
|
-
end
|
377
|
-
|
378
|
-
context "when license is present but invalid" do
|
379
|
-
before(:each) do
|
380
|
-
expect(R10K::Util::License).to receive(:load).and_raise(R10K::Error.new('invalid license'))
|
381
|
-
end
|
382
|
-
|
383
|
-
it "issues warning to logger" do
|
384
|
-
expect(runner.logger).to receive(:warn).with(/invalid license/)
|
385
|
-
runner.setup_authorization
|
386
|
-
end
|
387
|
-
|
388
|
-
it "does not set authorization header on connection class" do
|
389
|
-
expect(PuppetForge::Connection).not_to receive(:authorization=)
|
390
|
-
runner.setup_authorization
|
391
|
-
end
|
392
|
-
end
|
393
|
-
|
394
|
-
context "when license is present and valid" do
|
395
|
-
before(:each) do
|
396
|
-
mock_license = double('pe-license', :authorization_token => 'test token')
|
397
|
-
expect(R10K::Util::License).to receive(:load).and_return(mock_license)
|
398
|
-
end
|
399
|
-
|
400
|
-
it "sets authorization header on connection class" do
|
401
|
-
expect(PuppetForge::Connection).to receive(:authorization=).with('test token')
|
402
|
-
runner.setup_authorization
|
403
|
-
end
|
404
|
-
end
|
405
|
-
end
|
406
|
-
end
|
407
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/action/visitor'
|
3
|
-
require 'r10k/logging'
|
4
|
-
|
5
|
-
describe R10K::Action::Visitor do
|
6
|
-
let(:visitor_class) do
|
7
|
-
Class.new do
|
8
|
-
include R10K::Action::Visitor
|
9
|
-
include R10K::Logging
|
10
|
-
attr_accessor :trace
|
11
|
-
|
12
|
-
def visit_error(other)
|
13
|
-
raise ArgumentError, "no soup for you"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
subject { visitor_class.new }
|
19
|
-
|
20
|
-
it "dispatches visit invocations to the type specific method" do
|
21
|
-
expect(subject).to receive(:visit_sym).with(:hi)
|
22
|
-
subject.visit(:sym, :hi)
|
23
|
-
end
|
24
|
-
|
25
|
-
describe "when a visit_ method raises an error" do
|
26
|
-
|
27
|
-
[true, false].each do |trace|
|
28
|
-
msg = trace ? "a" : "no"
|
29
|
-
it "logs the error with #{msg} backtrace when trace is #{trace}" do
|
30
|
-
subject.trace = trace
|
31
|
-
expect(R10K::Errors::Formatting).to(
|
32
|
-
receive(:format_exception).with(instance_of(ArgumentError), trace)
|
33
|
-
).and_return("errmsg")
|
34
|
-
expect(subject.logger).to receive(:error).with('errmsg')
|
35
|
-
subject.visit(:error, :hi)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/spec/unit/cli_spec.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe R10K::Deployment::Config do
|
4
|
-
let(:loader) { instance_double('R10K::Settings::Loader') }
|
5
|
-
let(:initializer) { instance_double('R10K::Initializers::GlobalInitializer') }
|
6
|
-
|
7
|
-
describe "applying global settings" do
|
8
|
-
before do
|
9
|
-
expect(R10K::Settings::Loader).to receive(:new).and_return(loader)
|
10
|
-
expect(R10K::Initializers::GlobalInitializer).to receive(:new).and_return(initializer)
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'runs application initialization' do
|
14
|
-
config = instance_double('Hash')
|
15
|
-
allow(loader).to receive(:read).and_return({})
|
16
|
-
expect(initializer).to receive(:call)
|
17
|
-
described_class.new('some/path')
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe "overriding settings" do
|
22
|
-
before do
|
23
|
-
expect(R10K::Settings::Loader).to receive(:new).and_return(loader)
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'allows settings from config to be overridden' do
|
27
|
-
allow(loader).to receive(:read).and_return({:cachedir => 'fromfile'})
|
28
|
-
expect(R10K::Initializers::GlobalInitializer).to receive(:new).with(hash_including(:cachedir => 'fromoverride')).and_return(initializer)
|
29
|
-
expect(initializer).to receive(:call)
|
30
|
-
described_class.new('some/path', {:cachedir => 'fromoverride'})
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|