r10k 3.5.2
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 +7 -0
- data/.gitattributes +1 -0
- data/.github/pull_request_template.md +1 -0
- data/.github/workflows/docker.yml +56 -0
- data/.github/workflows/release.yml +36 -0
- data/.gitignore +9 -0
- data/.travis.yml +45 -0
- data/CHANGELOG.mkd +1759 -0
- data/CODEOWNERS +2 -0
- data/CONTRIBUTING.mkd +105 -0
- data/Gemfile +15 -0
- data/LICENSE +14 -0
- data/README.mkd +118 -0
- data/Rakefile +3 -0
- data/azure-pipelines.yml +86 -0
- data/bin/r10k +17 -0
- data/doc/common-patterns.mkd +44 -0
- data/doc/dynamic-environments.mkd +31 -0
- data/doc/dynamic-environments/configuration.mkd +669 -0
- data/doc/dynamic-environments/git-environments.mkd +75 -0
- data/doc/dynamic-environments/introduction.mkd +69 -0
- data/doc/dynamic-environments/master-configuration.mkd +40 -0
- data/doc/dynamic-environments/quickstart.mkd +201 -0
- data/doc/dynamic-environments/svn-environments.mkd +45 -0
- data/doc/dynamic-environments/usage.mkd +132 -0
- data/doc/dynamic-environments/workflow-guide.mkd +247 -0
- data/doc/faq.mkd +164 -0
- data/doc/git/cloning-and-mirroring.mkd +60 -0
- data/doc/git/providers.mkd +111 -0
- data/doc/puppetfile.mkd +309 -0
- data/doc/updating-your-puppetfile.mkd +38 -0
- data/docker/.gitignore +1 -0
- data/docker/.rspec +4 -0
- data/docker/Gemfile +11 -0
- data/docker/Makefile +89 -0
- data/docker/README.md +28 -0
- data/docker/r10k/Dockerfile +67 -0
- data/docker/r10k/adduser.sh +13 -0
- data/docker/r10k/docker-entrypoint.d/10-analytics.sh +30 -0
- data/docker/r10k/docker-entrypoint.sh +11 -0
- data/docker/r10k/release.Dockerfile +54 -0
- data/docker/spec/dockerfile_spec.rb +43 -0
- data/docker/spec/fixtures/Puppetfile +2 -0
- data/integration/Gemfile +19 -0
- data/integration/README.mkd +29 -0
- data/integration/Rakefile +77 -0
- data/integration/component/pre-suite/05_install_dev_r10k.rb +12 -0
- data/integration/files/README.mkd +4 -0
- data/integration/files/hiera.yaml +8 -0
- data/integration/files/modules/helloworld/manifests/init.pp +3 -0
- data/integration/files/modules/hieratest/manifests/init.pp +3 -0
- data/integration/files/modules/unicode/files/pretend_unicode +1 -0
- data/integration/files/modules/unicode/manifests/init.pp +6 -0
- data/integration/files/pre-suite/git_config.pp.erb +19 -0
- data/integration/files/pre-suite/prod_env.config +3 -0
- data/integration/files/r10k_conf.yaml.erb +9 -0
- data/integration/lib/README.mkd +4 -0
- data/integration/lib/git_utils.rb +205 -0
- data/integration/lib/master_manipulator.rb +205 -0
- data/integration/lib/r10k_utils.rb +222 -0
- data/integration/manifests/README.mkd +4 -0
- data/integration/pre-suite/00_pe_install.rb +6 -0
- data/integration/pre-suite/10_git_config.rb +48 -0
- data/integration/pre-suite/20_pe_r10k.rb +55 -0
- data/integration/pre-suite/README.mkd +5 -0
- data/integration/tests/Puppetfile/HTTP_PROXY_affects_forge_source.rb +72 -0
- data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +70 -0
- data/integration/tests/README.mkd +4 -0
- data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +83 -0
- data/integration/tests/basic_functionality/negative/neg_deploy_with_invalid_r10k_yaml.rb +51 -0
- data/integration/tests/basic_functionality/negative/neg_deploy_with_missing_r10k_yaml.rb +28 -0
- data/integration/tests/basic_functionality/negative/neg_invalid_git_provider.rb +45 -0
- data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +34 -0
- data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +103 -0
- data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +128 -0
- data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +61 -0
- data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +109 -0
- data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +108 -0
- data/integration/tests/command_line/deploy_env_without_mod_update.rb +76 -0
- data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +77 -0
- data/integration/tests/command_line/negative/neg_invalid_cmd_line_arg.rb +23 -0
- data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +70 -0
- data/integration/tests/git_source/git_source_git.rb +128 -0
- data/integration/tests/git_source/git_source_ssh.rb +87 -0
- data/integration/tests/git_source/git_source_submodule.rb +70 -0
- data/integration/tests/git_source/negative/neg_git_broken_remote.rb +38 -0
- data/integration/tests/git_source/negative/neg_git_unauthorized_https.rb +46 -0
- data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +73 -0
- data/integration/tests/git_source/negative/neg_git_unicode_branch.rb +35 -0
- data/integration/tests/i18n/deploy_module_with_unicode_in_file_name.rb +64 -0
- data/integration/tests/purging/content_not_purged_at_root.rb +89 -0
- data/integration/tests/purging/default_purging.rb +125 -0
- data/integration/tests/purging/does_not_purge_files_on_white_list.rb +93 -0
- data/integration/tests/purging/invalid_whitelist_types.rb +63 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_1000_branches.rb +66 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +111 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +117 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_hiera.rb +100 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_multi_source.rb +133 -0
- data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +161 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_basedir.rb +46 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +48 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +45 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +43 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_remote.rb +45 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_branch_name_collision.rb +64 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +44 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +58 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_env_name.rb +34 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_puppet_file.rb +36 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +49 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_read_only.rb +58 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +51 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +104 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +81 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_module.rb +49 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +82 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +68 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_non-existent_base_dir.rb +94 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +93 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +117 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_unicode_paths.rb +60 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +166 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +163 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_remove_re-add.rb +111 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_unamanaged.rb +78 -0
- data/integration/tests/user_scenario/complex_workflow/single_env_git_module_update.rb +100 -0
- data/lib/r10k.rb +11 -0
- data/lib/r10k/action/base.rb +31 -0
- data/lib/r10k/action/cri_runner.rb +72 -0
- data/lib/r10k/action/deploy.rb +9 -0
- data/lib/r10k/action/deploy/deploy_helpers.rb +34 -0
- data/lib/r10k/action/deploy/display.rb +89 -0
- data/lib/r10k/action/deploy/environment.rb +196 -0
- data/lib/r10k/action/deploy/module.rb +84 -0
- data/lib/r10k/action/puppetfile.rb +10 -0
- data/lib/r10k/action/puppetfile/check.rb +31 -0
- data/lib/r10k/action/puppetfile/cri_runner.rb +26 -0
- data/lib/r10k/action/puppetfile/install.rb +45 -0
- data/lib/r10k/action/puppetfile/purge.rb +28 -0
- data/lib/r10k/action/runner.rb +96 -0
- data/lib/r10k/action/visitor.rb +31 -0
- data/lib/r10k/cli.rb +51 -0
- data/lib/r10k/cli/deploy.rb +114 -0
- data/lib/r10k/cli/ext/logging.rb +15 -0
- data/lib/r10k/cli/help.rb +7 -0
- data/lib/r10k/cli/puppetfile.rb +74 -0
- data/lib/r10k/cli/version.rb +31 -0
- data/lib/r10k/deployment.rb +132 -0
- data/lib/r10k/deployment/config.rb +56 -0
- data/lib/r10k/environment.rb +37 -0
- data/lib/r10k/environment/bare.rb +16 -0
- data/lib/r10k/environment/base.rb +150 -0
- data/lib/r10k/environment/git.rb +81 -0
- data/lib/r10k/environment/name.rb +86 -0
- data/lib/r10k/environment/svn.rb +91 -0
- data/lib/r10k/environment/with_modules.rb +139 -0
- data/lib/r10k/errors.rb +61 -0
- data/lib/r10k/errors/formatting.rb +28 -0
- data/lib/r10k/feature.rb +56 -0
- data/lib/r10k/feature/collection.rb +23 -0
- data/lib/r10k/features.rb +20 -0
- data/lib/r10k/forge/module_release.rb +228 -0
- data/lib/r10k/git.rb +196 -0
- data/lib/r10k/git/alternates.rb +63 -0
- data/lib/r10k/git/cache.rb +108 -0
- data/lib/r10k/git/errors.rb +34 -0
- data/lib/r10k/git/rugged.rb +17 -0
- data/lib/r10k/git/rugged/bare_repository.rb +85 -0
- data/lib/r10k/git/rugged/base_repository.rb +93 -0
- data/lib/r10k/git/rugged/cache.rb +11 -0
- data/lib/r10k/git/rugged/credentials.rb +91 -0
- data/lib/r10k/git/rugged/thin_repository.rb +89 -0
- data/lib/r10k/git/rugged/working_repository.rb +145 -0
- data/lib/r10k/git/shellgit.rb +9 -0
- data/lib/r10k/git/shellgit/bare_repository.rb +43 -0
- data/lib/r10k/git/shellgit/base_repository.rb +137 -0
- data/lib/r10k/git/shellgit/cache.rb +11 -0
- data/lib/r10k/git/shellgit/thin_repository.rb +69 -0
- data/lib/r10k/git/shellgit/working_repository.rb +111 -0
- data/lib/r10k/git/stateful_repository.rb +95 -0
- data/lib/r10k/initializers.rb +67 -0
- data/lib/r10k/instance_cache.rb +32 -0
- data/lib/r10k/keyed_factory.rb +39 -0
- data/lib/r10k/logging.rb +109 -0
- data/lib/r10k/logging/terminaloutputter.rb +36 -0
- data/lib/r10k/module.rb +38 -0
- data/lib/r10k/module/base.rb +113 -0
- data/lib/r10k/module/forge.rb +177 -0
- data/lib/r10k/module/git.rb +109 -0
- data/lib/r10k/module/local.rb +36 -0
- data/lib/r10k/module/metadata_file.rb +31 -0
- data/lib/r10k/module/svn.rb +112 -0
- data/lib/r10k/puppetfile.rb +286 -0
- data/lib/r10k/settings.rb +194 -0
- data/lib/r10k/settings/collection.rb +123 -0
- data/lib/r10k/settings/container.rb +97 -0
- data/lib/r10k/settings/definition.rb +124 -0
- data/lib/r10k/settings/enum_definition.rb +30 -0
- data/lib/r10k/settings/helpers.rb +38 -0
- data/lib/r10k/settings/list.rb +107 -0
- data/lib/r10k/settings/loader.rb +99 -0
- data/lib/r10k/settings/mixin.rb +54 -0
- data/lib/r10k/settings/uri_definition.rb +19 -0
- data/lib/r10k/source.rb +42 -0
- data/lib/r10k/source/base.rb +74 -0
- data/lib/r10k/source/exec.rb +51 -0
- data/lib/r10k/source/git.rb +142 -0
- data/lib/r10k/source/hash.rb +182 -0
- data/lib/r10k/source/svn.rb +136 -0
- data/lib/r10k/source/yaml.rb +20 -0
- data/lib/r10k/source/yamldir.rb +32 -0
- data/lib/r10k/svn.rb +6 -0
- data/lib/r10k/svn/remote.rb +68 -0
- data/lib/r10k/svn/working_dir.rb +125 -0
- data/lib/r10k/util/attempt.rb +84 -0
- data/lib/r10k/util/basedir.rb +65 -0
- data/lib/r10k/util/commands.rb +31 -0
- data/lib/r10k/util/exec_env.rb +36 -0
- data/lib/r10k/util/license.rb +24 -0
- data/lib/r10k/util/platform.rb +42 -0
- data/lib/r10k/util/purgeable.rb +88 -0
- data/lib/r10k/util/setopts.rb +55 -0
- data/lib/r10k/util/subprocess.rb +84 -0
- data/lib/r10k/util/subprocess/result.rb +56 -0
- data/lib/r10k/util/subprocess/runner.rb +26 -0
- data/lib/r10k/util/subprocess/runner/jruby.rb +23 -0
- data/lib/r10k/util/subprocess/runner/posix.rb +103 -0
- data/lib/r10k/util/subprocess/runner/pump.rb +59 -0
- data/lib/r10k/util/subprocess/runner/windows.rb +23 -0
- data/lib/r10k/util/subprocess/subprocess_error.rb +24 -0
- data/lib/r10k/util/symbolize_keys.rb +35 -0
- data/lib/r10k/version.rb +6 -0
- data/locales/config.yaml +21 -0
- data/locales/r10k.pot +545 -0
- data/r10k.gemspec +50 -0
- data/r10k.yaml.example +112 -0
- 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 +1 -0
- data/spec/fixtures/module/forge/eight_hundred/Modulefile +8 -0
- data/spec/fixtures/module/forge/eight_hundred/metadata.json +19 -0
- data/spec/fixtures/unit/action/r10k.yaml +5 -0
- data/spec/fixtures/unit/action/r10k_cachedir.yaml +2 -0
- data/spec/fixtures/unit/action/r10k_generate_types.yaml +3 -0
- data/spec/fixtures/unit/action/r10k_puppet_path.yaml +3 -0
- data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +5 -0
- data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +10 -0
- data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +1 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/expected_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/unmanaged_1 +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 +3 -0
- data/spec/integration/git/rugged/bare_repository_spec.rb +13 -0
- data/spec/integration/git/rugged/thin_repository_spec.rb +14 -0
- data/spec/integration/git/rugged/working_repository_spec.rb +48 -0
- data/spec/integration/git/shellgit/bare_repository_spec.rb +13 -0
- data/spec/integration/git/shellgit/thin_repository_spec.rb +14 -0
- data/spec/integration/git/shellgit/working_repository_spec.rb +13 -0
- data/spec/integration/git/stateful_repository_spec.rb +159 -0
- data/spec/matchers/exit_with.rb +28 -0
- data/spec/matchers/match_realpath.rb +18 -0
- data/spec/r10k-mocks.rb +3 -0
- data/spec/r10k-mocks/mock_config.rb +33 -0
- data/spec/r10k-mocks/mock_env.rb +15 -0
- data/spec/r10k-mocks/mock_source.rb +13 -0
- data/spec/shared-contexts/git-fixtures.rb +55 -0
- data/spec/shared-examples/deploy-actions.rb +69 -0
- data/spec/shared-examples/git-repository.rb +38 -0
- data/spec/shared-examples/git/bare_repository.rb +132 -0
- data/spec/shared-examples/git/thin_repository.rb +26 -0
- data/spec/shared-examples/git/working_repository.rb +207 -0
- data/spec/shared-examples/puppetfile-action.rb +39 -0
- data/spec/shared-examples/settings/ancestry.rb +44 -0
- data/spec/shared-examples/subprocess-runner.rb +83 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/unit/action/cri_runner_spec.rb +72 -0
- data/spec/unit/action/deploy/deploy_helpers_spec.rb +38 -0
- data/spec/unit/action/deploy/display_spec.rb +31 -0
- data/spec/unit/action/deploy/environment_spec.rb +395 -0
- data/spec/unit/action/deploy/module_spec.rb +139 -0
- data/spec/unit/action/puppetfile/check_spec.rb +41 -0
- data/spec/unit/action/puppetfile/cri_runner_spec.rb +47 -0
- data/spec/unit/action/puppetfile/install_spec.rb +84 -0
- data/spec/unit/action/puppetfile/purge_spec.rb +42 -0
- data/spec/unit/action/runner_spec.rb +213 -0
- data/spec/unit/action/visitor_spec.rb +39 -0
- data/spec/unit/cli_spec.rb +9 -0
- data/spec/unit/deployment/config_spec.rb +33 -0
- data/spec/unit/deployment_spec.rb +162 -0
- data/spec/unit/environment/base_spec.rb +109 -0
- data/spec/unit/environment/git_spec.rb +97 -0
- data/spec/unit/environment/name_spec.rb +135 -0
- data/spec/unit/environment/svn_spec.rb +133 -0
- data/spec/unit/errors/formatting_spec.rb +84 -0
- data/spec/unit/feature_spec.rb +50 -0
- data/spec/unit/forge/module_release_spec.rb +213 -0
- data/spec/unit/git/alternates_spec.rb +116 -0
- data/spec/unit/git/cache_spec.rb +55 -0
- data/spec/unit/git/rugged/cache_spec.rb +29 -0
- data/spec/unit/git/rugged/credentials_spec.rb +109 -0
- data/spec/unit/git/shellgit/cache_spec.rb +27 -0
- data/spec/unit/git/stateful_repository_spec.rb +40 -0
- data/spec/unit/git_spec.rb +102 -0
- data/spec/unit/initializers_spec.rb +68 -0
- data/spec/unit/instance_cache_spec.rb +78 -0
- data/spec/unit/keyed_factory_spec.rb +51 -0
- data/spec/unit/logging/terminaloutputter_spec.rb +53 -0
- data/spec/unit/logging_spec.rb +68 -0
- data/spec/unit/module/base_spec.rb +72 -0
- data/spec/unit/module/forge_spec.rb +207 -0
- data/spec/unit/module/git_spec.rb +274 -0
- data/spec/unit/module/metadata_file_spec.rb +68 -0
- data/spec/unit/module/svn_spec.rb +178 -0
- data/spec/unit/module_spec.rb +29 -0
- data/spec/unit/puppetfile_spec.rb +300 -0
- data/spec/unit/settings/collection_spec.rb +123 -0
- data/spec/unit/settings/container_spec.rb +92 -0
- data/spec/unit/settings/definition_spec.rb +79 -0
- data/spec/unit/settings/enum_definition_spec.rb +20 -0
- data/spec/unit/settings/inheritance_spec.rb +38 -0
- data/spec/unit/settings/list_spec.rb +88 -0
- data/spec/unit/settings/loader_spec.rb +110 -0
- data/spec/unit/settings/uri_definition_spec.rb +23 -0
- data/spec/unit/settings_spec.rb +246 -0
- data/spec/unit/source/base_spec.rb +31 -0
- data/spec/unit/source/exec_spec.rb +81 -0
- data/spec/unit/source/git_spec.rb +185 -0
- data/spec/unit/source/hash_spec.rb +54 -0
- data/spec/unit/source/svn_spec.rb +196 -0
- data/spec/unit/source/yaml_spec.rb +42 -0
- data/spec/unit/source_spec.rb +10 -0
- data/spec/unit/svn/remote_spec.rb +21 -0
- data/spec/unit/svn/working_dir_spec.rb +56 -0
- data/spec/unit/util/attempt_spec.rb +82 -0
- data/spec/unit/util/commands_spec.rb +61 -0
- data/spec/unit/util/exec_env_spec.rb +56 -0
- data/spec/unit/util/purgeable_spec.rb +230 -0
- data/spec/unit/util/setopts_spec.rb +59 -0
- data/spec/unit/util/subprocess/result_spec.rb +36 -0
- data/spec/unit/util/subprocess/runner/posix_spec.rb +7 -0
- data/spec/unit/util/subprocess/runner/pump_spec.rb +79 -0
- data/spec/unit/util/subprocess/runner/windows_spec.rb +7 -0
- data/spec/unit/util/subprocess/subprocess_error_spec.rb +26 -0
- data/spec/unit/util/subprocess_spec.rb +65 -0
- data/spec/unit/util/symbolize_keys_spec.rb +67 -0
- metadata +582 -0
data/lib/r10k.rb
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'gettext-setup'
|
|
2
|
+
|
|
3
|
+
module R10K
|
|
4
|
+
GettextSetup.initialize(File.absolute_path('../locales', File.dirname(__FILE__)))
|
|
5
|
+
|
|
6
|
+
# Attempt to set the R10k error and log message locale
|
|
7
|
+
FastGettext.locale = ENV["LANG"]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
require 'r10k/version'
|
|
11
|
+
require 'r10k/logging'
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'r10k/util/setopts'
|
|
2
|
+
require 'r10k/logging'
|
|
3
|
+
|
|
4
|
+
module R10K
|
|
5
|
+
module Action
|
|
6
|
+
class Base
|
|
7
|
+
|
|
8
|
+
include R10K::Logging
|
|
9
|
+
include R10K::Util::Setopts
|
|
10
|
+
|
|
11
|
+
attr_accessor :settings
|
|
12
|
+
|
|
13
|
+
def initialize(opts, argv, settings = {})
|
|
14
|
+
@opts = opts
|
|
15
|
+
@argv = argv
|
|
16
|
+
@settings = settings
|
|
17
|
+
|
|
18
|
+
setopts(opts, allowed_initialize_opts)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def allowed_initialize_opts
|
|
24
|
+
{
|
|
25
|
+
:config => true,
|
|
26
|
+
:trace => true,
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require 'r10k/action/runner'
|
|
2
|
+
|
|
3
|
+
module R10K
|
|
4
|
+
module Action
|
|
5
|
+
|
|
6
|
+
# Adapt the Cri runner interface to the R10K::Action::Runner interface
|
|
7
|
+
#
|
|
8
|
+
# This class provides the necessary glue to translate behavior specific
|
|
9
|
+
# to Cri and the CLI component in general to the interface agnostic runner
|
|
10
|
+
# class.
|
|
11
|
+
#
|
|
12
|
+
# @api private
|
|
13
|
+
class CriRunner
|
|
14
|
+
|
|
15
|
+
def self.wrap(klass)
|
|
16
|
+
new(klass)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def initialize(klass)
|
|
20
|
+
@klass = klass
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Intercept any instatiations of klass
|
|
24
|
+
#
|
|
25
|
+
# Defining #new allows this object to proxy method calls on the wrapped
|
|
26
|
+
# runner and decorate various methods. Doing so allows this class to
|
|
27
|
+
# manage CLI specific behaviors and isolate the underlying code from
|
|
28
|
+
# having to deal with those particularities
|
|
29
|
+
#
|
|
30
|
+
# @param opts [Hash]
|
|
31
|
+
# @param argv [Array<String>]
|
|
32
|
+
# @param _cmd [Cri::Command] The command that was invoked. This value
|
|
33
|
+
# is not used and is only present to adapt the Cri interface to r10k.
|
|
34
|
+
# @return [self]
|
|
35
|
+
def new(opts, argv, _cmd = nil)
|
|
36
|
+
handle_opts(opts)
|
|
37
|
+
handle_argv(argv)
|
|
38
|
+
@runner = R10K::Action::Runner.new(@opts, @argv, @klass)
|
|
39
|
+
self
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# @return [Hash] The adapted options for the runner
|
|
43
|
+
def handle_opts(opts)
|
|
44
|
+
if opts[:verbose]
|
|
45
|
+
# Translate from the Cri verbose logging option to the internal logging setting.
|
|
46
|
+
opts[:loglevel] = opts.delete(:verbose)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Colored logging is only appropriate for CLI interactions, so we
|
|
50
|
+
# handle this while we're still in CLI specific code.
|
|
51
|
+
use_color = opts.delete(:color)
|
|
52
|
+
if use_color
|
|
53
|
+
R10K::Logging.use_color = use_color
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
@opts = opts
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# @return [Array] The adapted arguments for the runner
|
|
60
|
+
def handle_argv(argv)
|
|
61
|
+
@argv = argv
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Invoke the wrapped behavior, determine if it succeeded, and exit with
|
|
65
|
+
# the resulting exit code.
|
|
66
|
+
def call
|
|
67
|
+
rv = @runner.call
|
|
68
|
+
exit(rv ? 0 : 1)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module R10K
|
|
2
|
+
module Action
|
|
3
|
+
module Deploy
|
|
4
|
+
module DeployHelpers
|
|
5
|
+
|
|
6
|
+
# Ensure that a config file has been found (and presumably loaded) and exit
|
|
7
|
+
# with a helpful error if it hasn't.
|
|
8
|
+
#
|
|
9
|
+
# @raise [SystemExit] If no config file was loaded
|
|
10
|
+
def expect_config!
|
|
11
|
+
if @config.nil?
|
|
12
|
+
logger.fatal(_("No configuration file given, no config file found in current directory, and no global config present"))
|
|
13
|
+
exit(8)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Check to see if the deploy write_lock setting has been set, and log the lock message
|
|
18
|
+
# and exit if it has been set.
|
|
19
|
+
#
|
|
20
|
+
# @param config [Hash] The r10k config hash
|
|
21
|
+
#
|
|
22
|
+
# @raise [SystemExit] if the deploy write_lock setting has been set
|
|
23
|
+
def check_write_lock!(config)
|
|
24
|
+
write_lock = config.fetch(:deploy, {})[:write_lock]
|
|
25
|
+
if write_lock
|
|
26
|
+
logger.fatal(_("Making changes to deployed environments has been administratively disabled."))
|
|
27
|
+
logger.fatal(_("Reason: %{write_lock}") % {write_lock: write_lock})
|
|
28
|
+
exit(16)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
require 'r10k/deployment'
|
|
2
|
+
require 'r10k/action/base'
|
|
3
|
+
require 'r10k/action/deploy/deploy_helpers'
|
|
4
|
+
|
|
5
|
+
module R10K
|
|
6
|
+
module Action
|
|
7
|
+
module Deploy
|
|
8
|
+
class Display < R10K::Action::Base
|
|
9
|
+
|
|
10
|
+
include R10K::Action::Deploy::DeployHelpers
|
|
11
|
+
|
|
12
|
+
def call
|
|
13
|
+
expect_config!
|
|
14
|
+
deployment = R10K::Deployment.new(@settings)
|
|
15
|
+
|
|
16
|
+
if @fetch
|
|
17
|
+
deployment.preload!
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
output = { :sources => deployment.sources.map { |source| source_info(source, @argv) } }
|
|
21
|
+
|
|
22
|
+
case @format
|
|
23
|
+
when 'json' then json_format(output)
|
|
24
|
+
else yaml_format(output)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# exit 0
|
|
28
|
+
true
|
|
29
|
+
rescue => e
|
|
30
|
+
logger.error R10K::Errors::Formatting.format_exception(e, @trace)
|
|
31
|
+
false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def json_format(output)
|
|
37
|
+
require 'json'
|
|
38
|
+
puts JSON.pretty_generate(output)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def yaml_format(output)
|
|
42
|
+
require 'yaml'
|
|
43
|
+
puts output.to_yaml
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def source_info(source, argv=[])
|
|
47
|
+
source_info = {
|
|
48
|
+
:name => source.name,
|
|
49
|
+
:basedir => source.basedir,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
source_info[:prefix] = source.prefix if source.prefix
|
|
53
|
+
source_info[:remote] = source.remote if source.respond_to?(:remote)
|
|
54
|
+
|
|
55
|
+
env_list = source.environments.select { |env| argv.empty? || argv.include?(env.name) }
|
|
56
|
+
source_info[:environments] = env_list.map { |env| environment_info(env) }
|
|
57
|
+
|
|
58
|
+
source_info
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def environment_info(env)
|
|
62
|
+
if !@puppetfile && !@detail
|
|
63
|
+
env.dirname
|
|
64
|
+
else
|
|
65
|
+
env_info = env.info.merge({
|
|
66
|
+
:status => (env.status rescue nil),
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
env_info[:modules] = env.modules.map { |mod| module_info(mod) } if @puppetfile
|
|
70
|
+
|
|
71
|
+
env_info
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def module_info(mod)
|
|
76
|
+
if @detail
|
|
77
|
+
{ :name => mod.title, :properties => mod.properties }
|
|
78
|
+
else
|
|
79
|
+
mod.title
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def allowed_initialize_opts
|
|
84
|
+
super.merge(puppetfile: :self, detail: :self, format: :self, fetch: :self)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
require 'r10k/util/setopts'
|
|
2
|
+
require 'r10k/deployment'
|
|
3
|
+
require 'r10k/logging'
|
|
4
|
+
require 'r10k/action/visitor'
|
|
5
|
+
require 'r10k/action/base'
|
|
6
|
+
require 'r10k/action/deploy/deploy_helpers'
|
|
7
|
+
require 'json'
|
|
8
|
+
|
|
9
|
+
module R10K
|
|
10
|
+
module Action
|
|
11
|
+
module Deploy
|
|
12
|
+
class Environment < R10K::Action::Base
|
|
13
|
+
|
|
14
|
+
include R10K::Action::Deploy::DeployHelpers
|
|
15
|
+
|
|
16
|
+
attr_reader :force
|
|
17
|
+
|
|
18
|
+
def initialize(opts, argv, settings = nil)
|
|
19
|
+
settings ||= {}
|
|
20
|
+
@purge_levels = settings.fetch(:deploy, {}).fetch(:purge_levels, [])
|
|
21
|
+
@user_purge_whitelist = settings.fetch(:deploy, {}).fetch(:purge_whitelist, [])
|
|
22
|
+
@generate_types = settings.fetch(:deploy, {}).fetch(:generate_types, false)
|
|
23
|
+
|
|
24
|
+
super
|
|
25
|
+
|
|
26
|
+
# @force here is used to make it easier to reason about
|
|
27
|
+
@force = !@no_force
|
|
28
|
+
@argv = @argv.map { |arg| arg.gsub(/\W/,'_') }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def call
|
|
32
|
+
@visit_ok = true
|
|
33
|
+
|
|
34
|
+
expect_config!
|
|
35
|
+
deployment = R10K::Deployment.new(@settings)
|
|
36
|
+
check_write_lock!(@settings)
|
|
37
|
+
|
|
38
|
+
deployment.accept(self)
|
|
39
|
+
@visit_ok
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
include R10K::Action::Visitor
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
def visit_deployment(deployment)
|
|
47
|
+
# Ensure that everything can be preloaded. If we cannot preload all
|
|
48
|
+
# sources then we can't fully enumerate all environments which
|
|
49
|
+
# could be dangerous. If this fails then an exception will be raised
|
|
50
|
+
# and execution will be halted.
|
|
51
|
+
deployment.preload!
|
|
52
|
+
deployment.validate!
|
|
53
|
+
|
|
54
|
+
undeployable = undeployable_environment_names(deployment.environments, @argv)
|
|
55
|
+
if !undeployable.empty?
|
|
56
|
+
@visit_ok = false
|
|
57
|
+
logger.error _("Environment(s) \'%{environments}\' cannot be found in any source and will not be deployed.") % {environments: undeployable.join(", ")}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
yield
|
|
61
|
+
|
|
62
|
+
if @purge_levels.include?(:deployment)
|
|
63
|
+
logger.debug("Purging unmanaged environments for deployment...")
|
|
64
|
+
deployment.purge!
|
|
65
|
+
end
|
|
66
|
+
ensure
|
|
67
|
+
if (postcmd = @settings[:postrun])
|
|
68
|
+
if postcmd.grep('$modifiedenvs').any?
|
|
69
|
+
envs = deployment.environments.map { |e| e.dirname }
|
|
70
|
+
envs.reject! { |e| !@argv.include?(e) } if @argv.any?
|
|
71
|
+
postcmd = postcmd.map { |e| e.gsub('$modifiedenvs', envs.join(' ')) }
|
|
72
|
+
end
|
|
73
|
+
subproc = R10K::Util::Subprocess.new(postcmd)
|
|
74
|
+
subproc.logger = logger
|
|
75
|
+
subproc.execute
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def visit_source(source)
|
|
80
|
+
yield
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def visit_environment(environment)
|
|
84
|
+
if !(@argv.empty? || @argv.any? { |name| environment.dirname == name })
|
|
85
|
+
logger.debug1(_("Environment %{env_dir} does not match environment name filter, skipping") % {env_dir: environment.dirname})
|
|
86
|
+
return
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
started_at = Time.new
|
|
90
|
+
@environment_ok = true
|
|
91
|
+
|
|
92
|
+
status = environment.status
|
|
93
|
+
logger.info _("Deploying environment %{env_path}") % {env_path: environment.path}
|
|
94
|
+
|
|
95
|
+
environment.sync
|
|
96
|
+
logger.info _("Environment %{env_dir} is now at %{env_signature}") % {env_dir: environment.dirname, env_signature: environment.signature}
|
|
97
|
+
|
|
98
|
+
if status == :absent || @puppetfile
|
|
99
|
+
if status == :absent
|
|
100
|
+
logger.debug(_("Environment %{env_dir} is new, updating all modules") % {env_dir: environment.dirname})
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
previous_ok = @visit_ok
|
|
104
|
+
@visit_ok = true
|
|
105
|
+
yield
|
|
106
|
+
@environment_ok = @visit_ok
|
|
107
|
+
@visit_ok &&= previous_ok
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
if @purge_levels.include?(:environment)
|
|
111
|
+
if @visit_ok
|
|
112
|
+
logger.debug("Purging unmanaged content for environment '#{environment.dirname}'...")
|
|
113
|
+
environment.purge!(:recurse => true, :whitelist => environment.whitelist(@user_purge_whitelist))
|
|
114
|
+
else
|
|
115
|
+
logger.debug("Not purging unmanaged content for environment '#{environment.dirname}' due to prior deploy failures.")
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
if @generate_types
|
|
120
|
+
if @environment_ok
|
|
121
|
+
logger.debug("Generating puppet types for environment '#{environment.dirname}'...")
|
|
122
|
+
environment.generate_types!
|
|
123
|
+
else
|
|
124
|
+
logger.debug("Not generating puppet types for environment '#{environment.dirname}' due to puppetfile failures.")
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
write_environment_info!(environment, started_at, @visit_ok)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def visit_puppetfile(puppetfile)
|
|
132
|
+
puppetfile.load(@opts[:'default-branch-override'])
|
|
133
|
+
|
|
134
|
+
yield
|
|
135
|
+
|
|
136
|
+
if @purge_levels.include?(:puppetfile)
|
|
137
|
+
logger.debug("Purging unmanaged Puppetfile content for environment '#{puppetfile.environment.dirname}'...")
|
|
138
|
+
puppetfile.purge!
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def visit_module(mod)
|
|
143
|
+
logger.info _("Deploying %{origin} content %{path}") % {origin: mod.origin, path: mod.path}
|
|
144
|
+
mod.sync(force: @force)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def write_environment_info!(environment, started_at, success)
|
|
148
|
+
module_deploys = []
|
|
149
|
+
begin
|
|
150
|
+
environment.modules.each do |mod|
|
|
151
|
+
name = mod.name
|
|
152
|
+
version = mod.version
|
|
153
|
+
sha = mod.repo.head rescue nil
|
|
154
|
+
module_deploys.push({:name => name, :version => version, :sha => sha})
|
|
155
|
+
end
|
|
156
|
+
rescue
|
|
157
|
+
logger.debug("Unable to get environment module deploy data for .r10k-deploy.json at #{environment.path}")
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# make this file write as atomic as possible in pure ruby
|
|
161
|
+
final = "#{environment.path}/.r10k-deploy.json"
|
|
162
|
+
staging = "#{environment.path}/.r10k-deploy.json~"
|
|
163
|
+
File.open(staging, 'w') do |f|
|
|
164
|
+
deploy_info = environment.info.merge({
|
|
165
|
+
:started_at => started_at,
|
|
166
|
+
:finished_at => Time.new,
|
|
167
|
+
:deploy_success => success,
|
|
168
|
+
:module_deploys => module_deploys,
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
f.puts(JSON.pretty_generate(deploy_info))
|
|
172
|
+
end
|
|
173
|
+
FileUtils.mv(staging, final)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def undeployable_environment_names(environments, expected_names)
|
|
177
|
+
if expected_names.empty?
|
|
178
|
+
[]
|
|
179
|
+
else
|
|
180
|
+
known_names = environments.map(&:dirname)
|
|
181
|
+
expected_names - known_names
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def allowed_initialize_opts
|
|
186
|
+
super.merge(puppetfile: :self,
|
|
187
|
+
cachedir: :self,
|
|
188
|
+
'no-force': :self,
|
|
189
|
+
'generate-types': :self,
|
|
190
|
+
'puppet-path': :self,
|
|
191
|
+
'default-branch-override': :self)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|