chef-dk 0.8.0 → 0.9.0
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 +190 -190
- data/Gemfile +26 -0
- data/LICENSE +201 -201
- data/README.md +276 -276
- data/Rakefile +18 -18
- 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/builtin_commands.rb +60 -60
- data/lib/chef-dk/chef_runner.rb +98 -98
- data/lib/chef-dk/cli.rb +200 -200
- data/lib/chef-dk/command/base.rb +79 -75
- 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 +151 -153
- data/lib/chef-dk/command/gem.rb +47 -47
- data/lib/chef-dk/command/generate.rb +120 -118
- data/lib/chef-dk/command/generator_commands.rb +80 -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 +121 -121
- data/lib/chef-dk/command/generator_commands/cookbook.rb +119 -108
- 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 -0
- data/lib/chef-dk/command/generator_commands/lwrp.rb +36 -36
- data/lib/chef-dk/command/generator_commands/policyfile.rb +86 -83
- data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
- data/lib/chef-dk/command/generator_commands/repo.rb +96 -96
- 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 +129 -129
- data/lib/chef-dk/command/verify.rb +490 -453
- data/lib/chef-dk/commands_map.rb +115 -115
- 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 +171 -171
- data/lib/chef-dk/configurable.rb +57 -52
- 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 +113 -113
- data/lib/chef-dk/generator.rb +163 -162
- 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 +122 -122
- data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +54 -54
- data/lib/chef-dk/policyfile/community_cookbook_source.rb +82 -82
- data/lib/chef-dk/policyfile/comparison_base.rb +124 -124
- data/lib/chef-dk/policyfile/cookbook_location_specification.rb +133 -133
- data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
- data/lib/chef-dk/policyfile/cookbook_sources.rb +21 -21
- data/lib/chef-dk/policyfile/differ.rb +266 -266
- data/lib/chef-dk/policyfile/dsl.rb +197 -197
- 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 +322 -322
- 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 +309 -281
- data/lib/chef-dk/policyfile_services/install.rb +125 -125
- data/lib/chef-dk/policyfile_services/push.rb +114 -114
- data/lib/chef-dk/policyfile_services/push_archive.rb +173 -173
- 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 +100 -100
- 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 -0
- 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 +57 -57
- 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/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/roles/README.md +8 -8
- 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 -3
- data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.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 +104 -92
- 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 +48 -47
- 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 +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 +20 -16
- 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 +16 -16
- data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +27 -0
- 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 +20 -20
- data/lib/kitchen/provisioner/policyfile_zero.rb +193 -164
- 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 +117 -117
- data/spec/shared/fixture_cookbook_checksums.rb +47 -47
- data/spec/shared/setup_git_cookbooks.rb +53 -53
- data/spec/spec_helper.rb +49 -48
- data/spec/test_helpers.rb +84 -84
- data/spec/unit/chef_runner_spec.rb +111 -110
- data/spec/unit/cli_spec.rb +357 -357
- data/spec/unit/command/base_spec.rb +169 -136
- 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 +189 -189
- 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/cookbook_file_spec.rb +32 -32
- data/spec/unit/command/generator_commands/cookbook_spec.rb +320 -240
- data/spec/unit/command/generator_commands/generator_generator_spec.rb +229 -0
- data/spec/unit/command/generator_commands/lwrp_spec.rb +32 -32
- data/spec/unit/command/generator_commands/policyfile_spec.rb +125 -125
- data/spec/unit/command/generator_commands/recipe_spec.rb +34 -34
- data/spec/unit/command/generator_commands/repo_spec.rb +283 -283
- 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 +251 -251
- data/spec/unit/command/verify_spec.rb +323 -322
- data/spec/unit/commands_map_spec.rb +57 -57
- data/spec/unit/component_test_spec.rb +126 -126
- 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/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 +120 -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 +66 -66
- data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +34 -34
- data/spec/unit/policyfile/community_cookbook_source_spec.rb +51 -51
- data/spec/unit/policyfile/comparison_base_spec.rb +343 -343
- data/spec/unit/policyfile/cookbook_location_specification_spec.rb +252 -252
- data/spec/unit/policyfile/cookbook_locks_spec.rb +529 -529
- 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 +876 -876
- data/spec/unit/policyfile_evaluation_spec.rb +441 -441
- 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 +439 -416
- data/spec/unit/policyfile_services/install_spec.rb +191 -191
- data/spec/unit/policyfile_services/push_archive_spec.rb +345 -345
- 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
- metadata +9 -3
|
@@ -1,441 +1,441 @@
|
|
|
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 policyfile evaluation is aborted by user signal" do
|
|
92
|
-
|
|
93
|
-
let(:policyfile_rb) { "raise Interrupt" }
|
|
94
|
-
|
|
95
|
-
it "allows the exception to bubble up" do
|
|
96
|
-
expect { policyfile }.to raise_error(Interrupt)
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
context "when given an invalid default source type" do
|
|
101
|
-
|
|
102
|
-
let(:policyfile_rb) do
|
|
103
|
-
<<-EOH
|
|
104
|
-
run_list "foo"
|
|
105
|
-
default_source :herp, "derp"
|
|
106
|
-
EOH
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
it "has an invalid source error" do
|
|
110
|
-
expect(policyfile.errors.size).to eq(1)
|
|
111
|
-
expect(policyfile.errors.first).to eq("Invalid default_source type ':herp'")
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
context "when the url is omitted for chef server default source" do
|
|
116
|
-
let(:policyfile_rb) do
|
|
117
|
-
<<-EOH
|
|
118
|
-
run_list "foo"
|
|
119
|
-
default_source :chef_server
|
|
120
|
-
EOH
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
it "has an invalid source error" do
|
|
124
|
-
expect(policyfile.errors.size).to eq(1)
|
|
125
|
-
expect(policyfile.errors.first).to eq("You must specify the server's URI when using a default_source :chef_server")
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
context "when a per-cookbook source is specified with invalid options" do
|
|
131
|
-
let(:policyfile_rb) do
|
|
132
|
-
<<-EOH
|
|
133
|
-
run_list "foo"
|
|
134
|
-
|
|
135
|
-
cookbook "foo", herp: "derp"
|
|
136
|
-
EOH
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
it "has an invalid source error" do
|
|
140
|
-
expect(policyfile.errors.size).to eq(1)
|
|
141
|
-
message = "Cookbook `foo' has invalid source options `{:herp=>\"derp\"}'"
|
|
142
|
-
expect(policyfile.errors.first).to eq(message)
|
|
143
|
-
end
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
context "Given a minimal valid policyfile" do
|
|
148
|
-
|
|
149
|
-
let(:policyfile_rb) do
|
|
150
|
-
<<-EOH
|
|
151
|
-
name "hello"
|
|
152
|
-
|
|
153
|
-
run_list "foo", "bar"
|
|
154
|
-
EOH
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
it "has no errors" do
|
|
158
|
-
expect(policyfile.errors).to eq([])
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
it "has a name" do
|
|
162
|
-
expect(policyfile.name).to eq("hello")
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
it "has a run_list" do
|
|
166
|
-
expect(policyfile.run_list).to eq(%w[foo bar])
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
it "gives the run_list as the expanded run_list" do
|
|
170
|
-
expect(policyfile.expanded_run_list).to eq(%w[foo bar])
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
it "has no default cookbook source" do
|
|
174
|
-
expect(policyfile.default_source).to be_an(Array)
|
|
175
|
-
expect(policyfile.default_source.size).to eq(1)
|
|
176
|
-
expect(policyfile.default_source.first).to be_a(ChefDK::Policyfile::NullCookbookSource)
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
context "with the default source set to the community site" do
|
|
180
|
-
|
|
181
|
-
let(:policyfile_rb) do
|
|
182
|
-
<<-EOH
|
|
183
|
-
run_list "foo", "bar"
|
|
184
|
-
default_source :community
|
|
185
|
-
EOH
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
it "has a default source" do
|
|
189
|
-
expect(policyfile.errors).to eq([])
|
|
190
|
-
expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io") ]
|
|
191
|
-
expect(policyfile.default_source).to eq(expected)
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
context "with a custom URI" do
|
|
195
|
-
|
|
196
|
-
let(:policyfile_rb) do
|
|
197
|
-
<<-EOH
|
|
198
|
-
run_list "foo", "bar"
|
|
199
|
-
default_source :community, "https://cookbook-api.example.com"
|
|
200
|
-
EOH
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
it "has a default source" do
|
|
204
|
-
expect(policyfile.errors).to eq([])
|
|
205
|
-
expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://cookbook-api.example.com") ]
|
|
206
|
-
expect(policyfile.default_source).to eq(expected)
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
context "with an added cookbook with no options" do
|
|
212
|
-
|
|
213
|
-
let(:policyfile_rb) do
|
|
214
|
-
<<-EOH
|
|
215
|
-
run_list "foo", "bar"
|
|
216
|
-
cookbook "baz"
|
|
217
|
-
EOH
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
it "adds the cookbook to the list of location specs" do
|
|
221
|
-
expect(policyfile.errors).to eq([])
|
|
222
|
-
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("baz", ">= 0.0.0", {}, storage_config)
|
|
223
|
-
expect(policyfile.cookbook_location_specs).to eq("baz" => expected_cb_spec)
|
|
224
|
-
end
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
context "with the default source set to a chef server" do
|
|
230
|
-
|
|
231
|
-
let(:policyfile_rb) do
|
|
232
|
-
<<-EOH
|
|
233
|
-
run_list "foo", "bar"
|
|
234
|
-
default_source :chef_server, "https://mychef.example.com"
|
|
235
|
-
EOH
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
it "has a default source" do
|
|
239
|
-
skip "Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)"
|
|
240
|
-
|
|
241
|
-
expect(policyfile.errors).to eq([])
|
|
242
|
-
expected = ChefDK::Policyfile::ChefServerCookbookSource.new("https://mychef.example.com")
|
|
243
|
-
expect(policyfile.default_source).to eq(expected)
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
end
|
|
247
|
-
|
|
248
|
-
context "with the default source set to a chef-repo path" do
|
|
249
|
-
|
|
250
|
-
let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
|
|
251
|
-
|
|
252
|
-
let(:policyfile_rb) do
|
|
253
|
-
<<-EOH
|
|
254
|
-
run_list "foo", "bar"
|
|
255
|
-
default_source :chef_repo, "#{chef_repo}"
|
|
256
|
-
EOH
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
it "has a default source" do
|
|
260
|
-
expect(policyfile.errors).to eq([])
|
|
261
|
-
expected = [ ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo) ]
|
|
262
|
-
expect(policyfile.default_source).to eq(expected)
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
context "with multiple default sources" do
|
|
268
|
-
let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
|
|
269
|
-
|
|
270
|
-
let(:policyfile_rb) do
|
|
271
|
-
<<-EOH
|
|
272
|
-
run_list "foo", "bar"
|
|
273
|
-
|
|
274
|
-
default_source :community
|
|
275
|
-
default_source :chef_repo, "#{chef_repo}"
|
|
276
|
-
EOH
|
|
277
|
-
end
|
|
278
|
-
|
|
279
|
-
it "has an array of sources" do
|
|
280
|
-
expect(policyfile.errors).to eq([])
|
|
281
|
-
|
|
282
|
-
community_source = ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io")
|
|
283
|
-
repo_source = ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo)
|
|
284
|
-
expected = [ community_source, repo_source ]
|
|
285
|
-
|
|
286
|
-
expect(policyfile.default_source).to eq(expected)
|
|
287
|
-
end
|
|
288
|
-
|
|
289
|
-
end
|
|
290
|
-
|
|
291
|
-
end
|
|
292
|
-
|
|
293
|
-
describe "assigning cookbooks to specific sources" do
|
|
294
|
-
|
|
295
|
-
before do
|
|
296
|
-
expect(policyfile.errors).to eq([])
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
context "when a cookbook is assigned to a local source" do
|
|
300
|
-
|
|
301
|
-
let(:policyfile_rb) do
|
|
302
|
-
<<-EOH
|
|
303
|
-
run_list "foo"
|
|
304
|
-
cookbook "foo", path: "local_cookbooks/foo"
|
|
305
|
-
EOH
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
it "sets the source of the cookbook to the local path" do
|
|
309
|
-
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {path: "local_cookbooks/foo"}, storage_config)
|
|
310
|
-
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
311
|
-
end
|
|
312
|
-
|
|
313
|
-
end
|
|
314
|
-
|
|
315
|
-
context "when a cookbook is assigned to a git source" do
|
|
316
|
-
let(:policyfile_rb) do
|
|
317
|
-
<<-EOH
|
|
318
|
-
run_list "foo"
|
|
319
|
-
cookbook "foo", git: "git://example.com:me/foo-cookbook.git"
|
|
320
|
-
EOH
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
it "sets the source of the cookbook to the git URL" do
|
|
324
|
-
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {git: "git://example.com:me/foo-cookbook.git"}, storage_config)
|
|
325
|
-
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
context "when a cookbook is assigned to a chef_server source" do
|
|
331
|
-
let(:policyfile_rb) do
|
|
332
|
-
<<-EOH
|
|
333
|
-
run_list "foo"
|
|
334
|
-
cookbook "foo", chef_server: "https://mychefserver.example.com"
|
|
335
|
-
EOH
|
|
336
|
-
end
|
|
337
|
-
|
|
338
|
-
# Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)
|
|
339
|
-
# We have to skip at the example definition level or else we fail in the before block
|
|
340
|
-
skip "sets the source of the cookbook to the git URL" do
|
|
341
|
-
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {chef_server: "https://mychefserver.example.com"}, storage_config)
|
|
342
|
-
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
end
|
|
348
|
-
|
|
349
|
-
describe "assigning a cookbook to conflicting sources" do
|
|
350
|
-
let(:policyfile_rb) do
|
|
351
|
-
<<-EOH
|
|
352
|
-
run_list "foo"
|
|
353
|
-
cookbook "foo", path: "local_cookbooks/foo"
|
|
354
|
-
cookbook "foo", chef_server: "https://mychefserver.example.com"
|
|
355
|
-
EOH
|
|
356
|
-
end
|
|
357
|
-
|
|
358
|
-
it "has a conflicting sources error" do
|
|
359
|
-
expected = <<-EOH
|
|
360
|
-
Cookbook 'foo' assigned to conflicting sources
|
|
361
|
-
|
|
362
|
-
Previous source: {:path=>"local_cookbooks/foo"}
|
|
363
|
-
Conflicts with: {:chef_server=>"https://mychefserver.example.com"}
|
|
364
|
-
EOH
|
|
365
|
-
expect(policyfile.errors.size).to eq(1)
|
|
366
|
-
expect(policyfile.errors.first).to eq(expected)
|
|
367
|
-
end
|
|
368
|
-
|
|
369
|
-
end
|
|
370
|
-
|
|
371
|
-
describe "defining attributes" do
|
|
372
|
-
|
|
373
|
-
let(:policyfile_rb) do
|
|
374
|
-
<<-EOH
|
|
375
|
-
name "policy-with-attrs"
|
|
376
|
-
run_list "foo"
|
|
377
|
-
|
|
378
|
-
# basic attribute setting:
|
|
379
|
-
default["foo"] = "bar"
|
|
380
|
-
|
|
381
|
-
# auto-vivify
|
|
382
|
-
default["abc"]["def"]["ghi"] = "xyz"
|
|
383
|
-
|
|
384
|
-
# literal data structures
|
|
385
|
-
default["baz"] = {
|
|
386
|
-
"more_nested_stuff" => "yup"
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
# Array literals work and we merge rather than overwrite:
|
|
390
|
-
default["baz"]["an_array"] = ["a", "b", "c"]
|
|
391
|
-
|
|
392
|
-
# all the same stuff works with overrides:
|
|
393
|
-
|
|
394
|
-
override["foo"] = "bar"
|
|
395
|
-
|
|
396
|
-
override["abc"]["def"]["ghi"] = "xyz"
|
|
397
|
-
|
|
398
|
-
override["baz_override"] = {
|
|
399
|
-
"more_nested_stuff" => "yup"
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
override["baz_override"]["an_array"] = ["a", "b", "c"]
|
|
403
|
-
EOH
|
|
404
|
-
end
|
|
405
|
-
|
|
406
|
-
let(:expected_combined_default_attrs) do
|
|
407
|
-
{
|
|
408
|
-
"foo" => "bar",
|
|
409
|
-
"abc" => { "def" => { "ghi" => "xyz" } },
|
|
410
|
-
"baz" => {
|
|
411
|
-
"more_nested_stuff" => "yup",
|
|
412
|
-
"an_array" => ["a", "b", "c"]
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
end
|
|
416
|
-
|
|
417
|
-
let(:expected_combined_override_attrs) do
|
|
418
|
-
{
|
|
419
|
-
"foo" => "bar",
|
|
420
|
-
"abc" => { "def" => { "ghi" => "xyz" } },
|
|
421
|
-
"baz_override" => {
|
|
422
|
-
"more_nested_stuff" => "yup",
|
|
423
|
-
"an_array" => ["a", "b", "c"]
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
end
|
|
427
|
-
|
|
428
|
-
it "defines default attributes" do
|
|
429
|
-
expect(policyfile.errors).to eq([])
|
|
430
|
-
expect(policyfile.default_attributes).to eq(expected_combined_default_attrs)
|
|
431
|
-
end
|
|
432
|
-
|
|
433
|
-
it "defines override attributes" do
|
|
434
|
-
expect(policyfile.errors).to eq([])
|
|
435
|
-
expect(policyfile.override_attributes).to eq(expected_combined_override_attrs)
|
|
436
|
-
end
|
|
437
|
-
end
|
|
438
|
-
|
|
439
|
-
end
|
|
440
|
-
|
|
441
|
-
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 policyfile evaluation is aborted by user signal" do
|
|
92
|
+
|
|
93
|
+
let(:policyfile_rb) { "raise Interrupt" }
|
|
94
|
+
|
|
95
|
+
it "allows the exception to bubble up" do
|
|
96
|
+
expect { policyfile }.to raise_error(Interrupt)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
context "when given an invalid default source type" do
|
|
101
|
+
|
|
102
|
+
let(:policyfile_rb) do
|
|
103
|
+
<<-EOH
|
|
104
|
+
run_list "foo"
|
|
105
|
+
default_source :herp, "derp"
|
|
106
|
+
EOH
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "has an invalid source error" do
|
|
110
|
+
expect(policyfile.errors.size).to eq(1)
|
|
111
|
+
expect(policyfile.errors.first).to eq("Invalid default_source type ':herp'")
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context "when the url is omitted for chef server default source" do
|
|
116
|
+
let(:policyfile_rb) do
|
|
117
|
+
<<-EOH
|
|
118
|
+
run_list "foo"
|
|
119
|
+
default_source :chef_server
|
|
120
|
+
EOH
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "has an invalid source error" do
|
|
124
|
+
expect(policyfile.errors.size).to eq(1)
|
|
125
|
+
expect(policyfile.errors.first).to eq("You must specify the server's URI when using a default_source :chef_server")
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
context "when a per-cookbook source is specified with invalid options" do
|
|
131
|
+
let(:policyfile_rb) do
|
|
132
|
+
<<-EOH
|
|
133
|
+
run_list "foo"
|
|
134
|
+
|
|
135
|
+
cookbook "foo", herp: "derp"
|
|
136
|
+
EOH
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it "has an invalid source error" do
|
|
140
|
+
expect(policyfile.errors.size).to eq(1)
|
|
141
|
+
message = "Cookbook `foo' has invalid source options `{:herp=>\"derp\"}'"
|
|
142
|
+
expect(policyfile.errors.first).to eq(message)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
context "Given a minimal valid policyfile" do
|
|
148
|
+
|
|
149
|
+
let(:policyfile_rb) do
|
|
150
|
+
<<-EOH
|
|
151
|
+
name "hello"
|
|
152
|
+
|
|
153
|
+
run_list "foo", "bar"
|
|
154
|
+
EOH
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "has no errors" do
|
|
158
|
+
expect(policyfile.errors).to eq([])
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it "has a name" do
|
|
162
|
+
expect(policyfile.name).to eq("hello")
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it "has a run_list" do
|
|
166
|
+
expect(policyfile.run_list).to eq(%w[foo bar])
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
it "gives the run_list as the expanded run_list" do
|
|
170
|
+
expect(policyfile.expanded_run_list).to eq(%w[foo bar])
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "has no default cookbook source" do
|
|
174
|
+
expect(policyfile.default_source).to be_an(Array)
|
|
175
|
+
expect(policyfile.default_source.size).to eq(1)
|
|
176
|
+
expect(policyfile.default_source.first).to be_a(ChefDK::Policyfile::NullCookbookSource)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
context "with the default source set to the community site" do
|
|
180
|
+
|
|
181
|
+
let(:policyfile_rb) do
|
|
182
|
+
<<-EOH
|
|
183
|
+
run_list "foo", "bar"
|
|
184
|
+
default_source :community
|
|
185
|
+
EOH
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it "has a default source" do
|
|
189
|
+
expect(policyfile.errors).to eq([])
|
|
190
|
+
expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io") ]
|
|
191
|
+
expect(policyfile.default_source).to eq(expected)
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
context "with a custom URI" do
|
|
195
|
+
|
|
196
|
+
let(:policyfile_rb) do
|
|
197
|
+
<<-EOH
|
|
198
|
+
run_list "foo", "bar"
|
|
199
|
+
default_source :community, "https://cookbook-api.example.com"
|
|
200
|
+
EOH
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
it "has a default source" do
|
|
204
|
+
expect(policyfile.errors).to eq([])
|
|
205
|
+
expected = [ ChefDK::Policyfile::CommunityCookbookSource.new("https://cookbook-api.example.com") ]
|
|
206
|
+
expect(policyfile.default_source).to eq(expected)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
context "with an added cookbook with no options" do
|
|
212
|
+
|
|
213
|
+
let(:policyfile_rb) do
|
|
214
|
+
<<-EOH
|
|
215
|
+
run_list "foo", "bar"
|
|
216
|
+
cookbook "baz"
|
|
217
|
+
EOH
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
it "adds the cookbook to the list of location specs" do
|
|
221
|
+
expect(policyfile.errors).to eq([])
|
|
222
|
+
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("baz", ">= 0.0.0", {}, storage_config)
|
|
223
|
+
expect(policyfile.cookbook_location_specs).to eq("baz" => expected_cb_spec)
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
context "with the default source set to a chef server" do
|
|
230
|
+
|
|
231
|
+
let(:policyfile_rb) do
|
|
232
|
+
<<-EOH
|
|
233
|
+
run_list "foo", "bar"
|
|
234
|
+
default_source :chef_server, "https://mychef.example.com"
|
|
235
|
+
EOH
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it "has a default source" do
|
|
239
|
+
skip "Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)"
|
|
240
|
+
|
|
241
|
+
expect(policyfile.errors).to eq([])
|
|
242
|
+
expected = ChefDK::Policyfile::ChefServerCookbookSource.new("https://mychef.example.com")
|
|
243
|
+
expect(policyfile.default_source).to eq(expected)
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
context "with the default source set to a chef-repo path" do
|
|
249
|
+
|
|
250
|
+
let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
|
|
251
|
+
|
|
252
|
+
let(:policyfile_rb) do
|
|
253
|
+
<<-EOH
|
|
254
|
+
run_list "foo", "bar"
|
|
255
|
+
default_source :chef_repo, "#{chef_repo}"
|
|
256
|
+
EOH
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it "has a default source" do
|
|
260
|
+
expect(policyfile.errors).to eq([])
|
|
261
|
+
expected = [ ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo) ]
|
|
262
|
+
expect(policyfile.default_source).to eq(expected)
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
context "with multiple default sources" do
|
|
268
|
+
let(:chef_repo) { File.expand_path("spec/unit/fixtures/local_path_cookbooks", project_root) }
|
|
269
|
+
|
|
270
|
+
let(:policyfile_rb) do
|
|
271
|
+
<<-EOH
|
|
272
|
+
run_list "foo", "bar"
|
|
273
|
+
|
|
274
|
+
default_source :community
|
|
275
|
+
default_source :chef_repo, "#{chef_repo}"
|
|
276
|
+
EOH
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
it "has an array of sources" do
|
|
280
|
+
expect(policyfile.errors).to eq([])
|
|
281
|
+
|
|
282
|
+
community_source = ChefDK::Policyfile::CommunityCookbookSource.new("https://supermarket.chef.io")
|
|
283
|
+
repo_source = ChefDK::Policyfile::ChefRepoCookbookSource.new(chef_repo)
|
|
284
|
+
expected = [ community_source, repo_source ]
|
|
285
|
+
|
|
286
|
+
expect(policyfile.default_source).to eq(expected)
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
describe "assigning cookbooks to specific sources" do
|
|
294
|
+
|
|
295
|
+
before do
|
|
296
|
+
expect(policyfile.errors).to eq([])
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
context "when a cookbook is assigned to a local source" do
|
|
300
|
+
|
|
301
|
+
let(:policyfile_rb) do
|
|
302
|
+
<<-EOH
|
|
303
|
+
run_list "foo"
|
|
304
|
+
cookbook "foo", path: "local_cookbooks/foo"
|
|
305
|
+
EOH
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
it "sets the source of the cookbook to the local path" do
|
|
309
|
+
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {path: "local_cookbooks/foo"}, storage_config)
|
|
310
|
+
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
context "when a cookbook is assigned to a git source" do
|
|
316
|
+
let(:policyfile_rb) do
|
|
317
|
+
<<-EOH
|
|
318
|
+
run_list "foo"
|
|
319
|
+
cookbook "foo", git: "git://example.com:me/foo-cookbook.git"
|
|
320
|
+
EOH
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
it "sets the source of the cookbook to the git URL" do
|
|
324
|
+
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {git: "git://example.com:me/foo-cookbook.git"}, storage_config)
|
|
325
|
+
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
context "when a cookbook is assigned to a chef_server source" do
|
|
331
|
+
let(:policyfile_rb) do
|
|
332
|
+
<<-EOH
|
|
333
|
+
run_list "foo"
|
|
334
|
+
cookbook "foo", chef_server: "https://mychefserver.example.com"
|
|
335
|
+
EOH
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
# Chef server isn't yet supported in cookbook-omnifetch (pending /universe endpoint in Chef Server)
|
|
339
|
+
# We have to skip at the example definition level or else we fail in the before block
|
|
340
|
+
skip "sets the source of the cookbook to the git URL" do
|
|
341
|
+
expected_cb_spec = ChefDK::Policyfile::CookbookLocationSpecification.new("foo", ">= 0.0.0", {chef_server: "https://mychefserver.example.com"}, storage_config)
|
|
342
|
+
expect(policyfile.cookbook_location_specs).to eq("foo" => expected_cb_spec)
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
describe "assigning a cookbook to conflicting sources" do
|
|
350
|
+
let(:policyfile_rb) do
|
|
351
|
+
<<-EOH
|
|
352
|
+
run_list "foo"
|
|
353
|
+
cookbook "foo", path: "local_cookbooks/foo"
|
|
354
|
+
cookbook "foo", chef_server: "https://mychefserver.example.com"
|
|
355
|
+
EOH
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
it "has a conflicting sources error" do
|
|
359
|
+
expected = <<-EOH
|
|
360
|
+
Cookbook 'foo' assigned to conflicting sources
|
|
361
|
+
|
|
362
|
+
Previous source: {:path=>"local_cookbooks/foo"}
|
|
363
|
+
Conflicts with: {:chef_server=>"https://mychefserver.example.com"}
|
|
364
|
+
EOH
|
|
365
|
+
expect(policyfile.errors.size).to eq(1)
|
|
366
|
+
expect(policyfile.errors.first).to eq(expected)
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
describe "defining attributes" do
|
|
372
|
+
|
|
373
|
+
let(:policyfile_rb) do
|
|
374
|
+
<<-EOH
|
|
375
|
+
name "policy-with-attrs"
|
|
376
|
+
run_list "foo"
|
|
377
|
+
|
|
378
|
+
# basic attribute setting:
|
|
379
|
+
default["foo"] = "bar"
|
|
380
|
+
|
|
381
|
+
# auto-vivify
|
|
382
|
+
default["abc"]["def"]["ghi"] = "xyz"
|
|
383
|
+
|
|
384
|
+
# literal data structures
|
|
385
|
+
default["baz"] = {
|
|
386
|
+
"more_nested_stuff" => "yup"
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
# Array literals work and we merge rather than overwrite:
|
|
390
|
+
default["baz"]["an_array"] = ["a", "b", "c"]
|
|
391
|
+
|
|
392
|
+
# all the same stuff works with overrides:
|
|
393
|
+
|
|
394
|
+
override["foo"] = "bar"
|
|
395
|
+
|
|
396
|
+
override["abc"]["def"]["ghi"] = "xyz"
|
|
397
|
+
|
|
398
|
+
override["baz_override"] = {
|
|
399
|
+
"more_nested_stuff" => "yup"
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
override["baz_override"]["an_array"] = ["a", "b", "c"]
|
|
403
|
+
EOH
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
let(:expected_combined_default_attrs) do
|
|
407
|
+
{
|
|
408
|
+
"foo" => "bar",
|
|
409
|
+
"abc" => { "def" => { "ghi" => "xyz" } },
|
|
410
|
+
"baz" => {
|
|
411
|
+
"more_nested_stuff" => "yup",
|
|
412
|
+
"an_array" => ["a", "b", "c"]
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
let(:expected_combined_override_attrs) do
|
|
418
|
+
{
|
|
419
|
+
"foo" => "bar",
|
|
420
|
+
"abc" => { "def" => { "ghi" => "xyz" } },
|
|
421
|
+
"baz_override" => {
|
|
422
|
+
"more_nested_stuff" => "yup",
|
|
423
|
+
"an_array" => ["a", "b", "c"]
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
it "defines default attributes" do
|
|
429
|
+
expect(policyfile.errors).to eq([])
|
|
430
|
+
expect(policyfile.default_attributes).to eq(expected_combined_default_attrs)
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
it "defines override attributes" do
|
|
434
|
+
expect(policyfile.errors).to eq([])
|
|
435
|
+
expect(policyfile.override_attributes).to eq(expected_combined_override_attrs)
|
|
436
|
+
end
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
end
|