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,347 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require "spec_helper"
|
|
19
|
+
require "chef-cli/policyfile/cookbook_location_specification"
|
|
20
|
+
|
|
21
|
+
describe ChefCLI::Policyfile::CookbookLocationSpecification do
|
|
22
|
+
|
|
23
|
+
let(:policyfile_filename) { File.join(fixtures_path, "example_app/Policyfile.rb") }
|
|
24
|
+
|
|
25
|
+
let(:version_constraint) { ">= 0.0.0" }
|
|
26
|
+
|
|
27
|
+
let(:cookbook_name) { "my_cookbook" }
|
|
28
|
+
|
|
29
|
+
let(:source_options) { {} }
|
|
30
|
+
|
|
31
|
+
let(:cached_cookbook) { double("ChefCLI::CookbookMetadata") }
|
|
32
|
+
|
|
33
|
+
let(:install_path) { Pathname.new("~/.chefcli/cache/cookbooks/my_cookbook-1.0.0") }
|
|
34
|
+
|
|
35
|
+
let(:installer) { double("CookbookOmnifetch location", cached_cookbook: cached_cookbook, install_path: install_path) }
|
|
36
|
+
|
|
37
|
+
let(:storage_config) do
|
|
38
|
+
ChefCLI::Policyfile::StorageConfig.new.use_policyfile(policyfile_filename)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
let(:cookbook_location_spec) { described_class.new(cookbook_name, version_constraint, source_options, storage_config) }
|
|
42
|
+
|
|
43
|
+
it "has a name" do
|
|
44
|
+
expect(cookbook_location_spec.name).to eq(cookbook_name)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "has a version constraint" do
|
|
48
|
+
expect(cookbook_location_spec.version_constraint).to eq(Semverse::Constraint.new(version_constraint))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "has source options it was created with" do
|
|
52
|
+
expect(cookbook_location_spec.source_options).to eq(source_options)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "is equal to another cookbook spec with the same name, constraint, and options" do
|
|
56
|
+
equal_spec = described_class.new(cookbook_name, version_constraint, source_options, storage_config)
|
|
57
|
+
expect(cookbook_location_spec).to eq(equal_spec)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "is not equal to another cookbook spec if the name, constraint or option differ" do
|
|
61
|
+
different_name = described_class.new("wut", version_constraint, source_options, storage_config)
|
|
62
|
+
expect(cookbook_location_spec).to_not eq(different_name)
|
|
63
|
+
|
|
64
|
+
different_constraint = described_class.new(cookbook_name, ">= 1.0.0", source_options, storage_config)
|
|
65
|
+
expect(cookbook_location_spec).to_not eq(different_constraint)
|
|
66
|
+
|
|
67
|
+
different_opts = described_class.new(cookbook_name, version_constraint, { git: "git://example.com/wat.git" }, storage_config)
|
|
68
|
+
expect(cookbook_location_spec).to_not eq(different_opts)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "gives the base directory from which relative paths will be expanded" do
|
|
72
|
+
expect(cookbook_location_spec.relative_paths_root).to eq(File.join(fixtures_path, "example_app"))
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "gives source options for locking via the installer" do
|
|
76
|
+
lock_data = double("Installer lock data")
|
|
77
|
+
expect(installer).to receive(:lock_data).and_return(lock_data)
|
|
78
|
+
expect(cookbook_location_spec).to receive(:installer).and_return(installer)
|
|
79
|
+
expect(cookbook_location_spec.source_options_for_lock).to eq(lock_data)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "converts to a readable string with all relevant info" do
|
|
83
|
+
expected_s = "Cookbook 'my_cookbook' >= 0.0.0"
|
|
84
|
+
expect(cookbook_location_spec.to_s).to eq(expected_s)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
describe "fetching and querying a cookbook" do
|
|
88
|
+
|
|
89
|
+
before do
|
|
90
|
+
expect(CookbookOmnifetch).to receive(:init).with(cookbook_location_spec, source_options).and_return(installer)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "initializes a CookbookOmnifetch location class to handle installation" do
|
|
94
|
+
expect(cookbook_location_spec.installer).to eq(installer)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "delegates #installed? to the installer" do
|
|
98
|
+
expect(installer).to receive(:installed?).and_return(false)
|
|
99
|
+
expect(cookbook_location_spec).to_not be_installed
|
|
100
|
+
expect(installer).to receive(:installed?).and_return(true)
|
|
101
|
+
expect(cookbook_location_spec).to be_installed
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "delegates installation to the installer" do
|
|
105
|
+
expect(installer).to receive(:installed?).and_return(false)
|
|
106
|
+
expect(installer).to receive(:install)
|
|
107
|
+
cookbook_location_spec.ensure_cached
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "does not install the cookbook if it's already cached" do
|
|
111
|
+
expect(installer).to receive(:installed?).and_return(true)
|
|
112
|
+
expect(installer).to_not receive(:install)
|
|
113
|
+
cookbook_location_spec.ensure_cached
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "delegates cache_key to the installer" do
|
|
117
|
+
expect(installer).to receive(:cache_key).and_return("my_cookbook-1.2.3-supermarket.chef.io")
|
|
118
|
+
expect(cookbook_location_spec.cache_key).to eq("my_cookbook-1.2.3-supermarket.chef.io")
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "delegates relative_path to the installer" do
|
|
122
|
+
expect(installer).to receive(:relative_path).and_return(Pathname.new("../my_stuff/my_cookbook"))
|
|
123
|
+
expect(cookbook_location_spec.relative_path).to eq("../my_stuff/my_cookbook")
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "loads the cookbook metadata via the installer" do
|
|
127
|
+
expect(cookbook_location_spec.cached_cookbook).to eq(cached_cookbook)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
it "gives the cookbook's version via the metadata" do
|
|
131
|
+
expect(cached_cookbook).to receive(:version).and_return("1.2.3")
|
|
132
|
+
expect(cookbook_location_spec.version).to eq("1.2.3")
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it "gives the cookbook's dependencies via the metadata" do
|
|
136
|
+
expect(cached_cookbook).to receive(:dependencies).and_return("apt" => "~> 1.2.3")
|
|
137
|
+
expect(cookbook_location_spec.dependencies).to eq("apt" => "~> 1.2.3")
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it "determines whether a cookbook has a given recipe" do
|
|
141
|
+
cookbook_path = cookbook_location_spec.cookbook_path
|
|
142
|
+
# "cache" cookbook_path so we stub the correct object
|
|
143
|
+
allow(cookbook_location_spec).to receive(:cookbook_path).and_return(cookbook_path)
|
|
144
|
+
|
|
145
|
+
default_recipe_path = install_path.join("recipes/default.rb")
|
|
146
|
+
nope_recipe_path = install_path.join("recipes/nope.rb")
|
|
147
|
+
|
|
148
|
+
expect(cookbook_path).to receive(:join).with("recipes/default.rb").and_return(default_recipe_path)
|
|
149
|
+
expect(cookbook_path).to receive(:join).with("recipes/nope.rb").and_return(nope_recipe_path)
|
|
150
|
+
|
|
151
|
+
expect(default_recipe_path).to receive(:exist?).and_return(true)
|
|
152
|
+
expect(nope_recipe_path).to receive(:exist?).and_return(false)
|
|
153
|
+
|
|
154
|
+
expect(cookbook_location_spec.cookbook_has_recipe?("default")).to be(true)
|
|
155
|
+
expect(cookbook_location_spec.cookbook_has_recipe?("nope")).to be(false)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
describe "when created with no source" do
|
|
161
|
+
|
|
162
|
+
it "has a nil installer" do
|
|
163
|
+
expect(cookbook_location_spec.installer).to be_nil
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it "is not at a fixed version" do
|
|
167
|
+
expect(cookbook_location_spec.version_fixed?).to be false
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
describe "when created with invalid source options" do
|
|
173
|
+
|
|
174
|
+
let(:source_options) { { herp: "derp" } }
|
|
175
|
+
|
|
176
|
+
it "is invalid" do
|
|
177
|
+
expect(cookbook_location_spec).to_not be_valid
|
|
178
|
+
expect(cookbook_location_spec.errors.size).to eq(1)
|
|
179
|
+
error = cookbook_location_spec.errors.first
|
|
180
|
+
expect(error).to eq("Cookbook `my_cookbook' has invalid source options `{:herp=>\"derp\"}'")
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
describe "when created with a git source" do
|
|
186
|
+
|
|
187
|
+
let(:source_options) { { git: "git@github.com:example/my_cookbook.git" } }
|
|
188
|
+
|
|
189
|
+
it "has a git installer" do
|
|
190
|
+
expect(cookbook_location_spec.installer).to be_a_kind_of(CookbookOmnifetch::GitLocation)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
it "has a fixed version" do
|
|
194
|
+
expect(cookbook_location_spec.version_fixed?).to be true
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it "mirrors a canonical upstream" do
|
|
198
|
+
expect(cookbook_location_spec.mirrors_canonical_upstream?).to be true
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
it "is valid" do
|
|
202
|
+
expect(cookbook_location_spec.errors.size).to eq(0)
|
|
203
|
+
expect(cookbook_location_spec).to be_valid
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
describe "when created with a github source" do
|
|
209
|
+
|
|
210
|
+
let(:source_options) { { github: "my_org/my_cookbook" } }
|
|
211
|
+
|
|
212
|
+
it "has a github installer" do
|
|
213
|
+
expect(cookbook_location_spec.installer).to be_a_kind_of(CookbookOmnifetch::GithubLocation)
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
it "has a fixed version" do
|
|
217
|
+
expect(cookbook_location_spec.version_fixed?).to be true
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
it "mirrors a canonical upstream" do
|
|
221
|
+
expect(cookbook_location_spec.mirrors_canonical_upstream?).to be true
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it "is valid" do
|
|
225
|
+
expect(cookbook_location_spec.errors.size).to eq(0)
|
|
226
|
+
expect(cookbook_location_spec).to be_valid
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
describe "when created with a path source" do
|
|
232
|
+
|
|
233
|
+
let(:source_options) { { path: "../example_cookbook" } }
|
|
234
|
+
|
|
235
|
+
it "has a path installer" do
|
|
236
|
+
expect(cookbook_location_spec.installer).to be_a_kind_of(CookbookOmnifetch::PathLocation)
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
it "has a fixed version" do
|
|
240
|
+
expect(cookbook_location_spec.version_fixed?).to be true
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
it "isnt a mirror of a canonical upstream" do
|
|
244
|
+
expect(cookbook_location_spec.mirrors_canonical_upstream?).to be false
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
it "is valid" do
|
|
248
|
+
expect(cookbook_location_spec.errors.size).to eq(0)
|
|
249
|
+
expect(cookbook_location_spec).to be_valid
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
describe "when created with an artifactserver source" do
|
|
255
|
+
|
|
256
|
+
let(:source_options) { { artifactserver: "https://supermarket.chef.io:/api/v1/cookbooks/my_cookbook/versions/2.0.0/download" } }
|
|
257
|
+
|
|
258
|
+
it "has a artifactserver installer" do
|
|
259
|
+
expect(cookbook_location_spec.installer).to be_a_kind_of(CookbookOmnifetch::ArtifactserverLocation)
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "does not have a fixed version" do
|
|
263
|
+
expect(cookbook_location_spec.version_fixed?).to be false
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
it "is a mirror of a canonical upstream" do
|
|
267
|
+
expect(cookbook_location_spec.mirrors_canonical_upstream?).to be true
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
it "is valid" do
|
|
271
|
+
expect(cookbook_location_spec.errors.size).to eq(0)
|
|
272
|
+
expect(cookbook_location_spec).to be_valid
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
describe "when created with a chef_server source" do
|
|
278
|
+
|
|
279
|
+
let(:source_options) { { chef_server: "https://api.opscode.com/organizations/chef-oss-dev/cookbooks/my_cookbook/versions/2.0.0/download" } }
|
|
280
|
+
|
|
281
|
+
let(:http_client) { instance_double("ChefCLI::ChefServerAPIMulti") }
|
|
282
|
+
|
|
283
|
+
before do
|
|
284
|
+
CookbookOmnifetch.integration.default_chef_server_http_client = http_client
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
after do
|
|
288
|
+
CookbookOmnifetch.integration.default_chef_server_http_client = nil
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
it "has a chef_server installer" do
|
|
292
|
+
expect(cookbook_location_spec.installer).to be_a_kind_of(CookbookOmnifetch::ChefServerLocation)
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
it "does not have a fixed version" do
|
|
296
|
+
expect(cookbook_location_spec.version_fixed?).to be false
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
it "is a mirror of a canonical upstream" do
|
|
300
|
+
expect(cookbook_location_spec.mirrors_canonical_upstream?).to be true
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
it "is valid" do
|
|
304
|
+
expect(cookbook_location_spec.errors.size).to eq(0)
|
|
305
|
+
expect(cookbook_location_spec).to be_valid
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
describe "when created with a chef_server_artifact source" do
|
|
311
|
+
|
|
312
|
+
let(:source_options) do
|
|
313
|
+
{
|
|
314
|
+
chef_server_artifact: "https://api.opscode.com/organizations/chef-oss-dev/",
|
|
315
|
+
identifier: "09d43fad354b3efcc5b5836fef5137131f60f974",
|
|
316
|
+
}
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
let(:http_client) { instance_double("ChefCLI::ChefServerAPIMulti") }
|
|
320
|
+
|
|
321
|
+
before do
|
|
322
|
+
CookbookOmnifetch.integration.default_chef_server_http_client = http_client
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
after do
|
|
326
|
+
CookbookOmnifetch.integration.default_chef_server_http_client = nil
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
it "has a chef_server_artifact installer" do
|
|
330
|
+
expect(cookbook_location_spec.installer).to be_a_kind_of(CookbookOmnifetch::ChefServerArtifactLocation)
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
it "does has a fixed version" do
|
|
334
|
+
expect(cookbook_location_spec.version_fixed?).to be(true)
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
it "is a mirror of a canonical upstream" do
|
|
338
|
+
expect(cookbook_location_spec.mirrors_canonical_upstream?).to be(true)
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
it "is valid" do
|
|
342
|
+
expect(cookbook_location_spec.errors.size).to eq(0)
|
|
343
|
+
expect(cookbook_location_spec).to be_valid
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
end
|
|
347
|
+
end
|
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require "spec_helper"
|
|
19
|
+
require "chef-cli/policyfile/cookbook_locks"
|
|
20
|
+
|
|
21
|
+
shared_examples_for "Cookbook Lock" do
|
|
22
|
+
|
|
23
|
+
let(:cookbook_lock_data) { cookbook_lock.to_lock }
|
|
24
|
+
|
|
25
|
+
it "has a cookbook name" do
|
|
26
|
+
expect(cookbook_lock.name).to eq(cookbook_name)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "has a source_options attribute" do
|
|
30
|
+
cookbook_lock.source_options = { artifactserver: "https://artifacts.example.com/nginx/1.0.0/download" }
|
|
31
|
+
expect(cookbook_lock.source_options).to eq({ artifactserver: "https://artifacts.example.com/nginx/1.0.0/download" })
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "has an identifier attribute" do
|
|
35
|
+
cookbook_lock.identifier = "my-opaque-id"
|
|
36
|
+
expect(cookbook_lock.identifier).to eq("my-opaque-id")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "has a dotted_decimal_identifier attribute" do
|
|
40
|
+
cookbook_lock.dotted_decimal_identifier = "123.456.789"
|
|
41
|
+
expect(cookbook_lock.dotted_decimal_identifier).to eq("123.456.789")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "has a version attribute" do
|
|
45
|
+
cookbook_lock.version = "1.2.3"
|
|
46
|
+
expect(cookbook_lock.version).to eq("1.2.3")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "has a storage config" do
|
|
50
|
+
expect(cookbook_lock.storage_config).to eq(storage_config)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context "when the underlying cookbook has not been mutated, or #refresh! has not been called" do
|
|
54
|
+
|
|
55
|
+
it "is not updated" do
|
|
56
|
+
expect(cookbook_lock).to_not be_updated
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "does not have an updated identifier" do
|
|
60
|
+
expect(cookbook_lock.identifier_updated?).to be false
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "does not have an updated version" do
|
|
64
|
+
expect(cookbook_lock.version_updated?).to be false
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context "when version and identifier attributes are populated" do
|
|
70
|
+
|
|
71
|
+
before do
|
|
72
|
+
allow(cookbook_lock).to receive(:validate!)
|
|
73
|
+
|
|
74
|
+
cookbook_lock.identifier = "my-opaque-id"
|
|
75
|
+
cookbook_lock.dotted_decimal_identifier = "123.456.789"
|
|
76
|
+
cookbook_lock.version = "1.2.3"
|
|
77
|
+
cookbook_lock.source_options = { sourcekey: "location info" }
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "includes the identifier in the lock data" do
|
|
81
|
+
expect(cookbook_lock_data["identifier"]).to eq("my-opaque-id")
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "includes the dotted decimal identifier in the lock data" do
|
|
85
|
+
expect(cookbook_lock_data["dotted_decimal_identifier"]).to eq("123.456.789")
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "includes the version in lock data" do
|
|
89
|
+
expect(cookbook_lock_data["version"]).to eq("1.2.3")
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "includes the source_options in lock data" do
|
|
93
|
+
expect(cookbook_lock_data["source_options"]).to eq({ sourcekey: "location info" })
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "creates a CookbookLocationSpecification with the source and version data" do
|
|
97
|
+
location_spec = cookbook_lock.cookbook_location_spec
|
|
98
|
+
expect(location_spec.name).to eq(cookbook_name)
|
|
99
|
+
expect(location_spec.version_constraint).to eq(Semverse::Constraint.new("= 1.2.3"))
|
|
100
|
+
expect(location_spec.source_options).to eq({ sourcekey: "location info" })
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "delegates #dependencies to cookbook_location_spec" do
|
|
104
|
+
deps = [ [ "foo", ">= 0.0.0"], [ "bar", "~> 2.1" ] ]
|
|
105
|
+
expect(cookbook_lock.cookbook_location_spec).to receive(:dependencies).and_return(deps)
|
|
106
|
+
expect(cookbook_lock.dependencies).to eq(deps)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "delegates #installed? to the CookbookLocationSpecification" do
|
|
110
|
+
location_spec = cookbook_lock.cookbook_location_spec
|
|
111
|
+
expect(location_spec).to receive(:installed?).and_return(true)
|
|
112
|
+
expect(cookbook_lock).to be_installed
|
|
113
|
+
expect(location_spec).to receive(:installed?).and_return(false)
|
|
114
|
+
expect(cookbook_lock).to_not be_installed
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
context "when created from lock data" do
|
|
120
|
+
|
|
121
|
+
let(:lock_data) do
|
|
122
|
+
{
|
|
123
|
+
"identifier" => "my-opaque-id",
|
|
124
|
+
"dotted_decimal_identifier" => "123.456.789",
|
|
125
|
+
"version" => "1.2.3",
|
|
126
|
+
"source_options" => { "sourcekey" => "location info" },
|
|
127
|
+
"cache_key" => nil,
|
|
128
|
+
"source" => "cookbooks_local_path",
|
|
129
|
+
}
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
before do
|
|
133
|
+
cookbook_lock.build_from_lock_data(lock_data)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it "sets the identifier attribute" do
|
|
137
|
+
expect(cookbook_lock.identifier).to eq("my-opaque-id")
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it "sets the dotted_decimal_identifier attribute" do
|
|
141
|
+
expect(cookbook_lock.dotted_decimal_identifier).to eq("123.456.789")
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it "sets the version attribute" do
|
|
145
|
+
expect(cookbook_lock.version).to eq("1.2.3")
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "sets the source options" do
|
|
149
|
+
expect(cookbook_lock.source_options).to eq({ sourcekey: "location info" })
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
describe ChefCLI::Policyfile::CachedCookbook do
|
|
156
|
+
|
|
157
|
+
let(:cookbook_name) { "nginx" }
|
|
158
|
+
|
|
159
|
+
let(:storage_config) { ChefCLI::Policyfile::StorageConfig.new }
|
|
160
|
+
|
|
161
|
+
let(:cookbook_lock) do
|
|
162
|
+
described_class.new(cookbook_name, storage_config)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
include_examples "Cookbook Lock"
|
|
166
|
+
|
|
167
|
+
it "has a cache_key attribute" do
|
|
168
|
+
cookbook_lock.cache_key = "nginx-1.0.0-example.com"
|
|
169
|
+
expect(cookbook_lock.cache_key).to eq("nginx-1.0.0-example.com")
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it "has an origin attribute" do
|
|
173
|
+
cookbook_lock.origin = "https://artifacts.example.com/nginx/1.0.0/download"
|
|
174
|
+
expect(cookbook_lock.origin).to eq("https://artifacts.example.com/nginx/1.0.0/download")
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "errors locating the cookbook when the cache key is not set" do
|
|
178
|
+
expect { cookbook_lock.cookbook_path }.to raise_error(ChefCLI::MissingCookbookLockData)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it "ignores calls to #refresh!" do
|
|
182
|
+
expect { cookbook_lock.refresh! }.to_not raise_error
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
context "when populated with valid data" do
|
|
186
|
+
|
|
187
|
+
let(:cookbook_name) { "foo" }
|
|
188
|
+
|
|
189
|
+
let(:cache_path) { File.join(fixtures_path, "cached_cookbooks") }
|
|
190
|
+
|
|
191
|
+
before do
|
|
192
|
+
cookbook_lock.cache_key = "foo-1.0.0"
|
|
193
|
+
|
|
194
|
+
storage_config.cache_path = cache_path
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it "gives the path to the cookbook in the cache" do
|
|
198
|
+
expect(cookbook_lock.cookbook_path).to eq(File.join(cache_path, "foo-1.0.0"))
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
describe ChefCLI::Policyfile::LocalCookbook do
|
|
206
|
+
|
|
207
|
+
let(:cookbook_name) { "nginx" }
|
|
208
|
+
|
|
209
|
+
let(:storage_config) { ChefCLI::Policyfile::StorageConfig.new }
|
|
210
|
+
|
|
211
|
+
let(:scm_profiler) { instance_double("ChefCLI::CookbookProfiler::Git", profile_data: {}) }
|
|
212
|
+
|
|
213
|
+
let(:cookbook_lock) do
|
|
214
|
+
lock = described_class.new(cookbook_name, storage_config)
|
|
215
|
+
allow(lock).to receive(:scm_profiler).and_return(scm_profiler)
|
|
216
|
+
lock
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
include_examples "Cookbook Lock"
|
|
220
|
+
|
|
221
|
+
describe "gathering identifier info" do
|
|
222
|
+
let(:identifiers) do
|
|
223
|
+
instance_double("ChefCLI::CookbookProfiler::Identifiers",
|
|
224
|
+
content_identifier: "abc123",
|
|
225
|
+
dotted_decimal_identifier: "111.222.333",
|
|
226
|
+
semver_version: "1.2.3")
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
before do
|
|
230
|
+
allow(cookbook_lock).to receive(:identifiers).and_return(identifiers)
|
|
231
|
+
cookbook_lock.gather_profile_data
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
it "sets the content identifier" do
|
|
235
|
+
expect(cookbook_lock.identifier).to eq("abc123")
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it "sets the backwards compatible dotted decimal identifer equivalent" do
|
|
239
|
+
expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
it "collects the 'real' SemVer version of the cookbook" do
|
|
243
|
+
expect(cookbook_lock.version).to eq("1.2.3")
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
describe "selecting an SCM profiler" do
|
|
249
|
+
|
|
250
|
+
let(:cookbook_source_relpath) { "nginx" }
|
|
251
|
+
|
|
252
|
+
let(:cookbook_source_path) do
|
|
253
|
+
path = File.join(tempdir, cookbook_source_relpath)
|
|
254
|
+
FileUtils.mkdir_p(path)
|
|
255
|
+
path
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
# everywhere else, #scm_profiler is stubbed, we need the unstubbed version
|
|
259
|
+
let(:cookbook_lock) do
|
|
260
|
+
described_class.new(cookbook_name, storage_config)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
before do
|
|
264
|
+
cookbook_lock.source = cookbook_source_path
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
after do
|
|
268
|
+
clear_tempdir
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
context "when the cookbook is in a git-repo" do
|
|
272
|
+
|
|
273
|
+
before do
|
|
274
|
+
FileUtils.mkdir_p(git_dir_path)
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
context "when the cookbook is a self-contained git repo" do
|
|
278
|
+
|
|
279
|
+
let(:git_dir_path) { File.join(cookbook_source_path, ".git") }
|
|
280
|
+
|
|
281
|
+
it "selects the git profiler" do
|
|
282
|
+
expect(cookbook_lock.scm_profiler).to be_an_instance_of(ChefCLI::CookbookProfiler::Git)
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
context "when the cookbook is a subdirectory of a git repo" do
|
|
288
|
+
|
|
289
|
+
let(:cookbook_source_relpath) { "cookbook_repo/nginx" }
|
|
290
|
+
|
|
291
|
+
let(:git_dir_path) { File.join(tempdir, "cookbook_repo/.git") }
|
|
292
|
+
|
|
293
|
+
it "selects the git profiler" do
|
|
294
|
+
expect(cookbook_lock.scm_profiler).to be_an_instance_of(ChefCLI::CookbookProfiler::Git)
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
context "when the cookbook is not in a git repo" do
|
|
302
|
+
|
|
303
|
+
it "selects the null profiler" do
|
|
304
|
+
expect(cookbook_lock.scm_profiler).to be_an_instance_of(ChefCLI::CookbookProfiler::NullSCM)
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
context "when loading data from a serialized form" do
|
|
312
|
+
|
|
313
|
+
let(:previous_lock_data) do
|
|
314
|
+
{
|
|
315
|
+
"identifier" => "abc123",
|
|
316
|
+
"dotted_decimal_identifier" => "111.222.333",
|
|
317
|
+
"version" => "1.2.3",
|
|
318
|
+
"source" => "../my_repo/nginx",
|
|
319
|
+
"source_options" => {
|
|
320
|
+
"path" => "../my_repo/nginx",
|
|
321
|
+
},
|
|
322
|
+
"cache_key" => nil,
|
|
323
|
+
}
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
before do
|
|
327
|
+
cookbook_lock.build_from_lock_data(previous_lock_data)
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
it "sets the identifier" do
|
|
331
|
+
expect(cookbook_lock.identifier).to eq("abc123")
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
it "sets the dotted_decimal_identifier" do
|
|
335
|
+
expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
it "sets the version" do
|
|
339
|
+
expect(cookbook_lock.version).to eq("1.2.3")
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
it "sets the source attribute" do
|
|
343
|
+
expect(cookbook_lock.source).to eq("../my_repo/nginx")
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
it "sets the source options, symbolizing keys so the data is compatible with CookbookLocationSpecification" do
|
|
347
|
+
expected = { path: "../my_repo/nginx" }
|
|
348
|
+
expect(cookbook_lock.source_options).to eq(expected)
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
it "doesn't refresh scm_data when #lock_data is called" do
|
|
352
|
+
allow(scm_profiler).to receive(:profile_data).and_raise("This shouldn't get called")
|
|
353
|
+
cookbook_lock.lock_data
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
context "after the data has been refreshed" do
|
|
357
|
+
|
|
358
|
+
before do
|
|
359
|
+
allow(cookbook_lock).to receive(:identifiers).and_return(identifiers)
|
|
360
|
+
cookbook_lock.refresh!
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
context "and the underlying hasn't been mutated" do
|
|
364
|
+
|
|
365
|
+
let(:identifiers) do
|
|
366
|
+
instance_double("ChefCLI::CookbookProfiler::Identifiers",
|
|
367
|
+
content_identifier: "abc123",
|
|
368
|
+
dotted_decimal_identifier: "111.222.333",
|
|
369
|
+
semver_version: "1.2.3")
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
it "has the correct identifier" do
|
|
373
|
+
expect(cookbook_lock.identifier).to eq("abc123")
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
it "has the correct dotted_decimal_identifier" do
|
|
377
|
+
expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
it "has the correct version" do
|
|
381
|
+
expect(cookbook_lock.version).to eq("1.2.3")
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
it "sets the updated flag to false" do
|
|
385
|
+
expect(cookbook_lock).to_not be_updated
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
it "sets the version_updated flag to false" do
|
|
389
|
+
expect(cookbook_lock.version_updated?).to be(false)
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
it "sets the identifier_updated flag to false" do
|
|
393
|
+
expect(cookbook_lock.identifier_updated?).to be(false)
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
context "and the underlying data has been mutated" do
|
|
399
|
+
# represents the updated state of the cookbook
|
|
400
|
+
let(:identifiers) do
|
|
401
|
+
instance_double("ChefCLI::CookbookProfiler::Identifiers",
|
|
402
|
+
content_identifier: "def456",
|
|
403
|
+
dotted_decimal_identifier: "777.888.999",
|
|
404
|
+
semver_version: "7.8.9")
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
it "sets the content identifier to the new identifier" do
|
|
408
|
+
expect(cookbook_lock.identifier).to eq("def456")
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
it "sets the dotted_decimal_identifier to the new identifier" do
|
|
412
|
+
expect(cookbook_lock.dotted_decimal_identifier).to eq("777.888.999")
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
it "sets the SemVer version to the new version" do
|
|
416
|
+
expect(cookbook_lock.version).to eq("7.8.9")
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
it "sets the updated flag to true" do
|
|
420
|
+
expect(cookbook_lock).to be_updated
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
it "sets the version_updated flag to true" do
|
|
424
|
+
expect(cookbook_lock.version_updated?).to be(true)
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
it "sets the identifier_updated flag to true" do
|
|
428
|
+
expect(cookbook_lock.identifier_updated?).to be(true)
|
|
429
|
+
end
|
|
430
|
+
end
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
describe ChefCLI::Policyfile::ArchivedCookbook do
|
|
437
|
+
|
|
438
|
+
let(:cookbook_name) { "nginx" }
|
|
439
|
+
|
|
440
|
+
let(:storage_config) { ChefCLI::Policyfile::StorageConfig.new }
|
|
441
|
+
|
|
442
|
+
let(:wrapped_cookbook_lock_data) do
|
|
443
|
+
{
|
|
444
|
+
"identifier" => "abc123",
|
|
445
|
+
"dotted_decimal_identifier" => "111.222.333",
|
|
446
|
+
"version" => "1.2.3",
|
|
447
|
+
"source" => "../my_repo/nginx",
|
|
448
|
+
"source_options" => {
|
|
449
|
+
# when getting the cookbook location spec, source options needs to have
|
|
450
|
+
# symbolic keys, so a round trip via LocalCookbook#build_from_lock_data
|
|
451
|
+
# will result in this being a symbol
|
|
452
|
+
path: "../my_repo/nginx",
|
|
453
|
+
},
|
|
454
|
+
"cache_key" => nil,
|
|
455
|
+
"scm_info" => {},
|
|
456
|
+
}
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
let(:wrapped_cookbook_lock) do
|
|
460
|
+
lock = ChefCLI::Policyfile::LocalCookbook.new(cookbook_name, storage_config)
|
|
461
|
+
allow(lock).to receive(:scm_info).and_return({})
|
|
462
|
+
lock.build_from_lock_data(wrapped_cookbook_lock_data)
|
|
463
|
+
lock
|
|
464
|
+
end
|
|
465
|
+
|
|
466
|
+
let(:cookbook_lock) do
|
|
467
|
+
described_class.new(wrapped_cookbook_lock, storage_config)
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
let(:archived_cookbook_path) { File.join(storage_config.relative_paths_root, "cookbook_artifacts", "nginx-abc123") }
|
|
471
|
+
|
|
472
|
+
it "sets cookbook_path to the path within the archive" do
|
|
473
|
+
expect(cookbook_lock.cookbook_path).to eq(archived_cookbook_path)
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
it "implements build_from_lock_data" do
|
|
477
|
+
msg = "ArchivedCookbook cannot be built from lock data, it can only wrap an existing lock object"
|
|
478
|
+
expect { cookbook_lock.build_from_lock_data({}) }.to raise_error(NotImplementedError, msg)
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
it "implements validate!" do
|
|
482
|
+
expect(cookbook_lock.validate!).to be(true)
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
it "implements refresh!" do
|
|
486
|
+
expect(cookbook_lock.refresh!).to be(true)
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
it "implements installed?" do
|
|
490
|
+
allow(File).to receive(:exist?).with(archived_cookbook_path).and_return(false)
|
|
491
|
+
allow(File).to receive(:directory?).with(archived_cookbook_path).and_return(false)
|
|
492
|
+
expect(cookbook_lock.installed?).to be(false)
|
|
493
|
+
allow(File).to receive(:exist?).with(archived_cookbook_path).and_return(true)
|
|
494
|
+
allow(File).to receive(:directory?).with(archived_cookbook_path).and_return(true)
|
|
495
|
+
expect(cookbook_lock.installed?).to be(true)
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
describe "delegated behavior" do
|
|
499
|
+
|
|
500
|
+
it "sets the identifier" do
|
|
501
|
+
expect(cookbook_lock.identifier).to eq("abc123")
|
|
502
|
+
end
|
|
503
|
+
|
|
504
|
+
it "sets the dotted_decimal_identifier" do
|
|
505
|
+
expect(cookbook_lock.dotted_decimal_identifier).to eq("111.222.333")
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
it "sets the version" do
|
|
509
|
+
expect(cookbook_lock.version).to eq("1.2.3")
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
it "sets the source attribute" do
|
|
513
|
+
expect(cookbook_lock.source).to eq("../my_repo/nginx")
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
it "sets the source options, symbolizing keys so the data is compatible with CookbookLocationSpecification" do
|
|
517
|
+
expected = { path: "../my_repo/nginx" }
|
|
518
|
+
expect(cookbook_lock.source_options).to eq(expected)
|
|
519
|
+
end
|
|
520
|
+
|
|
521
|
+
it "returns unchanged data when calling to_lock" do
|
|
522
|
+
expect(cookbook_lock.to_lock).to eq(wrapped_cookbook_lock_data)
|
|
523
|
+
end
|
|
524
|
+
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
end
|