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,77 @@
|
|
|
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 "spec_helper"
|
|
19
|
+
require "stringio"
|
|
20
|
+
|
|
21
|
+
require "chef/run_context"
|
|
22
|
+
require "chef/cookbook/cookbook_collection"
|
|
23
|
+
require "chef/node"
|
|
24
|
+
require "chef/event_dispatch/dispatcher"
|
|
25
|
+
require "chef/formatters/base"
|
|
26
|
+
|
|
27
|
+
require "ohai/system"
|
|
28
|
+
|
|
29
|
+
require "chef-cli/command/generator_commands/chef_exts/generator_desc_resource"
|
|
30
|
+
|
|
31
|
+
describe ChefCLI::ChefResource::GeneratorDesc do
|
|
32
|
+
|
|
33
|
+
let(:node) { Chef::Node.new }
|
|
34
|
+
|
|
35
|
+
let(:stdout) { StringIO.new }
|
|
36
|
+
|
|
37
|
+
let(:stderr) { StringIO.new }
|
|
38
|
+
|
|
39
|
+
let(:null_formatter) { Chef::Formatters.new(:null, stdout, stderr) }
|
|
40
|
+
|
|
41
|
+
let(:events) do
|
|
42
|
+
Chef::EventDispatch::Dispatcher.new.tap do |d|
|
|
43
|
+
d.register(null_formatter)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
let(:cookbook_collection) { Chef::CookbookCollection.new }
|
|
48
|
+
|
|
49
|
+
let(:run_context) { Chef::RunContext.new(node, cookbook_collection, events) }
|
|
50
|
+
|
|
51
|
+
let(:message) { "this part of the cookbook does a thing" }
|
|
52
|
+
|
|
53
|
+
let(:resource) { described_class.new(message, run_context) }
|
|
54
|
+
|
|
55
|
+
let(:provider) { resource.provider_for_action(:write) }
|
|
56
|
+
|
|
57
|
+
describe "resource" do
|
|
58
|
+
|
|
59
|
+
it "has the message it was created with" do
|
|
60
|
+
expect(resource.message).to eq(message)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "defaults to action :write" do
|
|
64
|
+
expect(resource.action).to eq( [ :write ] )
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "is identified by the message property" do
|
|
68
|
+
expect(resource.identity).to eq(message)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "writes the message to the formatter" do
|
|
72
|
+
provider.action_write
|
|
73
|
+
expect(stdout.string).to include(message)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
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 "spec_helper"
|
|
19
|
+
require "stringio"
|
|
20
|
+
|
|
21
|
+
require "chef/config"
|
|
22
|
+
require "chef/recipe"
|
|
23
|
+
require "chef/run_context"
|
|
24
|
+
require "chef/event_dispatch/dispatcher"
|
|
25
|
+
require "chef/policy_builder"
|
|
26
|
+
require "chef/formatters/doc"
|
|
27
|
+
require "chef/cookbook/file_vendor"
|
|
28
|
+
require "chef/cookbook/file_system_file_vendor"
|
|
29
|
+
require "chef/cookbook/cookbook_collection"
|
|
30
|
+
require "chef/cookbook_loader"
|
|
31
|
+
|
|
32
|
+
require "ohai/system"
|
|
33
|
+
|
|
34
|
+
require "chef-cli/command/generator_commands/chef_exts/recipe_dsl_ext"
|
|
35
|
+
require "chef-cli/command/generator_commands/chef_exts/quieter_doc_formatter"
|
|
36
|
+
|
|
37
|
+
describe ChefCLI::RecipeDSLExt do
|
|
38
|
+
|
|
39
|
+
before(:all) { Chef.reset! }
|
|
40
|
+
|
|
41
|
+
let(:stdout) { StringIO.new }
|
|
42
|
+
|
|
43
|
+
let(:stderr) { StringIO.new }
|
|
44
|
+
|
|
45
|
+
let(:doc_formatter) do
|
|
46
|
+
Chef::Formatters.new(:chefcli_doc, stdout, stderr)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
let(:event_dispatcher) do
|
|
50
|
+
Chef::EventDispatch::Dispatcher.new.tap do |d|
|
|
51
|
+
d.register(doc_formatter)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
let(:run_list) { [ ] }
|
|
56
|
+
|
|
57
|
+
let(:ohai) do
|
|
58
|
+
Ohai::System.new.tap do |o|
|
|
59
|
+
o.all_plugins(%w{platform platform_version})
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
let(:policy_builder) do
|
|
64
|
+
Chef::PolicyBuilder::Dynamic.new("chef-cli", ohai.data, {}, nil, event_dispatcher).tap do |b|
|
|
65
|
+
b.load_node
|
|
66
|
+
b.build_node
|
|
67
|
+
b.node.run_list(*run_list)
|
|
68
|
+
b.expand_run_list
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# In some circumstances (not totally clear about what), compat resource gets
|
|
73
|
+
# loaded and it does some weird stuff to `Chef::Recipe.new` which can fail if
|
|
74
|
+
# you pass in a cookbook name that is bogus and not-falsey. Using `nil` for
|
|
75
|
+
# the cookbook name works around that.
|
|
76
|
+
# https://github.com/chef-cookbooks/compat_resource/blob/3d948a5a9cabccddc7cf5e48dfea796a6b557a44/files/lib/chef_compat/monkeypatches/chef/recipe.rb#L8-L15
|
|
77
|
+
let(:cookbook_name) { nil }
|
|
78
|
+
|
|
79
|
+
let(:recipe_name) { "example" }
|
|
80
|
+
|
|
81
|
+
let(:run_context) { policy_builder.setup_run_context }
|
|
82
|
+
|
|
83
|
+
let(:recipe) { Chef::Recipe.new(cookbook_name, recipe_name, run_context) }
|
|
84
|
+
|
|
85
|
+
before do
|
|
86
|
+
Chef::Config.solo_legacy_mode = true
|
|
87
|
+
Chef::Config.color = true
|
|
88
|
+
Chef::Config.diff_disabled = true
|
|
89
|
+
Chef::Config.use_policyfile = false
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
describe "silence_chef_formatter" do
|
|
93
|
+
|
|
94
|
+
before do
|
|
95
|
+
recipe.silence_chef_formatter
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
let(:formatter) { run_context.events.subscribers.first }
|
|
99
|
+
|
|
100
|
+
it "replaces the default formatter with a null formatter" do
|
|
101
|
+
expect(formatter).to be_a(Chef::Formatters::NullFormatter)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "passes stdout and stderr from the default formatter to the new one" do
|
|
105
|
+
expect(formatter.output.out).to be(stdout)
|
|
106
|
+
expect(formatter.output.err).to be(stderr)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require "spec_helper"
|
|
19
|
+
require "shared/a_file_generator"
|
|
20
|
+
require "chef-cli/command/generator_commands/cookbook_file"
|
|
21
|
+
|
|
22
|
+
describe ChefCLI::Command::GeneratorCommands::CookbookFile do
|
|
23
|
+
|
|
24
|
+
include_examples "a file generator" do
|
|
25
|
+
|
|
26
|
+
let(:generator_name) { "file" }
|
|
27
|
+
let(:generated_files) { [ "files/new_file.txt" ] }
|
|
28
|
+
let(:new_file_name) { "new_file.txt" }
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,769 @@
|
|
|
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 "spec_helper"
|
|
19
|
+
require "shared/custom_generator_cookbook"
|
|
20
|
+
require "shared/setup_git_committer_config"
|
|
21
|
+
require "chef-cli/command/generator_commands/cookbook"
|
|
22
|
+
|
|
23
|
+
describe ChefCLI::Command::GeneratorCommands::Cookbook do
|
|
24
|
+
|
|
25
|
+
include_context("setup_git_committer_config")
|
|
26
|
+
|
|
27
|
+
let(:argv) { %w{new_cookbook} }
|
|
28
|
+
|
|
29
|
+
let(:stdout_io) { StringIO.new }
|
|
30
|
+
let(:stderr_io) { StringIO.new }
|
|
31
|
+
|
|
32
|
+
let(:expected_cookbook_file_relpaths) do
|
|
33
|
+
%w{
|
|
34
|
+
.gitignore
|
|
35
|
+
kitchen.yml
|
|
36
|
+
test
|
|
37
|
+
test/integration
|
|
38
|
+
test/integration/default/default_test.rb
|
|
39
|
+
Policyfile.rb
|
|
40
|
+
chefignore
|
|
41
|
+
LICENSE
|
|
42
|
+
metadata.rb
|
|
43
|
+
README.md
|
|
44
|
+
CHANGELOG.md
|
|
45
|
+
recipes
|
|
46
|
+
recipes/default.rb
|
|
47
|
+
spec
|
|
48
|
+
spec/spec_helper.rb
|
|
49
|
+
spec/unit
|
|
50
|
+
spec/unit/recipes
|
|
51
|
+
spec/unit/recipes/default_spec.rb
|
|
52
|
+
}
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
let(:expected_cookbook_files) do
|
|
56
|
+
expected_cookbook_file_relpaths.map do |relpath|
|
|
57
|
+
File.join(tempdir, "new_cookbook", relpath)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
let(:non_delivery_breadcrumb) do
|
|
62
|
+
<<~EOF
|
|
63
|
+
Your cookbook is ready. Type `cd new_cookbook` to enter it.
|
|
64
|
+
|
|
65
|
+
There are several commands you can run to get started locally developing and testing your cookbook.
|
|
66
|
+
Type `delivery local --help` to see a full list of local testing commands.
|
|
67
|
+
|
|
68
|
+
Why not start by writing an InSpec test? Tests for the default recipe are stored at:
|
|
69
|
+
|
|
70
|
+
test/integration/default/default_test.rb
|
|
71
|
+
|
|
72
|
+
If you'd prefer to dive right in, the default recipe can be found at:
|
|
73
|
+
|
|
74
|
+
recipes/default.rb
|
|
75
|
+
EOF
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
subject(:cookbook_generator) do
|
|
79
|
+
g = described_class.new(argv)
|
|
80
|
+
allow(g).to receive(:cookbook_path_in_git_repo?).and_return(false)
|
|
81
|
+
allow(g).to receive(:stdout).and_return(stdout_io)
|
|
82
|
+
g
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def generator_context
|
|
86
|
+
ChefCLI::Generator.context
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
before do
|
|
90
|
+
ChefCLI::Generator.reset
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
include_examples "custom generator cookbook" do
|
|
94
|
+
|
|
95
|
+
let(:generator_arg) { "new_cookbook" }
|
|
96
|
+
|
|
97
|
+
let(:generator_name) { "cookbook" }
|
|
98
|
+
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it "configures the chef runner" do
|
|
102
|
+
expect(cookbook_generator.chef_runner).to be_a(ChefCLI::ChefRunner)
|
|
103
|
+
expect(cookbook_generator.chef_runner.cookbook_path).to eq(File.expand_path("lib/chef-cli/skeletons", project_root))
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
context "when given invalid/incomplete arguments" do
|
|
107
|
+
|
|
108
|
+
let(:expected_help_message) do
|
|
109
|
+
"Usage: chef generate cookbook NAME [options]\n"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def with_argv(argv)
|
|
113
|
+
generator = described_class.new(argv)
|
|
114
|
+
allow(generator).to receive(:stdout).and_return(stdout_io)
|
|
115
|
+
allow(generator).to receive(:stderr).and_return(stderr_io)
|
|
116
|
+
generator
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "prints usage when args are empty" do
|
|
120
|
+
with_argv([]).run
|
|
121
|
+
expect(stderr_io.string).to include(expected_help_message)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "errors if both berks and policyfiles are requested" do
|
|
125
|
+
expect(with_argv(%w{my_cookbook --berks --policy}).run).to eq(1)
|
|
126
|
+
message = "Berkshelf and Policyfiles are mutually exclusive. Please specify only one."
|
|
127
|
+
expect(stderr_io.string).to include(message)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
it "warns if a hyphenated cookbook name is passed" do
|
|
131
|
+
expect(with_argv(%w{my-cookbook}).run).to eq(0)
|
|
132
|
+
message = "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."
|
|
133
|
+
expect(stdout_io.string).to include(message)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
context "when given the name of the cookbook to generate" do
|
|
139
|
+
|
|
140
|
+
let(:argv) { %w{new_cookbook} }
|
|
141
|
+
|
|
142
|
+
before do
|
|
143
|
+
reset_tempdir
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it "configures the generator context" do
|
|
147
|
+
cookbook_generator.read_and_validate_params
|
|
148
|
+
cookbook_generator.setup_context
|
|
149
|
+
expect(generator_context.cookbook_root).to eq(Dir.pwd)
|
|
150
|
+
expect(generator_context.cookbook_name).to eq("new_cookbook")
|
|
151
|
+
expect(generator_context.recipe_name).to eq("default")
|
|
152
|
+
expect(generator_context.verbose).to be(false)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it "creates a new cookbook" do
|
|
156
|
+
Dir.chdir(tempdir) do
|
|
157
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
158
|
+
expect(cookbook_generator.run).to eq(0)
|
|
159
|
+
end
|
|
160
|
+
generated_files = Dir.glob("#{tempdir}/new_cookbook/**/*", File::FNM_DOTMATCH)
|
|
161
|
+
expected_cookbook_files.each do |expected_file|
|
|
162
|
+
expect(generated_files).to include(expected_file)
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
context "when passed workflow option" do
|
|
167
|
+
|
|
168
|
+
context "generates a workflow (delivery) cookbook" do
|
|
169
|
+
|
|
170
|
+
let(:argv) { %w{new_cookbook --workflow} }
|
|
171
|
+
|
|
172
|
+
let(:dot_delivery) { File.join(tempdir, "new_cookbook", ".delivery") }
|
|
173
|
+
|
|
174
|
+
before do
|
|
175
|
+
Dir.chdir(tempdir) do
|
|
176
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
177
|
+
expect(cookbook_generator.run).to eq(0)
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
describe ".delivery/project.toml" do
|
|
182
|
+
|
|
183
|
+
let(:file) { File.join(tempdir, "new_cookbook", ".delivery", "project.toml") }
|
|
184
|
+
|
|
185
|
+
let(:expected_content) do
|
|
186
|
+
<<~PROJECT_DOT_TOML
|
|
187
|
+
# Delivery for Local Phases Execution
|
|
188
|
+
#
|
|
189
|
+
# This file allows you to execute test phases locally on a workstation or
|
|
190
|
+
# in a CI pipeline. The delivery-cli will read this file and execute the
|
|
191
|
+
# command(s) that are configured for each phase. You can customize them
|
|
192
|
+
# by just modifying the phase key on this file.
|
|
193
|
+
#
|
|
194
|
+
# By default these phases are configured for Cookbook Workflow only
|
|
195
|
+
#
|
|
196
|
+
|
|
197
|
+
[local_phases]
|
|
198
|
+
unit = "chef exec rspec spec/"
|
|
199
|
+
lint = "chef exec cookstyle"
|
|
200
|
+
# Foodcritic includes rules only appropriate for community cookbooks
|
|
201
|
+
# uploaded to Supermarket. We turn off any rules tagged "supermarket"
|
|
202
|
+
# by default. If you plan to share this cookbook you should remove
|
|
203
|
+
# '-t ~supermarket' below to enable supermarket rules.
|
|
204
|
+
syntax = "chef exec foodcritic . -t ~supermarket"
|
|
205
|
+
provision = "chef exec kitchen create"
|
|
206
|
+
deploy = "chef exec kitchen converge"
|
|
207
|
+
smoke = "chef exec kitchen verify"
|
|
208
|
+
# The functional phase is optional, you can define it by uncommenting
|
|
209
|
+
# the line below and running the command: `delivery local functional`
|
|
210
|
+
# functional = ""
|
|
211
|
+
cleanup = "chef exec kitchen destroy"
|
|
212
|
+
|
|
213
|
+
# Remote project.toml file
|
|
214
|
+
#
|
|
215
|
+
# Instead of the local phases above, you may specify a remote URI location for
|
|
216
|
+
# the `project.toml` file. This is useful for teams that wish to centrally
|
|
217
|
+
# manage the behavior of the `delivery local` command across many different
|
|
218
|
+
# projects.
|
|
219
|
+
#
|
|
220
|
+
# remote_file = "https://url/project.toml"
|
|
221
|
+
PROJECT_DOT_TOML
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it "exists with default config for Cookbook Workflow" do
|
|
225
|
+
expect(IO.read(file)).to eq(expected_content)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
describe ".delivery/config.json" do
|
|
231
|
+
|
|
232
|
+
let(:file) { File.join(tempdir, "new_cookbook", ".delivery", "config.json") }
|
|
233
|
+
|
|
234
|
+
let(:expected_content) do
|
|
235
|
+
<<~CONFIG_DOT_JSON
|
|
236
|
+
{
|
|
237
|
+
"version": "2",
|
|
238
|
+
"build_cookbook": {
|
|
239
|
+
"name": "build_cookbook",
|
|
240
|
+
"path": ".delivery/build_cookbook"
|
|
241
|
+
},
|
|
242
|
+
"delivery-truck": {
|
|
243
|
+
"lint": {
|
|
244
|
+
"enable_cookstyle": true
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
"skip_phases": [],
|
|
248
|
+
"job_dispatch": {
|
|
249
|
+
"version": "v2"
|
|
250
|
+
},
|
|
251
|
+
"dependencies": []
|
|
252
|
+
}
|
|
253
|
+
CONFIG_DOT_JSON
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
it "configures delivery to use a local build cookbook" do
|
|
257
|
+
expect(IO.read(file)).to eq(expected_content)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
describe "build cookbook recipes" do
|
|
263
|
+
|
|
264
|
+
let(:file) do
|
|
265
|
+
File.join(dot_delivery, "build_cookbook", "recipes", "publish.rb")
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
let(:expected_content) do
|
|
269
|
+
<<~CONFIG_DOT_JSON
|
|
270
|
+
#
|
|
271
|
+
# Cookbook:: build_cookbook
|
|
272
|
+
# Recipe:: publish
|
|
273
|
+
#
|
|
274
|
+
# Copyright:: 2019, The Authors, All Rights Reserved.
|
|
275
|
+
|
|
276
|
+
include_recipe 'delivery-truck::publish'
|
|
277
|
+
CONFIG_DOT_JSON
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
it "delegates functionality to delivery-truck" do
|
|
281
|
+
expect(IO.read(file)).to include(expected_content)
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
describe "build cookbook Berksfile" do
|
|
287
|
+
|
|
288
|
+
let(:file) do
|
|
289
|
+
File.join(dot_delivery, "build_cookbook", "Berksfile")
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
let(:expected_content) do
|
|
293
|
+
<<~CONFIG_DOT_JSON
|
|
294
|
+
source 'https://supermarket.chef.io'
|
|
295
|
+
|
|
296
|
+
metadata
|
|
297
|
+
|
|
298
|
+
group :workflow do
|
|
299
|
+
cookbook 'test', path: './test/fixtures/cookbooks/test'
|
|
300
|
+
end
|
|
301
|
+
CONFIG_DOT_JSON
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
it "sets the sources for delivery library cookbooks to github" do
|
|
305
|
+
expect(IO.read(file)).to include(expected_content)
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
context "when no delivery CLI configuration is present" do
|
|
312
|
+
|
|
313
|
+
let(:argv) { %w{new_cookbook --workflow} }
|
|
314
|
+
|
|
315
|
+
it "detects no delivery config" do
|
|
316
|
+
Dir.chdir(tempdir) do
|
|
317
|
+
expect(cookbook_generator.have_delivery_config?).to be(false)
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
it "emits concise output" do
|
|
322
|
+
Dir.chdir(tempdir) do
|
|
323
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
324
|
+
expect(cookbook_generator.run).to eq(0)
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
expected = <<~OUTPUT
|
|
328
|
+
Generating cookbook new_cookbook
|
|
329
|
+
- Ensuring correct cookbook content
|
|
330
|
+
- Committing cookbook files to git
|
|
331
|
+
- Ensuring delivery CLI configuration
|
|
332
|
+
- Ensuring correct Workflow (Delivery) build cookbook content
|
|
333
|
+
- Adding delivery configuration to feature branch
|
|
334
|
+
- Adding build cookbook to feature branch
|
|
335
|
+
- Merging delivery content feature branch to master
|
|
336
|
+
|
|
337
|
+
#{non_delivery_breadcrumb}
|
|
338
|
+
OUTPUT
|
|
339
|
+
|
|
340
|
+
actual = stdout_io.string
|
|
341
|
+
|
|
342
|
+
# the formatter will add escape sequences to turn off any colors
|
|
343
|
+
actual.gsub!("\e[0m", "")
|
|
344
|
+
expect(actual).to eq(expected)
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
context "when a delivery CLI config is present" do
|
|
349
|
+
|
|
350
|
+
# Setup a situation like this:
|
|
351
|
+
# there is a dir for the delivery organization with the
|
|
352
|
+
# `.delivery/cli.toml` in it. Inside that is another dir (maybe IRL this
|
|
353
|
+
# would be "cookbooks"), then we create the cookbook inside that.
|
|
354
|
+
|
|
355
|
+
let(:argv) { %w{new_cookbook --workflow} }
|
|
356
|
+
|
|
357
|
+
let(:tempdir_subdir) { File.join(tempdir, "subdirectory") }
|
|
358
|
+
|
|
359
|
+
let(:dot_delivery_dir) { File.join(tempdir, ".delivery") }
|
|
360
|
+
|
|
361
|
+
let(:dot_delivery_cli_toml) { File.join(dot_delivery_dir, "cli.toml") }
|
|
362
|
+
|
|
363
|
+
before do
|
|
364
|
+
Dir.mkdir(tempdir_subdir)
|
|
365
|
+
Dir.mkdir(dot_delivery_dir)
|
|
366
|
+
FileUtils.touch(dot_delivery_cli_toml)
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
it "detects the delivery config" do
|
|
370
|
+
Dir.chdir(tempdir_subdir) do
|
|
371
|
+
expect(cookbook_generator.have_delivery_config?).to be(true)
|
|
372
|
+
end
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
it "emits concise output" do
|
|
376
|
+
Dir.chdir(tempdir) do
|
|
377
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
378
|
+
expect(cookbook_generator.run).to eq(0)
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
expected = <<~OUTPUT
|
|
382
|
+
Generating cookbook new_cookbook
|
|
383
|
+
- Ensuring correct cookbook content
|
|
384
|
+
- Committing cookbook files to git
|
|
385
|
+
- Ensuring delivery CLI configuration
|
|
386
|
+
- Ensuring correct Workflow (Delivery) build cookbook content
|
|
387
|
+
- Adding delivery configuration to feature branch
|
|
388
|
+
- Adding build cookbook to feature branch
|
|
389
|
+
- Merging delivery content feature branch to master
|
|
390
|
+
|
|
391
|
+
Your cookbook is ready. To setup the pipeline, type `cd new_cookbook`, then run `delivery init`
|
|
392
|
+
OUTPUT
|
|
393
|
+
|
|
394
|
+
actual = stdout_io.string
|
|
395
|
+
|
|
396
|
+
# the formatter will add escape sequences to turn off any colors
|
|
397
|
+
actual.gsub!("\e[0m", "")
|
|
398
|
+
expect(actual).to eq(expected)
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
context "when given the verbose flag" do
|
|
404
|
+
|
|
405
|
+
let(:argv) { %w{ new_cookbook --verbose } }
|
|
406
|
+
|
|
407
|
+
it "configures the generator context with verbose mode enabled" do
|
|
408
|
+
cookbook_generator.read_and_validate_params
|
|
409
|
+
cookbook_generator.setup_context
|
|
410
|
+
expect(generator_context.verbose).to be(true)
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
it "emits verbose output" do
|
|
414
|
+
Dir.chdir(tempdir) do
|
|
415
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
416
|
+
expect(cookbook_generator.run).to eq(0)
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
# The normal chef formatter puts a heading for each recipe like this.
|
|
420
|
+
# Full output is large and subject to change with minor changes in the
|
|
421
|
+
# generator cookbook, so we just look for this line
|
|
422
|
+
expected_line = "Recipe: code_generator::cookbook"
|
|
423
|
+
|
|
424
|
+
actual = stdout_io.string
|
|
425
|
+
|
|
426
|
+
expect(actual).to include(expected_line)
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
shared_examples_for "a generated file" do |context_var|
|
|
431
|
+
before do
|
|
432
|
+
Dir.chdir(tempdir) do
|
|
433
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
434
|
+
expect(cookbook_generator.run).to eq(0)
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
it "should contain #{context_var} from the generator context" do
|
|
439
|
+
expect(File.read(file)).to match line
|
|
440
|
+
end
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
describe "README.md" do
|
|
444
|
+
let(:file) { File.join(tempdir, "new_cookbook", "README.md") }
|
|
445
|
+
|
|
446
|
+
include_examples "a generated file", :cookbook_name do
|
|
447
|
+
let(:line) { "# new_cookbook" }
|
|
448
|
+
end
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
describe "CHANGELOG.md" do
|
|
452
|
+
let(:file) { File.join(tempdir, "new_cookbook", "CHANGELOG.md") }
|
|
453
|
+
|
|
454
|
+
include_examples "a generated file", :cookbook_name do
|
|
455
|
+
let(:line) { "# new_cookbook" }
|
|
456
|
+
end
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
# This shared example group requires a let binding for
|
|
460
|
+
# `expected_kitchen_yml_content`
|
|
461
|
+
shared_examples_for "kitchen_yml_and_integration_tests" do
|
|
462
|
+
|
|
463
|
+
describe "Generating Test Kitchen and integration testing files" do
|
|
464
|
+
|
|
465
|
+
describe "generating kitchen config" do
|
|
466
|
+
|
|
467
|
+
before do
|
|
468
|
+
Dir.chdir(tempdir) do
|
|
469
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
470
|
+
expect(cookbook_generator.run).to eq(0)
|
|
471
|
+
end
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
let(:file) { File.join(tempdir, "new_cookbook", "kitchen.yml") }
|
|
475
|
+
|
|
476
|
+
it "creates a kitchen.yml with the expected content" do
|
|
477
|
+
expect(IO.read(file)).to eq(expected_kitchen_yml_content)
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
describe "test/integration/default/default_test.rb" do
|
|
483
|
+
let(:file) { File.join(tempdir, "new_cookbook", "test", "integration", "default", "default_test.rb") }
|
|
484
|
+
|
|
485
|
+
include_examples "a generated file", :cookbook_name do
|
|
486
|
+
let(:line) { "describe port" }
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
end
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
# This shared example group requires you to define a let binding for
|
|
493
|
+
# `expected_chefspec_spec_helper_content`
|
|
494
|
+
shared_examples_for "chefspec_spec_helper_file" do
|
|
495
|
+
|
|
496
|
+
describe "Generating ChefSpec files" do
|
|
497
|
+
|
|
498
|
+
before do
|
|
499
|
+
Dir.chdir(tempdir) do
|
|
500
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
501
|
+
expect(cookbook_generator.run).to eq(0)
|
|
502
|
+
end
|
|
503
|
+
end
|
|
504
|
+
|
|
505
|
+
let(:file) { File.join(tempdir, "new_cookbook", "spec", "spec_helper.rb") }
|
|
506
|
+
|
|
507
|
+
it "creates a spec/spec_helper.rb for ChefSpec with the expected content" do
|
|
508
|
+
expect(IO.read(file)).to eq(expected_chefspec_spec_helper_content)
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
context "when configured for Policyfiles" do
|
|
516
|
+
|
|
517
|
+
let(:argv) { %w{new_cookbook --policy} }
|
|
518
|
+
|
|
519
|
+
describe "Policyfile.rb" do
|
|
520
|
+
|
|
521
|
+
let(:file) { File.join(tempdir, "new_cookbook", "Policyfile.rb") }
|
|
522
|
+
|
|
523
|
+
let(:expected_content) do
|
|
524
|
+
<<~POLICYFILE_RB
|
|
525
|
+
# Policyfile.rb - Describe how you want Chef Infra Client to build your system.
|
|
526
|
+
#
|
|
527
|
+
# For more information on the Policyfile feature, visit
|
|
528
|
+
# https://docs.chef.io/policyfile.html
|
|
529
|
+
|
|
530
|
+
# A name that describes what the system you're building with Chef does.
|
|
531
|
+
name 'new_cookbook'
|
|
532
|
+
|
|
533
|
+
# Where to find external cookbooks:
|
|
534
|
+
default_source :supermarket
|
|
535
|
+
|
|
536
|
+
# run_list: chef-client will run these recipes in the order specified.
|
|
537
|
+
run_list 'new_cookbook::default'
|
|
538
|
+
|
|
539
|
+
# Specify a custom source for a single cookbook:
|
|
540
|
+
cookbook 'new_cookbook', path: '.'
|
|
541
|
+
POLICYFILE_RB
|
|
542
|
+
end
|
|
543
|
+
|
|
544
|
+
before do
|
|
545
|
+
Dir.chdir(tempdir) do
|
|
546
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
547
|
+
expect(cookbook_generator.run).to eq(0)
|
|
548
|
+
end
|
|
549
|
+
end
|
|
550
|
+
|
|
551
|
+
it "has a run_list and cookbook path that will work out of the box" do
|
|
552
|
+
expect(IO.read(file)).to eq(expected_content)
|
|
553
|
+
end
|
|
554
|
+
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
include_examples "kitchen_yml_and_integration_tests" do
|
|
558
|
+
|
|
559
|
+
let(:expected_kitchen_yml_content) do
|
|
560
|
+
<<~KITCHEN_YML
|
|
561
|
+
---
|
|
562
|
+
driver:
|
|
563
|
+
name: vagrant
|
|
564
|
+
|
|
565
|
+
## The forwarded_port port feature lets you connect to ports on the VM guest via
|
|
566
|
+
## localhost on the host.
|
|
567
|
+
## see also: https://www.vagrantup.com/docs/networking/forwarded_ports.html
|
|
568
|
+
|
|
569
|
+
# network:
|
|
570
|
+
# - ["forwarded_port", {guest: 80, host: 8080}]
|
|
571
|
+
|
|
572
|
+
provisioner:
|
|
573
|
+
name: chef_zero
|
|
574
|
+
|
|
575
|
+
## product_name and product_version specifies a specific Chef product and version to install.
|
|
576
|
+
## see the Chef documentation for more details: https://docs.chef.io/config_yml_kitchen.html
|
|
577
|
+
# product_name: chef
|
|
578
|
+
# product_version: 15
|
|
579
|
+
|
|
580
|
+
verifier:
|
|
581
|
+
name: inspec
|
|
582
|
+
|
|
583
|
+
platforms:
|
|
584
|
+
- name: ubuntu-18.04
|
|
585
|
+
- name: centos-7
|
|
586
|
+
|
|
587
|
+
suites:
|
|
588
|
+
- name: default
|
|
589
|
+
verifier:
|
|
590
|
+
inspec_tests:
|
|
591
|
+
- test/integration/default
|
|
592
|
+
attributes:
|
|
593
|
+
KITCHEN_YML
|
|
594
|
+
end
|
|
595
|
+
|
|
596
|
+
end
|
|
597
|
+
|
|
598
|
+
include_examples "chefspec_spec_helper_file" do
|
|
599
|
+
|
|
600
|
+
let(:expected_chefspec_spec_helper_content) do
|
|
601
|
+
<<~SPEC_HELPER
|
|
602
|
+
require 'chefspec'
|
|
603
|
+
require 'chefspec/policyfile'
|
|
604
|
+
SPEC_HELPER
|
|
605
|
+
end
|
|
606
|
+
|
|
607
|
+
end
|
|
608
|
+
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
context "when configured for Berkshelf" do
|
|
612
|
+
|
|
613
|
+
let(:argv) { %w{new_cookbook --berks} }
|
|
614
|
+
|
|
615
|
+
describe "Berksfile" do
|
|
616
|
+
|
|
617
|
+
let(:file) { File.join(tempdir, "new_cookbook", "Berksfile") }
|
|
618
|
+
|
|
619
|
+
let(:expected_content) do
|
|
620
|
+
<<~POLICYFILE_RB
|
|
621
|
+
source 'https://supermarket.chef.io'
|
|
622
|
+
|
|
623
|
+
metadata
|
|
624
|
+
POLICYFILE_RB
|
|
625
|
+
end
|
|
626
|
+
|
|
627
|
+
before do
|
|
628
|
+
Dir.chdir(tempdir) do
|
|
629
|
+
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
|
630
|
+
expect(cookbook_generator.run).to eq(0)
|
|
631
|
+
end
|
|
632
|
+
end
|
|
633
|
+
|
|
634
|
+
it "pulls deps from metadata" do
|
|
635
|
+
expect(IO.read(file)).to eq(expected_content)
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
end
|
|
639
|
+
|
|
640
|
+
include_examples "kitchen_yml_and_integration_tests" do
|
|
641
|
+
|
|
642
|
+
let(:expected_kitchen_yml_content) do
|
|
643
|
+
<<~KITCHEN_YML
|
|
644
|
+
---
|
|
645
|
+
driver:
|
|
646
|
+
name: vagrant
|
|
647
|
+
|
|
648
|
+
## The forwarded_port port feature lets you connect to ports on the VM guest via
|
|
649
|
+
## localhost on the host.
|
|
650
|
+
## see also: https://www.vagrantup.com/docs/networking/forwarded_ports.html
|
|
651
|
+
|
|
652
|
+
# network:
|
|
653
|
+
# - ["forwarded_port", {guest: 80, host: 8080}]
|
|
654
|
+
|
|
655
|
+
provisioner:
|
|
656
|
+
name: chef_zero
|
|
657
|
+
# You may wish to disable always updating cookbooks in CI or other testing environments.
|
|
658
|
+
# For example:
|
|
659
|
+
# always_update_cookbooks: <%= !ENV['CI'] %>
|
|
660
|
+
always_update_cookbooks: true
|
|
661
|
+
|
|
662
|
+
## product_name and product_version specifies a specific Chef product and version to install.
|
|
663
|
+
## see the Chef documentation for more details: https://docs.chef.io/config_yml_kitchen.html
|
|
664
|
+
# product_name: chef
|
|
665
|
+
# product_version: 15
|
|
666
|
+
|
|
667
|
+
verifier:
|
|
668
|
+
name: inspec
|
|
669
|
+
|
|
670
|
+
platforms:
|
|
671
|
+
- name: ubuntu-18.04
|
|
672
|
+
- name: centos-7
|
|
673
|
+
|
|
674
|
+
suites:
|
|
675
|
+
- name: default
|
|
676
|
+
run_list:
|
|
677
|
+
- recipe[new_cookbook::default]
|
|
678
|
+
verifier:
|
|
679
|
+
inspec_tests:
|
|
680
|
+
- test/integration/default
|
|
681
|
+
attributes:
|
|
682
|
+
KITCHEN_YML
|
|
683
|
+
end
|
|
684
|
+
|
|
685
|
+
end
|
|
686
|
+
|
|
687
|
+
include_examples "chefspec_spec_helper_file" do
|
|
688
|
+
|
|
689
|
+
let(:expected_chefspec_spec_helper_content) do
|
|
690
|
+
<<~SPEC_HELPER
|
|
691
|
+
require 'chefspec'
|
|
692
|
+
require 'chefspec/berkshelf'
|
|
693
|
+
SPEC_HELPER
|
|
694
|
+
end
|
|
695
|
+
|
|
696
|
+
end
|
|
697
|
+
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
describe "metadata.rb" do
|
|
701
|
+
let(:file) { File.join(tempdir, "new_cookbook", "metadata.rb") }
|
|
702
|
+
|
|
703
|
+
include_examples "a generated file", :cookbook_name do
|
|
704
|
+
let(:line) { /name\s+'new_cookbook'.+# issues_url.+# source_url/m }
|
|
705
|
+
end
|
|
706
|
+
end
|
|
707
|
+
|
|
708
|
+
describe "recipes/default.rb" do
|
|
709
|
+
let(:file) { File.join(tempdir, "new_cookbook", "recipes", "default.rb") }
|
|
710
|
+
|
|
711
|
+
include_examples "a generated file", :cookbook_name do
|
|
712
|
+
let(:line) { "# Cookbook:: new_cookbook" }
|
|
713
|
+
end
|
|
714
|
+
end
|
|
715
|
+
|
|
716
|
+
describe "spec/unit/recipes/default_spec.rb" do
|
|
717
|
+
let(:file) { File.join(tempdir, "new_cookbook", "spec", "unit", "recipes", "default_spec.rb") }
|
|
718
|
+
|
|
719
|
+
include_examples "a generated file", :cookbook_name do
|
|
720
|
+
let(:line) { "describe 'new_cookbook::default' do" }
|
|
721
|
+
end
|
|
722
|
+
end
|
|
723
|
+
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
context "when given the path to the cookbook to generate" do
|
|
727
|
+
let(:argv) { [ File.join(tempdir, "a_new_cookbook") ] }
|
|
728
|
+
|
|
729
|
+
before do
|
|
730
|
+
reset_tempdir
|
|
731
|
+
end
|
|
732
|
+
|
|
733
|
+
it "configures the generator context" do
|
|
734
|
+
cookbook_generator.read_and_validate_params
|
|
735
|
+
cookbook_generator.setup_context
|
|
736
|
+
expect(generator_context.cookbook_root).to eq(tempdir)
|
|
737
|
+
expect(generator_context.cookbook_name).to eq("a_new_cookbook")
|
|
738
|
+
end
|
|
739
|
+
|
|
740
|
+
end
|
|
741
|
+
|
|
742
|
+
context "when given generic arguments to populate the generator context" do
|
|
743
|
+
let(:argv) { [ "new_cookbook", "--generator-arg", "key1=value1", "-a", "key2=value2", "-a", " key3 = value3 " ] }
|
|
744
|
+
|
|
745
|
+
before do
|
|
746
|
+
reset_tempdir
|
|
747
|
+
end
|
|
748
|
+
|
|
749
|
+
it "configures the generator context for long form option key1" do
|
|
750
|
+
cookbook_generator.read_and_validate_params
|
|
751
|
+
cookbook_generator.setup_context
|
|
752
|
+
expect(generator_context.key1).to eq("value1")
|
|
753
|
+
end
|
|
754
|
+
|
|
755
|
+
it "configures the generator context for short form option key2" do
|
|
756
|
+
cookbook_generator.read_and_validate_params
|
|
757
|
+
cookbook_generator.setup_context
|
|
758
|
+
expect(generator_context.key2).to eq("value2")
|
|
759
|
+
end
|
|
760
|
+
|
|
761
|
+
it "configures the generator context for key3 containing additional spaces" do
|
|
762
|
+
cookbook_generator.read_and_validate_params
|
|
763
|
+
cookbook_generator.setup_context
|
|
764
|
+
expect(generator_context.key3).to eq("value3")
|
|
765
|
+
end
|
|
766
|
+
|
|
767
|
+
end
|
|
768
|
+
|
|
769
|
+
end
|