chef-cli 1.0.3
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/Gemfile +32 -0
- data/LICENSE +201 -0
- data/Rakefile +70 -0
- data/bin/chef +25 -0
- data/chef-cli.gemspec +53 -0
- data/lib/chef-cli.rb +19 -0
- data/lib/chef-cli/authenticated_http.rb +22 -0
- data/lib/chef-cli/builtin_commands.rb +62 -0
- data/lib/chef-cli/chef_runner.rb +114 -0
- data/lib/chef-cli/chef_server_api_multi.rb +73 -0
- data/lib/chef-cli/cli.rb +206 -0
- data/lib/chef-cli/command/base.rb +89 -0
- data/lib/chef-cli/command/clean_policy_cookbooks.rb +115 -0
- data/lib/chef-cli/command/clean_policy_revisions.rb +112 -0
- data/lib/chef-cli/command/delete_policy.rb +121 -0
- data/lib/chef-cli/command/delete_policy_group.rb +121 -0
- data/lib/chef-cli/command/describe_cookbook.rb +98 -0
- data/lib/chef-cli/command/diff.rb +316 -0
- data/lib/chef-cli/command/env.rb +99 -0
- data/lib/chef-cli/command/exec.rb +45 -0
- data/lib/chef-cli/command/export.rb +156 -0
- data/lib/chef-cli/command/gem.rb +48 -0
- data/lib/chef-cli/command/generate.rb +123 -0
- data/lib/chef-cli/command/generator_commands.rb +83 -0
- data/lib/chef-cli/command/generator_commands/attribute.rb +37 -0
- data/lib/chef-cli/command/generator_commands/base.rb +157 -0
- data/lib/chef-cli/command/generator_commands/build_cookbook.rb +126 -0
- data/lib/chef-cli/command/generator_commands/chef_exts/generator_desc_resource.rb +40 -0
- data/lib/chef-cli/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -0
- data/lib/chef-cli/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -0
- data/lib/chef-cli/command/generator_commands/cookbook.rb +251 -0
- data/lib/chef-cli/command/generator_commands/cookbook_code_file.rb +100 -0
- data/lib/chef-cli/command/generator_commands/cookbook_file.rb +46 -0
- data/lib/chef-cli/command/generator_commands/generator_generator.rb +175 -0
- data/lib/chef-cli/command/generator_commands/helpers.rb +37 -0
- data/lib/chef-cli/command/generator_commands/policyfile.rb +125 -0
- data/lib/chef-cli/command/generator_commands/recipe.rb +37 -0
- data/lib/chef-cli/command/generator_commands/repo.rb +140 -0
- data/lib/chef-cli/command/generator_commands/resource.rb +37 -0
- data/lib/chef-cli/command/generator_commands/template.rb +47 -0
- data/lib/chef-cli/command/install.rb +121 -0
- data/lib/chef-cli/command/provision.rb +38 -0
- data/lib/chef-cli/command/push.rb +118 -0
- data/lib/chef-cli/command/push_archive.rb +126 -0
- data/lib/chef-cli/command/shell_init.rb +185 -0
- data/lib/chef-cli/command/show_policy.rb +164 -0
- data/lib/chef-cli/command/undelete.rb +155 -0
- data/lib/chef-cli/command/update.rb +140 -0
- data/lib/chef-cli/command/verify.rb +548 -0
- data/lib/chef-cli/commands_map.rb +113 -0
- data/lib/chef-cli/completions/bash.sh.erb +5 -0
- data/lib/chef-cli/completions/chef.fish.erb +10 -0
- data/lib/chef-cli/completions/zsh.zsh.erb +21 -0
- data/lib/chef-cli/component_test.rb +226 -0
- data/lib/chef-cli/configurable.rb +88 -0
- data/lib/chef-cli/cookbook_metadata.rb +45 -0
- data/lib/chef-cli/cookbook_omnifetch.rb +32 -0
- data/lib/chef-cli/cookbook_profiler/git.rb +152 -0
- data/lib/chef-cli/cookbook_profiler/identifiers.rb +72 -0
- data/lib/chef-cli/cookbook_profiler/null_scm.rb +31 -0
- data/lib/chef-cli/dist.rb +31 -0
- data/lib/chef-cli/exceptions.rb +153 -0
- data/lib/chef-cli/generator.rb +165 -0
- data/lib/chef-cli/helpers.rb +170 -0
- data/lib/chef-cli/pager.rb +104 -0
- data/lib/chef-cli/policyfile/artifactory_cookbook_source.rb +102 -0
- data/lib/chef-cli/policyfile/attribute_merge_checker.rb +110 -0
- data/lib/chef-cli/policyfile/chef_repo_cookbook_source.rb +138 -0
- data/lib/chef-cli/policyfile/chef_server_cookbook_source.rb +99 -0
- data/lib/chef-cli/policyfile/chef_server_lock_fetcher.rb +167 -0
- data/lib/chef-cli/policyfile/community_cookbook_source.rb +95 -0
- data/lib/chef-cli/policyfile/comparison_base.rb +123 -0
- data/lib/chef-cli/policyfile/cookbook_location_specification.rb +154 -0
- data/lib/chef-cli/policyfile/cookbook_locks.rb +466 -0
- data/lib/chef-cli/policyfile/cookbook_sources.rb +23 -0
- data/lib/chef-cli/policyfile/delivery_supermarket_source.rb +89 -0
- data/lib/chef-cli/policyfile/differ.rb +263 -0
- data/lib/chef-cli/policyfile/dsl.rb +288 -0
- data/lib/chef-cli/policyfile/git_lock_fetcher.rb +265 -0
- data/lib/chef-cli/policyfile/included_policies_cookbook_source.rb +156 -0
- data/lib/chef-cli/policyfile/lister.rb +229 -0
- data/lib/chef-cli/policyfile/local_lock_fetcher.rb +132 -0
- data/lib/chef-cli/policyfile/lock_applier.rb +80 -0
- data/lib/chef-cli/policyfile/lock_fetcher_mixin.rb +37 -0
- data/lib/chef-cli/policyfile/null_cookbook_source.rb +49 -0
- data/lib/chef-cli/policyfile/policyfile_location_specification.rb +128 -0
- data/lib/chef-cli/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -0
- data/lib/chef-cli/policyfile/remote_lock_fetcher.rb +108 -0
- data/lib/chef-cli/policyfile/reports/install.rb +69 -0
- data/lib/chef-cli/policyfile/reports/table_printer.rb +57 -0
- data/lib/chef-cli/policyfile/reports/upload.rb +70 -0
- data/lib/chef-cli/policyfile/solution_dependencies.rb +311 -0
- data/lib/chef-cli/policyfile/source_uri.rb +57 -0
- data/lib/chef-cli/policyfile/storage_config.rb +112 -0
- data/lib/chef-cli/policyfile/undo_record.rb +139 -0
- data/lib/chef-cli/policyfile/undo_stack.rb +128 -0
- data/lib/chef-cli/policyfile/uploader.rb +222 -0
- data/lib/chef-cli/policyfile_compiler.rb +528 -0
- data/lib/chef-cli/policyfile_lock.rb +581 -0
- data/lib/chef-cli/policyfile_services/clean_policies.rb +95 -0
- data/lib/chef-cli/policyfile_services/clean_policy_cookbooks.rb +123 -0
- data/lib/chef-cli/policyfile_services/export_repo.rb +419 -0
- data/lib/chef-cli/policyfile_services/install.rb +167 -0
- data/lib/chef-cli/policyfile_services/push.rb +112 -0
- data/lib/chef-cli/policyfile_services/push_archive.rb +164 -0
- data/lib/chef-cli/policyfile_services/rm_policy.rb +141 -0
- data/lib/chef-cli/policyfile_services/rm_policy_group.rb +85 -0
- data/lib/chef-cli/policyfile_services/show_policy.rb +234 -0
- data/lib/chef-cli/policyfile_services/undelete.rb +108 -0
- data/lib/chef-cli/policyfile_services/update_attributes.rb +110 -0
- data/lib/chef-cli/service_exception_inspectors.rb +24 -0
- data/lib/chef-cli/service_exception_inspectors/base.rb +39 -0
- data/lib/chef-cli/service_exception_inspectors/http.rb +119 -0
- data/lib/chef-cli/service_exceptions.rb +142 -0
- data/lib/chef-cli/shell_out.rb +36 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/Berksfile +3 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/README.md +146 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/kitchen.yml +21 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +8 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/chefignore +110 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README.md +66 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/delivery-config.json +17 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/delivery-project.toml +34 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/gitignore +22 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/README.md +20 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +6 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +4 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/README.md +9 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/example.json +13 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/policyfiles/README.md +24 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/README.md +9 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/example.json +13 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper.rb +2 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -0
- data/lib/chef-cli/skeletons/code_generator/metadata.rb +8 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/attribute.rb +11 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/build_cookbook.rb +175 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/cookbook.rb +167 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/cookbook_file.rb +23 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/helpers.rb +19 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/policyfile.rb +7 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/recipe.rb +50 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/repo.rb +71 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/resource.rb +12 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/template.rb +31 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/README.md.erb +4 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +9 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/helpers.rb.erb +39 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +16 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen.yml.erb +38 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_dokken.yml.erb +36 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +32 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/metadata.rb.erb +20 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/recipe.rb.erb +5 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/recipe_spec.rb.erb +29 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/resource.rb.erb +1 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/template.erb +0 -0
- data/lib/chef-cli/ui.rb +57 -0
- data/lib/chef-cli/version.rb +20 -0
- data/lib/kitchen/provisioner/policyfile_zero.rb +195 -0
- data/spec/shared/a_file_generator.rb +125 -0
- data/spec/shared/a_generated_file.rb +12 -0
- data/spec/shared/command_with_ui_object.rb +11 -0
- data/spec/shared/custom_generator_cookbook.rb +136 -0
- data/spec/shared/fixture_cookbook_checksums.rb +46 -0
- data/spec/shared/setup_git_committer_config.rb +54 -0
- data/spec/shared/setup_git_cookbooks.rb +53 -0
- data/spec/spec_helper.rb +51 -0
- data/spec/test_helpers.rb +84 -0
- data/spec/unit/chef_runner_spec.rb +139 -0
- data/spec/unit/chef_server_api_multi_spec.rb +120 -0
- data/spec/unit/cli_spec.rb +375 -0
- data/spec/unit/command/base_spec.rb +195 -0
- data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -0
- data/spec/unit/command/clean_policy_revisions_spec.rb +180 -0
- data/spec/unit/command/delete_policy_group_spec.rb +206 -0
- data/spec/unit/command/delete_policy_spec.rb +206 -0
- data/spec/unit/command/diff_spec.rb +311 -0
- data/spec/unit/command/env_spec.rb +86 -0
- data/spec/unit/command/exec_spec.rb +178 -0
- data/spec/unit/command/export_spec.rb +199 -0
- data/spec/unit/command/generate_spec.rb +142 -0
- data/spec/unit/command/generator_commands/attribute_spec.rb +31 -0
- data/spec/unit/command/generator_commands/base_spec.rb +180 -0
- data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -0
- data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +77 -0
- data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -0
- data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -0
- data/spec/unit/command/generator_commands/cookbook_spec.rb +769 -0
- data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -0
- data/spec/unit/command/generator_commands/helpers_spec.rb +31 -0
- data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -0
- data/spec/unit/command/generator_commands/recipe_spec.rb +37 -0
- data/spec/unit/command/generator_commands/repo_spec.rb +374 -0
- data/spec/unit/command/generator_commands/resource_spec.rb +31 -0
- data/spec/unit/command/generator_commands/template_spec.rb +31 -0
- data/spec/unit/command/install_spec.rb +179 -0
- data/spec/unit/command/push_archive_spec.rb +153 -0
- data/spec/unit/command/push_spec.rb +198 -0
- data/spec/unit/command/shell_init_spec.rb +339 -0
- data/spec/unit/command/show_policy_spec.rb +234 -0
- data/spec/unit/command/undelete_spec.rb +244 -0
- data/spec/unit/command/update_spec.rb +283 -0
- data/spec/unit/command/verify_spec.rb +341 -0
- data/spec/unit/commands_map_spec.rb +57 -0
- data/spec/unit/component_test_spec.rb +128 -0
- data/spec/unit/configurable_spec.rb +68 -0
- data/spec/unit/cookbook_metadata_spec.rb +96 -0
- data/spec/unit/cookbook_profiler/git_spec.rb +176 -0
- data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -0
- data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -0
- data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -0
- data/spec/unit/fixtures/command/cli_test_command.rb +26 -0
- data/spec/unit/fixtures/command/explicit_path_example.rb +7 -0
- data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -0
- data/spec/unit/fixtures/configurable/test_configurable.rb +10 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/kitchen.yml +16 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -0
- data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -0
- data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -0
- data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1322 -0
- data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -0
- data/spec/unit/fixtures/cookbooks_api/universe.json +1 -0
- data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +33 -0
- data/spec/unit/fixtures/dev_cookbooks/README.md +16 -0
- data/spec/unit/fixtures/dev_cookbooks/bar-cookbook.gitbundle +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/bin/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/bin/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_component/bin/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/berkshelf/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/test-kitchen/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/bin/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/bin/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef-dk/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/bin/.keep +0 -0
- data/spec/unit/fixtures/example_app/Policyfile.rb +0 -0
- data/spec/unit/fixtures/example_cookbook/.gitignore +17 -0
- data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -0
- data/spec/unit/fixtures/example_cookbook/Berksfile +3 -0
- data/spec/unit/fixtures/example_cookbook/README.md +4 -0
- data/spec/unit/fixtures/example_cookbook/chefignore +96 -0
- data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -0
- data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -0
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -0
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/extra/extra_file.txt +0 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -0
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
- data/spec/unit/generator_spec.rb +119 -0
- data/spec/unit/pager_spec.rb +117 -0
- data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -0
- data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -0
- data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -0
- data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -0
- data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -0
- data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -0
- data/spec/unit/policyfile/comparison_base_spec.rb +340 -0
- data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -0
- data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -0
- data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -0
- data/spec/unit/policyfile/differ_spec.rb +686 -0
- data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -0
- data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -0
- data/spec/unit/policyfile/lister_spec.rb +268 -0
- data/spec/unit/policyfile/local_lock_fetcher_spec.rb +199 -0
- data/spec/unit/policyfile/lock_applier_spec.rb +100 -0
- data/spec/unit/policyfile/lock_fetcher_mixin_spec.rb +60 -0
- data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -0
- data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -0
- data/spec/unit/policyfile/remote_lock_fetcher_spec.rb +129 -0
- data/spec/unit/policyfile/reports/install_spec.rb +114 -0
- data/spec/unit/policyfile/reports/upload_spec.rb +94 -0
- data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -0
- data/spec/unit/policyfile/source_uri_spec.rb +36 -0
- data/spec/unit/policyfile/storage_config_spec.rb +180 -0
- data/spec/unit/policyfile/undo_record_spec.rb +258 -0
- data/spec/unit/policyfile/undo_stack_spec.rb +265 -0
- data/spec/unit/policyfile/uploader_spec.rb +410 -0
- data/spec/unit/policyfile_demands_spec.rb +1197 -0
- data/spec/unit/policyfile_evaluation_spec.rb +628 -0
- data/spec/unit/policyfile_includes_dsl_spec.rb +220 -0
- data/spec/unit/policyfile_includes_spec.rb +720 -0
- data/spec/unit/policyfile_install_with_includes_spec.rb +232 -0
- data/spec/unit/policyfile_lock_build_spec.rb +1065 -0
- data/spec/unit/policyfile_lock_install_spec.rb +137 -0
- data/spec/unit/policyfile_lock_serialization_spec.rb +424 -0
- data/spec/unit/policyfile_lock_validation_spec.rb +608 -0
- data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -0
- data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -0
- data/spec/unit/policyfile_services/export_repo_spec.rb +473 -0
- data/spec/unit/policyfile_services/install_spec.rb +209 -0
- data/spec/unit/policyfile_services/push_archive_spec.rb +359 -0
- data/spec/unit/policyfile_services/push_spec.rb +249 -0
- data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -0
- data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -0
- data/spec/unit/policyfile_services/show_policy_spec.rb +887 -0
- data/spec/unit/policyfile_services/undelete_spec.rb +302 -0
- data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -0
- data/spec/unit/policyfile_services/update_spec.rb +162 -0
- data/spec/unit/service_exception_inspectors/base_spec.rb +41 -0
- data/spec/unit/service_exception_inspectors/http_spec.rb +138 -0
- data/spec/unit/shell_out_spec.rb +34 -0
- metadata +796 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
|
2
|
+
# License:: Apache License, Version 2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
require "spec_helper"
|
|
18
|
+
require "stringio"
|
|
19
|
+
require "chef-cli/cli"
|
|
20
|
+
require "unit/fixtures/command/cli_test_command"
|
|
21
|
+
|
|
22
|
+
describe ChefCLI::CLI do
|
|
23
|
+
|
|
24
|
+
let(:argv) { [] }
|
|
25
|
+
|
|
26
|
+
# Setup a new commands map so we control what subcommands exist. Otherwise
|
|
27
|
+
# we'd have to update this test for every new subcommand we add or code the
|
|
28
|
+
# tests defensively.
|
|
29
|
+
let(:commands_map) { ChefCLI::CommandsMap.new }
|
|
30
|
+
|
|
31
|
+
let(:stdout_io) { StringIO.new }
|
|
32
|
+
let(:stderr_io) { StringIO.new }
|
|
33
|
+
|
|
34
|
+
def stdout
|
|
35
|
+
stdout_io.string
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def stderr
|
|
39
|
+
stderr_io.string
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
let(:base_help_message) do
|
|
43
|
+
<<~E
|
|
44
|
+
Usage:
|
|
45
|
+
chef -h/--help
|
|
46
|
+
chef -v/--version
|
|
47
|
+
chef command [arguments...] [options...]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
Available Commands:
|
|
51
|
+
verify Test the embedded ChefCLI applications
|
|
52
|
+
gem Runs the `gem` command in context of the embedded ruby
|
|
53
|
+
example Example subcommand for testing
|
|
54
|
+
E
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
let(:version_message) { "#{ChefCLI::Dist::PRODUCT} version: #{ChefCLI::VERSION}\n" }
|
|
58
|
+
|
|
59
|
+
def run_cli(expected_exit_code)
|
|
60
|
+
expect(cli).to receive(:exit).with(expected_exit_code)
|
|
61
|
+
expect(cli).to receive(:sanity_check!)
|
|
62
|
+
cli.run
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def run_cli_with_sanity_check(expected_exit_code)
|
|
66
|
+
expect(cli).to receive(:exit).with(expected_exit_code)
|
|
67
|
+
cli.run
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def run_cli_and_validate_tool_versions
|
|
71
|
+
full_version_message = version_message
|
|
72
|
+
tools.each do |name, details|
|
|
73
|
+
expect(cli).to receive(:shell_out).with("#{details["command"]} --version").and_return(mock_shell_out(0, "#{details["version_output"]}", ""))
|
|
74
|
+
full_version_message += "#{name} version: #{details["expected_version"]}\n"
|
|
75
|
+
end
|
|
76
|
+
run_cli(0)
|
|
77
|
+
expect(stdout).to eq(full_version_message)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def mock_shell_out(exitstatus, stdout, stderr)
|
|
81
|
+
shell_out = double("mixlib_shell_out")
|
|
82
|
+
allow(shell_out).to receive(:exitstatus).and_return(exitstatus)
|
|
83
|
+
allow(shell_out).to receive(:stdout).and_return(stdout)
|
|
84
|
+
allow(shell_out).to receive(:stderr).and_return(stderr)
|
|
85
|
+
shell_out
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
subject(:cli) do
|
|
89
|
+
ChefCLI::CLI.new(argv).tap do |c|
|
|
90
|
+
allow(c).to receive(:commands_map).and_return(commands_map)
|
|
91
|
+
allow(c).to receive(:stdout).and_return(stdout_io)
|
|
92
|
+
allow(c).to receive(:stderr).and_return(stderr_io)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
before do
|
|
97
|
+
commands_map.builtin "verify", :Verify, desc: "Test the embedded ChefCLI applications"
|
|
98
|
+
|
|
99
|
+
commands_map.builtin "gem", :GemForwarder, require_path: "chef-cli/command/gem",
|
|
100
|
+
desc: "Runs the `gem` command in context of the embedded ruby"
|
|
101
|
+
|
|
102
|
+
commands_map.builtin "example", :TestCommand, require_path: "unit/fixtures/command/cli_test_command",
|
|
103
|
+
desc: "Example subcommand for testing"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
context "given no arguments or options" do
|
|
107
|
+
|
|
108
|
+
it "prints the help output" do
|
|
109
|
+
run_cli(0)
|
|
110
|
+
expect(stdout).to eq(base_help_message)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context "given -h" do
|
|
116
|
+
let(:argv) { %w{-h} }
|
|
117
|
+
|
|
118
|
+
it "prints the help output" do
|
|
119
|
+
run_cli(0)
|
|
120
|
+
expect(stdout).to eq(base_help_message)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context "given -v" do
|
|
125
|
+
let(:argv) { %w{-v} }
|
|
126
|
+
|
|
127
|
+
let(:tools) do
|
|
128
|
+
{
|
|
129
|
+
"Chef Infra Client" => {
|
|
130
|
+
"command" => "chef-client",
|
|
131
|
+
"version_output" => "Chef Infra Client: 15.0.300",
|
|
132
|
+
"expected_version" => "15.0.300",
|
|
133
|
+
},
|
|
134
|
+
"Chef InSpec" => {
|
|
135
|
+
"command" => "inspec",
|
|
136
|
+
"version_output" => "4.6.2\n\nYour version of InSpec is out of date! The latest version is 4.6.4.",
|
|
137
|
+
"expected_version" => "4.6.2",
|
|
138
|
+
},
|
|
139
|
+
"Test Kitchen" => {
|
|
140
|
+
"command" => "kitchen",
|
|
141
|
+
"version_output" => "Test Kitchen version 2.2.5",
|
|
142
|
+
"expected_version" => "2.2.5",
|
|
143
|
+
},
|
|
144
|
+
"Foodcritic" => {
|
|
145
|
+
"command" => "foodcritic",
|
|
146
|
+
"version_output" => "foodcritic 16.0.0",
|
|
147
|
+
"expected_version" => "16.0.0",
|
|
148
|
+
},
|
|
149
|
+
"Cookstyle" => {
|
|
150
|
+
"command" => "cookstyle",
|
|
151
|
+
"version_output" => "Cookstyle 4.0.0\n * RuboCop 0.62.0",
|
|
152
|
+
"expected_version" => "4.0.0",
|
|
153
|
+
},
|
|
154
|
+
}
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "does not print versions of tools with missing or errored tools" do
|
|
158
|
+
full_version_message = version_message
|
|
159
|
+
tools.each do |name, details|
|
|
160
|
+
if name == "inspec"
|
|
161
|
+
expect(cli).to receive(:shell_out).with("#{details["command"]} --version").and_return(mock_shell_out(1, "#{details["version_output"]}", ""))
|
|
162
|
+
full_version_message += "#{name} version: ERROR\n"
|
|
163
|
+
else
|
|
164
|
+
expect(cli).to receive(:shell_out).with("#{details["command"]} --version").and_return(mock_shell_out(0, "#{details["version_output"]}", ""))
|
|
165
|
+
full_version_message += "#{name} version: #{details["expected_version"]}\n"
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
run_cli(0)
|
|
169
|
+
expect(stdout).to eq(full_version_message)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it "prints the version and versions of chef-cli tools" do
|
|
173
|
+
run_cli_and_validate_tool_versions
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
context "given an invalid option" do
|
|
178
|
+
|
|
179
|
+
let(:argv) { %w{-nope} }
|
|
180
|
+
|
|
181
|
+
it "prints an 'invalid option message and the help output, then exits non-zero" do
|
|
182
|
+
run_cli(1)
|
|
183
|
+
expect(stdout).to eq(base_help_message)
|
|
184
|
+
expect(stderr).to eq("invalid option: -nope\n")
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
context "given an invalid/unknown subcommand" do
|
|
190
|
+
let(:argv) { %w{ancient-aliens} }
|
|
191
|
+
|
|
192
|
+
it "prints an 'unknown command' message and the help output" do
|
|
193
|
+
expected_err = "Unknown command `ancient-aliens'.\n"
|
|
194
|
+
|
|
195
|
+
run_cli(1)
|
|
196
|
+
|
|
197
|
+
expect(stderr).to eq(expected_err)
|
|
198
|
+
expect(stdout).to eq(base_help_message)
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
context "given a valid subcommand" do
|
|
204
|
+
let(:argv) { %w{example with some args --and-an-option} }
|
|
205
|
+
|
|
206
|
+
def test_result
|
|
207
|
+
ChefCLI::Command::TestCommand.test_result
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
before do
|
|
211
|
+
ChefCLI::Command::TestCommand.reset!
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
it "runs the subcommand" do
|
|
215
|
+
run_cli(23)
|
|
216
|
+
expect(test_result[:status]).to eq(:success)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it "exits with the return code given by the subcommand" do
|
|
220
|
+
run_cli(23)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it "passes arguments and options to the subcommand" do
|
|
224
|
+
params = %w{with some args --and-an-option}
|
|
225
|
+
run_cli(23)
|
|
226
|
+
expect(test_result[:params]).to eq(params)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
context "sanity_check!" do
|
|
231
|
+
|
|
232
|
+
before do
|
|
233
|
+
allow(Gem).to receive(:ruby).and_return(ruby_path)
|
|
234
|
+
allow(cli).to receive(:package_home).and_return("/opt/chef-workstation")
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
context "when installed via omnibus" do
|
|
238
|
+
before do
|
|
239
|
+
allow(cli).to receive(:omnibus_install?).and_return true
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
context "on unix" do
|
|
243
|
+
|
|
244
|
+
let(:ruby_path) { "/opt/chef-workstation/embedded/bin/ruby" }
|
|
245
|
+
before do
|
|
246
|
+
stub_const("File::PATH_SEPARATOR", ":")
|
|
247
|
+
allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path|
|
|
248
|
+
path
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
it "complains if embedded is first" do
|
|
253
|
+
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chef-workstation/embedded/bin:/opt/chef-workstation/bin" })
|
|
254
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chef-workstation/embedded/bin")
|
|
255
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chef-workstation/bin")
|
|
256
|
+
run_cli_with_sanity_check(0)
|
|
257
|
+
expect(stdout).to eq(base_help_message)
|
|
258
|
+
expect(stderr).to include("please reverse that order")
|
|
259
|
+
expect(stderr).to include("chef shell-init")
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "complains if only embedded is present" do
|
|
263
|
+
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chef-workstation/embedded/bin" })
|
|
264
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chef-workstation/embedded/bin")
|
|
265
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chef-workstation/bin")
|
|
266
|
+
run_cli_with_sanity_check(0)
|
|
267
|
+
expect(stdout).to eq(base_help_message)
|
|
268
|
+
expect(stderr).to include("you must add")
|
|
269
|
+
expect(stderr).to include("chef shell-init")
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
it "passes when both are present in the correct order" do
|
|
273
|
+
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chef-workstation/bin:/opt/chef-workstation/embedded/bin" })
|
|
274
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chef-workstation/embedded/bin")
|
|
275
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chef-workstation/bin")
|
|
276
|
+
run_cli_with_sanity_check(0)
|
|
277
|
+
expect(stdout).to eq(base_help_message)
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
it "passes when only the omnibus bin dir is present" do
|
|
281
|
+
allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chef-workstation/bin" })
|
|
282
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chef-workstation/embedded/bin")
|
|
283
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chef-workstation/bin")
|
|
284
|
+
run_cli_with_sanity_check(0)
|
|
285
|
+
expect(stdout).to eq(base_help_message)
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
context "on windows" do
|
|
290
|
+
|
|
291
|
+
let(:ruby_path) { "c:/opscode/chef-workstation/embedded/bin/ruby.exe" }
|
|
292
|
+
let(:omnibus_root) { "c:/opscode/chef-workstation" }
|
|
293
|
+
|
|
294
|
+
before do
|
|
295
|
+
# Would be preferable not to stub this, but `File.expand_path` does
|
|
296
|
+
# weird things with windows paths on unix machines.
|
|
297
|
+
#
|
|
298
|
+
# I manually verified the behavior:
|
|
299
|
+
#
|
|
300
|
+
# $ /c/opscode/chef-workstation/embedded/bin/ruby -e 'p File.expand_path(File.join(Gem.ruby, "..", "..", ".."))'
|
|
301
|
+
# "c:/opscode/chef-workstation"
|
|
302
|
+
allow(cli).to receive(:expected_omnibus_root).and_return(ruby_path)
|
|
303
|
+
allow(cli).to receive(:omnibus_install?).and_return(true)
|
|
304
|
+
allow(Chef::Platform).to receive(:windows?).and_return(true)
|
|
305
|
+
stub_const("File::PATH_SEPARATOR", ";")
|
|
306
|
+
allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path|
|
|
307
|
+
path.tr "/", "\\"
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
it "complains if embedded is first" do
|
|
312
|
+
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chef-workstation\embedded\bin;C:\opscode\chef-workstation\bin' })
|
|
313
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chef-workstation/embedded/bin")
|
|
314
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chef-workstation/bin")
|
|
315
|
+
run_cli_with_sanity_check(0)
|
|
316
|
+
expect(stdout).to eq(base_help_message)
|
|
317
|
+
expect(stderr).to include("please reverse that order")
|
|
318
|
+
expect(stderr).to include("chef shell-init")
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
it "complains if only embedded is present" do
|
|
322
|
+
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chef-workstation\embedded\bin' })
|
|
323
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chef-workstation/embedded/bin")
|
|
324
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chef-workstation/bin")
|
|
325
|
+
run_cli_with_sanity_check(0)
|
|
326
|
+
expect(stdout).to eq(base_help_message)
|
|
327
|
+
expect(stderr).to include("you must add")
|
|
328
|
+
expect(stderr).to include("chef shell-init")
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
it "passes when both are present in the correct order" do
|
|
332
|
+
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chef-workstation\bin;C:\opscode\chef-workstation\embedded\bin' })
|
|
333
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chef-workstation/embedded/bin")
|
|
334
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chef-workstation/bin")
|
|
335
|
+
run_cli_with_sanity_check(0)
|
|
336
|
+
expect(stdout).to eq(base_help_message)
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
it "passes when only the omnibus bin dir is present" do
|
|
340
|
+
allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chef-workstation\bin' })
|
|
341
|
+
allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chef-workstation/embedded/bin")
|
|
342
|
+
allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chef-workstation/bin")
|
|
343
|
+
run_cli_with_sanity_check(0)
|
|
344
|
+
expect(stdout).to eq(base_help_message)
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
context "when not installed via omnibus" do
|
|
350
|
+
|
|
351
|
+
before do
|
|
352
|
+
allow(cli).to receive(:omnibus_install?).and_return false
|
|
353
|
+
end
|
|
354
|
+
let(:ruby_path) { "/Users/bog/.lots_o_rubies/2.1.2/bin/ruby" }
|
|
355
|
+
let(:expected_root_path) { "/Users/bog/.lots_o_rubies" }
|
|
356
|
+
|
|
357
|
+
before do
|
|
358
|
+
allow(File).to receive(:exist?).with(expected_root_path).and_return(false)
|
|
359
|
+
|
|
360
|
+
[
|
|
361
|
+
:omnibus_root,
|
|
362
|
+
:omnibus_bin_dir,
|
|
363
|
+
:omnibus_embedded_bin_dir,
|
|
364
|
+
].each do |method_name|
|
|
365
|
+
allow(cli).to receive(method_name).and_raise(ChefCLI::OmnibusInstallNotFound.new)
|
|
366
|
+
end
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
it "skips the sanity check without error" do
|
|
370
|
+
run_cli_with_sanity_check(0)
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
end
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require "spec_helper"
|
|
19
|
+
require "chef-cli/command/verify"
|
|
20
|
+
|
|
21
|
+
describe ChefCLI::Command::Base do
|
|
22
|
+
class TestCommand < ChefCLI::Command::Base
|
|
23
|
+
banner "use me please"
|
|
24
|
+
|
|
25
|
+
option :argue,
|
|
26
|
+
short: "-a ARG",
|
|
27
|
+
long: "--arg ARG",
|
|
28
|
+
description: "An option with a required argument"
|
|
29
|
+
|
|
30
|
+
option :user,
|
|
31
|
+
short: "-u",
|
|
32
|
+
long: "--user",
|
|
33
|
+
description: "If the user exists",
|
|
34
|
+
boolean: true
|
|
35
|
+
|
|
36
|
+
def run(params)
|
|
37
|
+
parse_options(params)
|
|
38
|
+
msg("thanks for passing me #{config[:user]}")
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
let(:stderr_io) { StringIO.new }
|
|
43
|
+
let(:stdout_io) { StringIO.new }
|
|
44
|
+
let(:command_instance) { TestCommand.new() }
|
|
45
|
+
let(:enforce_license) { false }
|
|
46
|
+
|
|
47
|
+
def stdout
|
|
48
|
+
stdout_io.string
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def stderr
|
|
52
|
+
stderr_io.string
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
before do
|
|
56
|
+
allow(command_instance).to receive(:stdout).and_return(stdout_io)
|
|
57
|
+
allow(command_instance).to receive(:stderr).and_return(stderr_io)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def run_command(options)
|
|
61
|
+
command_instance.run_with_default_options(enforce_license, options)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "should print the banner for -h" do
|
|
65
|
+
run_command(["-h"])
|
|
66
|
+
expect(stdout).to include("use me please\n")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "should print the banner for --help" do
|
|
70
|
+
run_command(["--help"])
|
|
71
|
+
expect(stdout).to include("use me please\n")
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "prints the options along with the banner when displaying the help message" do
|
|
75
|
+
run_command(["--help"])
|
|
76
|
+
expect(stdout).to include("-u, --user If the user exists")
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should print the version for -v" do
|
|
80
|
+
run_command(["-v"])
|
|
81
|
+
expect(stdout).to eq("#{ChefCLI::Dist::PRODUCT} version: #{ChefCLI::VERSION}\n")
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should print the version for --version" do
|
|
85
|
+
run_command(["--version"])
|
|
86
|
+
expect(stdout).to eq("#{ChefCLI::Dist::PRODUCT} version: #{ChefCLI::VERSION}\n")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "should run the command passing in the custom options for long custom options" do
|
|
90
|
+
run_command(["--user"])
|
|
91
|
+
expect(stdout).to eq("thanks for passing me true\n")
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "should run the command passing in the custom options for short custom options" do
|
|
95
|
+
run_command(["-u"])
|
|
96
|
+
expect(stdout).to eq("thanks for passing me true\n")
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe "when enforce_license is true" do
|
|
100
|
+
let(:enforce_license) { true }
|
|
101
|
+
|
|
102
|
+
it "calls the license acceptance library" do
|
|
103
|
+
expect(LicenseAcceptance::Acceptor).to receive(:check_and_persist!).with("chef-workstation", ChefCLI::VERSION.to_s)
|
|
104
|
+
run_command([])
|
|
105
|
+
expect(stdout).to eq("thanks for passing me \n")
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
describe "when enforce_license is false" do
|
|
110
|
+
let(:enforce_license) { false }
|
|
111
|
+
|
|
112
|
+
it "does not call the license acceptance library" do
|
|
113
|
+
expect(LicenseAcceptance::Acceptor).to_not receive(:check_and_persist!)
|
|
114
|
+
run_command([])
|
|
115
|
+
expect(stdout).to eq("thanks for passing me \n")
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
describe "when given invalid options" do
|
|
120
|
+
|
|
121
|
+
it "prints the help banner and exits gracefully" do
|
|
122
|
+
expect(run_command(%w{-foo})).to eq(1)
|
|
123
|
+
|
|
124
|
+
expect(stderr).to eq("ERROR: invalid option: -foo\n\n")
|
|
125
|
+
|
|
126
|
+
expected = <<~E
|
|
127
|
+
use me please
|
|
128
|
+
-a, --arg ARG An option with a required argument
|
|
129
|
+
--chef-license ACCEPTANCE Accept the license for this product and any contained products ('accept', 'accept-no-persist', or 'accept-silent')
|
|
130
|
+
-h, --help Show this message
|
|
131
|
+
-u, --user If the user exists
|
|
132
|
+
-v, --version Show #{ChefCLI::Dist::PRODUCT} version
|
|
133
|
+
|
|
134
|
+
E
|
|
135
|
+
expect(stdout).to eq(expected)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
describe "when given an option that requires an argument with no argument" do
|
|
141
|
+
|
|
142
|
+
it "prints the help banner and exits gracefully" do
|
|
143
|
+
expect(run_command(%w{-a})).to eq(1)
|
|
144
|
+
|
|
145
|
+
expect(stderr).to eq("ERROR: missing argument: -a\n\n")
|
|
146
|
+
|
|
147
|
+
expected = <<~E
|
|
148
|
+
use me please
|
|
149
|
+
-a, --arg ARG An option with a required argument
|
|
150
|
+
--chef-license ACCEPTANCE Accept the license for this product and any contained products ('accept', 'accept-no-persist', or 'accept-silent')
|
|
151
|
+
-h, --help Show this message
|
|
152
|
+
-u, --user If the user exists
|
|
153
|
+
-v, --version Show #{ChefCLI::Dist::PRODUCT} version
|
|
154
|
+
|
|
155
|
+
E
|
|
156
|
+
expect(stdout).to eq(expected)
|
|
157
|
+
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
describe "when parsing Chef's configuration fails" do
|
|
163
|
+
|
|
164
|
+
let(:exception_message) do
|
|
165
|
+
<<~MESSAGE
|
|
166
|
+
You have an error in your config file /Users/ddeleo/.chef/config.rb (Chef::Exceptions::ConfigurationError)
|
|
167
|
+
|
|
168
|
+
Mixlib::Config::UnknownConfigOptionError: Cannot set unsupported config value foo.
|
|
169
|
+
/Users/person/.chef/config.rb:50:in `from_string'
|
|
170
|
+
Relevant file content:
|
|
171
|
+
49: chefcli.generator_cookbook "~/.chef/code_generator"
|
|
172
|
+
50: chefcli.foo "bar"
|
|
173
|
+
51:
|
|
174
|
+
|
|
175
|
+
MESSAGE
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
let(:exception) { Chef::Exceptions::ConfigurationError.new(exception_message) }
|
|
179
|
+
|
|
180
|
+
before do
|
|
181
|
+
allow(command_instance).to receive(:run).and_raise(exception)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
it "exits non-zero" do
|
|
185
|
+
expect(run_command([])).to eq(1)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it "prints the exception message to stderr" do
|
|
189
|
+
run_command([])
|
|
190
|
+
expect(stderr).to include(exception_message)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
end
|