chef-dk 0.13.21 → 0.14.25
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 +4 -4
- data/CONTRIBUTING.md +186 -186
- data/Gemfile +37 -14
- data/Gemfile.lock +178 -72
- data/LICENSE +201 -201
- data/README.md +11 -148
- data/acceptance/.shared/kitchen_acceptance/.kitchen.digitalocean.yml +27 -27
- data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +288 -288
- data/acceptance/.shared/kitchen_acceptance/.kitchen.vagrant.yml +52 -52
- data/acceptance/.shared/kitchen_acceptance/libraries/kitchen.rb +51 -51
- data/acceptance/.shared/kitchen_acceptance/metadata.rb +1 -1
- data/acceptance/Gemfile +2 -1
- data/acceptance/Gemfile.lock +39 -42
- data/acceptance/README.md +132 -132
- data/acceptance/trivial/.acceptance/acceptance-cookbook/.gitignore +2 -2
- data/acceptance/trivial/.acceptance/acceptance-cookbook/metadata.rb +2 -2
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/destroy.rb +1 -1
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/provision.rb +1 -1
- data/acceptance/trivial/.acceptance/acceptance-cookbook/recipes/verify.rb +1 -1
- data/acceptance/trivial/.kitchen.yml +7 -7
- data/acceptance/trivial/test/integration/chefdk-current-install/inspec/chef_client_spec.rb +5 -5
- data/bin/chef +25 -25
- data/lib/chef-dk.rb +19 -19
- data/lib/chef-dk/authenticated_http.rb +40 -40
- data/lib/chef-dk/chef_runner.rb +107 -107
- data/lib/chef-dk/cli.rb +200 -200
- data/lib/chef-dk/command/base.rb +79 -79
- data/lib/chef-dk/command/clean_policy_cookbooks.rb +116 -116
- data/lib/chef-dk/command/clean_policy_revisions.rb +113 -113
- data/lib/chef-dk/command/delete_policy.rb +122 -122
- data/lib/chef-dk/command/delete_policy_group.rb +122 -122
- data/lib/chef-dk/command/diff.rb +316 -316
- data/lib/chef-dk/command/env.rb +90 -90
- data/lib/chef-dk/command/exec.rb +45 -45
- data/lib/chef-dk/command/export.rb +157 -157
- data/lib/chef-dk/command/gem.rb +47 -47
- data/lib/chef-dk/command/generate.rb +120 -120
- data/lib/chef-dk/command/generator_commands.rb +83 -80
- data/lib/chef-dk/command/generator_commands/app.rb +107 -107
- data/lib/chef-dk/command/generator_commands/attribute.rb +37 -37
- data/lib/chef-dk/command/generator_commands/base.rb +148 -148
- data/lib/chef-dk/command/generator_commands/cookbook.rb +153 -153
- data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
- data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
- data/lib/chef-dk/command/generator_commands/generator_generator.rb +177 -177
- data/lib/chef-dk/command/generator_commands/lwrp.rb +36 -36
- data/lib/chef-dk/command/generator_commands/policyfile.rb +127 -127
- data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
- data/lib/chef-dk/command/generator_commands/repo.rb +125 -125
- data/lib/chef-dk/command/generator_commands/template.rb +46 -46
- data/lib/chef-dk/command/install.rb +121 -121
- data/lib/chef-dk/command/provision.rb +438 -438
- data/lib/chef-dk/command/push.rb +118 -118
- data/lib/chef-dk/command/push_archive.rb +126 -126
- data/lib/chef-dk/command/shell_init.rb +180 -180
- data/lib/chef-dk/command/show_policy.rb +165 -165
- data/lib/chef-dk/command/undelete.rb +155 -155
- data/lib/chef-dk/command/update.rb +148 -148
- data/lib/chef-dk/command/verify.rb +106 -29
- data/lib/chef-dk/completions/bash.sh.erb +5 -5
- data/lib/chef-dk/completions/chef.fish.erb +10 -10
- data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
- data/lib/chef-dk/component_test.rb +30 -1
- data/lib/chef-dk/configurable.rb +69 -69
- data/lib/chef-dk/cookbook_metadata.rb +45 -45
- data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
- data/lib/chef-dk/cookbook_profiler/git.rb +151 -151
- data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
- data/lib/chef-dk/cookbook_profiler/null_scm.rb +32 -32
- data/lib/chef-dk/exceptions.rb +129 -129
- data/lib/chef-dk/generator.rb +163 -163
- data/lib/chef-dk/helpers.rb +159 -159
- data/lib/chef-dk/pager.rb +106 -106
- data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +138 -138
- data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +54 -54
- data/lib/chef-dk/policyfile/community_cookbook_source.rb +97 -97
- data/lib/chef-dk/policyfile/comparison_base.rb +124 -124
- data/lib/chef-dk/policyfile/cookbook_location_specification.rb +154 -154
- data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
- data/lib/chef-dk/policyfile/cookbook_sources.rb +22 -22
- data/lib/chef-dk/policyfile/delivery_supermarket_source.rb +90 -90
- data/lib/chef-dk/policyfile/differ.rb +266 -266
- data/lib/chef-dk/policyfile/dsl.rb +261 -261
- data/lib/chef-dk/policyfile/lister.rb +232 -232
- data/lib/chef-dk/policyfile/null_cookbook_source.rb +45 -45
- data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
- data/lib/chef-dk/policyfile/reports/install.rb +70 -70
- data/lib/chef-dk/policyfile/reports/table_printer.rb +58 -58
- data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
- data/lib/chef-dk/policyfile/solution_dependencies.rb +298 -298
- data/lib/chef-dk/policyfile/storage_config.rb +100 -100
- data/lib/chef-dk/policyfile/undo_record.rb +142 -142
- data/lib/chef-dk/policyfile/undo_stack.rb +130 -130
- data/lib/chef-dk/policyfile/uploader.rb +213 -213
- data/lib/chef-dk/policyfile_compiler.rb +419 -419
- data/lib/chef-dk/policyfile_lock.rb +552 -552
- data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
- data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +125 -125
- data/lib/chef-dk/policyfile_services/export_repo.rb +421 -421
- data/lib/chef-dk/policyfile_services/install.rb +126 -126
- data/lib/chef-dk/policyfile_services/push.rb +114 -114
- data/lib/chef-dk/policyfile_services/push_archive.rb +204 -204
- data/lib/chef-dk/policyfile_services/rm_policy.rb +142 -142
- data/lib/chef-dk/policyfile_services/rm_policy_group.rb +86 -86
- data/lib/chef-dk/policyfile_services/show_policy.rb +237 -237
- data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
- data/lib/chef-dk/policyfile_services/update_attributes.rb +104 -104
- data/lib/chef-dk/service_exception_inspectors.rb +25 -25
- data/lib/chef-dk/service_exception_inspectors/base.rb +40 -40
- data/lib/chef-dk/service_exception_inspectors/http.rb +121 -121
- data/lib/chef-dk/service_exceptions.rb +143 -143
- data/lib/chef-dk/shell_out.rb +36 -36
- data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +3 -3
- data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +102 -102
- data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
- data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +54 -54
- data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +16 -16
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +28 -28
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -27
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -7
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +3 -3
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -8
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +58 -58
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -6
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/policies/README.md +24 -24
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +9 -9
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
- data/lib/chef-dk/skeletons/code_generator/files/default/serverspec_spec_helper.rb +8 -8
- data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +2 -2
- data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -2
- data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
- data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +97 -97
- data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +12 -12
- data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +117 -117
- data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +24 -24
- data/lib/chef-dk/skeletons/code_generator/recipes/lwrp.rb +23 -23
- data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +8 -8
- data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +27 -27
- data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +67 -67
- data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
- data/lib/chef-dk/skeletons/code_generator/templates/default/{LICENSE.apache2.erb → LICENSE.apachev2.erb} +201 -201
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
- data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -25
- data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
- data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +21 -21
- data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +32 -32
- data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +7 -7
- data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
- data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +20 -20
- data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +11 -11
- data/lib/chef-dk/skeletons/code_generator/templates/default/serverspec_default_spec.rb.erb +9 -9
- data/lib/chef-dk/ui.rb +58 -58
- data/lib/chef-dk/version.rb +1 -1
- data/lib/kitchen/provisioner/policyfile_zero.rb +195 -195
- data/omnibus_overrides.rb +19 -11
- data/spec/shared/a_file_generator.rb +125 -125
- data/spec/shared/a_generated_file.rb +12 -12
- data/spec/shared/command_with_ui_object.rb +11 -11
- data/spec/shared/custom_generator_cookbook.rb +130 -130
- data/spec/shared/fixture_cookbook_checksums.rb +47 -47
- data/spec/shared/setup_git_cookbooks.rb +53 -53
- data/spec/spec_helper.rb +51 -51
- data/spec/test_helpers.rb +84 -84
- data/spec/unit/chef_runner_spec.rb +139 -139
- data/spec/unit/cli_spec.rb +357 -357
- data/spec/unit/command/base_spec.rb +173 -169
- data/spec/unit/command/clean_policy_cookbooks_spec.rb +181 -181
- data/spec/unit/command/clean_policy_revisions_spec.rb +181 -181
- data/spec/unit/command/delete_policy_group_spec.rb +207 -207
- data/spec/unit/command/delete_policy_spec.rb +207 -207
- data/spec/unit/command/diff_spec.rb +312 -312
- data/spec/unit/command/env_spec.rb +52 -52
- data/spec/unit/command/exec_spec.rb +179 -179
- data/spec/unit/command/export_spec.rb +200 -200
- data/spec/unit/command/generate_spec.rb +142 -142
- data/spec/unit/command/generator_commands/app_spec.rb +169 -169
- data/spec/unit/command/generator_commands/attribute_spec.rb +32 -32
- data/spec/unit/command/generator_commands/base_spec.rb +136 -136
- data/spec/unit/command/generator_commands/cookbook_file_spec.rb +32 -32
- data/spec/unit/command/generator_commands/cookbook_spec.rb +450 -450
- data/spec/unit/command/generator_commands/generator_generator_spec.rb +229 -229
- data/spec/unit/command/generator_commands/lwrp_spec.rb +32 -32
- data/spec/unit/command/generator_commands/policyfile_spec.rb +225 -225
- data/spec/unit/command/generator_commands/recipe_spec.rb +34 -34
- data/spec/unit/command/generator_commands/repo_spec.rb +374 -367
- data/spec/unit/command/generator_commands/template_spec.rb +32 -32
- data/spec/unit/command/install_spec.rb +179 -179
- data/spec/unit/command/provision_spec.rb +592 -592
- data/spec/unit/command/push_archive_spec.rb +153 -153
- data/spec/unit/command/push_spec.rb +199 -199
- data/spec/unit/command/shell_init_spec.rb +329 -329
- data/spec/unit/command/show_policy_spec.rb +235 -235
- data/spec/unit/command/undelete_spec.rb +246 -246
- data/spec/unit/command/update_spec.rb +275 -275
- data/spec/unit/command/verify_spec.rb +15 -6
- data/spec/unit/commands_map_spec.rb +57 -57
- data/spec/unit/component_test_spec.rb +128 -126
- data/spec/unit/configurable_spec.rb +41 -41
- data/spec/unit/cookbook_metadata_spec.rb +98 -98
- data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
- data/spec/unit/cookbook_profiler/identifiers_spec.rb +83 -83
- data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
- data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
- data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
- data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
- data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -5
- data/spec/unit/fixtures/configurable/test_configurable.rb +10 -10
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
- data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
- data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
- data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
- data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +36 -36
- data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -3
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -2
- data/spec/unit/fixtures/example_cookbook/.gitignore +17 -17
- data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
- data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
- data/spec/unit/fixtures/example_cookbook/README.md +4 -4
- data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
- data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
- data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
- data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
- data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
- data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
- data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
- data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
- data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
- data/spec/unit/generator_spec.rb +119 -120
- data/spec/unit/helpers_spec.rb +92 -92
- data/spec/unit/pager_spec.rb +119 -119
- data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -93
- data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +34 -34
- data/spec/unit/policyfile/community_cookbook_source_spec.rb +84 -84
- data/spec/unit/policyfile/comparison_base_spec.rb +343 -343
- data/spec/unit/policyfile/cookbook_location_specification_spec.rb +277 -277
- data/spec/unit/policyfile/cookbook_locks_spec.rb +529 -529
- data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +130 -130
- data/spec/unit/policyfile/differ_spec.rb +687 -687
- data/spec/unit/policyfile/lister_spec.rb +272 -272
- data/spec/unit/policyfile/null_cookbook_source_spec.rb +35 -35
- data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
- data/spec/unit/policyfile/reports/install_spec.rb +115 -115
- data/spec/unit/policyfile/reports/upload_spec.rb +96 -96
- data/spec/unit/policyfile/solution_dependencies_spec.rb +145 -145
- data/spec/unit/policyfile/storage_config_spec.rb +172 -172
- data/spec/unit/policyfile/undo_record_spec.rb +260 -260
- data/spec/unit/policyfile/undo_stack_spec.rb +266 -266
- data/spec/unit/policyfile/uploader_spec.rb +410 -410
- data/spec/unit/policyfile_demands_spec.rb +1203 -1203
- data/spec/unit/policyfile_evaluation_spec.rb +642 -642
- data/spec/unit/policyfile_lock_build_spec.rb +1056 -1056
- data/spec/unit/policyfile_lock_install_spec.rb +138 -138
- data/spec/unit/policyfile_lock_serialization_spec.rb +425 -425
- data/spec/unit/policyfile_lock_validation_spec.rb +611 -611
- data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
- data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +275 -275
- data/spec/unit/policyfile_services/export_repo_spec.rb +481 -481
- data/spec/unit/policyfile_services/install_spec.rb +211 -211
- data/spec/unit/policyfile_services/push_archive_spec.rb +378 -378
- data/spec/unit/policyfile_services/push_spec.rb +233 -233
- data/spec/unit/policyfile_services/rm_policy_group_spec.rb +241 -241
- data/spec/unit/policyfile_services/rm_policy_spec.rb +266 -266
- data/spec/unit/policyfile_services/show_policy_spec.rb +889 -889
- data/spec/unit/policyfile_services/undelete_spec.rb +304 -304
- data/spec/unit/policyfile_services/update_attributes_spec.rb +217 -217
- data/spec/unit/service_exception_inspectors/base_spec.rb +43 -43
- data/spec/unit/service_exception_inspectors/http_spec.rb +140 -140
- data/spec/unit/shell_out_spec.rb +34 -34
- data/spec/unit/tasks/helpers_spec.rb +75 -0
- data/tasks/bin/bundle-platform +0 -0
- data/tasks/bin/bundle-platform.bat +0 -0
- data/tasks/bin/create-override-gemfile +110 -0
- data/tasks/bundle.rb +27 -11
- data/tasks/bundle_util.rb +6 -5
- data/tasks/dependencies.rb +97 -122
- data/tasks/gemfile_util.rb +357 -66
- data/tasks/helpers.rb +47 -0
- data/tasks/version.rb +1 -5
- data/version_policy.rb +66 -41
- data/warning.txt +9 -9
- metadata +7 -5
- data/Gemfile.windows +0 -34
- data/Gemfile.windows.lock +0 -936
|
@@ -1,642 +1,642 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Copyright:: Copyright (c) 2014 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-dk/policyfile_compiler'
|
|
20
|
-
|
|
21
|
-
describe ChefDK::PolicyfileCompiler do
|
|
22
|
-
|
|
23
|
-
let(:storage_config) { ChefDK::Policyfile::StorageConfig.new.use_policyfile("TestPolicyfile.rb") }
|
|
24
|
-
|
|
25
|
-
let(:policyfile) { ChefDK::PolicyfileCompiler.evaluate(policyfile_rb, "TestPolicyfile.rb") }
|
|
26
|
-
|
|
27
|
-
describe "Evaluate a policyfile" do
|
|
28
|
-
|
|
29
|
-
describe "when the policyfile is not valid" do
|
|
30
|
-
|
|
31
|
-
describe "when error! is called" do
|
|
32
|
-
|
|
33
|
-
let(:policyfile_rb) { "raise 'oops'" }
|
|
34
|
-
|
|
35
|
-
it "raises a PolicyfileError" do
|
|
36
|
-
expect { policyfile.error! }.to raise_error(ChefDK::PolicyfileError)
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
context "Given an empty policyfile" do
|
|
41
|
-
|
|
42
|
-
let(:policyfile_rb) { "" }
|
|
43
|
-
|
|
44
|
-
it "has an invalid run_list" do
|
|
45
|
-
expect(policyfile.errors).to include("Invalid run_list. run_list cannot be empty")
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
context "Given a policyfile with a syntax error" do
|
|
51
|
-
|
|
52
|
-
let(:policyfile_rb) { "{{{{::::{{::" }
|
|
53
|
-
|
|
54
|
-
it "has a syntax error message" do
|
|
55
|
-
expected_error=<<-E
|
|
56
|
-
Invalid ruby syntax in policyfile 'TestPolicyfile.rb':
|
|
57
|
-
|
|
58
|
-
TestPolicyfile.rb:1: syntax error, unexpected :: at EXPR_BEG, expecting tCONSTANT
|
|
59
|
-
{{{{::::{{::
|
|
60
|
-
^
|
|
61
|
-
TestPolicyfile.rb:1: syntax error, unexpected end-of-input, expecting tCONSTANT
|
|
62
|
-
{{{{::::{{::
|
|
63
|
-
^
|
|
64
|
-
E
|
|
65
|
-
expect(policyfile.errors.size).to eq(1)
|
|
66
|
-
expect(policyfile.errors.first).to eq(expected_error.chomp)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
context "Given a policyfile with a ruby error" do
|
|
72
|
-
|
|
73
|
-
let(:policyfile_rb) { "raise 'oops'" }
|
|
74
|
-
|
|
75
|
-
it "has an error message with code context" do
|
|
76
|
-
expect(policyfile.errors.size).to eq(1)
|
|
77
|
-
expected_message = <<-E
|
|
78
|
-
Evaluation of policyfile 'TestPolicyfile.rb' raised an exception
|
|
79
|
-
Exception: RuntimeError "oops"
|
|
80
|
-
|
|
81
|
-
Relevant Code:
|
|
82
|
-
1: raise 'oops'
|
|
83
|
-
|
|
84
|
-
Backtrace:
|
|
85
|
-
TestPolicyfile.rb:1:in `eval_policyfile'
|
|
86
|
-
E
|
|
87
|
-
expect(policyfile.errors.first).to eq(expected_message)
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
context "when given an invalid run list item" do
|
|
92
|
-
|
|
93
|
-
context "when there is only one colon between cookbook and recipe name" do
|
|
94
|
-
|
|
95
|
-
let(:policyfile_rb) do
|
|
96
|
-
<<-EOH
|
|
97
|
-
name "hello"
|
|
98
|
-
|
|
99
|
-
# Should be "foo::bar" (missing a colon)
|
|
100
|
-
run_list "foo:bar"
|
|
101
|
-
EOH
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it "has an error message with the offending run list item" do
|
|
105
|
-
expect(policyfile.errors).to_not be_empty
|
|
106
|
-
expected_message = "Run List Item 'foo:bar' has invalid cookbook name 'foo:bar'.\n" +
|
|
107
|
-
"Cookbook names can only contain alphanumerics, hyphens, and underscores.\n" +
|
|
108
|
-
"Did you mean 'foo::bar'?"
|
|
109
|
-
expect(policyfile.errors.first).to eq(expected_message)
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
context "when there is only one colon between cookbook and recipe name in fully qualified form" do
|
|
114
|
-
|
|
115
|
-
let(:policyfile_rb) do
|
|
116
|
-
<<-EOH
|
|
117
|
-
name "hello"
|
|
118
|
-
|
|
119
|
-
# Should be "foo::bar" (missing a colon)
|
|
120
|
-
run_list "recipe[foo:bar]"
|
|
121
|
-
EOH
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it "has an error message with the offending run list item" do
|
|
125
|
-
expect(policyfile.errors).to_not be_empty
|
|
126
|
-
expected_message = "Run List Item 'recipe[foo:bar]' has invalid cookbook name 'foo:bar'.\n" +
|
|
127
|
-
"Cookbook names can only contain alphanumerics, hyphens, and underscores.\n" +
|
|
128
|
-
"Did you mean 'recipe[foo::bar]'?"
|
|
129
|
-
expect(policyfile.errors.first).to eq(expected_message)
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
context "when the recipe name is empty" do
|
|
134
|
-
|
|
135
|
-
let(:policyfile_rb) do
|
|
136
|
-
<<-EOH
|
|
137
|
-
name "hello"
|
|
138
|
-
|
|
139
|
-
# Should be "foo::default" or just "foo"
|
|
140
|
-
run_list "foo::"
|
|
141
|
-
EOH
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
it "has an error message with the offending run list item" do
|
|
145
|
-
expect(policyfile.errors).to_not be_empty
|
|
146
|
-
expected_message = "Run List Item 'foo::' has invalid recipe name ''.\nRecipe names can only contain alphanumerics, hyphens, and underscores."
|
|
147
|
-
expect(policyfile.errors.first).to eq(expected_message)
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
context "with an invalid run list item in a named run list" do
|
|
153
|
-
|
|
154
|
-
let(:policyfile_rb) do
|
|
155
|
-
<<-EOH
|
|
156
|
-
name "hello"
|
|
157
|
-
|
|
158
|
-
# this one is valid:
|
|
159
|
-
run_list "foo"
|
|
160
|
-
|
|
161
|
-
named_run_list :oops, "foo:bar"
|
|
162
|
-
EOH
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
it "has an error message with the offending run list item" do
|
|
166
|
-
expect(policyfile.errors).to_not be_empty
|
|
167
|
-
expected_message = "Named Run List 'oops' Item 'foo:bar' has invalid cookbook name 'foo:bar'.\n" +
|
|
168
|
-
"Cookbook names can only contain alphanumerics, hyphens, and underscores.\n" +
|
|
169
|
-
"Did you mean 'foo::bar'?"
|
|
170
|
-
expect(policyfile.errors.first).to eq(expected_message)
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
end
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
context "when policyfile evaluation is aborted by user signal" do
|
|
177
|
-
|
|
178
|
-
let(:policyfile_rb) { "raise Interrupt" }
|
|
179
|
-
|
|
180
|
-
it "allows the exception to bubble up" do
|
|
181
|
-
expect { policyfile }.to raise_error(Interrupt)
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
context "when given an invalid default source type" do
|
|
186
|
-
|
|
187
|
-
let(:policyfile_rb) do
|
|
188
|
-
<<-EOH
|
|
189
|
-
run_list "foo"
|
|
190
|
-
default_source :herp, "derp"
|
|
191
|
-
EOH
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
it "has an invalid source error" do
|
|
195
|
-
expect(policyfile.errors.size).to eq(1)
|
|
196
|
-
expect(policyfile.errors.first).to eq("Invalid default_source type ':herp'")
|
|
197
|
-
end
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
context "when the url is omitted for chef server default source" do
|
|
201
|
-
let(:policyfile_rb) do
|
|
202
|
-
<<-EOH
|
|
203
|
-
run_list "foo"
|
|
204
|
-
default_source :chef_server
|
|
205
|
-
EOH
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
it "has an invalid source error" do
|
|
209
|
-
expect(policyfile.errors.size).to eq(1)
|
|
210
|
-
expect(policyfile.errors.first).to eq("You must specify the server's URI when using a default_source :chef_server")
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
context "when a per-cookbook source is specified with invalid options" do
|
|
216
|
-
let(:policyfile_rb) do
|
|
217
|
-
<<-EOH
|
|
218
|
-
run_list "foo"
|
|
219
|
-
|
|
220
|
-
cookbook "foo", herp: "derp"
|
|
221
|
-
EOH
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
it "has an invalid source error" do
|
|
225
|
-
expect(policyfile.errors.size).to eq(1)
|
|
226
|
-
message = "Cookbook `foo' has invalid source options `{:herp=>\"derp\"}'"
|
|
227
|
-
expect(policyfile.errors.first).to eq(message)
|
|
228
|
-
end
|
|
229
|
-
end
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
context "Given a minimal valid policyfile" do
|
|
233
|
-
|
|
234
|
-
let(:policyfile_rb) do
|
|
235
|
-
<<-EOH
|
|
236
|
-
name "hello"
|
|
237
|
-
|
|
238
|
-
run_list "foo", "bar"
|
|
239
|
-
EOH
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
it "has no errors" do
|
|
243
|
-
expect(policyfile.errors).to eq([])
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
it "has a name" do
|
|
247
|
-
expect(policyfile.name).to eq("hello")
|
|
248
|
-
end
|
|
249
|
-
|
|
250
|
-
it "has a run_list" do
|
|
251
|
-
expect(policyfile.run_list).to eq(%w[foo bar])
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
it "gives the run_list as the expanded run_list" do
|
|
255
|
-
expect(policyfile.expanded_run_list).to eq(%w[foo bar])
|
|
256
|
-
end
|
|
257
|
-
|
|
258
|
-
it "has no default cookbook source" do
|
|
259
|
-
expect(policyfile.default_source).to be_an(Array)
|
|
260
|
-
expect(policyfile.default_source.size).to eq(1)
|
|
261
|
-
expect(policyfile.default_source.first).to be_a(ChefDK::Policyfile::NullCookbookSource)
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
context "with the default source set to the community site" do
|
|
265
|
-
|
|
266
|
-
let(:policyfile_rb) do
|
|
267
|
-
<<-EOH
|
|
268
|
-
run_list "foo", "bar"
|
|
269
|
-
default_source :community
|
|
270
|
-
EOH
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
it "has a default source" do
|
|
274
|
-
expect(policyfile.errors).to eq([])
|
|
275
|
-
expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io") ]
|
|
276
|
-
expect(policyfile.default_source).to eq(expected)
|
|
277
|
-
end
|
|
278
|
-
|
|
279
|
-
context "with a custom URI" do
|
|
280
|
-
|
|
281
|
-
let(:policyfile_rb) do
|
|
282
|
-
<<-EOH
|
|
283
|
-
run_list "foo", "bar"
|
|
284
|
-
default_source :community, "https://cookbook-api.example.com"
|
|
285
|
-
EOH
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
it "has a default source" do
|
|
289
|
-
expect(policyfile.errors).to eq([])
|
|
290
|
-
expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://cookbook-api.example.com") ]
|
|
291
|
-
expect(policyfile.default_source).to eq(expected)
|
|
292
|
-
end
|
|
293
|
-
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
context "with an added cookbook with no options" do
|
|
297
|
-
|
|
298
|
-
let(:policyfile_rb) do
|
|
299
|
-
<<-EOH
|
|
300
|
-
run_list "foo", "bar"
|
|
301
|
-
cookbook "baz"
|
|
302
|
-
EOH
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
it "adds the cookbook to the list of location specs" do
|
|
306
|
-
expect(policyfile.errors).to eq([])
|
|
307
|
-
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("baz", ">= 0.0.0", {}, storage_config)
|
|
308
|
-
expect(policyfile.cookbook_location_specs).to eq("baz" => expected_cb_spec)
|
|
309
|
-
end
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
end
|
|
313
|
-
|
|
314
|
-
context "with the default source set to a delivery_supermarket" do
|
|
315
|
-
|
|
316
|
-
context "when no URI is given" do
|
|
317
|
-
|
|
318
|
-
let(:policyfile_rb) do
|
|
319
|
-
<<-EOH
|
|
320
|
-
run_list "foo", "bar"
|
|
321
|
-
default_source :delivery_supermarket
|
|
322
|
-
EOH
|
|
323
|
-
end
|
|
324
|
-
|
|
325
|
-
it "errors out with a message that the supermarket URI is required" do
|
|
326
|
-
expect(policyfile.errors).to eq([ "You must specify the server's URI when using a default_source :delivery_supermarket" ])
|
|
327
|
-
end
|
|
328
|
-
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
context "when the URI is given" do
|
|
332
|
-
|
|
333
|
-
let(:policyfile_rb) do
|
|
334
|
-
<<-EOH
|
|
335
|
-
run_list "foo", "bar"
|
|
336
|
-
default_source :delivery_supermarket, "https://supermarket.example.com"
|
|
337
|
-
EOH
|
|
338
|
-
end
|
|
339
|
-
|
|
340
|
-
it "sets the default source to the delivery_supermarket" do
|
|
341
|
-
expect(policyfile.errors).to eq([])
|
|
342
|
-
expected = [ ChefDK::Policyfile::DeliverySupermarketSource.new("https://supermarket.example.com") ]
|
|
343
|
-
expect(policyfile.default_source).to eq(expected)
|
|
344
|
-
end
|
|
345
|
-
|
|
346
|
-
end
|
|
347
|
-
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
context "with the default source set to a chef server" do
|
|
351
|
-
|
|
352
|
-
let(:policyfile_rb) do
|
|
353
|
-
<<-EOH
|
|
354
|
-
run_list "foo", "bar"
|
|
355
|
-
default_source :chef_server, "https://mychef.example.com"
|
|
356
|
-
EOH
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
it "has a default source" do
|
|
360
|
-
skip "Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)"
|
|
361
|
-
|
|
362
|
-
expect(policyfile.errors).to eq([])
|
|
363
|
-
expected = ChefDK::Policyfile::ChefServerCookbookSource.new("https://mychef.example.com")
|
|
364
|
-
expect(policyfile.default_source).to eq(expected)
|
|
365
|
-
end
|
|
366
|
-
|
|
367
|
-
end
|
|
368
|
-
|
|
369
|
-
context "with the default source set to a chef-repo path" do
|
|
370
|
-
|
|
371
|
-
let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
|
|
372
|
-
|
|
373
|
-
let(:policyfile_rb) do
|
|
374
|
-
<<-EOH
|
|
375
|
-
run_list "foo", "bar"
|
|
376
|
-
default_source :chef_repo, "#{chef_repo}"
|
|
377
|
-
EOH
|
|
378
|
-
end
|
|
379
|
-
|
|
380
|
-
it "has a default source" do
|
|
381
|
-
expect(policyfile.errors).to eq([])
|
|
382
|
-
expected = [ ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo) ]
|
|
383
|
-
expect(policyfile.default_source).to eq(expected)
|
|
384
|
-
end
|
|
385
|
-
|
|
386
|
-
context "when the path to the chef repo is relative" do
|
|
387
|
-
|
|
388
|
-
let(:policyfile_rb) do
|
|
389
|
-
<<-EOH
|
|
390
|
-
run_list "foo", "bar"
|
|
391
|
-
default_source :chef_repo, "../cookbooks"
|
|
392
|
-
EOH
|
|
393
|
-
end
|
|
394
|
-
|
|
395
|
-
# storage_config is created with path to Policyfile.rb in CWD
|
|
396
|
-
let(:expected_path) { File.expand_path("../cookbooks") }
|
|
397
|
-
|
|
398
|
-
it "sets the repo path relative to the directory the policyfile is in" do
|
|
399
|
-
expect(policyfile.errors).to eq([])
|
|
400
|
-
expect(policyfile.default_source.size).to eq(1)
|
|
401
|
-
expect(policyfile.default_source.first).to be_a(ChefDK::Policyfile::ChefRepoCookbookSource)
|
|
402
|
-
expect(policyfile.default_source.first.path).to eq(expected_path)
|
|
403
|
-
end
|
|
404
|
-
|
|
405
|
-
end
|
|
406
|
-
|
|
407
|
-
end
|
|
408
|
-
|
|
409
|
-
context "with multiple default sources" do
|
|
410
|
-
let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
|
|
411
|
-
|
|
412
|
-
let(:policyfile_rb) do
|
|
413
|
-
<<-EOH
|
|
414
|
-
run_list "foo", "bar"
|
|
415
|
-
|
|
416
|
-
default_source :community
|
|
417
|
-
default_source :chef_repo, "#{chef_repo}"
|
|
418
|
-
EOH
|
|
419
|
-
end
|
|
420
|
-
|
|
421
|
-
it "has an array of sources" do
|
|
422
|
-
expect(policyfile.errors).to eq([])
|
|
423
|
-
|
|
424
|
-
community_source = ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io")
|
|
425
|
-
repo_source = ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo)
|
|
426
|
-
expected = [ community_source, repo_source ]
|
|
427
|
-
|
|
428
|
-
expect(policyfile.default_source).to eq(expected)
|
|
429
|
-
end
|
|
430
|
-
|
|
431
|
-
end
|
|
432
|
-
|
|
433
|
-
context "with multiple supermarkets with source preferences set for specific cookbooks" do
|
|
434
|
-
|
|
435
|
-
context "when the preferences don't conflict" do
|
|
436
|
-
let(:policyfile_rb) do
|
|
437
|
-
<<-EOH
|
|
438
|
-
run_list "foo", "bar", "baz"
|
|
439
|
-
|
|
440
|
-
default_source :supermarket do |s|
|
|
441
|
-
s.preferred_for "foo"
|
|
442
|
-
end
|
|
443
|
-
|
|
444
|
-
default_source :supermarket, "https://mart.example" do |s|
|
|
445
|
-
s.preferred_for "bar", "baz"
|
|
446
|
-
end
|
|
447
|
-
EOH
|
|
448
|
-
end
|
|
449
|
-
|
|
450
|
-
it "has an array of sources, with cookbook preferences set" do
|
|
451
|
-
expect(policyfile.errors).to eq([])
|
|
452
|
-
expect(policyfile.default_source.size).to eq(2)
|
|
453
|
-
|
|
454
|
-
public_supermarket = policyfile.default_source.first
|
|
455
|
-
expect(public_supermarket.preferred_cookbooks).to eq(%w[ foo ])
|
|
456
|
-
|
|
457
|
-
private_supermarket = policyfile.default_source.last
|
|
458
|
-
expect(private_supermarket.uri).to eq("https://mart.example")
|
|
459
|
-
expect(private_supermarket.preferred_cookbooks).to eq(%w[ bar baz ])
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
end
|
|
463
|
-
|
|
464
|
-
context "when the preferences conflict" do
|
|
465
|
-
let(:policyfile_rb) do
|
|
466
|
-
# both supermarkets are the preferred source for "foo"
|
|
467
|
-
<<-EOH
|
|
468
|
-
run_list "foo", "bar"
|
|
469
|
-
|
|
470
|
-
default_source :supermarket do |s|
|
|
471
|
-
s.preferred_for "foo"
|
|
472
|
-
end
|
|
473
|
-
|
|
474
|
-
default_source :supermarket, "https://mart.example" do |s|
|
|
475
|
-
s.preferred_for "foo"
|
|
476
|
-
end
|
|
477
|
-
EOH
|
|
478
|
-
end
|
|
479
|
-
|
|
480
|
-
it "emits an error" do
|
|
481
|
-
err = <<-MESSAGE
|
|
482
|
-
Multiple sources are marked as the preferred source for some cookbooks. Only one source can be preferred for a cookbook.
|
|
483
|
-
supermarket(https://supermarket.chef.io) and supermarket(https://mart.example) are both set as the preferred source for cookbook(s) 'foo'
|
|
484
|
-
MESSAGE
|
|
485
|
-
expect(policyfile.errors).to eq([err])
|
|
486
|
-
end
|
|
487
|
-
|
|
488
|
-
end
|
|
489
|
-
|
|
490
|
-
end
|
|
491
|
-
|
|
492
|
-
end
|
|
493
|
-
|
|
494
|
-
describe "assigning cookbooks to specific sources" do
|
|
495
|
-
|
|
496
|
-
before do
|
|
497
|
-
expect(policyfile.errors).to eq([])
|
|
498
|
-
end
|
|
499
|
-
|
|
500
|
-
context "when a cookbook is assigned to a local source" do
|
|
501
|
-
|
|
502
|
-
let(:policyfile_rb) do
|
|
503
|
-
<<-EOH
|
|
504
|
-
run_list "foo"
|
|
505
|
-
cookbook "foo", path: "local_cookbooks/foo"
|
|
506
|
-
EOH
|
|
507
|
-
end
|
|
508
|
-
|
|
509
|
-
it "sets the source of the cookbook to the local path" do
|
|
510
|
-
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {path: "local_cookbooks/foo"}, storage_config)
|
|
511
|
-
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
512
|
-
end
|
|
513
|
-
|
|
514
|
-
end
|
|
515
|
-
|
|
516
|
-
context "when a cookbook is assigned to a git source" do
|
|
517
|
-
let(:policyfile_rb) do
|
|
518
|
-
<<-EOH
|
|
519
|
-
run_list "foo"
|
|
520
|
-
cookbook "foo", git: "git://example.com:me/foo-cookbook.git"
|
|
521
|
-
EOH
|
|
522
|
-
end
|
|
523
|
-
|
|
524
|
-
it "sets the source of the cookbook to the git URL" do
|
|
525
|
-
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {git: "git://example.com:me/foo-cookbook.git"}, storage_config)
|
|
526
|
-
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
527
|
-
end
|
|
528
|
-
|
|
529
|
-
end
|
|
530
|
-
|
|
531
|
-
context "when a cookbook is assigned to a chef_server source" do
|
|
532
|
-
let(:policyfile_rb) do
|
|
533
|
-
<<-EOH
|
|
534
|
-
run_list "foo"
|
|
535
|
-
cookbook "foo", chef_server: "https://mychefserver.example.com"
|
|
536
|
-
EOH
|
|
537
|
-
end
|
|
538
|
-
|
|
539
|
-
# Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)
|
|
540
|
-
# We have to skip at the example definition level or else we fail in the before block
|
|
541
|
-
skip "sets the source of the cookbook to the git URL" do
|
|
542
|
-
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {chef_server: "https://mychefserver.example.com"}, storage_config)
|
|
543
|
-
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
544
|
-
end
|
|
545
|
-
|
|
546
|
-
end
|
|
547
|
-
|
|
548
|
-
end
|
|
549
|
-
|
|
550
|
-
describe "assigning a cookbook to conflicting sources" do
|
|
551
|
-
let(:policyfile_rb) do
|
|
552
|
-
<<-EOH
|
|
553
|
-
run_list "foo"
|
|
554
|
-
cookbook "foo", path: "local_cookbooks/foo"
|
|
555
|
-
cookbook "foo", chef_server: "https://mychefserver.example.com"
|
|
556
|
-
EOH
|
|
557
|
-
end
|
|
558
|
-
|
|
559
|
-
it "has a conflicting sources error" do
|
|
560
|
-
expected = <<-EOH
|
|
561
|
-
Cookbook 'foo' assigned to conflicting sources
|
|
562
|
-
|
|
563
|
-
Previous source: {:path=>"local_cookbooks/foo"}
|
|
564
|
-
Conflicts with: {:chef_server=>"https://mychefserver.example.com"}
|
|
565
|
-
EOH
|
|
566
|
-
expect(policyfile.errors.size).to eq(1)
|
|
567
|
-
expect(policyfile.errors.first).to eq(expected)
|
|
568
|
-
end
|
|
569
|
-
|
|
570
|
-
end
|
|
571
|
-
|
|
572
|
-
describe "defining attributes" do
|
|
573
|
-
|
|
574
|
-
let(:policyfile_rb) do
|
|
575
|
-
<<-EOH
|
|
576
|
-
name "policy-with-attrs"
|
|
577
|
-
run_list "foo"
|
|
578
|
-
|
|
579
|
-
# basic attribute setting:
|
|
580
|
-
default["foo"] = "bar"
|
|
581
|
-
|
|
582
|
-
# auto-vivify
|
|
583
|
-
default["abc"]["def"]["ghi"] = "xyz"
|
|
584
|
-
|
|
585
|
-
# literal data structures
|
|
586
|
-
default["baz"] = {
|
|
587
|
-
"more_nested_stuff" => "yup"
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
# Array literals work and we merge rather than overwrite:
|
|
591
|
-
default["baz"]["an_array"] = ["a", "b", "c"]
|
|
592
|
-
|
|
593
|
-
# all the same stuff works with overrides:
|
|
594
|
-
|
|
595
|
-
override["foo"] = "bar"
|
|
596
|
-
|
|
597
|
-
override["abc"]["def"]["ghi"] = "xyz"
|
|
598
|
-
|
|
599
|
-
override["baz_override"] = {
|
|
600
|
-
"more_nested_stuff" => "yup"
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
override["baz_override"]["an_array"] = ["a", "b", "c"]
|
|
604
|
-
EOH
|
|
605
|
-
end
|
|
606
|
-
|
|
607
|
-
let(:expected_combined_default_attrs) do
|
|
608
|
-
{
|
|
609
|
-
"foo" => "bar",
|
|
610
|
-
"abc" => { "def" => { "ghi" => "xyz" } },
|
|
611
|
-
"baz" => {
|
|
612
|
-
"more_nested_stuff" => "yup",
|
|
613
|
-
"an_array" => ["a", "b", "c"]
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
end
|
|
617
|
-
|
|
618
|
-
let(:expected_combined_override_attrs) do
|
|
619
|
-
{
|
|
620
|
-
"foo" => "bar",
|
|
621
|
-
"abc" => { "def" => { "ghi" => "xyz" } },
|
|
622
|
-
"baz_override" => {
|
|
623
|
-
"more_nested_stuff" => "yup",
|
|
624
|
-
"an_array" => ["a", "b", "c"]
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
end
|
|
628
|
-
|
|
629
|
-
it "defines default attributes" do
|
|
630
|
-
expect(policyfile.errors).to eq([])
|
|
631
|
-
expect(policyfile.default_attributes).to eq(expected_combined_default_attrs)
|
|
632
|
-
end
|
|
633
|
-
|
|
634
|
-
it "defines override attributes" do
|
|
635
|
-
expect(policyfile.errors).to eq([])
|
|
636
|
-
expect(policyfile.override_attributes).to eq(expected_combined_override_attrs)
|
|
637
|
-
end
|
|
638
|
-
end
|
|
639
|
-
|
|
640
|
-
end
|
|
641
|
-
|
|
642
|
-
end
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2014 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-dk/policyfile_compiler'
|
|
20
|
+
|
|
21
|
+
describe ChefDK::PolicyfileCompiler do
|
|
22
|
+
|
|
23
|
+
let(:storage_config) { ChefDK::Policyfile::StorageConfig.new.use_policyfile("TestPolicyfile.rb") }
|
|
24
|
+
|
|
25
|
+
let(:policyfile) { ChefDK::PolicyfileCompiler.evaluate(policyfile_rb, "TestPolicyfile.rb") }
|
|
26
|
+
|
|
27
|
+
describe "Evaluate a policyfile" do
|
|
28
|
+
|
|
29
|
+
describe "when the policyfile is not valid" do
|
|
30
|
+
|
|
31
|
+
describe "when error! is called" do
|
|
32
|
+
|
|
33
|
+
let(:policyfile_rb) { "raise 'oops'" }
|
|
34
|
+
|
|
35
|
+
it "raises a PolicyfileError" do
|
|
36
|
+
expect { policyfile.error! }.to raise_error(ChefDK::PolicyfileError)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context "Given an empty policyfile" do
|
|
41
|
+
|
|
42
|
+
let(:policyfile_rb) { "" }
|
|
43
|
+
|
|
44
|
+
it "has an invalid run_list" do
|
|
45
|
+
expect(policyfile.errors).to include("Invalid run_list. run_list cannot be empty")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context "Given a policyfile with a syntax error" do
|
|
51
|
+
|
|
52
|
+
let(:policyfile_rb) { "{{{{::::{{::" }
|
|
53
|
+
|
|
54
|
+
it "has a syntax error message" do
|
|
55
|
+
expected_error=<<-E
|
|
56
|
+
Invalid ruby syntax in policyfile 'TestPolicyfile.rb':
|
|
57
|
+
|
|
58
|
+
TestPolicyfile.rb:1: syntax error, unexpected :: at EXPR_BEG, expecting tCONSTANT
|
|
59
|
+
{{{{::::{{::
|
|
60
|
+
^
|
|
61
|
+
TestPolicyfile.rb:1: syntax error, unexpected end-of-input, expecting tCONSTANT
|
|
62
|
+
{{{{::::{{::
|
|
63
|
+
^
|
|
64
|
+
E
|
|
65
|
+
expect(policyfile.errors.size).to eq(1)
|
|
66
|
+
expect(policyfile.errors.first).to eq(expected_error.chomp)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context "Given a policyfile with a ruby error" do
|
|
72
|
+
|
|
73
|
+
let(:policyfile_rb) { "raise 'oops'" }
|
|
74
|
+
|
|
75
|
+
it "has an error message with code context" do
|
|
76
|
+
expect(policyfile.errors.size).to eq(1)
|
|
77
|
+
expected_message = <<-E
|
|
78
|
+
Evaluation of policyfile 'TestPolicyfile.rb' raised an exception
|
|
79
|
+
Exception: RuntimeError "oops"
|
|
80
|
+
|
|
81
|
+
Relevant Code:
|
|
82
|
+
1: raise 'oops'
|
|
83
|
+
|
|
84
|
+
Backtrace:
|
|
85
|
+
TestPolicyfile.rb:1:in `eval_policyfile'
|
|
86
|
+
E
|
|
87
|
+
expect(policyfile.errors.first).to eq(expected_message)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
context "when given an invalid run list item" do
|
|
92
|
+
|
|
93
|
+
context "when there is only one colon between cookbook and recipe name" do
|
|
94
|
+
|
|
95
|
+
let(:policyfile_rb) do
|
|
96
|
+
<<-EOH
|
|
97
|
+
name "hello"
|
|
98
|
+
|
|
99
|
+
# Should be "foo::bar" (missing a colon)
|
|
100
|
+
run_list "foo:bar"
|
|
101
|
+
EOH
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "has an error message with the offending run list item" do
|
|
105
|
+
expect(policyfile.errors).to_not be_empty
|
|
106
|
+
expected_message = "Run List Item 'foo:bar' has invalid cookbook name 'foo:bar'.\n" +
|
|
107
|
+
"Cookbook names can only contain alphanumerics, hyphens, and underscores.\n" +
|
|
108
|
+
"Did you mean 'foo::bar'?"
|
|
109
|
+
expect(policyfile.errors.first).to eq(expected_message)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
context "when there is only one colon between cookbook and recipe name in fully qualified form" do
|
|
114
|
+
|
|
115
|
+
let(:policyfile_rb) do
|
|
116
|
+
<<-EOH
|
|
117
|
+
name "hello"
|
|
118
|
+
|
|
119
|
+
# Should be "foo::bar" (missing a colon)
|
|
120
|
+
run_list "recipe[foo:bar]"
|
|
121
|
+
EOH
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "has an error message with the offending run list item" do
|
|
125
|
+
expect(policyfile.errors).to_not be_empty
|
|
126
|
+
expected_message = "Run List Item 'recipe[foo:bar]' has invalid cookbook name 'foo:bar'.\n" +
|
|
127
|
+
"Cookbook names can only contain alphanumerics, hyphens, and underscores.\n" +
|
|
128
|
+
"Did you mean 'recipe[foo::bar]'?"
|
|
129
|
+
expect(policyfile.errors.first).to eq(expected_message)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
context "when the recipe name is empty" do
|
|
134
|
+
|
|
135
|
+
let(:policyfile_rb) do
|
|
136
|
+
<<-EOH
|
|
137
|
+
name "hello"
|
|
138
|
+
|
|
139
|
+
# Should be "foo::default" or just "foo"
|
|
140
|
+
run_list "foo::"
|
|
141
|
+
EOH
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it "has an error message with the offending run list item" do
|
|
145
|
+
expect(policyfile.errors).to_not be_empty
|
|
146
|
+
expected_message = "Run List Item 'foo::' has invalid recipe name ''.\nRecipe names can only contain alphanumerics, hyphens, and underscores."
|
|
147
|
+
expect(policyfile.errors.first).to eq(expected_message)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
context "with an invalid run list item in a named run list" do
|
|
153
|
+
|
|
154
|
+
let(:policyfile_rb) do
|
|
155
|
+
<<-EOH
|
|
156
|
+
name "hello"
|
|
157
|
+
|
|
158
|
+
# this one is valid:
|
|
159
|
+
run_list "foo"
|
|
160
|
+
|
|
161
|
+
named_run_list :oops, "foo:bar"
|
|
162
|
+
EOH
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it "has an error message with the offending run list item" do
|
|
166
|
+
expect(policyfile.errors).to_not be_empty
|
|
167
|
+
expected_message = "Named Run List 'oops' Item 'foo:bar' has invalid cookbook name 'foo:bar'.\n" +
|
|
168
|
+
"Cookbook names can only contain alphanumerics, hyphens, and underscores.\n" +
|
|
169
|
+
"Did you mean 'foo::bar'?"
|
|
170
|
+
expect(policyfile.errors.first).to eq(expected_message)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
context "when policyfile evaluation is aborted by user signal" do
|
|
177
|
+
|
|
178
|
+
let(:policyfile_rb) { "raise Interrupt" }
|
|
179
|
+
|
|
180
|
+
it "allows the exception to bubble up" do
|
|
181
|
+
expect { policyfile }.to raise_error(Interrupt)
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
context "when given an invalid default source type" do
|
|
186
|
+
|
|
187
|
+
let(:policyfile_rb) do
|
|
188
|
+
<<-EOH
|
|
189
|
+
run_list "foo"
|
|
190
|
+
default_source :herp, "derp"
|
|
191
|
+
EOH
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
it "has an invalid source error" do
|
|
195
|
+
expect(policyfile.errors.size).to eq(1)
|
|
196
|
+
expect(policyfile.errors.first).to eq("Invalid default_source type ':herp'")
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
context "when the url is omitted for chef server default source" do
|
|
201
|
+
let(:policyfile_rb) do
|
|
202
|
+
<<-EOH
|
|
203
|
+
run_list "foo"
|
|
204
|
+
default_source :chef_server
|
|
205
|
+
EOH
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "has an invalid source error" do
|
|
209
|
+
expect(policyfile.errors.size).to eq(1)
|
|
210
|
+
expect(policyfile.errors.first).to eq("You must specify the server's URI when using a default_source :chef_server")
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
context "when a per-cookbook source is specified with invalid options" do
|
|
216
|
+
let(:policyfile_rb) do
|
|
217
|
+
<<-EOH
|
|
218
|
+
run_list "foo"
|
|
219
|
+
|
|
220
|
+
cookbook "foo", herp: "derp"
|
|
221
|
+
EOH
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it "has an invalid source error" do
|
|
225
|
+
expect(policyfile.errors.size).to eq(1)
|
|
226
|
+
message = "Cookbook `foo' has invalid source options `{:herp=>\"derp\"}'"
|
|
227
|
+
expect(policyfile.errors.first).to eq(message)
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
context "Given a minimal valid policyfile" do
|
|
233
|
+
|
|
234
|
+
let(:policyfile_rb) do
|
|
235
|
+
<<-EOH
|
|
236
|
+
name "hello"
|
|
237
|
+
|
|
238
|
+
run_list "foo", "bar"
|
|
239
|
+
EOH
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
it "has no errors" do
|
|
243
|
+
expect(policyfile.errors).to eq([])
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
it "has a name" do
|
|
247
|
+
expect(policyfile.name).to eq("hello")
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
it "has a run_list" do
|
|
251
|
+
expect(policyfile.run_list).to eq(%w[foo bar])
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
it "gives the run_list as the expanded run_list" do
|
|
255
|
+
expect(policyfile.expanded_run_list).to eq(%w[foo bar])
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
it "has no default cookbook source" do
|
|
259
|
+
expect(policyfile.default_source).to be_an(Array)
|
|
260
|
+
expect(policyfile.default_source.size).to eq(1)
|
|
261
|
+
expect(policyfile.default_source.first).to be_a(ChefDK::Policyfile::NullCookbookSource)
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
context "with the default source set to the community site" do
|
|
265
|
+
|
|
266
|
+
let(:policyfile_rb) do
|
|
267
|
+
<<-EOH
|
|
268
|
+
run_list "foo", "bar"
|
|
269
|
+
default_source :community
|
|
270
|
+
EOH
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
it "has a default source" do
|
|
274
|
+
expect(policyfile.errors).to eq([])
|
|
275
|
+
expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io") ]
|
|
276
|
+
expect(policyfile.default_source).to eq(expected)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
context "with a custom URI" do
|
|
280
|
+
|
|
281
|
+
let(:policyfile_rb) do
|
|
282
|
+
<<-EOH
|
|
283
|
+
run_list "foo", "bar"
|
|
284
|
+
default_source :community, "https://cookbook-api.example.com"
|
|
285
|
+
EOH
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
it "has a default source" do
|
|
289
|
+
expect(policyfile.errors).to eq([])
|
|
290
|
+
expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://cookbook-api.example.com") ]
|
|
291
|
+
expect(policyfile.default_source).to eq(expected)
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
context "with an added cookbook with no options" do
|
|
297
|
+
|
|
298
|
+
let(:policyfile_rb) do
|
|
299
|
+
<<-EOH
|
|
300
|
+
run_list "foo", "bar"
|
|
301
|
+
cookbook "baz"
|
|
302
|
+
EOH
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
it "adds the cookbook to the list of location specs" do
|
|
306
|
+
expect(policyfile.errors).to eq([])
|
|
307
|
+
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("baz", ">= 0.0.0", {}, storage_config)
|
|
308
|
+
expect(policyfile.cookbook_location_specs).to eq("baz" => expected_cb_spec)
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
context "with the default source set to a delivery_supermarket" do
|
|
315
|
+
|
|
316
|
+
context "when no URI is given" do
|
|
317
|
+
|
|
318
|
+
let(:policyfile_rb) do
|
|
319
|
+
<<-EOH
|
|
320
|
+
run_list "foo", "bar"
|
|
321
|
+
default_source :delivery_supermarket
|
|
322
|
+
EOH
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
it "errors out with a message that the supermarket URI is required" do
|
|
326
|
+
expect(policyfile.errors).to eq([ "You must specify the server's URI when using a default_source :delivery_supermarket" ])
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
context "when the URI is given" do
|
|
332
|
+
|
|
333
|
+
let(:policyfile_rb) do
|
|
334
|
+
<<-EOH
|
|
335
|
+
run_list "foo", "bar"
|
|
336
|
+
default_source :delivery_supermarket, "https://supermarket.example.com"
|
|
337
|
+
EOH
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
it "sets the default source to the delivery_supermarket" do
|
|
341
|
+
expect(policyfile.errors).to eq([])
|
|
342
|
+
expected = [ ChefDK::Policyfile::DeliverySupermarketSource.new("https://supermarket.example.com") ]
|
|
343
|
+
expect(policyfile.default_source).to eq(expected)
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
context "with the default source set to a chef server" do
|
|
351
|
+
|
|
352
|
+
let(:policyfile_rb) do
|
|
353
|
+
<<-EOH
|
|
354
|
+
run_list "foo", "bar"
|
|
355
|
+
default_source :chef_server, "https://mychef.example.com"
|
|
356
|
+
EOH
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
it "has a default source" do
|
|
360
|
+
skip "Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)"
|
|
361
|
+
|
|
362
|
+
expect(policyfile.errors).to eq([])
|
|
363
|
+
expected = ChefDK::Policyfile::ChefServerCookbookSource.new("https://mychef.example.com")
|
|
364
|
+
expect(policyfile.default_source).to eq(expected)
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
context "with the default source set to a chef-repo path" do
|
|
370
|
+
|
|
371
|
+
let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
|
|
372
|
+
|
|
373
|
+
let(:policyfile_rb) do
|
|
374
|
+
<<-EOH
|
|
375
|
+
run_list "foo", "bar"
|
|
376
|
+
default_source :chef_repo, "#{chef_repo}"
|
|
377
|
+
EOH
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
it "has a default source" do
|
|
381
|
+
expect(policyfile.errors).to eq([])
|
|
382
|
+
expected = [ ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo) ]
|
|
383
|
+
expect(policyfile.default_source).to eq(expected)
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
context "when the path to the chef repo is relative" do
|
|
387
|
+
|
|
388
|
+
let(:policyfile_rb) do
|
|
389
|
+
<<-EOH
|
|
390
|
+
run_list "foo", "bar"
|
|
391
|
+
default_source :chef_repo, "../cookbooks"
|
|
392
|
+
EOH
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
# storage_config is created with path to Policyfile.rb in CWD
|
|
396
|
+
let(:expected_path) { File.expand_path("../cookbooks") }
|
|
397
|
+
|
|
398
|
+
it "sets the repo path relative to the directory the policyfile is in" do
|
|
399
|
+
expect(policyfile.errors).to eq([])
|
|
400
|
+
expect(policyfile.default_source.size).to eq(1)
|
|
401
|
+
expect(policyfile.default_source.first).to be_a(ChefDK::Policyfile::ChefRepoCookbookSource)
|
|
402
|
+
expect(policyfile.default_source.first.path).to eq(expected_path)
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
context "with multiple default sources" do
|
|
410
|
+
let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
|
|
411
|
+
|
|
412
|
+
let(:policyfile_rb) do
|
|
413
|
+
<<-EOH
|
|
414
|
+
run_list "foo", "bar"
|
|
415
|
+
|
|
416
|
+
default_source :community
|
|
417
|
+
default_source :chef_repo, "#{chef_repo}"
|
|
418
|
+
EOH
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
it "has an array of sources" do
|
|
422
|
+
expect(policyfile.errors).to eq([])
|
|
423
|
+
|
|
424
|
+
community_source = ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io")
|
|
425
|
+
repo_source = ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo)
|
|
426
|
+
expected = [ community_source, repo_source ]
|
|
427
|
+
|
|
428
|
+
expect(policyfile.default_source).to eq(expected)
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
context "with multiple supermarkets with source preferences set for specific cookbooks" do
|
|
434
|
+
|
|
435
|
+
context "when the preferences don't conflict" do
|
|
436
|
+
let(:policyfile_rb) do
|
|
437
|
+
<<-EOH
|
|
438
|
+
run_list "foo", "bar", "baz"
|
|
439
|
+
|
|
440
|
+
default_source :supermarket do |s|
|
|
441
|
+
s.preferred_for "foo"
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
default_source :supermarket, "https://mart.example" do |s|
|
|
445
|
+
s.preferred_for "bar", "baz"
|
|
446
|
+
end
|
|
447
|
+
EOH
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
it "has an array of sources, with cookbook preferences set" do
|
|
451
|
+
expect(policyfile.errors).to eq([])
|
|
452
|
+
expect(policyfile.default_source.size).to eq(2)
|
|
453
|
+
|
|
454
|
+
public_supermarket = policyfile.default_source.first
|
|
455
|
+
expect(public_supermarket.preferred_cookbooks).to eq(%w[ foo ])
|
|
456
|
+
|
|
457
|
+
private_supermarket = policyfile.default_source.last
|
|
458
|
+
expect(private_supermarket.uri).to eq("https://mart.example")
|
|
459
|
+
expect(private_supermarket.preferred_cookbooks).to eq(%w[ bar baz ])
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
context "when the preferences conflict" do
|
|
465
|
+
let(:policyfile_rb) do
|
|
466
|
+
# both supermarkets are the preferred source for "foo"
|
|
467
|
+
<<-EOH
|
|
468
|
+
run_list "foo", "bar"
|
|
469
|
+
|
|
470
|
+
default_source :supermarket do |s|
|
|
471
|
+
s.preferred_for "foo"
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
default_source :supermarket, "https://mart.example" do |s|
|
|
475
|
+
s.preferred_for "foo"
|
|
476
|
+
end
|
|
477
|
+
EOH
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
it "emits an error" do
|
|
481
|
+
err = <<-MESSAGE
|
|
482
|
+
Multiple sources are marked as the preferred source for some cookbooks. Only one source can be preferred for a cookbook.
|
|
483
|
+
supermarket(https://supermarket.chef.io) and supermarket(https://mart.example) are both set as the preferred source for cookbook(s) 'foo'
|
|
484
|
+
MESSAGE
|
|
485
|
+
expect(policyfile.errors).to eq([err])
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
describe "assigning cookbooks to specific sources" do
|
|
495
|
+
|
|
496
|
+
before do
|
|
497
|
+
expect(policyfile.errors).to eq([])
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
context "when a cookbook is assigned to a local source" do
|
|
501
|
+
|
|
502
|
+
let(:policyfile_rb) do
|
|
503
|
+
<<-EOH
|
|
504
|
+
run_list "foo"
|
|
505
|
+
cookbook "foo", path: "local_cookbooks/foo"
|
|
506
|
+
EOH
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
it "sets the source of the cookbook to the local path" do
|
|
510
|
+
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {path: "local_cookbooks/foo"}, storage_config)
|
|
511
|
+
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
context "when a cookbook is assigned to a git source" do
|
|
517
|
+
let(:policyfile_rb) do
|
|
518
|
+
<<-EOH
|
|
519
|
+
run_list "foo"
|
|
520
|
+
cookbook "foo", git: "git://example.com:me/foo-cookbook.git"
|
|
521
|
+
EOH
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
it "sets the source of the cookbook to the git URL" do
|
|
525
|
+
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {git: "git://example.com:me/foo-cookbook.git"}, storage_config)
|
|
526
|
+
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
context "when a cookbook is assigned to a chef_server source" do
|
|
532
|
+
let(:policyfile_rb) do
|
|
533
|
+
<<-EOH
|
|
534
|
+
run_list "foo"
|
|
535
|
+
cookbook "foo", chef_server: "https://mychefserver.example.com"
|
|
536
|
+
EOH
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
# Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)
|
|
540
|
+
# We have to skip at the example definition level or else we fail in the before block
|
|
541
|
+
skip "sets the source of the cookbook to the git URL" do
|
|
542
|
+
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {chef_server: "https://mychefserver.example.com"}, storage_config)
|
|
543
|
+
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
544
|
+
end
|
|
545
|
+
|
|
546
|
+
end
|
|
547
|
+
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
describe "assigning a cookbook to conflicting sources" do
|
|
551
|
+
let(:policyfile_rb) do
|
|
552
|
+
<<-EOH
|
|
553
|
+
run_list "foo"
|
|
554
|
+
cookbook "foo", path: "local_cookbooks/foo"
|
|
555
|
+
cookbook "foo", chef_server: "https://mychefserver.example.com"
|
|
556
|
+
EOH
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
it "has a conflicting sources error" do
|
|
560
|
+
expected = <<-EOH
|
|
561
|
+
Cookbook 'foo' assigned to conflicting sources
|
|
562
|
+
|
|
563
|
+
Previous source: {:path=>"local_cookbooks/foo"}
|
|
564
|
+
Conflicts with: {:chef_server=>"https://mychefserver.example.com"}
|
|
565
|
+
EOH
|
|
566
|
+
expect(policyfile.errors.size).to eq(1)
|
|
567
|
+
expect(policyfile.errors.first).to eq(expected)
|
|
568
|
+
end
|
|
569
|
+
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
describe "defining attributes" do
|
|
573
|
+
|
|
574
|
+
let(:policyfile_rb) do
|
|
575
|
+
<<-EOH
|
|
576
|
+
name "policy-with-attrs"
|
|
577
|
+
run_list "foo"
|
|
578
|
+
|
|
579
|
+
# basic attribute setting:
|
|
580
|
+
default["foo"] = "bar"
|
|
581
|
+
|
|
582
|
+
# auto-vivify
|
|
583
|
+
default["abc"]["def"]["ghi"] = "xyz"
|
|
584
|
+
|
|
585
|
+
# literal data structures
|
|
586
|
+
default["baz"] = {
|
|
587
|
+
"more_nested_stuff" => "yup"
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
# Array literals work and we merge rather than overwrite:
|
|
591
|
+
default["baz"]["an_array"] = ["a", "b", "c"]
|
|
592
|
+
|
|
593
|
+
# all the same stuff works with overrides:
|
|
594
|
+
|
|
595
|
+
override["foo"] = "bar"
|
|
596
|
+
|
|
597
|
+
override["abc"]["def"]["ghi"] = "xyz"
|
|
598
|
+
|
|
599
|
+
override["baz_override"] = {
|
|
600
|
+
"more_nested_stuff" => "yup"
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
override["baz_override"]["an_array"] = ["a", "b", "c"]
|
|
604
|
+
EOH
|
|
605
|
+
end
|
|
606
|
+
|
|
607
|
+
let(:expected_combined_default_attrs) do
|
|
608
|
+
{
|
|
609
|
+
"foo" => "bar",
|
|
610
|
+
"abc" => { "def" => { "ghi" => "xyz" } },
|
|
611
|
+
"baz" => {
|
|
612
|
+
"more_nested_stuff" => "yup",
|
|
613
|
+
"an_array" => ["a", "b", "c"]
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
end
|
|
617
|
+
|
|
618
|
+
let(:expected_combined_override_attrs) do
|
|
619
|
+
{
|
|
620
|
+
"foo" => "bar",
|
|
621
|
+
"abc" => { "def" => { "ghi" => "xyz" } },
|
|
622
|
+
"baz_override" => {
|
|
623
|
+
"more_nested_stuff" => "yup",
|
|
624
|
+
"an_array" => ["a", "b", "c"]
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
end
|
|
628
|
+
|
|
629
|
+
it "defines default attributes" do
|
|
630
|
+
expect(policyfile.errors).to eq([])
|
|
631
|
+
expect(policyfile.default_attributes).to eq(expected_combined_default_attrs)
|
|
632
|
+
end
|
|
633
|
+
|
|
634
|
+
it "defines override attributes" do
|
|
635
|
+
expect(policyfile.errors).to eq([])
|
|
636
|
+
expect(policyfile.override_attributes).to eq(expected_combined_override_attrs)
|
|
637
|
+
end
|
|
638
|
+
end
|
|
639
|
+
|
|
640
|
+
end
|
|
641
|
+
|
|
642
|
+
end
|