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 @@
|
|
|
1
|
+
# To learn more about Custom Resources, see https://docs.chef.io/custom_resources.html
|
|
File without changes
|
data/lib/chef-cli/ui.rb
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
module ChefCLI
|
|
19
|
+
class UI
|
|
20
|
+
|
|
21
|
+
class NullStream
|
|
22
|
+
|
|
23
|
+
def puts(*anything)
|
|
24
|
+
nil
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def print(*anything)
|
|
28
|
+
nil
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.null
|
|
34
|
+
new(out: NullStream.new, err: NullStream.new)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
attr_reader :out_stream
|
|
38
|
+
attr_reader :err_stream
|
|
39
|
+
|
|
40
|
+
def initialize(out: nil, err: nil)
|
|
41
|
+
@out_stream = out || $stdout
|
|
42
|
+
@err_stream = err || $stderr
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def err(message)
|
|
46
|
+
@err_stream.puts(message)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def msg(message)
|
|
50
|
+
@out_stream.puts(message)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def print(message)
|
|
54
|
+
@out_stream.print(message)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2014-2019 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
|
+
module ChefCLI
|
|
19
|
+
VERSION = "1.0.3".freeze
|
|
20
|
+
end
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2013, Fletcher Nichol
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
|
|
19
|
+
require "kitchen/provisioner/chef_base"
|
|
20
|
+
|
|
21
|
+
# TODO: chef-cli and kitchen can only co-exist if kitchen and chef-cli agree on
|
|
22
|
+
# the version of mixlib-shellout to use. Kitchen currently locked at 1.4,
|
|
23
|
+
# chef-cli is on 2.x
|
|
24
|
+
require_relative "../../chef-cli/policyfile_services/export_repo"
|
|
25
|
+
|
|
26
|
+
module Kitchen
|
|
27
|
+
|
|
28
|
+
module Provisioner
|
|
29
|
+
|
|
30
|
+
class Base
|
|
31
|
+
|
|
32
|
+
# PolicyfileZero needs to access the base behavior of creating the
|
|
33
|
+
# sandbox directory without invoking the behavior of
|
|
34
|
+
# ChefBase#create_sandbox, because that will trigger the use of
|
|
35
|
+
# Chef::CommonSandbox, which we need to override.
|
|
36
|
+
alias_method :create_sandbox_directory, :create_sandbox
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class PolicyfileSandbox < Chef::CommonSandbox
|
|
41
|
+
|
|
42
|
+
# Stub #prepare_cookbooks because we have implemented this in the
|
|
43
|
+
# provisioner, below. If a Berksfile is present, the default
|
|
44
|
+
# implementation will try to run Berkshelf, which can lead to dependency
|
|
45
|
+
# issues since berks is not yet using Solve 2.x. See also
|
|
46
|
+
# PolicyfileZero#load_needed_dependencies! which is stubbed to prevent
|
|
47
|
+
# berks from loading.
|
|
48
|
+
def prepare_cookbooks
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Policyfile + Chef Zero provisioner.
|
|
54
|
+
#
|
|
55
|
+
# @author Daniel DeLeo <dan@chef.io>
|
|
56
|
+
class PolicyfileZero < ChefBase
|
|
57
|
+
|
|
58
|
+
# This provsioner will forcibly set the following config options:
|
|
59
|
+
# * `use_policyfile`: `true`
|
|
60
|
+
# * `versioned_cookbooks`: `true`
|
|
61
|
+
# * `deployment_group`: `POLICY_NAME-local`
|
|
62
|
+
# Since it makes no sense to modify these, they are hardcoded elsewhere.
|
|
63
|
+
default_config :client_rb, {}
|
|
64
|
+
default_config :json_attributes, true
|
|
65
|
+
default_config :named_run_list, nil
|
|
66
|
+
default_config :chef_zero_host, nil
|
|
67
|
+
default_config :chef_zero_port, 8889
|
|
68
|
+
default_config :policyfile, "Policyfile.rb"
|
|
69
|
+
|
|
70
|
+
default_config :chef_client_path do |provisioner|
|
|
71
|
+
provisioner
|
|
72
|
+
.remote_path_join(%W{#{provisioner[:chef_omnibus_root]} bin chef-client})
|
|
73
|
+
.tap { |path| path.concat(".bat") if provisioner.windows_os? }
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
default_config :ruby_bindir do |provisioner|
|
|
77
|
+
provisioner
|
|
78
|
+
.remote_path_join(%W{#{provisioner[:chef_omnibus_root]} embedded bin})
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# (see Base#finalize_config!)
|
|
82
|
+
def finalize_config!(*args)
|
|
83
|
+
super
|
|
84
|
+
banner("Using policyfile mode for chef-client")
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# (see Base#create_sandbox)
|
|
88
|
+
def create_sandbox
|
|
89
|
+
create_sandbox_directory
|
|
90
|
+
PolicyfileSandbox.new(config, sandbox_path, instance).populate
|
|
91
|
+
prepare_cookbooks
|
|
92
|
+
prepare_validation_pem
|
|
93
|
+
prepare_client_rb
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# (see Base#run_command)
|
|
97
|
+
def run_command
|
|
98
|
+
level = config[:log_level] == :info ? :auto : config[:log_level]
|
|
99
|
+
|
|
100
|
+
cmd = "#{sudo(config[:chef_client_path])} --local-mode"
|
|
101
|
+
.tap { |str| str.insert(0, "& ") if powershell_shell? }
|
|
102
|
+
|
|
103
|
+
args = [
|
|
104
|
+
"--config #{config[:root_path]}/client.rb",
|
|
105
|
+
"--log_level #{level}",
|
|
106
|
+
"--force-formatter",
|
|
107
|
+
"--no-color",
|
|
108
|
+
]
|
|
109
|
+
if config[:chef_zero_port]
|
|
110
|
+
args << "--chef-zero-port #{config[:chef_zero_port]}"
|
|
111
|
+
end
|
|
112
|
+
if config[:log_file]
|
|
113
|
+
args << "--logfile #{config[:log_file]}"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
if config[:named_run_list]
|
|
117
|
+
args << "--named-run-list #{config[:named_run_list]}"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
wrap_shell_code(
|
|
121
|
+
[cmd, *args].join(" ")
|
|
122
|
+
.tap { |str| str.insert(0, reload_ps1_path) if windows_os? }
|
|
123
|
+
)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# We don't want to load Berkshelf or Librarian; Policyfile is managing
|
|
127
|
+
# dependencies, so these can only cause trouble.
|
|
128
|
+
def load_needed_dependencies!
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
private
|
|
132
|
+
|
|
133
|
+
# Overrides behavior of parent class so that dna.json isn't created; we
|
|
134
|
+
# don't need it.
|
|
135
|
+
#
|
|
136
|
+
# @api private
|
|
137
|
+
def prepare_json
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Copies the policyfile's cookbooks to the sandbox.
|
|
141
|
+
#
|
|
142
|
+
# @api private
|
|
143
|
+
def prepare_cookbooks
|
|
144
|
+
Kitchen.mutex.synchronize do
|
|
145
|
+
policy_exporter.run
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# An instance of ChefCLI::PolicyfileServices::ExportRepo, configured with
|
|
150
|
+
# the sandbox path. Calling `#run` on this copies the cookbooks to the
|
|
151
|
+
# sandbox. Calling `#policy_name` returns the policy's name.
|
|
152
|
+
#
|
|
153
|
+
# @api private
|
|
154
|
+
def policy_exporter
|
|
155
|
+
# Must force this because TK by default copies the current cookbook to the sandbox
|
|
156
|
+
# See ChefCLI::PolicyfileServices::ExportRepo#assert_export_dir_clean!
|
|
157
|
+
@policy_exporter ||= ChefCLI::PolicyfileServices::ExportRepo.new(policyfile: config[:policyfile],
|
|
158
|
+
export_dir: sandbox_path,
|
|
159
|
+
force: true)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Writes a fake (but valid) validation.pem into the sandbox directory.
|
|
163
|
+
#
|
|
164
|
+
# @api private
|
|
165
|
+
def prepare_validation_pem
|
|
166
|
+
info("Preparing validation.pem")
|
|
167
|
+
debug("Using a dummy validation.pem")
|
|
168
|
+
|
|
169
|
+
source = File.join(Kitchen.source_root, %w{support dummy-validation.pem})
|
|
170
|
+
FileUtils.cp(source, File.join(sandbox_path, "validation.pem"))
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Writes a client.rb configuration file to the sandbox directory.
|
|
174
|
+
#
|
|
175
|
+
# @api private
|
|
176
|
+
def prepare_client_rb
|
|
177
|
+
data = default_config_rb.merge(config[:client_rb])
|
|
178
|
+
|
|
179
|
+
data["use_policyfile"] = true
|
|
180
|
+
data["versioned_cookbooks"] = true
|
|
181
|
+
data["policy_name"] = policy_exporter.policy_name
|
|
182
|
+
data["policy_group"] = "local"
|
|
183
|
+
data["policy_document_native_api"] = true
|
|
184
|
+
|
|
185
|
+
info("Preparing client.rb")
|
|
186
|
+
debug("Creating client.rb from #{data.inspect}")
|
|
187
|
+
|
|
188
|
+
File.open(File.join(sandbox_path, "client.rb"), "wb") do |file|
|
|
189
|
+
file.write(format_config_file(data))
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
shared_examples_for "a file generator" do
|
|
2
|
+
|
|
3
|
+
let(:stdout_io) { StringIO.new }
|
|
4
|
+
let(:stderr_io) { StringIO.new }
|
|
5
|
+
|
|
6
|
+
def stdout
|
|
7
|
+
stdout_io.string
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def stderr
|
|
11
|
+
stderr_io.string
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
let(:expected_cookbook_root) { tempdir }
|
|
15
|
+
let(:cookbook_name) { "example_cookbook" }
|
|
16
|
+
|
|
17
|
+
let(:cookbook_path) { File.join(tempdir, cookbook_name) }
|
|
18
|
+
|
|
19
|
+
subject(:recipe_generator) do
|
|
20
|
+
generator = described_class.new(argv)
|
|
21
|
+
allow(generator).to receive(:stdout).and_return(stdout_io)
|
|
22
|
+
allow(generator).to receive(:stderr).and_return(stderr_io)
|
|
23
|
+
generator
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def generator_context
|
|
27
|
+
ChefCLI::Generator.context
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
before do
|
|
31
|
+
ChefCLI::Generator.reset
|
|
32
|
+
reset_tempdir
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
after(:each) do
|
|
36
|
+
ChefCLI::Generator::Context.reset
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context "when argv is empty" do
|
|
40
|
+
let(:argv) { [] }
|
|
41
|
+
|
|
42
|
+
it "emits an error message and exits" do
|
|
43
|
+
expected_stdout = "Usage: chef generate #{generator_name} [path/to/cookbook] NAME [options]"
|
|
44
|
+
|
|
45
|
+
expect(recipe_generator.run).to eq(1)
|
|
46
|
+
expect(stdout).to include(expected_stdout)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context "when CWD is a cookbook" do
|
|
51
|
+
|
|
52
|
+
let(:argv) { [ new_file_name ] }
|
|
53
|
+
|
|
54
|
+
before do
|
|
55
|
+
FileUtils.cp_r(File.join(fixtures_path, "example_cookbook"), tempdir)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "configures the generator context" do
|
|
59
|
+
Dir.chdir(cookbook_path) do
|
|
60
|
+
recipe_generator.read_and_validate_params
|
|
61
|
+
recipe_generator.setup_context
|
|
62
|
+
|
|
63
|
+
expect(generator_context.cookbook_root).to eq(expected_cookbook_root)
|
|
64
|
+
expect(generator_context.cookbook_name).to eq(cookbook_name)
|
|
65
|
+
expect(generator_context.new_file_basename).to eq(new_file_name)
|
|
66
|
+
expect(generator_context.recipe_name).to eq(new_file_name)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "creates a new recipe" do
|
|
71
|
+
Dir.chdir(cookbook_path) do
|
|
72
|
+
allow(recipe_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
73
|
+
recipe_generator.run
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
generated_files.each do |expected_file|
|
|
77
|
+
expect(File).to exist(File.join(cookbook_path, expected_file))
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context "when CWD is not a cookbook" do
|
|
84
|
+
context "and path to the cookbook is not given in the agv" do
|
|
85
|
+
let(:argv) { [ new_file_name ] }
|
|
86
|
+
|
|
87
|
+
it "emits an error message and exits" do
|
|
88
|
+
expected_stdout = "Usage: chef generate #{generator_name} [path/to/cookbook] NAME [options]"
|
|
89
|
+
expected_stderr = "Error: Directory #{Dir.pwd} is not a cookbook\n"
|
|
90
|
+
|
|
91
|
+
expect(recipe_generator.run).to eq(1)
|
|
92
|
+
expect(stdout).to include(expected_stdout)
|
|
93
|
+
expect(stderr).to eq(expected_stderr)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context "and path to the cookbook is given in the argv" do
|
|
98
|
+
let(:argv) { [cookbook_path, new_file_name ] }
|
|
99
|
+
|
|
100
|
+
before do
|
|
101
|
+
FileUtils.cp_r(File.join(fixtures_path, "example_cookbook"), tempdir)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "configures the generator context" do
|
|
105
|
+
recipe_generator.read_and_validate_params
|
|
106
|
+
recipe_generator.setup_context
|
|
107
|
+
|
|
108
|
+
expect(generator_context.cookbook_root).to eq(File.dirname(cookbook_path))
|
|
109
|
+
expect(generator_context.cookbook_name).to eq(cookbook_name)
|
|
110
|
+
expect(generator_context.new_file_basename).to eq(new_file_name)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "creates a new recipe" do
|
|
114
|
+
allow(recipe_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
115
|
+
recipe_generator.run
|
|
116
|
+
|
|
117
|
+
generated_files.each do |expected_file|
|
|
118
|
+
expect(File).to exist(File.join(cookbook_path, expected_file))
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
shared_examples_for "a generated file" do |context_var|
|
|
2
|
+
before do
|
|
3
|
+
Dir.chdir(tempdir) do
|
|
4
|
+
allow(generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
5
|
+
generator.run
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "should contain #{context_var} from the generator context" do
|
|
10
|
+
expect(File.read(file)).to match line
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
|
|
2
|
+
# Required `let` bindings:
|
|
3
|
+
# * `generator_name` in lowercase, e.g., "cookbook", "app"
|
|
4
|
+
# * `generator_arg`: argument to the generator command
|
|
5
|
+
# * `expected_cookbook_files`: a list of files the generator should create
|
|
6
|
+
shared_examples_for "custom generator cookbook" do
|
|
7
|
+
|
|
8
|
+
context "when given a generator-cookbook path" do
|
|
9
|
+
|
|
10
|
+
let(:default_generator_cookbook_path) { File.expand_path("lib/chef-cli/skeletons/code_generator", project_root) }
|
|
11
|
+
|
|
12
|
+
let(:generator_cookbook_path) { File.join(tempdir, "a_generator_cookbook") }
|
|
13
|
+
let(:generator_copyright_holder) { "Chef" }
|
|
14
|
+
let(:generator_email) { "mail@chef.io" }
|
|
15
|
+
let(:generator_license) { "Free as in Beer" }
|
|
16
|
+
|
|
17
|
+
let(:argv) { [generator_arg, "--generator-cookbook", generator_cookbook_path] }
|
|
18
|
+
|
|
19
|
+
let(:stdout_io) { StringIO.new }
|
|
20
|
+
|
|
21
|
+
subject(:code_generator) do
|
|
22
|
+
described_class.new(argv).tap do |gen|
|
|
23
|
+
allow(gen).to receive(:stdout).and_return(stdout_io)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
before do
|
|
28
|
+
reset_tempdir
|
|
29
|
+
code_generator.read_and_validate_params
|
|
30
|
+
allow(code_generator.config_loader).to receive(:load)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "configures the generator context" do
|
|
34
|
+
code_generator.setup_context
|
|
35
|
+
expect(generator_context.cookbook_name).to eq(generator_arg)
|
|
36
|
+
expect(code_generator.chef_runner.cookbook_path).to eq(tempdir)
|
|
37
|
+
expect(code_generator.chef_runner.run_list).to eq(["recipe[a_generator_cookbook::#{generator_name}]"])
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context "when the generator cookbook is configured in a configuration file" do
|
|
41
|
+
|
|
42
|
+
let(:argv) { [generator_arg] }
|
|
43
|
+
|
|
44
|
+
let(:generator_config) do
|
|
45
|
+
double("Generator Config Context",
|
|
46
|
+
license: generator_license,
|
|
47
|
+
copyright_holder: generator_copyright_holder,
|
|
48
|
+
email: generator_email)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
let(:chefcli_config) do
|
|
52
|
+
double("Mixlib::Config context for ChefCLI",
|
|
53
|
+
generator_cookbook: generator_cookbook_path,
|
|
54
|
+
generator: generator_config)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
before do
|
|
58
|
+
allow(code_generator).to receive(:chefcli_config).and_return(chefcli_config)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "configures the generator context" do
|
|
62
|
+
code_generator.setup_context
|
|
63
|
+
expect(generator_context.cookbook_name).to eq(generator_arg)
|
|
64
|
+
expect(code_generator.chef_runner.cookbook_path).to eq(tempdir)
|
|
65
|
+
expect(code_generator.chef_runner.run_list).to eq(["recipe[a_generator_cookbook::#{generator_name}]"])
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context "with an invalid generator-cookbook path" do
|
|
70
|
+
|
|
71
|
+
it "fails with an informative error" do
|
|
72
|
+
Dir.chdir(tempdir) do
|
|
73
|
+
allow(code_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
74
|
+
allow(code_generator).to receive(:stderr).and_return(stderr_io)
|
|
75
|
+
expect(code_generator.run).to eq(1)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
cookbook_path = File.dirname(generator_cookbook_path)
|
|
79
|
+
expected_msg = %Q{ERROR: Could not find cookbook(s) to satisfy run list ["recipe[a_generator_cookbook::#{generator_name}]"] in #{cookbook_path}}
|
|
80
|
+
|
|
81
|
+
expect(stderr_io.string).to include(expected_msg)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
context "with a generator-cookbook path to a specific cookbook" do
|
|
87
|
+
|
|
88
|
+
let(:metadata_file) { File.join(generator_cookbook_path, "metadata.rb") }
|
|
89
|
+
|
|
90
|
+
before do
|
|
91
|
+
FileUtils.cp_r(default_generator_cookbook_path, generator_cookbook_path)
|
|
92
|
+
|
|
93
|
+
# have to update metadata with the correct name
|
|
94
|
+
IO.binwrite(metadata_file, "name 'a_generator_cookbook'")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "creates the new files" do
|
|
98
|
+
expect(code_generator.chef_runner.cookbook_path).to eq(tempdir)
|
|
99
|
+
expect(code_generator.chef_runner.run_list).to eq(["recipe[a_generator_cookbook::#{generator_name}]"])
|
|
100
|
+
|
|
101
|
+
Dir.chdir(tempdir) do
|
|
102
|
+
allow(code_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
103
|
+
code_generator.run
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
context "with a generator-cookbook path to a directory containing a 'code_generator' cookbook" do
|
|
110
|
+
|
|
111
|
+
before do
|
|
112
|
+
FileUtils.mkdir_p(generator_cookbook_path)
|
|
113
|
+
FileUtils.cp_r(default_generator_cookbook_path, generator_cookbook_path)
|
|
114
|
+
|
|
115
|
+
allow(code_generator).to receive(:stderr).and_return(stderr_io)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it "creates the new_files (and warns about deprecated usage)" do
|
|
119
|
+
allow(code_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
120
|
+
|
|
121
|
+
Dir.chdir(tempdir) do
|
|
122
|
+
code_generator.run
|
|
123
|
+
end
|
|
124
|
+
generated_files = Dir.glob("#{tempdir}/#{generator_arg}/**/*", File::FNM_DOTMATCH)
|
|
125
|
+
expected_cookbook_files.each do |expected_file|
|
|
126
|
+
expect(generated_files).to include(expected_file)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
code_generator_path = File.join(generator_cookbook_path, "code_generator")
|
|
130
|
+
warning_message = "WARN: Please configure the generator cookbook by giving the full path to the desired cookbook (like '#{code_generator_path}')"
|
|
131
|
+
|
|
132
|
+
expect(stderr_io.string).to include(warning_message)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|