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
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require 'r10k/deployment'
|
|
2
|
+
require 'r10k/action/visitor'
|
|
3
|
+
require 'r10k/action/base'
|
|
4
|
+
require 'r10k/action/deploy/deploy_helpers'
|
|
5
|
+
|
|
6
|
+
module R10K
|
|
7
|
+
module Action
|
|
8
|
+
module Deploy
|
|
9
|
+
class Module < R10K::Action::Base
|
|
10
|
+
|
|
11
|
+
include R10K::Action::Deploy::DeployHelpers
|
|
12
|
+
|
|
13
|
+
attr_reader :force
|
|
14
|
+
|
|
15
|
+
def initialize(opts, argv, settings = nil)
|
|
16
|
+
settings ||= {}
|
|
17
|
+
|
|
18
|
+
super
|
|
19
|
+
|
|
20
|
+
# @force here is used to make it easier to reason about
|
|
21
|
+
@force = !@no_force
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def call
|
|
25
|
+
@visit_ok = true
|
|
26
|
+
|
|
27
|
+
expect_config!
|
|
28
|
+
deployment = R10K::Deployment.new(@settings)
|
|
29
|
+
check_write_lock!(@settings)
|
|
30
|
+
|
|
31
|
+
deployment.accept(self)
|
|
32
|
+
@visit_ok
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
include R10K::Action::Visitor
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def visit_deployment(deployment)
|
|
40
|
+
yield
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def visit_source(source)
|
|
44
|
+
yield
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def visit_environment(environment)
|
|
48
|
+
if @opts[:environment] && (@opts[:environment] != environment.dirname)
|
|
49
|
+
logger.debug1(_("Only updating modules in environment %{opt_env} skipping environment %{env_path}") % {opt_env: @opts[:environment], env_path: environment.path})
|
|
50
|
+
else
|
|
51
|
+
logger.debug1(_("Updating modules %{modules} in environment %{env_path}") % {modules: @argv.inspect, env_path: environment.path})
|
|
52
|
+
yield
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def visit_puppetfile(puppetfile)
|
|
57
|
+
puppetfile.load
|
|
58
|
+
yield
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def visit_module(mod)
|
|
62
|
+
if @argv.include?(mod.name)
|
|
63
|
+
logger.info _("Deploying module %{mod_path}") % {mod_path: mod.path}
|
|
64
|
+
mod.sync(force: @force)
|
|
65
|
+
if mod.environment && @generate_types
|
|
66
|
+
logger.debug("Generating puppet types for environment '#{mod.environment.dirname}'...")
|
|
67
|
+
mod.environment.generate_types!
|
|
68
|
+
end
|
|
69
|
+
else
|
|
70
|
+
logger.debug1(_("Only updating modules %{modules}, skipping module %{mod_name}") % {modules: @argv.inspect, mod_name: mod.name})
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def allowed_initialize_opts
|
|
75
|
+
super.merge(environment: true,
|
|
76
|
+
cachedir: :self,
|
|
77
|
+
'no-force': :self,
|
|
78
|
+
'generate-types': :self,
|
|
79
|
+
'puppet-path': :self)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'r10k/puppetfile'
|
|
2
|
+
require 'r10k/action/base'
|
|
3
|
+
require 'r10k/errors/formatting'
|
|
4
|
+
|
|
5
|
+
module R10K
|
|
6
|
+
module Action
|
|
7
|
+
module Puppetfile
|
|
8
|
+
class Check < R10K::Action::Base
|
|
9
|
+
|
|
10
|
+
def call
|
|
11
|
+
pf = R10K::Puppetfile.new(@root, @moduledir, @puppetfile)
|
|
12
|
+
begin
|
|
13
|
+
pf.load!
|
|
14
|
+
$stderr.puts _("Syntax OK")
|
|
15
|
+
true
|
|
16
|
+
rescue => e
|
|
17
|
+
$stderr.puts R10K::Errors::Formatting.format_exception(e, @trace)
|
|
18
|
+
false
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def allowed_initialize_opts
|
|
25
|
+
super.merge(root: :self, puppetfile: :self, moduledir: :self)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'r10k/action/cri_runner'
|
|
2
|
+
|
|
3
|
+
module R10K
|
|
4
|
+
module Action
|
|
5
|
+
module Puppetfile
|
|
6
|
+
# Extend the default Cri Runner with Puppetfile specific opts
|
|
7
|
+
#
|
|
8
|
+
# @api private
|
|
9
|
+
class CriRunner < R10K::Action::CriRunner
|
|
10
|
+
|
|
11
|
+
include R10K::Logging
|
|
12
|
+
|
|
13
|
+
def handle_opts(opts)
|
|
14
|
+
opts[:root] ||= wd
|
|
15
|
+
super(opts)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def wd
|
|
21
|
+
Dir.getwd
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'r10k/puppetfile'
|
|
2
|
+
require 'r10k/errors/formatting'
|
|
3
|
+
require 'r10k/action/visitor'
|
|
4
|
+
require 'r10k/action/base'
|
|
5
|
+
|
|
6
|
+
module R10K
|
|
7
|
+
module Action
|
|
8
|
+
module Puppetfile
|
|
9
|
+
class Install < R10K::Action::Base
|
|
10
|
+
|
|
11
|
+
def call
|
|
12
|
+
@visit_ok = true
|
|
13
|
+
pf = R10K::Puppetfile.new(@root, @moduledir, @puppetfile, nil , @force)
|
|
14
|
+
pf.accept(self)
|
|
15
|
+
@visit_ok
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
include R10K::Action::Visitor
|
|
21
|
+
|
|
22
|
+
def visit_puppetfile(pf)
|
|
23
|
+
pf.load!
|
|
24
|
+
yield
|
|
25
|
+
pf.purge!
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def visit_module(mod)
|
|
29
|
+
@force ||= false
|
|
30
|
+
logger.info _("Updating module %{mod_path}") % {mod_path: mod.path}
|
|
31
|
+
|
|
32
|
+
if mod.respond_to?(:desired_ref) && mod.desired_ref == :control_branch
|
|
33
|
+
logger.warn _("Cannot track control repo branch for content '%{name}' when not part of a 'deploy' action, will use default if available." % {name: mod.name})
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
mod.sync(force: @force)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def allowed_initialize_opts
|
|
40
|
+
super.merge(root: :self, puppetfile: :self, moduledir: :self, force: :self )
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'r10k/puppetfile'
|
|
2
|
+
require 'r10k/action/base'
|
|
3
|
+
require 'r10k/errors/formatting'
|
|
4
|
+
|
|
5
|
+
module R10K
|
|
6
|
+
module Action
|
|
7
|
+
module Puppetfile
|
|
8
|
+
class Purge < R10K::Action::Base
|
|
9
|
+
|
|
10
|
+
def call
|
|
11
|
+
pf = R10K::Puppetfile.new(@root, @moduledir, @puppetfile)
|
|
12
|
+
pf.load!
|
|
13
|
+
pf.purge!
|
|
14
|
+
true
|
|
15
|
+
rescue => e
|
|
16
|
+
logger.error R10K::Errors::Formatting.format_exception(e, @trace)
|
|
17
|
+
false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def allowed_initialize_opts
|
|
23
|
+
super.merge(root: :self, puppetfile: :self, moduledir: :self)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
require 'r10k/logging'
|
|
2
|
+
require 'r10k/errors'
|
|
3
|
+
require 'r10k/util/license'
|
|
4
|
+
require 'puppet_forge/connection'
|
|
5
|
+
|
|
6
|
+
module R10K
|
|
7
|
+
module Action
|
|
8
|
+
class Runner
|
|
9
|
+
include R10K::Logging
|
|
10
|
+
|
|
11
|
+
def initialize(opts, argv, klass)
|
|
12
|
+
@opts = opts
|
|
13
|
+
@argv = argv
|
|
14
|
+
@klass = klass
|
|
15
|
+
|
|
16
|
+
@settings = {}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def instance
|
|
20
|
+
if @_instance.nil?
|
|
21
|
+
iopts = @opts.dup
|
|
22
|
+
iopts.delete(:loglevel)
|
|
23
|
+
@_instance = @klass.new(iopts, @argv, @settings)
|
|
24
|
+
end
|
|
25
|
+
@_instance
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def call
|
|
29
|
+
setup_logging
|
|
30
|
+
setup_settings
|
|
31
|
+
# @todo check arguments
|
|
32
|
+
setup_authorization
|
|
33
|
+
instance.call
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def setup_logging
|
|
37
|
+
if @opts.key?(:loglevel)
|
|
38
|
+
R10K::Logging.level = @opts[:loglevel]
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def setup_settings
|
|
43
|
+
config_settings = settings_from_config(@opts[:config])
|
|
44
|
+
|
|
45
|
+
overrides = {}
|
|
46
|
+
overrides[:cachedir] = @opts[:cachedir] if @opts.key?(:cachedir)
|
|
47
|
+
overrides[:deploy] = {} if @opts.key?(:'puppet-path') || @opts.key?(:'generate-types')
|
|
48
|
+
overrides[:deploy][:puppet_path] = @opts[:'puppet-path'] if @opts.key?(:'puppet-path')
|
|
49
|
+
overrides[:deploy][:generate_types] = @opts[:'generate-types'] if @opts.key?(:'generate-types')
|
|
50
|
+
|
|
51
|
+
with_overrides = config_settings.merge(overrides) do |key, oldval, newval|
|
|
52
|
+
newval = oldval.merge(newval) if oldval.is_a? Hash
|
|
53
|
+
logger.debug2 _("Overriding config file setting '%{key}': '%{old_val}' -> '%{new_val}'") % {key: key, old_val: oldval, new_val: newval}
|
|
54
|
+
newval
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
@settings = R10K::Settings.global_settings.evaluate(with_overrides)
|
|
58
|
+
|
|
59
|
+
R10K::Initializers::GlobalInitializer.new(@settings).call
|
|
60
|
+
rescue R10K::Settings::Collection::ValidationError => e
|
|
61
|
+
logger.error e.format
|
|
62
|
+
exit(8)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def setup_authorization
|
|
66
|
+
begin
|
|
67
|
+
license = R10K::Util::License.load
|
|
68
|
+
|
|
69
|
+
if license.respond_to?(:authorization_token)
|
|
70
|
+
PuppetForge::Connection.authorization = license.authorization_token
|
|
71
|
+
end
|
|
72
|
+
rescue R10K::Error => e
|
|
73
|
+
logger.warn e.message
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
def settings_from_config(override_path)
|
|
80
|
+
loader = R10K::Settings::Loader.new
|
|
81
|
+
path = loader.search(override_path)
|
|
82
|
+
results = {}
|
|
83
|
+
|
|
84
|
+
if path
|
|
85
|
+
@opts[:config] = path
|
|
86
|
+
logger.debug2 _("Reading configuration from %{config_path}") % {config_path: path.inspect}
|
|
87
|
+
results = loader.read(path)
|
|
88
|
+
else
|
|
89
|
+
logger.debug2 _("No config file explicitly given and no default config file could be found, default settings will be used.")
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
results
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'r10k/errors/formatting'
|
|
2
|
+
|
|
3
|
+
module R10K
|
|
4
|
+
module Action
|
|
5
|
+
# Implement the Visitor pattern via pseudo double dispatch.
|
|
6
|
+
#
|
|
7
|
+
# Visitor classes must implement #visit_type methods for each type that may
|
|
8
|
+
# be visited. If the visitor should descend into child objects the #visit_
|
|
9
|
+
# method should yield to the passed block.
|
|
10
|
+
#
|
|
11
|
+
# Visitor classes must implement #logger so that error messages can be logged.
|
|
12
|
+
#
|
|
13
|
+
# @api private
|
|
14
|
+
module Visitor
|
|
15
|
+
|
|
16
|
+
# Dispatch to the type specific visitor method
|
|
17
|
+
#
|
|
18
|
+
# @param type [Symbol] The object type to dispatch for
|
|
19
|
+
# @param other [Object] The actual object to pass to the visitor method
|
|
20
|
+
# @param block [Proc] The block that the called visitor method may yield
|
|
21
|
+
# to in case recursion is desired.
|
|
22
|
+
# @return [void]
|
|
23
|
+
def visit(type, other, &block)
|
|
24
|
+
send("visit_#{type}", other, &block)
|
|
25
|
+
rescue => e
|
|
26
|
+
logger.error R10K::Errors::Formatting.format_exception(e, @trace)
|
|
27
|
+
@visit_ok = false
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
data/lib/r10k/cli.rb
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'r10k'
|
|
2
|
+
require 'r10k/version'
|
|
3
|
+
require 'r10k/cli/ext/logging'
|
|
4
|
+
|
|
5
|
+
require 'cri'
|
|
6
|
+
|
|
7
|
+
module R10K::CLI
|
|
8
|
+
def self.command
|
|
9
|
+
@cmd ||= Cri::Command.define do
|
|
10
|
+
name 'r10k'
|
|
11
|
+
usage 'r10k <subcommand> [options]'
|
|
12
|
+
summary 'Killer robot powered Puppet environment deployment'
|
|
13
|
+
description <<-EOD
|
|
14
|
+
r10k is a suite of commands to help deploy and manage puppet code for
|
|
15
|
+
complex environments.
|
|
16
|
+
EOD
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
flag :h, :help, 'Show help for this command' do |value, cmd|
|
|
20
|
+
# This is evil because we may not necessarily be called from the
|
|
21
|
+
# command line and have a meaningful ARGV to scan. However the best
|
|
22
|
+
# way of having a globally useful --help command is to define the
|
|
23
|
+
# behavior in the block of the option to immediately handle it and exit
|
|
24
|
+
# and we don't have access to the verbose option, so the simple method
|
|
25
|
+
# is to simply scan ARGV.
|
|
26
|
+
verbose = (ARGV.include?('-v') || ARGV.include?('--verbose'))
|
|
27
|
+
puts cmd.help(:verbose => verbose)
|
|
28
|
+
exit 0
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
flag :t, :trace, 'Display stack traces on application crash'
|
|
32
|
+
|
|
33
|
+
loglevels = R10K::Logging::LOG_LEVELS.reverse.map(&:downcase).join(", ")
|
|
34
|
+
optional :v, :verbose, "Set log verbosity. Valid values: #{loglevels}"
|
|
35
|
+
|
|
36
|
+
flag nil, :color, 'Enable colored log messages'
|
|
37
|
+
|
|
38
|
+
required :c, :config, 'Specify a global configuration file'
|
|
39
|
+
|
|
40
|
+
run do |opts, args, cmd|
|
|
41
|
+
puts cmd.help(:verbose => opts[:verbose])
|
|
42
|
+
exit 0
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
require 'r10k/cli/deploy'
|
|
49
|
+
require 'r10k/cli/puppetfile'
|
|
50
|
+
require 'r10k/cli/version'
|
|
51
|
+
require 'r10k/cli/help'
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
require 'r10k/cli'
|
|
2
|
+
require 'r10k/deployment'
|
|
3
|
+
require 'r10k/deployment/config'
|
|
4
|
+
|
|
5
|
+
require 'r10k/action/cri_runner'
|
|
6
|
+
require 'r10k/action/deploy'
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
require 'cri'
|
|
10
|
+
|
|
11
|
+
module R10K::CLI
|
|
12
|
+
module Deploy
|
|
13
|
+
def self.command
|
|
14
|
+
@cmd ||= Cri::Command.define do
|
|
15
|
+
name 'deploy'
|
|
16
|
+
usage 'deploy <subcommand>'
|
|
17
|
+
summary 'Puppet dynamic environment deployment'
|
|
18
|
+
|
|
19
|
+
description <<-DESCRIPTION
|
|
20
|
+
`r10k deploy` implements the Git branch to Puppet environment workflow
|
|
21
|
+
(https://puppet.com/docs/puppet/latest/environments_about.html).
|
|
22
|
+
DESCRIPTION
|
|
23
|
+
|
|
24
|
+
required nil, :cachedir, 'Specify a cachedir, overriding the value in config'
|
|
25
|
+
flag nil, :'no-force', 'Prevent the overwriting of local module modifications'
|
|
26
|
+
flag nil, :'generate-types', 'Run `puppet generate types` after updating an environment'
|
|
27
|
+
option nil, :'puppet-path', 'Path to puppet executable', argument: :required do |value, cmd|
|
|
28
|
+
unless File.executable? value
|
|
29
|
+
$stderr.puts "The specified puppet executable #{value} is not executable."
|
|
30
|
+
puts cmd.help
|
|
31
|
+
exit 1
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
run do |opts, args, cmd|
|
|
36
|
+
puts cmd.help(:verbose => opts[:verbose])
|
|
37
|
+
exit 0
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
module Environment
|
|
43
|
+
def self.command
|
|
44
|
+
@cmd ||= Cri::Command.define do
|
|
45
|
+
name 'environment'
|
|
46
|
+
usage 'environment <options> <environment> <...>'
|
|
47
|
+
summary 'Deploy environments and their dependent modules'
|
|
48
|
+
|
|
49
|
+
description <<-DESCRIPTION
|
|
50
|
+
`r10k deploy environment` creates and updates Puppet environments based on Git
|
|
51
|
+
branches.
|
|
52
|
+
|
|
53
|
+
Environments can provide a Puppetfile at the root of the directory to deploy
|
|
54
|
+
independent Puppet modules. To recursively deploy an environment, pass the
|
|
55
|
+
`--puppetfile` flag to the command.
|
|
56
|
+
|
|
57
|
+
**NOTE**: If an environment has a Puppetfile when it is instantiated a
|
|
58
|
+
recursive update will be forced. It is assumed that environments are dependent
|
|
59
|
+
on modules specified in the Puppetfile and an update will be automatically
|
|
60
|
+
scheduled. On subsequent deployments, Puppetfile deployment will default to off.
|
|
61
|
+
DESCRIPTION
|
|
62
|
+
|
|
63
|
+
flag :p, :puppetfile, 'Deploy modules from a puppetfile'
|
|
64
|
+
required nil, :'default-branch-override', 'Specify a branchname to override the default branch in the puppetfile'
|
|
65
|
+
|
|
66
|
+
runner R10K::Action::CriRunner.wrap(R10K::Action::Deploy::Environment)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
module Module
|
|
72
|
+
def self.command
|
|
73
|
+
@cmd ||= Cri::Command.define do
|
|
74
|
+
name 'module'
|
|
75
|
+
usage 'module [module] <module ...>'
|
|
76
|
+
summary 'Deploy modules in all environments'
|
|
77
|
+
|
|
78
|
+
description <<-DESCRIPTION
|
|
79
|
+
`r10k deploy module` Deploys and updates modules inside of Puppet environments.
|
|
80
|
+
It will load the Puppetfile configurations out of all environments, and will
|
|
81
|
+
try to deploy the given module names in all environments.
|
|
82
|
+
DESCRIPTION
|
|
83
|
+
|
|
84
|
+
required :e, :environment, 'Update the modules in the given environment'
|
|
85
|
+
|
|
86
|
+
runner R10K::Action::CriRunner.wrap(R10K::Action::Deploy::Module)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
module Display
|
|
92
|
+
def self.command
|
|
93
|
+
@cmd ||= Cri::Command.define do
|
|
94
|
+
name 'display'
|
|
95
|
+
aliases 'list'
|
|
96
|
+
usage 'display'
|
|
97
|
+
summary 'Display environments and modules in the deployment'
|
|
98
|
+
|
|
99
|
+
flag :p, :puppetfile, 'Display Puppetfile modules'
|
|
100
|
+
flag nil, :detail, 'Display detailed information'
|
|
101
|
+
flag nil, :fetch, 'Update available environment lists from all remote sources'
|
|
102
|
+
required nil, :format, 'Display output in a specific format. Valid values: json, yaml. Default: yaml'
|
|
103
|
+
|
|
104
|
+
runner R10K::Action::CriRunner.wrap(R10K::Action::Deploy::Display)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
R10K::CLI.command.add_command(R10K::CLI::Deploy.command)
|
|
112
|
+
R10K::CLI::Deploy.command.add_command(R10K::CLI::Deploy::Environment.command)
|
|
113
|
+
R10K::CLI::Deploy.command.add_command(R10K::CLI::Deploy::Module.command)
|
|
114
|
+
R10K::CLI::Deploy.command.add_command(R10K::CLI::Deploy::Display.command)
|