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,37 @@
|
|
|
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
|
+
require_relative "cookbook_code_file"
|
|
19
|
+
require_relative "../../dist"
|
|
20
|
+
|
|
21
|
+
module ChefCLI
|
|
22
|
+
module Command
|
|
23
|
+
module GeneratorCommands
|
|
24
|
+
# chef generate attribute [path/to/cookbook_root] NAME
|
|
25
|
+
class Attribute < CookbookCodeFile
|
|
26
|
+
|
|
27
|
+
banner "Usage: #{ChefCLI::Dist::EXEC} generate attribute [path/to/cookbook] NAME [options]"
|
|
28
|
+
|
|
29
|
+
options.merge!(SharedGeneratorOptions.options)
|
|
30
|
+
|
|
31
|
+
def recipe
|
|
32
|
+
"attribute"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,157 @@
|
|
|
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_relative "../../configurable"
|
|
19
|
+
require_relative "../generator_commands"
|
|
20
|
+
|
|
21
|
+
require_relative "chef_exts/recipe_dsl_ext"
|
|
22
|
+
require_relative "chef_exts/generator_desc_resource"
|
|
23
|
+
|
|
24
|
+
module ChefCLI
|
|
25
|
+
module Command
|
|
26
|
+
module GeneratorCommands
|
|
27
|
+
# ## Base
|
|
28
|
+
#
|
|
29
|
+
# Base class for `chef generate` subcommands. Contains basic behaviors
|
|
30
|
+
# for setting up the generator context, detecting git, and launching a
|
|
31
|
+
# chef converge.
|
|
32
|
+
#
|
|
33
|
+
# The behavior of the generators is largely delegated to a chef cookbook.
|
|
34
|
+
# The default implementation is the `code_generator` cookbook in
|
|
35
|
+
# chef-cli/skeletons/code_generator.
|
|
36
|
+
class Base < Command::Base
|
|
37
|
+
|
|
38
|
+
include Configurable
|
|
39
|
+
|
|
40
|
+
attr_reader :params
|
|
41
|
+
|
|
42
|
+
options.merge!(SharedGeneratorOptions.options)
|
|
43
|
+
|
|
44
|
+
def initialize(params)
|
|
45
|
+
super()
|
|
46
|
+
@params = params
|
|
47
|
+
|
|
48
|
+
@generator_cookbook_path = nil
|
|
49
|
+
@generator_cookbook_name = nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# An instance of ChefRunner. Calling ChefRunner#converge will trigger
|
|
53
|
+
# convergence and generate the desired code.
|
|
54
|
+
def chef_runner
|
|
55
|
+
@chef_runner ||= ChefRunner.new(generator_cookbook_path, ["recipe[#{generator_cookbook_name}::#{recipe}]"])
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Path to the directory where the code_generator cookbook is located.
|
|
59
|
+
def generator_cookbook_path
|
|
60
|
+
detect_generator_cookbook_name_and_path! unless @generator_cookbook_path
|
|
61
|
+
@generator_cookbook_path
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def generator_cookbook_name
|
|
65
|
+
detect_generator_cookbook_name_and_path! unless @generator_cookbook_name
|
|
66
|
+
@generator_cookbook_name
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Sets git related generator_context values.
|
|
70
|
+
def setup_context
|
|
71
|
+
apply_generator_values_from_config
|
|
72
|
+
Generator.add_attr_to_context(:have_git, have_git?)
|
|
73
|
+
Generator.add_attr_to_context(:skip_git_init, false)
|
|
74
|
+
config.each do |k, v|
|
|
75
|
+
Generator.add_attr_to_context(k, v)
|
|
76
|
+
end
|
|
77
|
+
# inject the arbitrary args supplied on cmdline, default = []
|
|
78
|
+
config[:generator_arg].each do |k, v|
|
|
79
|
+
Generator.add_attr_to_context(k, v)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Checks the `PATH` for the presence of a `git` (or `git.exe`, on
|
|
84
|
+
# windows) executable.
|
|
85
|
+
def have_git?
|
|
86
|
+
path = ENV["PATH"] || ""
|
|
87
|
+
paths = path.split(File::PATH_SEPARATOR)
|
|
88
|
+
exts = [RbConfig::CONFIG["EXEEXT"]]
|
|
89
|
+
exts.concat(ENV["PATHEXT"].split(";")) unless ENV["PATHEXT"].nil?
|
|
90
|
+
paths.any? do |bin_path|
|
|
91
|
+
exts.any? do |ext|
|
|
92
|
+
File.exist?(File.join(bin_path, "git#{ext}"))
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
private
|
|
98
|
+
|
|
99
|
+
# Inspects the `config[:generator_cookbook]` option to determine the
|
|
100
|
+
# generator_cookbook_name and generator_cookbook_path. There are two
|
|
101
|
+
# supported ways this can work:
|
|
102
|
+
#
|
|
103
|
+
# * `config[:generator_cookbook]` is the full path to the generator
|
|
104
|
+
# cookbook. In this case, the last path component is the cookbook name,
|
|
105
|
+
# and the parent directory is the cookbook path
|
|
106
|
+
# * `config[:generator_cookbook]` is the path to a directory that
|
|
107
|
+
# contains a cookbook named "code_generator" (DEPRECATED). This is how
|
|
108
|
+
# the `--generator-cookbook` feature was originally written, so we
|
|
109
|
+
# support this for backwards compatibility. This way has poor UX and
|
|
110
|
+
# we'd like to get rid of it, so a warning is printed in this case.
|
|
111
|
+
def detect_generator_cookbook_name_and_path!
|
|
112
|
+
given_path = generator_cookbook_option
|
|
113
|
+
code_generator_subdir = File.join(given_path, "code_generator")
|
|
114
|
+
if File.directory?(code_generator_subdir)
|
|
115
|
+
@generator_cookbook_name = "code_generator"
|
|
116
|
+
@generator_cookbook_path = given_path
|
|
117
|
+
err("WARN: Please configure the generator cookbook by giving the full path to the desired cookbook (like '#{code_generator_subdir}')")
|
|
118
|
+
else
|
|
119
|
+
@generator_cookbook_name = File.basename(given_path)
|
|
120
|
+
@generator_cookbook_path = File.dirname(given_path)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def generator_cookbook_option
|
|
125
|
+
config[:generator_cookbook] || chefcli_config.generator_cookbook
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Load any values that were not defined via cli switches from Chef
|
|
129
|
+
# configuration
|
|
130
|
+
#
|
|
131
|
+
def apply_generator_values_from_config
|
|
132
|
+
config[:copyright_holder] ||= coerce_generator_copyright_holder
|
|
133
|
+
config[:email] ||= coerce_generator_email
|
|
134
|
+
config[:license] ||= coerce_generator_license
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def coerce_generator_copyright_holder
|
|
138
|
+
generator_config.copyright_holder ||
|
|
139
|
+
knife_config.cookbook_copyright ||
|
|
140
|
+
"The Authors"
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def coerce_generator_email
|
|
144
|
+
generator_config.email ||
|
|
145
|
+
knife_config.cookbook_email ||
|
|
146
|
+
"you@example.com"
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def coerce_generator_license
|
|
150
|
+
generator_config.license ||
|
|
151
|
+
knife_config.cookbook_license ||
|
|
152
|
+
"all_rights"
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2016-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
|
+
require_relative "base"
|
|
19
|
+
require_relative "../../dist"
|
|
20
|
+
|
|
21
|
+
module ChefCLI
|
|
22
|
+
module Command
|
|
23
|
+
module GeneratorCommands
|
|
24
|
+
|
|
25
|
+
class BuildCookbook < Base
|
|
26
|
+
|
|
27
|
+
banner "Usage: #{ChefCLI::Dist::EXEC} generate build-cookbook NAME [options]"
|
|
28
|
+
|
|
29
|
+
attr_reader :errors
|
|
30
|
+
|
|
31
|
+
attr_reader :cookbook_name_or_path
|
|
32
|
+
|
|
33
|
+
option :pipeline,
|
|
34
|
+
long: "--pipeline PIPELINE",
|
|
35
|
+
description: "Use PIPELINE to set target branch to something other than master for the build_cookbook",
|
|
36
|
+
default: "master"
|
|
37
|
+
|
|
38
|
+
options.merge!(SharedGeneratorOptions.options)
|
|
39
|
+
|
|
40
|
+
def initialize(params)
|
|
41
|
+
@params_valid = true
|
|
42
|
+
@cookbook_name = nil
|
|
43
|
+
super
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def run
|
|
47
|
+
read_and_validate_params
|
|
48
|
+
if params_valid?
|
|
49
|
+
setup_context
|
|
50
|
+
chef_runner.converge
|
|
51
|
+
0
|
|
52
|
+
else
|
|
53
|
+
err(opt_parser)
|
|
54
|
+
1
|
|
55
|
+
end
|
|
56
|
+
rescue ChefCLI::ChefRunnerError => e
|
|
57
|
+
err("ERROR: #{e}")
|
|
58
|
+
1
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def setup_context
|
|
62
|
+
super
|
|
63
|
+
Generator.add_attr_to_context(:workflow_project_dir, workflow_project_dir)
|
|
64
|
+
|
|
65
|
+
Generator.add_attr_to_context(:workflow_project_git_initialized, workflow_project_git_initialized?)
|
|
66
|
+
Generator.add_attr_to_context(:build_cookbook_parent_is_cookbook, build_cookbook_parent_is_cookbook?)
|
|
67
|
+
|
|
68
|
+
Generator.add_attr_to_context(:pipeline, pipeline)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def pipeline
|
|
72
|
+
config[:pipeline]
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def recipe
|
|
76
|
+
"build_cookbook"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def build_cookbook_parent_is_cookbook?
|
|
80
|
+
metadata_json_path = File.join(workflow_project_dir, "metadata.json")
|
|
81
|
+
metadata_rb_path = File.join(workflow_project_dir, "metadata.rb")
|
|
82
|
+
|
|
83
|
+
File.exist?(metadata_json_path) || File.exist?(metadata_rb_path)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def workflow_project_dir
|
|
87
|
+
project_dir = File.expand_path(cookbook_name_or_path, Dir.pwd)
|
|
88
|
+
# Detect if we were invoked with arguments like
|
|
89
|
+
#
|
|
90
|
+
# chef generate build-cookbook project/.delivery/build_cookbook
|
|
91
|
+
#
|
|
92
|
+
# If so, normalize paths so we don't make a directory structure like
|
|
93
|
+
# `.delivery/.delivery/build_cookbook`.
|
|
94
|
+
#
|
|
95
|
+
# Note that we don't check the name of the build cookbook the user
|
|
96
|
+
# asked for and we hard-code to naming it "build_cookbook". We also
|
|
97
|
+
# don't catch the case that the user requested something like
|
|
98
|
+
# `project/.delivery/build_cookbook/extra-thing-that-shouldn't-be-here`
|
|
99
|
+
Pathname.new(project_dir).ascend do |dir|
|
|
100
|
+
if File.basename(dir) == ".delivery"
|
|
101
|
+
project_dir = File.dirname(dir)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
project_dir
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def workflow_project_git_initialized?
|
|
108
|
+
File.exist?(File.join(workflow_project_dir, ".git"))
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def read_and_validate_params
|
|
112
|
+
arguments = parse_options(params)
|
|
113
|
+
@cookbook_name_or_path = arguments[0]
|
|
114
|
+
unless @cookbook_name_or_path
|
|
115
|
+
@params_valid = false
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def params_valid?
|
|
120
|
+
@params_valid
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2016-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
|
+
require "chef/resource"
|
|
19
|
+
|
|
20
|
+
module ChefCLI
|
|
21
|
+
module ChefResource
|
|
22
|
+
|
|
23
|
+
# GeneratorDesc is similar to Chef's built-in log resource, but instead of
|
|
24
|
+
# sending output through the logger, it sends output through the output
|
|
25
|
+
# formatter, which avoids the extra formatting that the logger would add.
|
|
26
|
+
#
|
|
27
|
+
# As the name implies, it is used to describe the steps that the generator
|
|
28
|
+
# takes to create a cookbook.
|
|
29
|
+
class GeneratorDesc < Chef::Resource
|
|
30
|
+
resource_name :generator_desc
|
|
31
|
+
|
|
32
|
+
property :message, String, name_property: true
|
|
33
|
+
|
|
34
|
+
# Write the log to Chef's log
|
|
35
|
+
action :write do
|
|
36
|
+
run_context.events.subscribers.first.puts_line("- #{new_resource.message}")
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2016 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 "chef/formatters/doc"
|
|
19
|
+
|
|
20
|
+
module ChefCLI
|
|
21
|
+
|
|
22
|
+
# Subclass of Chef's standard 'doc' formatter that mutes messages that occur
|
|
23
|
+
# prior to convergence. This gives us cleaner output in general, but is
|
|
24
|
+
# especially noticeable when the standard formatter is disabled by the
|
|
25
|
+
# generator cookbook.
|
|
26
|
+
class QuieterDocFormatter < Chef::Formatters::Doc
|
|
27
|
+
|
|
28
|
+
cli_name(:chefcli_doc)
|
|
29
|
+
|
|
30
|
+
# Called when starting to collect gems from the cookbooks
|
|
31
|
+
def cookbook_gem_start(gems)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Called when cookbook loading starts.
|
|
35
|
+
def library_load_start(file_count)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2016 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 "chef/dsl/recipe"
|
|
19
|
+
|
|
20
|
+
module ChefCLI
|
|
21
|
+
|
|
22
|
+
# Methods here are mixed in to the Chef recipe DSL to provide extra
|
|
23
|
+
# functionality for generator cookbooks.
|
|
24
|
+
module RecipeDSLExt
|
|
25
|
+
|
|
26
|
+
# Replaces the current formatter (by default this is the `doc` formatter)
|
|
27
|
+
# with the null formatter, thus suppressing normal Chef output.
|
|
28
|
+
def silence_chef_formatter
|
|
29
|
+
old = run_context.events.subscribers.first
|
|
30
|
+
out, err = old.output.out, old.output.err
|
|
31
|
+
run_context.events.subscribers.clear
|
|
32
|
+
null_formatter = Chef::Formatters.new(:null, out, err)
|
|
33
|
+
run_context.events.register(null_formatter)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
Chef::DSL::Recipe.send(:include, ChefCLI::RecipeDSLExt)
|
|
@@ -0,0 +1,251 @@
|
|
|
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
|
+
require_relative "base"
|
|
19
|
+
require_relative "../../dist"
|
|
20
|
+
|
|
21
|
+
module ChefCLI
|
|
22
|
+
module Command
|
|
23
|
+
module GeneratorCommands
|
|
24
|
+
|
|
25
|
+
# ## CookbookFile
|
|
26
|
+
# chef generate cookbook path/to/basename --generator-cookbook=path/to/generator
|
|
27
|
+
#
|
|
28
|
+
# Generates a basic cookbook directory structure. Most file types are
|
|
29
|
+
# omitted, the user is expected to add additional files as needed using
|
|
30
|
+
# the relevant generators.
|
|
31
|
+
class Cookbook < Base
|
|
32
|
+
|
|
33
|
+
banner "Usage: #{ChefCLI::Dist::EXEC} generate cookbook NAME [options]"
|
|
34
|
+
|
|
35
|
+
attr_reader :errors
|
|
36
|
+
|
|
37
|
+
attr_reader :cookbook_name_or_path
|
|
38
|
+
|
|
39
|
+
option :berks,
|
|
40
|
+
short: "-b",
|
|
41
|
+
long: "--berks",
|
|
42
|
+
description: "Generate cookbooks using Berkshelf dependency resolution.",
|
|
43
|
+
boolean: true,
|
|
44
|
+
default: nil
|
|
45
|
+
|
|
46
|
+
option :kitchen,
|
|
47
|
+
long: "--kitchen CONFIGURATION",
|
|
48
|
+
description: "Generate cookbooks with a specific Test Kitchen configuration (dokken|vagrant) - defaults to vagrant",
|
|
49
|
+
default: "vagrant"
|
|
50
|
+
|
|
51
|
+
option :policy,
|
|
52
|
+
short: "-P",
|
|
53
|
+
long: "--policy",
|
|
54
|
+
description: "Generate a cookbook using Policyfile dependency resolution (default).",
|
|
55
|
+
boolean: true,
|
|
56
|
+
default: nil
|
|
57
|
+
|
|
58
|
+
option :workflow,
|
|
59
|
+
short: "-w",
|
|
60
|
+
long: "--workflow",
|
|
61
|
+
description: "Generate a cookbook with a full #{ChefCLI::Dist::WORKFLOW} build cookbook.",
|
|
62
|
+
boolean: true,
|
|
63
|
+
default: false
|
|
64
|
+
|
|
65
|
+
option :verbose,
|
|
66
|
+
short: "-V",
|
|
67
|
+
long: "--verbose",
|
|
68
|
+
description: "Show detailed output from the generator",
|
|
69
|
+
boolean: true,
|
|
70
|
+
default: false
|
|
71
|
+
|
|
72
|
+
option :pipeline,
|
|
73
|
+
long: "--pipeline PIPELINE",
|
|
74
|
+
description: "Use PIPELINE to set target branch to something other than master for the #{ChefCLI::Dist::WORKFLOW} build_cookbook",
|
|
75
|
+
default: "master"
|
|
76
|
+
|
|
77
|
+
options.merge!(SharedGeneratorOptions.options)
|
|
78
|
+
|
|
79
|
+
def initialize(params)
|
|
80
|
+
@params_valid = true
|
|
81
|
+
@cookbook_name = nil
|
|
82
|
+
@policy_mode = true
|
|
83
|
+
@verbose = false
|
|
84
|
+
super
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def run
|
|
88
|
+
read_and_validate_params
|
|
89
|
+
if params_valid?
|
|
90
|
+
setup_context
|
|
91
|
+
msg("Generating cookbook #{cookbook_name}")
|
|
92
|
+
chef_runner.converge
|
|
93
|
+
msg("")
|
|
94
|
+
emit_post_create_message
|
|
95
|
+
0
|
|
96
|
+
else
|
|
97
|
+
err(opt_parser)
|
|
98
|
+
1
|
|
99
|
+
end
|
|
100
|
+
rescue ChefCLI::ChefRunnerError => e
|
|
101
|
+
err("ERROR: #{e}")
|
|
102
|
+
1
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def emit_post_create_message
|
|
106
|
+
if have_delivery_config?
|
|
107
|
+
msg("Your cookbook is ready. To setup the pipeline, type `cd #{cookbook_name_or_path}`, then run `delivery init`")
|
|
108
|
+
else
|
|
109
|
+
msg("Your cookbook is ready. Type `cd #{cookbook_name_or_path}` to enter it.")
|
|
110
|
+
msg("\nThere are several commands you can run to get started locally developing and testing your cookbook.")
|
|
111
|
+
msg("Type `delivery local --help` to see a full list of local testing commands.")
|
|
112
|
+
msg("\nWhy not start by writing an InSpec test? Tests for the default recipe are stored at:\n")
|
|
113
|
+
msg("test/integration/default/default_test.rb")
|
|
114
|
+
msg("\nIf you'd prefer to dive right in, the default recipe can be found at:")
|
|
115
|
+
msg("\nrecipes/default.rb\n")
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def setup_context
|
|
120
|
+
super
|
|
121
|
+
Generator.add_attr_to_context(:skip_git_init, cookbook_path_in_git_repo?)
|
|
122
|
+
Generator.add_attr_to_context(:cookbook_root, cookbook_root)
|
|
123
|
+
Generator.add_attr_to_context(:cookbook_name, cookbook_name)
|
|
124
|
+
Generator.add_attr_to_context(:recipe_name, recipe_name)
|
|
125
|
+
Generator.add_attr_to_context(:include_chef_repo_source, false)
|
|
126
|
+
Generator.add_attr_to_context(:policy_name, policy_name)
|
|
127
|
+
Generator.add_attr_to_context(:policy_run_list, policy_run_list)
|
|
128
|
+
Generator.add_attr_to_context(:policy_local_cookbook, ".")
|
|
129
|
+
|
|
130
|
+
Generator.add_attr_to_context(:enable_workflow, enable_workflow?)
|
|
131
|
+
Generator.add_attr_to_context(:workflow_project_dir, cookbook_full_path)
|
|
132
|
+
Generator.add_attr_to_context(:build_cookbook_parent_is_cookbook, true)
|
|
133
|
+
Generator.add_attr_to_context(:workflow_project_git_initialized, have_git? && !cookbook_path_in_git_repo?)
|
|
134
|
+
|
|
135
|
+
Generator.add_attr_to_context(:verbose, verbose?)
|
|
136
|
+
|
|
137
|
+
Generator.add_attr_to_context(:use_policyfile, policy_mode?)
|
|
138
|
+
Generator.add_attr_to_context(:pipeline, pipeline)
|
|
139
|
+
Generator.add_attr_to_context(:kitchen, kitchen)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def kitchen
|
|
143
|
+
config[:kitchen]
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def pipeline
|
|
147
|
+
config[:pipeline]
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def policy_name
|
|
151
|
+
cookbook_name
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def policy_run_list
|
|
155
|
+
"#{cookbook_name}::#{recipe_name}"
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def recipe
|
|
159
|
+
"cookbook"
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def recipe_name
|
|
163
|
+
"default"
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def cookbook_name
|
|
167
|
+
File.basename(cookbook_full_path)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def cookbook_root
|
|
171
|
+
File.dirname(cookbook_full_path)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def cookbook_full_path
|
|
175
|
+
File.expand_path(cookbook_name_or_path, Dir.pwd)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def policy_mode?
|
|
179
|
+
@policy_mode
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def enable_workflow?
|
|
183
|
+
config[:workflow]
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def verbose?
|
|
187
|
+
@verbose
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def have_delivery_config?
|
|
191
|
+
# delivery-cli's logic is to look recursively upward for
|
|
192
|
+
# .delivery/cli.toml starting from pwd:
|
|
193
|
+
# https://github.com/chef/delivery-cli/blob/22cbef3987ebd0aee98405b7e161a100edc87e49/src/delivery/config/mod.rs#L225-L247
|
|
194
|
+
|
|
195
|
+
path_to_check = File.expand_path(Dir.pwd)
|
|
196
|
+
result = false
|
|
197
|
+
|
|
198
|
+
Pathname.new(path_to_check).ascend do |path|
|
|
199
|
+
if contains_delivery_cli_toml?(path)
|
|
200
|
+
result = true
|
|
201
|
+
break
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
result
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def contains_delivery_cli_toml?(path)
|
|
209
|
+
delivery_cli_path = path.join(".delivery/cli.toml")
|
|
210
|
+
delivery_cli_path.exist?
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def read_and_validate_params
|
|
214
|
+
arguments = parse_options(params)
|
|
215
|
+
@cookbook_name_or_path = arguments[0]
|
|
216
|
+
if !@cookbook_name_or_path
|
|
217
|
+
@params_valid = false
|
|
218
|
+
elsif /-/ =~ File.basename(@cookbook_name_or_path)
|
|
219
|
+
msg("Hyphens are discouraged in cookbook names as they may cause problems with custom resources. See https://docs.chef.io/ctl_chef.html#chef-generate-cookbook for more information.")
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
if config[:berks] && config[:policy]
|
|
223
|
+
err("Berkshelf and Policyfiles are mutually exclusive. Please specify only one.")
|
|
224
|
+
@params_valid = false
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
if config[:berks]
|
|
228
|
+
@policy_mode = false
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
if config[:verbose]
|
|
232
|
+
@verbose = true
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
true
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def params_valid?
|
|
239
|
+
@params_valid
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def cookbook_path_in_git_repo?
|
|
243
|
+
Pathname.new(cookbook_full_path).ascend do |dir|
|
|
244
|
+
return true if File.directory?(File.join(dir.to_s, ".git"))
|
|
245
|
+
end
|
|
246
|
+
false
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|