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,220 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2017 Chef Software Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require "spec_helper"
|
|
19
|
+
require "chef-cli/policyfile_compiler"
|
|
20
|
+
require "chef-cli/exceptions"
|
|
21
|
+
|
|
22
|
+
describe ChefCLI::PolicyfileCompiler, "including upstream policy locks" do
|
|
23
|
+
|
|
24
|
+
let(:run_list) { ["local::default"] }
|
|
25
|
+
let(:included_policies) { [] }
|
|
26
|
+
|
|
27
|
+
let(:policyfile) do
|
|
28
|
+
policyfile = ChefCLI::PolicyfileCompiler.new.build do |p|
|
|
29
|
+
|
|
30
|
+
p.run_list(*run_list)
|
|
31
|
+
included_policies.each do |policy|
|
|
32
|
+
p.include_policy(policy[0], policy[1])
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
policyfile
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe "when include_policy specifies a policy on disk" do
|
|
40
|
+
describe "and the included policy is correctly configured" do
|
|
41
|
+
let(:included_policies) { [["foo", { path: "./foo.lock.json" }]] }
|
|
42
|
+
|
|
43
|
+
it "has an included policy" do
|
|
44
|
+
expect(policyfile.included_policies.length).to eq(1)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "uses a local fetcher" do
|
|
48
|
+
expect(policyfile.included_policies[0].fetcher).to be_a(ChefCLI::Policyfile::LocalLockFetcher)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "has a fetcher with no errors" do
|
|
52
|
+
expect(policyfile.included_policies[0].fetcher.errors).to eq([])
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "has a fetcher that is valid" do
|
|
56
|
+
expect(policyfile.included_policies[0].fetcher.valid?).to eq(true)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
describe "and the included policy and policy_revision_id are correctly configured" do
|
|
61
|
+
let(:included_policies) { [["foo", { path: "./foo.lock.json", policy_revision_id: "bar" }]] }
|
|
62
|
+
|
|
63
|
+
it "has an included policy" do
|
|
64
|
+
expect(policyfile.included_policies.length).to eq(1)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "uses a local fetcher" do
|
|
68
|
+
expect(policyfile.included_policies[0].fetcher).to be_a(ChefCLI::Policyfile::LocalLockFetcher)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "has a fetcher with no errors" do
|
|
72
|
+
expect(policyfile.included_policies[0].fetcher.errors).to eq([])
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "has a fetcher that is valid" do
|
|
76
|
+
expect(policyfile.included_policies[0].fetcher.valid?).to eq(true)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe "when include_policy specifies a remote policy" do
|
|
82
|
+
describe "and the included policy is correctly configured" do
|
|
83
|
+
let(:included_policies) { [["foo", { remote: "http://example.local/foo.lock.json" }]] }
|
|
84
|
+
|
|
85
|
+
it "has an included policy" do
|
|
86
|
+
expect(policyfile.included_policies.length).to eq(1)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "uses a remote fetcher" do
|
|
90
|
+
expect(policyfile.included_policies[0].fetcher).to be_a(ChefCLI::Policyfile::RemoteLockFetcher)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "has a fetcher with no errors" do
|
|
94
|
+
expect(policyfile.included_policies[0].fetcher.errors).to eq([])
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "has a fetcher that is valid" do
|
|
98
|
+
expect(policyfile.included_policies[0].fetcher.valid?).to eq(true)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
describe "and the included policy and policy_revision_id are correctly configured" do
|
|
103
|
+
let(:included_policies) { [["foo", { remote: "http://example.local/foo.lock.json", policy_revision_id: "bar" }]] }
|
|
104
|
+
|
|
105
|
+
it "has an included policy" do
|
|
106
|
+
expect(policyfile.included_policies.length).to eq(1)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "uses a remote fetcher" do
|
|
110
|
+
expect(policyfile.included_policies[0].fetcher).to be_a(ChefCLI::Policyfile::RemoteLockFetcher)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "has a fetcher with no errors" do
|
|
114
|
+
expect(policyfile.included_policies[0].fetcher.errors).to eq([])
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "has a fetcher that is valid" do
|
|
118
|
+
expect(policyfile.included_policies[0].fetcher.valid?).to eq(true)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
describe "when include_policy specifies a policy on a chef server" do
|
|
124
|
+
let(:included_policies) { [["foo", { server: "http://example.com", policy_name: "foo" }]] }
|
|
125
|
+
describe "and policy_revision_id and policy_group are missing" do
|
|
126
|
+
it "has a dsl with errors" do
|
|
127
|
+
expect(policyfile.dsl.errors.length).to eq(1)
|
|
128
|
+
expect(policyfile.dsl.errors[0]).to match(/policy_revision_id/)
|
|
129
|
+
expect(policyfile.dsl.errors[0]).to match(/policy_group/)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
describe "and the policy name is missing" do
|
|
134
|
+
let(:included_policies) { [["foo", { server: "http://example.com", policy_revision_id: "bar" }]] }
|
|
135
|
+
it "has no errors" do
|
|
136
|
+
expect(policyfile.dsl.errors.length).to eq(0)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
describe "and everything is correctly configured" do
|
|
141
|
+
context "using policy_revision_id" do
|
|
142
|
+
let(:included_policies) { [["foo", { server: "http://example.com", policy_name: "foo", policy_revision_id: "bar" }]] }
|
|
143
|
+
it "has a dsl with no errors" do
|
|
144
|
+
expect(policyfile.dsl.errors.length).to eq(0)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "has a included policy" do
|
|
148
|
+
expect(policyfile.included_policies.length).to eq(1)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "uses a server fetcher" do
|
|
152
|
+
expect(policyfile.included_policies[0].fetcher).to be_a(ChefCLI::Policyfile::ChefServerLockFetcher)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it "has a fetcher with no errors" do
|
|
156
|
+
expect(policyfile.included_policies[0].fetcher.errors).to eq([])
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it "has a fetcher that is valid" do
|
|
160
|
+
expect(policyfile.included_policies[0].fetcher.valid?).to eq(true)
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
context "using policy_group" do
|
|
166
|
+
let(:included_policies) { [["foo", { server: "http://example.com", policy_name: "foo", policy_group: "bar" }]] }
|
|
167
|
+
it "has a dsl with no errors" do
|
|
168
|
+
expect(policyfile.dsl.errors.length).to eq(0)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it "has a included policy" do
|
|
172
|
+
expect(policyfile.included_policies.length).to eq(1)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it "uses a server fetcher" do
|
|
176
|
+
expect(policyfile.included_policies[0].fetcher).to be_a(ChefCLI::Policyfile::ChefServerLockFetcher)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it "has a fetcher with no errors" do
|
|
180
|
+
expect(policyfile.included_policies[0].fetcher.errors).to eq([])
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it "has a fetcher that is valid" do
|
|
184
|
+
expect(policyfile.included_policies[0].fetcher.valid?).to eq(true)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
describe "when include_policy specifies a policy fetched with an unknown method" do
|
|
190
|
+
let(:included_policies) { [["foo", { foofetch: "bar" }]] }
|
|
191
|
+
|
|
192
|
+
it "has a included policy" do
|
|
193
|
+
expect(policyfile.included_policies.length).to eq(1)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
it "has a dsl with an errors" do
|
|
197
|
+
expect(policyfile.dsl.errors.length).to eq(1)
|
|
198
|
+
expect(policyfile.dsl.errors[0]).to match(/include_policy must use one of the following/)
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
it "errors when trying to get the fetcher" do
|
|
202
|
+
expect { policyfile.included_policies[0].fetcher }.to raise_error(ChefCLI::InvalidPolicyfileLocation)
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
describe "when a policy with the same name is specified multiple times" do
|
|
207
|
+
let(:included_policies) do
|
|
208
|
+
[
|
|
209
|
+
["foo", { path: "./foo.lock.json" }],
|
|
210
|
+
["foo", { path: "./foo.lock.json" }],
|
|
211
|
+
]
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
it "has a dsl with errors" do
|
|
215
|
+
expect(policyfile.dsl.errors.length).to eq(1)
|
|
216
|
+
expect(policyfile.dsl.errors[0]).to match(/assigned conflicting locations/)
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
end
|
|
@@ -0,0 +1,720 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Copyright:: Copyright (c) 2014-2018, Chef Software Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require "spec_helper"
|
|
20
|
+
require "chef-cli/policyfile_compiler"
|
|
21
|
+
require "chef-cli/exceptions"
|
|
22
|
+
|
|
23
|
+
describe ChefCLI::PolicyfileCompiler, "including upstream policy locks" do
|
|
24
|
+
|
|
25
|
+
def expand_run_list(r)
|
|
26
|
+
r.map do |item|
|
|
27
|
+
"recipe[#{item}]"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
let(:run_list) { ["local::default"] }
|
|
32
|
+
let(:run_list_expanded) { expand_run_list(run_list) }
|
|
33
|
+
let(:named_run_list) { {} }
|
|
34
|
+
let(:named_run_list_expanded) do
|
|
35
|
+
named_run_list.inject({}) do |acc, (key, val)|
|
|
36
|
+
acc[key] = expand_run_list(val)
|
|
37
|
+
acc
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
let(:default_attributes) { {} }
|
|
41
|
+
let(:override_attributes) { {} }
|
|
42
|
+
|
|
43
|
+
let(:default_source) { nil }
|
|
44
|
+
|
|
45
|
+
let(:external_cookbook_universe) do
|
|
46
|
+
{
|
|
47
|
+
"cookbookA" => {
|
|
48
|
+
"1.0.0" => [ ],
|
|
49
|
+
"2.0.0" => [ ],
|
|
50
|
+
},
|
|
51
|
+
"cookbookB" => {
|
|
52
|
+
"1.0.0" => [ ],
|
|
53
|
+
"2.0.0" => [ ],
|
|
54
|
+
},
|
|
55
|
+
"cookbookC" => {
|
|
56
|
+
"1.0.0" => [ ],
|
|
57
|
+
"2.0.0" => [ ],
|
|
58
|
+
},
|
|
59
|
+
"local" => {
|
|
60
|
+
"1.0.0" => [ ["cookbookC", "= 1.0.0" ] ],
|
|
61
|
+
},
|
|
62
|
+
"local_easy" => {
|
|
63
|
+
"1.0.0" => [ ["cookbookC", "= 2.0.0" ] ],
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
let(:included_policy_default_attributes) { {} }
|
|
69
|
+
let(:included_policy_override_attributes) { {} }
|
|
70
|
+
let(:included_policy_expanded_named_runlist) { nil }
|
|
71
|
+
let(:included_policy_expanded_runlist) { ["recipe[cookbookA::default]"] }
|
|
72
|
+
let(:included_policy_cookbooks) do
|
|
73
|
+
[
|
|
74
|
+
{
|
|
75
|
+
name: "cookbookA",
|
|
76
|
+
version: "2.0.0",
|
|
77
|
+
},
|
|
78
|
+
]
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
let(:included_policy_lock_data) do
|
|
82
|
+
cookbook_locks = included_policy_cookbooks.inject({}) do |acc, cookbook_info|
|
|
83
|
+
acc[cookbook_info[:name]] = {
|
|
84
|
+
"version" => cookbook_info[:version],
|
|
85
|
+
"identifier" => "identifier",
|
|
86
|
+
"dotted_decimal_identifier" => "dotted_decimal_identifier",
|
|
87
|
+
"cache_key" => "#{cookbook_info[:name]}-#{cookbook_info[:version]}",
|
|
88
|
+
"origin" => "uri",
|
|
89
|
+
"source_options" => {},
|
|
90
|
+
}
|
|
91
|
+
acc
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
solution_dependencies_lock = included_policy_cookbooks.map do |cookbook_info|
|
|
95
|
+
[cookbook_info[:name], cookbook_info[:version]]
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
solution_dependencies_cookbooks = included_policy_cookbooks.inject({}) do |acc, cookbook_info|
|
|
99
|
+
acc["#{cookbook_info[:name]} (#{cookbook_info[:version]})"] = external_cookbook_universe[cookbook_info[:name]][cookbook_info[:version]]
|
|
100
|
+
acc
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
{
|
|
104
|
+
"name" => "included_policyfile",
|
|
105
|
+
"revision_id" => "myrevisionid",
|
|
106
|
+
"run_list" => included_policy_expanded_runlist,
|
|
107
|
+
"cookbook_locks" => cookbook_locks,
|
|
108
|
+
"default_attributes" => included_policy_default_attributes,
|
|
109
|
+
"override_attributes" => included_policy_override_attributes,
|
|
110
|
+
"solution_dependencies" => {
|
|
111
|
+
"Policyfile" => solution_dependencies_lock,
|
|
112
|
+
"dependencies" => solution_dependencies_cookbooks,
|
|
113
|
+
},
|
|
114
|
+
}.tap do |core|
|
|
115
|
+
core["named_run_lists"] = included_policy_expanded_named_runlist if included_policy_expanded_named_runlist
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
let(:included_policy_lock_name) { "included" }
|
|
120
|
+
let(:included_policy_fetcher) do
|
|
121
|
+
instance_double("ChefCLI::Policyfile::LocalLockFetcher").tap do |double|
|
|
122
|
+
allow(double).to receive(:lock_data).and_return(included_policy_lock_data)
|
|
123
|
+
allow(double).to receive(:valid?).and_return(true)
|
|
124
|
+
allow(double).to receive(:errors).and_return([])
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
let(:lock_source_options) { { path: "somelocation" } }
|
|
129
|
+
let(:included_policy_lock_spec) do
|
|
130
|
+
ChefCLI::Policyfile::PolicyfileLocationSpecification.new(included_policy_lock_name, lock_source_options, nil).tap do |spec|
|
|
131
|
+
allow(spec).to receive(:valid?).and_return(true)
|
|
132
|
+
allow(spec).to receive(:fetcher).and_return(included_policy_fetcher)
|
|
133
|
+
allow(spec).to receive(:source_options_for_lock).and_return(lock_source_options)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
let(:included_policies) { [] }
|
|
138
|
+
|
|
139
|
+
let(:policyfile) do
|
|
140
|
+
policyfile = ChefCLI::PolicyfileCompiler.new.build do |p|
|
|
141
|
+
if default_source
|
|
142
|
+
p.default_source.replace([default_source])
|
|
143
|
+
else
|
|
144
|
+
allow(p.default_source.first).to receive(:universe_graph).and_return(external_cookbook_universe)
|
|
145
|
+
allow(p.default_source.first).to receive(:null?).and_return(false)
|
|
146
|
+
end
|
|
147
|
+
p.run_list(*run_list)
|
|
148
|
+
|
|
149
|
+
named_run_list.each do |name, run_list|
|
|
150
|
+
p.named_run_list(name, *run_list)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
default_attributes.each do |(name, value)|
|
|
154
|
+
p.default[name] = value
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
override_attributes.each do |(name, value)|
|
|
158
|
+
p.override[name] = value
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
allow(p).to receive(:included_policies).and_return(included_policies)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
policyfile
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
let(:policyfile_lock) do
|
|
168
|
+
policyfile.lock
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
context "when no policies are included" do
|
|
172
|
+
|
|
173
|
+
it "does not emit included policies information in the lockfile" do
|
|
174
|
+
expect(policyfile_lock.to_lock["included_policies"]).to eq(nil)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
context "when one policy is included" do
|
|
180
|
+
|
|
181
|
+
let(:included_policies) { [included_policy_lock_spec] }
|
|
182
|
+
|
|
183
|
+
# currently you must have a run list in a policyfile, but it should now
|
|
184
|
+
# become possible to make a combo-policy just by combining other policies
|
|
185
|
+
context "when the including policy does not have a run list" do
|
|
186
|
+
let(:run_list) { [] }
|
|
187
|
+
|
|
188
|
+
it "emits a lockfile with an identical run list as the included policy" do
|
|
189
|
+
expect(policyfile_lock.to_lock["run_list"]).to eq(included_policy_expanded_runlist)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
context "when the including policy has a run list" do
|
|
195
|
+
|
|
196
|
+
it "appends run list items from the including policy to the included policy's run list, removing duplicates" do
|
|
197
|
+
expect(policyfile_lock.to_lock["run_list"]).to eq(included_policy_expanded_runlist + run_list_expanded)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
context "when the policies have named run lists" do
|
|
203
|
+
|
|
204
|
+
let(:included_policy_expanded_named_runlist) do
|
|
205
|
+
{
|
|
206
|
+
"shared" => ["recipe[cookbookA::included]"],
|
|
207
|
+
}
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
context "and no named run lists are shared between the including and included policy" do
|
|
211
|
+
|
|
212
|
+
let(:named_run_list) do
|
|
213
|
+
{
|
|
214
|
+
"local" => ["local::foo"],
|
|
215
|
+
}
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
it "preserves the named run lists as given in both policies" do
|
|
219
|
+
expect(policyfile_lock.to_lock["named_run_lists"]).to include(included_policy_expanded_named_runlist, named_run_list_expanded)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
context "and some named run lists are shared between the including and included policy" do
|
|
225
|
+
|
|
226
|
+
let(:named_run_list) do
|
|
227
|
+
{
|
|
228
|
+
"shared" => ["local::foo"],
|
|
229
|
+
}
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it "appends run lists items from the including policy's run lists to the included policy's run lists" do
|
|
233
|
+
expect(policyfile_lock.to_lock["named_run_lists"]["shared"]).to eq(included_policy_expanded_named_runlist["shared"] + named_run_list_expanded["shared"])
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
context "when no cookbooks are shared as dependencies or transitive dependencies" do
|
|
241
|
+
let(:included_policy_expanded_runlist) { ["recipe[cookbookC::default]"] }
|
|
242
|
+
let(:run_list) { ["cookbookA::default"] }
|
|
243
|
+
|
|
244
|
+
it "does not raise a have conflicting dependency requirements error" do
|
|
245
|
+
expect { policyfile_lock.to_lock }.not_to raise_error
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
it "emits a lockfile where cookbooks pulled from the upstream are at identical versions" do
|
|
249
|
+
expect(policyfile_lock.to_lock["solution_dependencies"]["dependencies"]).to(
|
|
250
|
+
have_key("cookbookC (2.0.0)"))
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
context "when some cookbooks are shared as dependencies or transitive dependencies" do
|
|
255
|
+
let(:included_policy_expanded_runlist) { ["recipe[cookbookC::default]"] }
|
|
256
|
+
let(:included_policy_cookbooks) do
|
|
257
|
+
[
|
|
258
|
+
{
|
|
259
|
+
name: "cookbookC",
|
|
260
|
+
version: "2.0.0",
|
|
261
|
+
},
|
|
262
|
+
]
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
context "and the including policy does not specify any sources" do
|
|
266
|
+
let(:run_list) { [] }
|
|
267
|
+
it "it defaults to those provided in the included policy lock" do
|
|
268
|
+
expect(policyfile_lock.to_lock["solution_dependencies"]["dependencies"]).to(
|
|
269
|
+
have_key("cookbookC (2.0.0)"))
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
context "and the including policy specifies a source that is equivalent to the included policy" do
|
|
274
|
+
let(:run_list) { [] }
|
|
275
|
+
let(:default_source) { instance_double("ChefCLI::Policyfile::NullCookbookSource") }
|
|
276
|
+
|
|
277
|
+
before do
|
|
278
|
+
allow(default_source).to receive(:preferred_cookbooks).and_return(["cookbookC"])
|
|
279
|
+
allow(default_source).to receive(:source_options_for).with("cookbookC", "2.0.0").and_return({})
|
|
280
|
+
allow(default_source).to receive(:null?).and_return(false)
|
|
281
|
+
allow(default_source).to receive(:universe_graph).and_return(external_cookbook_universe)
|
|
282
|
+
allow(default_source).to receive(:desc).and_return("source double")
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
it "it defaults to those provided in the included policy lock" do
|
|
286
|
+
expect { policyfile_lock.to_lock }.not_to raise_error
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
context "and the including policy specifies a source that is not equivalent to the included policy" do
|
|
291
|
+
let(:run_list) { [] }
|
|
292
|
+
let(:default_source) { instance_double("ChefCLI::Policyfile::NullCookbookSource") }
|
|
293
|
+
|
|
294
|
+
before do
|
|
295
|
+
allow(default_source).to receive(:preferred_cookbooks).and_return(["cookbookC"])
|
|
296
|
+
allow(default_source).to receive(:source_options_for).with("cookbookC", "2.0.0").and_return({ "foo" => "bar" })
|
|
297
|
+
allow(default_source).to receive(:null?).and_return(false)
|
|
298
|
+
allow(default_source).to receive(:universe_graph).and_return(external_cookbook_universe)
|
|
299
|
+
allow(default_source).to receive(:desc).and_return("source double")
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
it "it raises an error" do
|
|
303
|
+
expect { policyfile_lock.to_lock }.to raise_error(ChefCLI::IncludePolicyCookbookSourceConflict)
|
|
304
|
+
end
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
context "and the including policy's dependencies can be solved with the included policy's locks" do
|
|
308
|
+
let(:run_list) { ["local_easy::default"] }
|
|
309
|
+
|
|
310
|
+
it "solves the dependencies added by the top-level policyfile and emits them in the lockfile" do
|
|
311
|
+
expect(policyfile_lock.to_lock["solution_dependencies"]["dependencies"]).to(
|
|
312
|
+
have_key("cookbookC (2.0.0)"))
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
context "and the including policy's dependencies cannot be solved with the included policy's locks" do
|
|
318
|
+
let(:run_list) { ["local::default"] }
|
|
319
|
+
|
|
320
|
+
it "raises an error describing the conflict" do
|
|
321
|
+
expect { policyfile_lock.to_lock }.to raise_error(Solve::Errors::NoSolutionError)
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
it "includes the source of the conflicting dependency constraint from the including policy" do
|
|
325
|
+
expect { policyfile_lock.to_lock }.to raise_error(Solve::Errors::NoSolutionError) do |e|
|
|
326
|
+
expect(e.to_s).to match(/`cookbookC \(= 2.0.0\)`/) # This one comes from the included policy
|
|
327
|
+
expect(e.to_s).to match(/`cookbookC \(= 1.0.0\)` required by `local-1.0.0`/) # This one comes from the included policy
|
|
328
|
+
end
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
context "when default attributes are specified" do
|
|
334
|
+
let(:default_attributes) do
|
|
335
|
+
{
|
|
336
|
+
"shared" => {
|
|
337
|
+
"foo" => "bar",
|
|
338
|
+
},
|
|
339
|
+
}
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
context "when the included policy does not have attributes that conflict with the including policy" do
|
|
343
|
+
let(:included_policy_default_attributes) do
|
|
344
|
+
{
|
|
345
|
+
"not_shared" => {
|
|
346
|
+
"foo" => "bar",
|
|
347
|
+
},
|
|
348
|
+
}
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
it "emits a lockfile with the attributes from both merged" do
|
|
352
|
+
expect(policyfile_lock.to_lock["default_attributes"]).to include(included_policy_default_attributes, default_attributes)
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
context "when the included policy has attributes that conflict with the including policy, but provide the same value" do
|
|
358
|
+
let(:included_policy_default_attributes) { default_attributes }
|
|
359
|
+
|
|
360
|
+
it "emits a lockfile with the attributes from both merged" do
|
|
361
|
+
expect(policyfile_lock.to_lock["default_attributes"]).to eq(default_attributes)
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
context "when the included policy has attributes that conflict with the including policy's attributes" do
|
|
367
|
+
let(:included_policy_default_attributes) do
|
|
368
|
+
{
|
|
369
|
+
"shared" => {
|
|
370
|
+
"foo" => "not_bar",
|
|
371
|
+
},
|
|
372
|
+
}
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
it "raises an error describing all attribute conflicts" do
|
|
376
|
+
expect { policyfile_lock.to_lock }.to raise_error(
|
|
377
|
+
ChefCLI::Policyfile::AttributeMergeChecker::ConflictError,
|
|
378
|
+
"Attribute '[shared][foo]' provided conflicting values by the following sources [\"user-specified\", \"included\"]")
|
|
379
|
+
end
|
|
380
|
+
end
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
context "when override attributes are specified" do
|
|
384
|
+
let(:override_attributes) do
|
|
385
|
+
{
|
|
386
|
+
"shared" => {
|
|
387
|
+
"foo" => "bar",
|
|
388
|
+
},
|
|
389
|
+
}
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
context "when the included policy does not have attributes that conflict with the including policy" do
|
|
393
|
+
let(:included_policy_override_attributes) do
|
|
394
|
+
{
|
|
395
|
+
"not_shared" => {
|
|
396
|
+
"foo" => "bar",
|
|
397
|
+
},
|
|
398
|
+
}
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
it "emits a lockfile with the attributes from both merged" do
|
|
402
|
+
expect(policyfile_lock.to_lock["override_attributes"]).to include(included_policy_override_attributes, override_attributes)
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
context "when the included policy has attributes that conflict with the including policy, but provide the same value" do
|
|
408
|
+
let(:included_policy_override_attributes) { override_attributes }
|
|
409
|
+
|
|
410
|
+
it "emits a lockfile with the attributes from both merged" do
|
|
411
|
+
expect(policyfile_lock.to_lock["override_attributes"]).to eq(override_attributes)
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
context "when the included policy has attributes that conflict with the including policy's attributes" do
|
|
417
|
+
let(:included_policy_override_attributes) do
|
|
418
|
+
{
|
|
419
|
+
"shared" => {
|
|
420
|
+
"foo" => "not_bar",
|
|
421
|
+
},
|
|
422
|
+
}
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
it "raises an error describing all attribute conflicts" do
|
|
426
|
+
expect { policyfile_lock.to_lock }.to raise_error(
|
|
427
|
+
ChefCLI::Policyfile::AttributeMergeChecker::ConflictError,
|
|
428
|
+
"Attribute '[shared][foo]' provided conflicting values by the following sources [\"user-specified\", \"included\"]")
|
|
429
|
+
end
|
|
430
|
+
end
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
context "when several policies are included" do
|
|
435
|
+
let(:included_policy_2_default_attributes) { {} }
|
|
436
|
+
let(:included_policy_2_override_attributes) { {} }
|
|
437
|
+
let(:included_policy_2_expanded_named_runlist) { nil }
|
|
438
|
+
let(:included_policy_2_expanded_runlist) { ["recipe[cookbookA::default]"] }
|
|
439
|
+
let(:included_policy_2_cookbooks) do
|
|
440
|
+
[
|
|
441
|
+
{
|
|
442
|
+
name: "cookbookA",
|
|
443
|
+
version: "2.0.0",
|
|
444
|
+
},
|
|
445
|
+
]
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
let(:included_policy_2_lock_data) do
|
|
449
|
+
cookbook_locks = included_policy_2_cookbooks.inject({}) do |acc, cookbook_info|
|
|
450
|
+
acc[cookbook_info[:name]] = {
|
|
451
|
+
"version" => cookbook_info[:version],
|
|
452
|
+
"identifier" => "identifier",
|
|
453
|
+
"dotted_decimal_identifier" => "dotted_decimal_identifier",
|
|
454
|
+
"cache_key" => "#{cookbook_info[:name]}-#{cookbook_info[:version]}",
|
|
455
|
+
"origin" => "uri",
|
|
456
|
+
"source_options" => {},
|
|
457
|
+
}
|
|
458
|
+
acc
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
solution_dependencies_lock = included_policy_2_cookbooks.map do |cookbook_info|
|
|
462
|
+
[cookbook_info[:name], cookbook_info[:version]]
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
solution_dependencies_cookbooks = included_policy_2_cookbooks.inject({}) do |acc, cookbook_info|
|
|
466
|
+
acc["#{cookbook_info[:name]} (#{cookbook_info[:version]})"] = external_cookbook_universe[cookbook_info[:name]][cookbook_info[:version]]
|
|
467
|
+
acc
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
{
|
|
471
|
+
"name" => "included_policy_2file",
|
|
472
|
+
"revision_id" => "myrevisionid",
|
|
473
|
+
"run_list" => included_policy_2_expanded_runlist,
|
|
474
|
+
"cookbook_locks" => cookbook_locks,
|
|
475
|
+
"default_attributes" => included_policy_2_default_attributes,
|
|
476
|
+
"override_attributes" => included_policy_2_override_attributes,
|
|
477
|
+
"solution_dependencies" => {
|
|
478
|
+
"Policyfile" => solution_dependencies_lock,
|
|
479
|
+
"dependencies" => solution_dependencies_cookbooks,
|
|
480
|
+
},
|
|
481
|
+
}.tap do |core|
|
|
482
|
+
core["named_run_lists"] = included_policy_2_expanded_named_runlist if included_policy_2_expanded_named_runlist
|
|
483
|
+
end
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
let(:included_policy_2_lock_name) { "included2" }
|
|
487
|
+
let(:included_policy_2_fetcher) do
|
|
488
|
+
instance_double("ChefCLI::Policyfile::LocalLockFetcher").tap do |double|
|
|
489
|
+
allow(double).to receive(:lock_data).and_return(included_policy_2_lock_data)
|
|
490
|
+
allow(double).to receive(:valid?).and_return(true)
|
|
491
|
+
allow(double).to receive(:errors).and_return([])
|
|
492
|
+
end
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
let(:included_policy_2_lock_spec) do
|
|
496
|
+
ChefCLI::Policyfile::PolicyfileLocationSpecification.new(included_policy_2_lock_name, lock_source_options, nil).tap do |spec|
|
|
497
|
+
allow(spec).to receive(:valid?).and_return(true)
|
|
498
|
+
allow(spec).to receive(:fetcher).and_return(included_policy_2_fetcher)
|
|
499
|
+
allow(spec).to receive(:source_options_for_lock).and_return(lock_source_options)
|
|
500
|
+
end
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
let(:included_policies) { [included_policy_lock_spec, included_policy_2_lock_spec] }
|
|
504
|
+
|
|
505
|
+
let(:run_list) { ["local::default"] }
|
|
506
|
+
|
|
507
|
+
context "when no cookbooks are shared as dependencies or transitive dependencies by included policies" do
|
|
508
|
+
let(:included_policy_expanded_runlist) { ["recipe[cookbookA::default]"] }
|
|
509
|
+
let(:included_policy_cookbooks) do
|
|
510
|
+
[
|
|
511
|
+
{
|
|
512
|
+
name: "cookbookA",
|
|
513
|
+
version: "2.0.0",
|
|
514
|
+
},
|
|
515
|
+
]
|
|
516
|
+
end
|
|
517
|
+
|
|
518
|
+
let(:included_policy_2_expanded_runlist) { ["recipe[cookbookB::default]"] }
|
|
519
|
+
let(:included_policy_2_cookbooks) do
|
|
520
|
+
[
|
|
521
|
+
{
|
|
522
|
+
name: "cookbookB",
|
|
523
|
+
version: "2.0.0",
|
|
524
|
+
},
|
|
525
|
+
]
|
|
526
|
+
end
|
|
527
|
+
|
|
528
|
+
it "does not raise a have conflicting dependency requirements error" do
|
|
529
|
+
expect { policyfile_lock.to_lock }.not_to raise_error
|
|
530
|
+
end
|
|
531
|
+
|
|
532
|
+
it "emits a lockfile with the correct dependencies" do
|
|
533
|
+
expect(policyfile_lock.to_lock["solution_dependencies"]["dependencies"]).to eq({
|
|
534
|
+
"cookbookA (2.0.0)" => [],
|
|
535
|
+
"cookbookB (2.0.0)" => [],
|
|
536
|
+
"cookbookC (1.0.0)" => [],
|
|
537
|
+
"local (1.0.0)" => [["cookbookC", "= 1.0.0"]],
|
|
538
|
+
})
|
|
539
|
+
end
|
|
540
|
+
end
|
|
541
|
+
|
|
542
|
+
context "when some cookbooks appear as dependencies or transitive dependencies of some included policies" do
|
|
543
|
+
let(:included_policy_expanded_runlist) { ["recipe[cookbookC::default]"] }
|
|
544
|
+
let(:included_policy_2_expanded_runlist) { ["recipe[cookbookC::default]"] }
|
|
545
|
+
|
|
546
|
+
context "and the locked versions of the cookbooks match" do
|
|
547
|
+
let(:included_policy_cookbooks) do
|
|
548
|
+
[
|
|
549
|
+
{
|
|
550
|
+
name: "cookbookC",
|
|
551
|
+
version: "1.0.0",
|
|
552
|
+
},
|
|
553
|
+
]
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
let(:included_policy_2_cookbooks) do
|
|
557
|
+
[
|
|
558
|
+
{
|
|
559
|
+
name: "cookbookC",
|
|
560
|
+
version: "1.0.0",
|
|
561
|
+
},
|
|
562
|
+
]
|
|
563
|
+
end
|
|
564
|
+
|
|
565
|
+
it "solves the dependencies with the matching versions" do
|
|
566
|
+
expect(policyfile_lock.to_lock["solution_dependencies"]["dependencies"]).to eq({
|
|
567
|
+
"cookbookC (1.0.0)" => [],
|
|
568
|
+
"local (1.0.0)" => [["cookbookC", "= 1.0.0"]],
|
|
569
|
+
})
|
|
570
|
+
end
|
|
571
|
+
end
|
|
572
|
+
|
|
573
|
+
context "and the locked versions of the cookbooks do not match" do
|
|
574
|
+
let(:included_policy_cookbooks) do
|
|
575
|
+
[
|
|
576
|
+
{
|
|
577
|
+
name: "cookbookC",
|
|
578
|
+
version: "1.0.0",
|
|
579
|
+
},
|
|
580
|
+
]
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
let(:included_policy_2_cookbooks) do
|
|
584
|
+
[
|
|
585
|
+
{
|
|
586
|
+
name: "cookbookC",
|
|
587
|
+
version: "2.0.0",
|
|
588
|
+
},
|
|
589
|
+
]
|
|
590
|
+
end
|
|
591
|
+
|
|
592
|
+
it "raises an error describing the conflict" do
|
|
593
|
+
expect { policyfile_lock }.to raise_error(
|
|
594
|
+
ChefCLI::Policyfile::IncludedPoliciesCookbookSource::ConflictingCookbookVersions,
|
|
595
|
+
/Multiple versions provided for cookbook cookbookC/
|
|
596
|
+
)
|
|
597
|
+
end
|
|
598
|
+
end
|
|
599
|
+
end
|
|
600
|
+
|
|
601
|
+
context "when default attributes are specified" do
|
|
602
|
+
context "when the included policies do not have conflicting attributes" do
|
|
603
|
+
let(:included_policy_default_attributes) do
|
|
604
|
+
{
|
|
605
|
+
"not_conflict" => {
|
|
606
|
+
"foo" => "bar",
|
|
607
|
+
},
|
|
608
|
+
}
|
|
609
|
+
end
|
|
610
|
+
let(:included_policy_2_default_attributes) do
|
|
611
|
+
{
|
|
612
|
+
"not_conflict" => {
|
|
613
|
+
"foo" => "bar",
|
|
614
|
+
},
|
|
615
|
+
}
|
|
616
|
+
end
|
|
617
|
+
let(:default_attributes) do
|
|
618
|
+
{
|
|
619
|
+
"not_conflict" => {
|
|
620
|
+
"bar" => "baz",
|
|
621
|
+
},
|
|
622
|
+
}
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
it "emits a lockfile with the included policies' attributes merged" do
|
|
626
|
+
expect(policyfile_lock.to_lock["default_attributes"]).to eq({
|
|
627
|
+
"not_conflict" => {
|
|
628
|
+
"foo" => "bar",
|
|
629
|
+
"bar" => "baz",
|
|
630
|
+
},
|
|
631
|
+
})
|
|
632
|
+
end
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
context "when the included policies have conflicting attributes" do
|
|
636
|
+
let(:included_policy_default_attributes) do
|
|
637
|
+
{
|
|
638
|
+
"conflict" => {
|
|
639
|
+
"foo" => "bar",
|
|
640
|
+
},
|
|
641
|
+
}
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
let(:included_policy_2_default_attributes) do
|
|
645
|
+
{
|
|
646
|
+
"conflict" => {
|
|
647
|
+
"foo" => "baz",
|
|
648
|
+
},
|
|
649
|
+
}
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
it "raises an error describing the conflict" do
|
|
653
|
+
expect { policyfile_lock }.to raise_error(
|
|
654
|
+
ChefCLI::Policyfile::AttributeMergeChecker::ConflictError,
|
|
655
|
+
"Attribute '[conflict][foo]' provided conflicting values by the following sources [\"included\", \"included2\"]")
|
|
656
|
+
end
|
|
657
|
+
end
|
|
658
|
+
end
|
|
659
|
+
|
|
660
|
+
context "when override attributes are specified" do
|
|
661
|
+
context "when the included policies do not have conflicting attributes" do
|
|
662
|
+
let(:included_policy_override_attributes) do
|
|
663
|
+
{
|
|
664
|
+
"not_conflict" => {
|
|
665
|
+
"foo" => "bar",
|
|
666
|
+
},
|
|
667
|
+
}
|
|
668
|
+
end
|
|
669
|
+
let(:included_policy_2_override_attributes) do
|
|
670
|
+
{
|
|
671
|
+
"not_conflict" => {
|
|
672
|
+
"foo" => "bar",
|
|
673
|
+
},
|
|
674
|
+
}
|
|
675
|
+
end
|
|
676
|
+
let(:override_attributes) do
|
|
677
|
+
{
|
|
678
|
+
"not_conflict" => {
|
|
679
|
+
"bar" => "baz",
|
|
680
|
+
},
|
|
681
|
+
}
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
it "emits a lockfile with the included policies' attributes merged" do
|
|
685
|
+
expect(policyfile_lock.to_lock["override_attributes"]).to eq({
|
|
686
|
+
"not_conflict" => {
|
|
687
|
+
"foo" => "bar",
|
|
688
|
+
"bar" => "baz",
|
|
689
|
+
},
|
|
690
|
+
})
|
|
691
|
+
end
|
|
692
|
+
end
|
|
693
|
+
|
|
694
|
+
context "when the included policies have conflicting attributes" do
|
|
695
|
+
let(:included_policy_override_attributes) do
|
|
696
|
+
{
|
|
697
|
+
"conflict" => {
|
|
698
|
+
"foo" => "bar",
|
|
699
|
+
},
|
|
700
|
+
}
|
|
701
|
+
end
|
|
702
|
+
|
|
703
|
+
let(:included_policy_2_override_attributes) do
|
|
704
|
+
{
|
|
705
|
+
"conflict" => {
|
|
706
|
+
"foo" => "baz",
|
|
707
|
+
},
|
|
708
|
+
}
|
|
709
|
+
end
|
|
710
|
+
|
|
711
|
+
it "raises an error describing the conflict" do
|
|
712
|
+
expect { policyfile_lock }.to raise_error(
|
|
713
|
+
ChefCLI::Policyfile::AttributeMergeChecker::ConflictError,
|
|
714
|
+
"Attribute '[conflict][foo]' provided conflicting values by the following sources [\"included\", \"included2\"]")
|
|
715
|
+
end
|
|
716
|
+
end
|
|
717
|
+
end
|
|
718
|
+
|
|
719
|
+
end
|
|
720
|
+
end
|