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,142 @@
|
|
|
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 "stringio"
|
|
20
|
+
require "chef-cli/command/generate"
|
|
21
|
+
|
|
22
|
+
class ChefCLI::Command::GeneratorCommands::Example < ChefCLI::Command::GeneratorCommands::Base
|
|
23
|
+
|
|
24
|
+
option :one,
|
|
25
|
+
long: "--option-one",
|
|
26
|
+
description: "one"
|
|
27
|
+
|
|
28
|
+
option :two,
|
|
29
|
+
long: "--option-two",
|
|
30
|
+
description: "two"
|
|
31
|
+
|
|
32
|
+
option :arg,
|
|
33
|
+
short: "-a ARG",
|
|
34
|
+
long: "--arg ARG",
|
|
35
|
+
description: "an option that takes an argument"
|
|
36
|
+
|
|
37
|
+
def initialize(argv)
|
|
38
|
+
super # required by mixlib-cli
|
|
39
|
+
@argv = argv
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def run
|
|
43
|
+
parse_options(@argv)
|
|
44
|
+
{ argv: @argv, ran_cmd: "example" }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe ChefCLI::Command::Generate do
|
|
49
|
+
|
|
50
|
+
# Use a subclass so we have a clean slate of defined generators
|
|
51
|
+
let(:generator_class) { Class.new(ChefCLI::Command::Generate) }
|
|
52
|
+
|
|
53
|
+
let(:stdout_io) { StringIO.new }
|
|
54
|
+
let(:stderr_io) { StringIO.new }
|
|
55
|
+
|
|
56
|
+
def stdout
|
|
57
|
+
stdout_io.string
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def stderr
|
|
61
|
+
stderr_io.string
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
subject(:generate) do
|
|
65
|
+
g = generator_class.new
|
|
66
|
+
allow(g).to receive(:stdout).and_return(stdout_io)
|
|
67
|
+
allow(g).to receive(:stderr).and_return(stderr_io)
|
|
68
|
+
g
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "has a list of generators" do
|
|
72
|
+
expect(generator_class.generators).to eq([])
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context "with a generator defined" do
|
|
76
|
+
let(:expected_help_message) do
|
|
77
|
+
<<~E
|
|
78
|
+
Usage: chef generate GENERATOR [options]
|
|
79
|
+
|
|
80
|
+
Available generators:
|
|
81
|
+
example this is a test
|
|
82
|
+
E
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
before do
|
|
86
|
+
generator_class.generator(:example, :Example, "this is a test")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "includes the generator in the list" do
|
|
90
|
+
expect(generator_class.generators.size).to eq(1)
|
|
91
|
+
generator_spec = generator_class.generators.first
|
|
92
|
+
expect(generator_spec.name).to eq(:example)
|
|
93
|
+
expect(generator_spec.class_name).to eq(:Example)
|
|
94
|
+
expect(generator_spec.description).to eq("this is a test")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "includes the generator in the help output" do
|
|
98
|
+
expect(generator_class.banner).to eq(expected_help_message)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it "prints usage when running an unknown generator" do
|
|
102
|
+
generate.run(%w{ancient-aliens})
|
|
103
|
+
expect(stdout).to include(expected_help_message)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "runs the generator sub-command" do
|
|
107
|
+
result = generate.run(%w{example})
|
|
108
|
+
expect(result[:ran_cmd]).to eq("example")
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it "removes the subcommand name from argv" do
|
|
112
|
+
result = generate.run(%w{example})
|
|
113
|
+
expect(result[:argv]).to eq([])
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "passes extra arguments and options to the subcommand" do
|
|
117
|
+
result = generate.run(%w{example argument_one argument_two --option-one --option-two})
|
|
118
|
+
expect(result[:argv]).to eq(%w{argument_one argument_two --option-one --option-two})
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
describe "when an invalid option is passed to the subcommand" do
|
|
122
|
+
|
|
123
|
+
it "prints usage and returns non-zero" do
|
|
124
|
+
result = generate.run(%w{example --nope})
|
|
125
|
+
expect(result).to eq(1)
|
|
126
|
+
expect(stderr).to eq("ERROR: invalid option: --nope\n\n")
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
describe "when an option requires an argument but none is given" do
|
|
132
|
+
|
|
133
|
+
it "prints usage and returns non-zero" do
|
|
134
|
+
result = generate.run(%w{example --arg})
|
|
135
|
+
expect(result).to eq(1)
|
|
136
|
+
expect(stderr).to eq("ERROR: missing argument: --arg\n\n")
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
end
|
|
142
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
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 "shared/a_file_generator"
|
|
20
|
+
require "chef-cli/command/generator_commands/attribute"
|
|
21
|
+
|
|
22
|
+
describe ChefCLI::Command::GeneratorCommands::Attribute do
|
|
23
|
+
|
|
24
|
+
include_examples "a file generator" do
|
|
25
|
+
|
|
26
|
+
let(:generator_name) { "attribute" }
|
|
27
|
+
let(:generated_files) { [ "attributes/new_attribute_file.rb" ] }
|
|
28
|
+
let(:new_file_name) { "new_attribute_file" }
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,180 @@
|
|
|
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/generator_commands/base"
|
|
20
|
+
|
|
21
|
+
describe ChefCLI::Command::GeneratorCommands::Base do
|
|
22
|
+
describe "parsing Chef configuration" do
|
|
23
|
+
let(:cli_args) do
|
|
24
|
+
[
|
|
25
|
+
"-C", "Business Man",
|
|
26
|
+
"-I", "Serious Business",
|
|
27
|
+
"-m", "business.man@corporation.com"
|
|
28
|
+
]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
before do
|
|
32
|
+
Chef::Config.reset
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context "when generator configuration is defined" do
|
|
36
|
+
before do
|
|
37
|
+
Chef::Config.reset
|
|
38
|
+
Chef::Config.chefcli.generator.copyright_holder = "This Guy"
|
|
39
|
+
Chef::Config.chefcli.generator.email = "this.guy@twothumbs.net"
|
|
40
|
+
Chef::Config.chefcli.generator.license = "Two Thumbs License"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "uses the defined values" do
|
|
44
|
+
cmd = ChefCLI::Command::GeneratorCommands::Base.new([])
|
|
45
|
+
cmd.parse_options
|
|
46
|
+
cmd.setup_context
|
|
47
|
+
cfg = cmd.config
|
|
48
|
+
expect(cfg[:copyright_holder]).to eq("This Guy")
|
|
49
|
+
expect(cfg[:email]).to eq("this.guy@twothumbs.net")
|
|
50
|
+
expect(cfg[:license]).to eq("Two Thumbs License")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context "when cli overrides are provided" do
|
|
54
|
+
before do
|
|
55
|
+
Chef::Config.reset
|
|
56
|
+
Chef::Config.chefcli.generator.copyright_holder = "This Guy"
|
|
57
|
+
Chef::Config.chefcli.generator.email = "this.guy@twothumbs.net"
|
|
58
|
+
Chef::Config.chefcli.generator.license = "Two Thumbs License"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "uses the cli args" do
|
|
62
|
+
cmd = ChefCLI::Command::GeneratorCommands::Base.new(cli_args)
|
|
63
|
+
cmd.parse_options(cli_args)
|
|
64
|
+
cmd.setup_context
|
|
65
|
+
cfg = cmd.config
|
|
66
|
+
expect(cfg[:copyright_holder]).to eq("Business Man")
|
|
67
|
+
expect(cfg[:email]).to eq("business.man@corporation.com")
|
|
68
|
+
expect(cfg[:license]).to eq("Serious Business")
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context "when knife configuration is also defined" do
|
|
73
|
+
|
|
74
|
+
before do
|
|
75
|
+
Chef::Config.reset
|
|
76
|
+
Chef::Config.chefcli.generator.copyright_holder = "This Guy"
|
|
77
|
+
Chef::Config.chefcli.generator.email = "this.guy@twothumbs.net"
|
|
78
|
+
Chef::Config.chefcli.generator.license = "Two Thumbs License"
|
|
79
|
+
Chef::Config.knife.cookbook_copyright = "Knife User"
|
|
80
|
+
Chef::Config.knife.cookbook_email = "knife.user@example.com"
|
|
81
|
+
Chef::Config.knife.cookbook_license = "GPLv9000"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "uses the generator configuration" do
|
|
85
|
+
cmd = ChefCLI::Command::GeneratorCommands::Base.new([])
|
|
86
|
+
cmd.parse_options
|
|
87
|
+
cmd.setup_context
|
|
88
|
+
cfg = cmd.config
|
|
89
|
+
expect(cfg[:copyright_holder]).to eq("This Guy")
|
|
90
|
+
expect(cfg[:email]).to eq("this.guy@twothumbs.net")
|
|
91
|
+
expect(cfg[:license]).to eq("Two Thumbs License")
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context "when knife configuration is defined" do
|
|
97
|
+
before do
|
|
98
|
+
Chef::Config.reset
|
|
99
|
+
Chef::Config.knife.cookbook_copyright = "Knife User"
|
|
100
|
+
Chef::Config.knife.cookbook_email = "knife.user@example.com"
|
|
101
|
+
Chef::Config.knife.cookbook_license = "GPLv9000"
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "uses the defined values" do
|
|
105
|
+
cmd = ChefCLI::Command::GeneratorCommands::Base.new([])
|
|
106
|
+
cmd.parse_options
|
|
107
|
+
cmd.setup_context
|
|
108
|
+
cfg = cmd.config
|
|
109
|
+
expect(cfg[:copyright_holder]).to eq("Knife User")
|
|
110
|
+
expect(cfg[:email]).to eq("knife.user@example.com")
|
|
111
|
+
expect(cfg[:license]).to eq("GPLv9000")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
context "when cli overrides are provided" do
|
|
115
|
+
|
|
116
|
+
before do
|
|
117
|
+
Chef::Config.reset
|
|
118
|
+
Chef::Config.knife.cookbook_copyright = "Knife User"
|
|
119
|
+
Chef::Config.knife.cookbook_email = "knife.user@example.com"
|
|
120
|
+
Chef::Config.knife.cookbook_license = "GPLv9000"
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "uses the cli args" do
|
|
124
|
+
cmd = ChefCLI::Command::GeneratorCommands::Base.new(cli_args)
|
|
125
|
+
cmd.parse_options(cli_args)
|
|
126
|
+
cmd.setup_context
|
|
127
|
+
cfg = cmd.config
|
|
128
|
+
expect(cfg[:copyright_holder]).to eq("Business Man")
|
|
129
|
+
expect(cfg[:email]).to eq("business.man@corporation.com")
|
|
130
|
+
expect(cfg[:license]).to eq("Serious Business")
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
describe "#have_git?" do
|
|
137
|
+
let(:cmd) { described_class.new([]) }
|
|
138
|
+
let(:path) { "bin_path" }
|
|
139
|
+
|
|
140
|
+
before do
|
|
141
|
+
allow(File).to receive(:exist?)
|
|
142
|
+
allow(ENV).to receive(:[]).with("PATH").and_return(path)
|
|
143
|
+
allow(ENV).to receive(:[]).with("PATHEXT").and_return(nil)
|
|
144
|
+
allow(RbConfig::CONFIG).to receive(:[]).with("EXEEXT").and_return("")
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
describe "when git executable exists" do
|
|
148
|
+
it "returns true" do
|
|
149
|
+
allow(File).to receive(:exist?).and_return(true)
|
|
150
|
+
expect(cmd.have_git?).to eq(true)
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
describe "when git executable does not exist" do
|
|
155
|
+
it "returns false" do
|
|
156
|
+
allow(File).to receive(:exist?).and_return(false)
|
|
157
|
+
expect(cmd.have_git?).to eq(false)
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it "checks PATH for git executable" do
|
|
162
|
+
expect(File).to receive(:exist?).with(File.join(path, "git"))
|
|
163
|
+
cmd.have_git?
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
describe "when on Windows" do
|
|
167
|
+
before do
|
|
168
|
+
allow(ENV).to receive(:[]).with("PATHEXT").and_return(".com;.exe;.bat")
|
|
169
|
+
allow(RbConfig::CONFIG).to receive(:[]).with("EXEEXT").and_return(".exe")
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it "checks PATH for git executable with an extension found in PATHEXT" do
|
|
173
|
+
expect(File).to receive(:exist?).with(File.join(path, "git.com"))
|
|
174
|
+
expect(File).to receive(:exist?).with(File.join(path, "git.exe"))
|
|
175
|
+
expect(File).to receive(:exist?).with(File.join(path, "git.bat"))
|
|
176
|
+
cmd.have_git?
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|
|
@@ -0,0 +1,377 @@
|
|
|
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 "shared/custom_generator_cookbook"
|
|
20
|
+
require "shared/setup_git_committer_config"
|
|
21
|
+
require "chef-cli/command/generator_commands/build_cookbook"
|
|
22
|
+
require "mixlib/shellout"
|
|
23
|
+
|
|
24
|
+
describe ChefCLI::Command::GeneratorCommands::BuildCookbook do
|
|
25
|
+
|
|
26
|
+
include_context("setup_git_committer_config")
|
|
27
|
+
|
|
28
|
+
let(:argv) { %w{workflow_project} }
|
|
29
|
+
|
|
30
|
+
let(:stdout_io) { StringIO.new }
|
|
31
|
+
let(:stderr_io) { StringIO.new }
|
|
32
|
+
|
|
33
|
+
let(:expected_cookbook_file_relpaths) do
|
|
34
|
+
%w{
|
|
35
|
+
kitchen.yml
|
|
36
|
+
data_bags
|
|
37
|
+
data_bags/keys
|
|
38
|
+
data_bags/keys/delivery_builder_keys.json
|
|
39
|
+
test
|
|
40
|
+
test/fixtures
|
|
41
|
+
test/fixtures/cookbooks
|
|
42
|
+
test/fixtures/cookbooks/test
|
|
43
|
+
test/fixtures/cookbooks/test/metadata.rb
|
|
44
|
+
test/fixtures/cookbooks/test/recipes
|
|
45
|
+
test/fixtures/cookbooks/test/recipes/default.rb
|
|
46
|
+
Berksfile
|
|
47
|
+
chefignore
|
|
48
|
+
metadata.rb
|
|
49
|
+
README.md
|
|
50
|
+
LICENSE
|
|
51
|
+
recipes
|
|
52
|
+
recipes/default.rb
|
|
53
|
+
recipes/deploy.rb
|
|
54
|
+
recipes/functional.rb
|
|
55
|
+
recipes/lint.rb
|
|
56
|
+
recipes/provision.rb
|
|
57
|
+
recipes/publish.rb
|
|
58
|
+
recipes/quality.rb
|
|
59
|
+
recipes/security.rb
|
|
60
|
+
recipes/smoke.rb
|
|
61
|
+
recipes/syntax.rb
|
|
62
|
+
recipes/unit.rb
|
|
63
|
+
secrets
|
|
64
|
+
secrets/fakey-mcfakerton
|
|
65
|
+
}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
let(:expected_cookbook_files) do
|
|
69
|
+
expected_cookbook_file_relpaths.map do |relpath|
|
|
70
|
+
File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", relpath)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
subject(:cookbook_generator) do
|
|
75
|
+
described_class.new(argv)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def generator_context
|
|
79
|
+
ChefCLI::Generator.context
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
before do
|
|
83
|
+
ChefCLI::Generator.reset
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "configures the chef runner" do
|
|
87
|
+
expect(cookbook_generator.chef_runner).to be_a(ChefCLI::ChefRunner)
|
|
88
|
+
expect(cookbook_generator.chef_runner.cookbook_path).to eq(File.expand_path("lib/chef-cli/skeletons", project_root))
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
context "when given invalid/incomplete arguments" do
|
|
92
|
+
|
|
93
|
+
let(:expected_help_message) do
|
|
94
|
+
"Usage: chef generate build-cookbook NAME [options]\n"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def with_argv(argv)
|
|
98
|
+
generator = described_class.new(argv)
|
|
99
|
+
allow(generator).to receive(:stdout).and_return(stdout_io)
|
|
100
|
+
allow(generator).to receive(:stderr).and_return(stderr_io)
|
|
101
|
+
generator
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "prints usage when args are empty" do
|
|
105
|
+
with_argv([]).run
|
|
106
|
+
expect(stderr_io.string).to include(expected_help_message)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
context "when given the name of the delivery project" do
|
|
112
|
+
|
|
113
|
+
let(:argv) { %w{workflow_project} }
|
|
114
|
+
|
|
115
|
+
let(:project_dir) { File.join(tempdir, "workflow_project") }
|
|
116
|
+
|
|
117
|
+
before do
|
|
118
|
+
reset_tempdir
|
|
119
|
+
Dir.mkdir(project_dir)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "configures the generator context" do
|
|
123
|
+
cookbook_generator.read_and_validate_params
|
|
124
|
+
cookbook_generator.setup_context
|
|
125
|
+
expect(generator_context.workflow_project_dir).to eq(File.join(Dir.pwd, "workflow_project"))
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it "creates a build cookbook" do
|
|
129
|
+
Dir.chdir(tempdir) do
|
|
130
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
131
|
+
expect(cookbook_generator.run).to eq(0)
|
|
132
|
+
end
|
|
133
|
+
generated_files = Dir.glob("#{tempdir}/workflow_project/**/*", File::FNM_DOTMATCH)
|
|
134
|
+
expected_cookbook_files.each do |expected_file|
|
|
135
|
+
expect(generated_files).to include(expected_file)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
shared_examples_for "a generated file" do |context_var|
|
|
140
|
+
before do
|
|
141
|
+
Dir.chdir(tempdir) do
|
|
142
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
143
|
+
expect(cookbook_generator.run).to eq(0)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "should contain #{context_var} from the generator context" do
|
|
148
|
+
expect(File.read(file)).to include(line)
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# This shared example group requires a let binding for
|
|
153
|
+
# `expected_kitchen_yml_content`
|
|
154
|
+
shared_examples_for "kitchen_yml_and_integration_tests" do
|
|
155
|
+
|
|
156
|
+
describe "Generating Test Kitchen and integration testing files" do
|
|
157
|
+
|
|
158
|
+
before do
|
|
159
|
+
Dir.chdir(tempdir) do
|
|
160
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
161
|
+
expect(cookbook_generator.run).to eq(0)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
let(:file) { File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", "kitchen.yml") }
|
|
166
|
+
|
|
167
|
+
it "creates a kitchen.yml with the expected content" do
|
|
168
|
+
expect(IO.read(file)).to eq(expected_kitchen_yml_content)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
context "when the delivery project is a cookbook" do
|
|
175
|
+
|
|
176
|
+
let(:parent_metadata_rb) { File.join(tempdir, "workflow_project", "metadata.rb") }
|
|
177
|
+
|
|
178
|
+
before do
|
|
179
|
+
FileUtils.touch(parent_metadata_rb)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
it "detects that the parent project is a cookbook" do
|
|
183
|
+
Dir.chdir(tempdir) do
|
|
184
|
+
cookbook_generator.read_and_validate_params
|
|
185
|
+
cookbook_generator.setup_context
|
|
186
|
+
expect(generator_context.build_cookbook_parent_is_cookbook).to eq(true)
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
describe "metadata.rb" do
|
|
191
|
+
let(:file) { File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", "metadata.rb") }
|
|
192
|
+
|
|
193
|
+
include_examples "a generated file", :cookbook_name do
|
|
194
|
+
let(:line) do
|
|
195
|
+
<<~METADATA
|
|
196
|
+
name 'build_cookbook'
|
|
197
|
+
maintainer 'The Authors'
|
|
198
|
+
maintainer_email 'you@example.com'
|
|
199
|
+
license 'all_rights'
|
|
200
|
+
version '0.1.0'
|
|
201
|
+
chef_version '>= 14.0'
|
|
202
|
+
|
|
203
|
+
depends 'delivery-truck'
|
|
204
|
+
METADATA
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
describe "delivery phase recipes" do
|
|
210
|
+
|
|
211
|
+
before do
|
|
212
|
+
Dir.chdir(tempdir) do
|
|
213
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
214
|
+
expect(cookbook_generator.run).to eq(0)
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
it "generates phase recipes which include the corresponding delivery truck recipe" do
|
|
219
|
+
%w{
|
|
220
|
+
deploy.rb
|
|
221
|
+
functional.rb
|
|
222
|
+
lint.rb
|
|
223
|
+
provision.rb
|
|
224
|
+
publish.rb
|
|
225
|
+
quality.rb
|
|
226
|
+
security.rb
|
|
227
|
+
smoke.rb
|
|
228
|
+
syntax.rb
|
|
229
|
+
unit.rb
|
|
230
|
+
}.each do |phase_recipe|
|
|
231
|
+
recipe_file = File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", "recipes", phase_recipe)
|
|
232
|
+
phase = File.basename(phase_recipe, ".rb")
|
|
233
|
+
expected_content = %Q{include_recipe 'delivery-truck::#{phase}'}
|
|
234
|
+
expect(IO.read(recipe_file)).to include(expected_content)
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
context "when the delivery project is not a cookbook" do
|
|
243
|
+
|
|
244
|
+
it "detects that the parent project is not a cookbook" do
|
|
245
|
+
cookbook_generator.read_and_validate_params
|
|
246
|
+
cookbook_generator.setup_context
|
|
247
|
+
expect(generator_context.build_cookbook_parent_is_cookbook).to eq(false)
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
describe "metadata.rb" do
|
|
251
|
+
let(:file) { File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", "metadata.rb") }
|
|
252
|
+
|
|
253
|
+
include_examples "a generated file", :cookbook_name do
|
|
254
|
+
let(:line) do
|
|
255
|
+
<<~METADATA
|
|
256
|
+
name 'build_cookbook'
|
|
257
|
+
maintainer 'The Authors'
|
|
258
|
+
maintainer_email 'you@example.com'
|
|
259
|
+
license 'all_rights'
|
|
260
|
+
version '0.1.0'
|
|
261
|
+
METADATA
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
describe "delivery phase recipes" do
|
|
267
|
+
|
|
268
|
+
before do
|
|
269
|
+
Dir.chdir(tempdir) do
|
|
270
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
271
|
+
expect(cookbook_generator.run).to eq(0)
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
it "generates phase recipes that are empty" do
|
|
276
|
+
%w{
|
|
277
|
+
deploy.rb
|
|
278
|
+
functional.rb
|
|
279
|
+
lint.rb
|
|
280
|
+
provision.rb
|
|
281
|
+
publish.rb
|
|
282
|
+
quality.rb
|
|
283
|
+
security.rb
|
|
284
|
+
smoke.rb
|
|
285
|
+
syntax.rb
|
|
286
|
+
unit.rb
|
|
287
|
+
}.each do |phase_recipe|
|
|
288
|
+
recipe_file = File.join(tempdir, "workflow_project", ".delivery", "build_cookbook", "recipes", phase_recipe)
|
|
289
|
+
expect(IO.read(recipe_file)).to_not include("include_recipe")
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
context "when the delivery project is a git repo" do
|
|
298
|
+
|
|
299
|
+
let(:readme) { File.join(project_dir, "README.md") }
|
|
300
|
+
|
|
301
|
+
def git!(cmd)
|
|
302
|
+
Mixlib::ShellOut.new("git #{cmd}", cwd: project_dir).tap do |c|
|
|
303
|
+
c.run_command
|
|
304
|
+
c.error!
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
before do
|
|
309
|
+
FileUtils.touch(readme)
|
|
310
|
+
|
|
311
|
+
git!("init .")
|
|
312
|
+
git!("add .")
|
|
313
|
+
git!("commit --no-gpg-sign -m \"initial commit\"")
|
|
314
|
+
|
|
315
|
+
Dir.chdir(tempdir) do
|
|
316
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
317
|
+
expect(cookbook_generator.run).to eq(0)
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
it "creates delivery config in a feature branch and merges it" do
|
|
322
|
+
expect(git!("log").stdout).to include("Merge branch 'add-delivery-configuration'")
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
context "when the delivery project has already a config.json and project.toml" do
|
|
328
|
+
|
|
329
|
+
let(:dot_delivery) { File.join(project_dir, ".delivery") }
|
|
330
|
+
let(:config_json) { File.join(dot_delivery, "config.json") }
|
|
331
|
+
let(:project_toml) { File.join(dot_delivery, "project.toml") }
|
|
332
|
+
|
|
333
|
+
def git!(cmd)
|
|
334
|
+
Mixlib::ShellOut.new("git #{cmd}", cwd: project_dir).tap do |c|
|
|
335
|
+
c.run_command
|
|
336
|
+
c.error!
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
before do
|
|
341
|
+
FileUtils.mkdir_p(dot_delivery)
|
|
342
|
+
FileUtils.touch(config_json)
|
|
343
|
+
FileUtils.touch(project_toml)
|
|
344
|
+
|
|
345
|
+
git!("init .")
|
|
346
|
+
git!("add .")
|
|
347
|
+
git!("commit --no-gpg-sign -m \"initial commit\"")
|
|
348
|
+
|
|
349
|
+
Dir.chdir(tempdir) do
|
|
350
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
351
|
+
expect(cookbook_generator.run).to eq(0)
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
it "does not overwrite the delivery config" do
|
|
356
|
+
expect(git!("log").stdout).to_not include("Add generated delivery configuration")
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
context "when given a path including the .delivery directory" do
|
|
363
|
+
let(:argv) { [ File.join(tempdir, "workflow_project", ".delivery", "build_cookbook") ] }
|
|
364
|
+
|
|
365
|
+
before do
|
|
366
|
+
reset_tempdir
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
it "correctly sets the delivery project dir to the parent of the .delivery dir" do
|
|
370
|
+
cookbook_generator.read_and_validate_params
|
|
371
|
+
cookbook_generator.setup_context
|
|
372
|
+
expect(generator_context.workflow_project_dir).to eq(File.join(tempdir, "workflow_project"))
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
end
|