chef-dk 3.0.36 → 3.1.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/Gemfile +124 -126
- data/Gemfile.lock +815 -812
- data/LICENSE +201 -201
- data/README.md +333 -333
- data/Rakefile +74 -74
- data/acceptance/.shared/kitchen_acceptance/.kitchen.digitalocean.yml +27 -27
- data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +287 -287
- 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 +21 -21
- data/acceptance/Gemfile.lock +334 -334
- 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/chef-dk.gemspec +60 -60
- data/lib/chef-dk.rb +19 -19
- data/lib/chef-dk/authenticated_http.rb +22 -22
- data/lib/chef-dk/builtin_commands.rb +59 -59
- data/lib/chef-dk/chef_runner.rb +114 -114
- data/lib/chef-dk/chef_server_api_multi.rb +73 -73
- data/lib/chef-dk/cli.rb +201 -201
- data/lib/chef-dk/command/base.rb +79 -79
- data/lib/chef-dk/command/clean_policy_cookbooks.rb +114 -114
- data/lib/chef-dk/command/clean_policy_revisions.rb +111 -111
- data/lib/chef-dk/command/delete_policy.rb +120 -120
- data/lib/chef-dk/command/delete_policy_group.rb +120 -120
- data/lib/chef-dk/command/diff.rb +315 -315
- data/lib/chef-dk/command/env.rb +89 -89
- data/lib/chef-dk/command/exec.rb +44 -44
- data/lib/chef-dk/command/export.rb +155 -155
- data/lib/chef-dk/command/gem.rb +47 -47
- data/lib/chef-dk/command/generate.rb +125 -125
- data/lib/chef-dk/command/generator_commands.rb +83 -83
- data/lib/chef-dk/command/generator_commands/app.rb +106 -106
- data/lib/chef-dk/command/generator_commands/attribute.rb +36 -36
- data/lib/chef-dk/command/generator_commands/base.rb +157 -157
- data/lib/chef-dk/command/generator_commands/build_cookbook.rb +125 -125
- data/lib/chef-dk/command/generator_commands/chef_exts/generator_desc_resource.rb +85 -85
- data/lib/chef-dk/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -38
- data/lib/chef-dk/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -39
- data/lib/chef-dk/command/generator_commands/cookbook.rb +241 -241
- 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 +174 -174
- data/lib/chef-dk/command/generator_commands/helpers.rb +36 -36
- data/lib/chef-dk/command/generator_commands/policyfile.rb +124 -124
- data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
- data/lib/chef-dk/command/generator_commands/repo.rb +123 -123
- data/lib/chef-dk/command/generator_commands/resource.rb +36 -36
- data/lib/chef-dk/command/generator_commands/template.rb +46 -46
- data/lib/chef-dk/command/install.rb +120 -120
- data/lib/chef-dk/command/provision.rb +436 -436
- data/lib/chef-dk/command/push.rb +117 -117
- data/lib/chef-dk/command/push_archive.rb +125 -125
- data/lib/chef-dk/command/shell_init.rb +179 -179
- data/lib/chef-dk/command/show_policy.rb +163 -163
- data/lib/chef-dk/command/undelete.rb +154 -154
- data/lib/chef-dk/command/update.rb +133 -133
- data/lib/chef-dk/command/verify.rb +629 -629
- data/lib/chef-dk/commands_map.rb +113 -113
- 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 +227 -227
- data/lib/chef-dk/configurable.rb +88 -88
- 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 +152 -152
- data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
- data/lib/chef-dk/cookbook_profiler/null_scm.rb +31 -31
- data/lib/chef-dk/exceptions.rb +151 -151
- data/lib/chef-dk/generator.rb +165 -165
- data/lib/chef-dk/helpers.rb +176 -176
- data/lib/chef-dk/pager.rb +104 -104
- data/lib/chef-dk/policyfile/artifactory_cookbook_source.rb +102 -102
- data/lib/chef-dk/policyfile/attribute_merge_checker.rb +110 -110
- data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +138 -138
- data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +99 -99
- data/lib/chef-dk/policyfile/chef_server_lock_fetcher.rb +167 -167
- data/lib/chef-dk/policyfile/community_cookbook_source.rb +95 -95
- data/lib/chef-dk/policyfile/comparison_base.rb +123 -123
- 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 +23 -23
- data/lib/chef-dk/policyfile/delivery_supermarket_source.rb +89 -89
- data/lib/chef-dk/policyfile/differ.rb +263 -263
- data/lib/chef-dk/policyfile/dsl.rb +288 -288
- data/lib/chef-dk/policyfile/git_lock_fetcher.rb +265 -265
- data/lib/chef-dk/policyfile/included_policies_cookbook_source.rb +156 -156
- data/lib/chef-dk/policyfile/lister.rb +229 -229
- data/lib/chef-dk/policyfile/local_lock_fetcher.rb +129 -129
- data/lib/chef-dk/policyfile/lock_applier.rb +80 -80
- data/lib/chef-dk/policyfile/null_cookbook_source.rb +49 -49
- data/lib/chef-dk/policyfile/policyfile_location_specification.rb +125 -125
- data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
- data/lib/chef-dk/policyfile/reports/install.rb +69 -69
- data/lib/chef-dk/policyfile/reports/table_printer.rb +57 -57
- data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
- data/lib/chef-dk/policyfile/solution_dependencies.rb +311 -311
- data/lib/chef-dk/policyfile/source_uri.rb +57 -57
- data/lib/chef-dk/policyfile/storage_config.rb +112 -112
- data/lib/chef-dk/policyfile/undo_record.rb +139 -139
- data/lib/chef-dk/policyfile/undo_stack.rb +128 -128
- data/lib/chef-dk/policyfile/uploader.rb +213 -213
- data/lib/chef-dk/policyfile_compiler.rb +528 -528
- data/lib/chef-dk/policyfile_lock.rb +581 -581
- data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
- data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +123 -123
- data/lib/chef-dk/policyfile_services/export_repo.rb +419 -419
- data/lib/chef-dk/policyfile_services/install.rb +162 -162
- data/lib/chef-dk/policyfile_services/push.rb +112 -112
- data/lib/chef-dk/policyfile_services/push_archive.rb +164 -164
- data/lib/chef-dk/policyfile_services/rm_policy.rb +141 -141
- data/lib/chef-dk/policyfile_services/rm_policy_group.rb +85 -85
- data/lib/chef-dk/policyfile_services/show_policy.rb +234 -234
- data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
- data/lib/chef-dk/policyfile_services/update_attributes.rb +110 -110
- data/lib/chef-dk/service_exception_inspectors.rb +24 -24
- data/lib/chef-dk/service_exception_inspectors/base.rb +39 -39
- data/lib/chef-dk/service_exception_inspectors/http.rb +119 -119
- data/lib/chef-dk/service_exceptions.rb +142 -142
- data/lib/chef-dk/shell_out.rb +36 -36
- data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +4 -4
- data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/.kitchen.yml +21 -21
- data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/README.md +146 -146
- data/lib/chef-dk/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +9 -9
- data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +104 -104
- 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 +66 -66
- data/lib/chef-dk/skeletons/code_generator/files/default/delivery-config.json +17 -17
- data/lib/chef-dk/skeletons/code_generator/files/default/delivery-project.toml +36 -36
- data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +22 -22
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +24 -24
- 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 +8 -8
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +7 -7
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +9 -9
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -56
- 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/spec_helper.rb +3 -3
- data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper_policyfile.rb +3 -3
- data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
- data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +89 -89
- data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +13 -13
- data/lib/chef-dk/skeletons/code_generator/recipes/build_cookbook.rb +177 -177
- data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +158 -158
- data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +25 -25
- data/lib/chef-dk/skeletons/code_generator/recipes/helpers.rb +21 -21
- data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +9 -9
- data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +52 -52
- data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +68 -68
- data/lib/chef-dk/skeletons/code_generator/recipes/resource.rb +13 -13
- data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
- data/lib/chef-dk/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -11
- 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.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/build_cookbook/Berksfile.erb +7 -7
- data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -10
- data/lib/chef-dk/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +8 -8
- data/lib/chef-dk/skeletons/code_generator/templates/default/helpers.rb.erb +39 -39
- data/lib/chef-dk/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +18 -18
- data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +26 -26
- data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +33 -33
- data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +20 -20
- 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 +35 -35
- data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -128
- data/lib/chef-dk/skeletons/code_generator/templates/default/resource.rb.erb +1 -1
- data/lib/chef-dk/ui.rb +57 -57
- data/lib/chef-dk/version.rb +20 -20
- data/lib/kitchen/provisioner/policyfile_zero.rb +195 -195
- data/omnibus_overrides.rb +25 -25
- 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 +136 -136
- data/spec/shared/fixture_cookbook_checksums.rb +46 -46
- data/spec/shared/setup_git_committer_config.rb +54 -54
- 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/chef_server_api_multi_spec.rb +120 -120
- data/spec/unit/cli_spec.rb +377 -377
- data/spec/unit/command/base_spec.rb +172 -172
- data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -180
- data/spec/unit/command/clean_policy_revisions_spec.rb +180 -180
- data/spec/unit/command/delete_policy_group_spec.rb +206 -206
- data/spec/unit/command/delete_policy_spec.rb +206 -206
- data/spec/unit/command/diff_spec.rb +311 -311
- data/spec/unit/command/env_spec.rb +52 -52
- data/spec/unit/command/exec_spec.rb +178 -178
- data/spec/unit/command/export_spec.rb +199 -199
- data/spec/unit/command/generate_spec.rb +142 -142
- data/spec/unit/command/generator_commands/app_spec.rb +166 -166
- data/spec/unit/command/generator_commands/attribute_spec.rb +31 -31
- data/spec/unit/command/generator_commands/base_spec.rb +181 -181
- data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -377
- data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +97 -97
- data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -111
- data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -31
- data/spec/unit/command/generator_commands/cookbook_spec.rb +765 -765
- data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -227
- data/spec/unit/command/generator_commands/helpers_spec.rb +31 -31
- data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -223
- data/spec/unit/command/generator_commands/recipe_spec.rb +37 -37
- data/spec/unit/command/generator_commands/repo_spec.rb +374 -374
- data/spec/unit/command/generator_commands/resource_spec.rb +31 -31
- data/spec/unit/command/generator_commands/template_spec.rb +31 -31
- data/spec/unit/command/install_spec.rb +179 -179
- data/spec/unit/command/provision_spec.rb +589 -589
- data/spec/unit/command/push_archive_spec.rb +153 -153
- data/spec/unit/command/push_spec.rb +198 -198
- data/spec/unit/command/shell_init_spec.rb +339 -339
- data/spec/unit/command/show_policy_spec.rb +234 -234
- data/spec/unit/command/undelete_spec.rb +244 -244
- data/spec/unit/command/update_spec.rb +283 -283
- data/spec/unit/command/verify_spec.rb +341 -341
- data/spec/unit/commands_map_spec.rb +57 -57
- data/spec/unit/component_test_spec.rb +128 -128
- data/spec/unit/configurable_spec.rb +68 -68
- data/spec/unit/cookbook_metadata_spec.rb +96 -96
- data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
- data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -81
- 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/chef_server_universe.json +56 -56
- data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -30
- 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 +33 -33
- 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 -119
- data/spec/unit/pager_spec.rb +117 -117
- data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -59
- data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -80
- data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -93
- data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -55
- data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -161
- data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -83
- data/spec/unit/policyfile/comparison_base_spec.rb +340 -340
- data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -347
- data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -527
- data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -129
- data/spec/unit/policyfile/differ_spec.rb +686 -686
- data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -155
- data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -242
- data/spec/unit/policyfile/lister_spec.rb +268 -268
- data/spec/unit/policyfile/local_lock_fetcher_spec.rb +173 -173
- data/spec/unit/policyfile/lock_applier_spec.rb +100 -100
- data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -34
- data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
- data/spec/unit/policyfile/reports/install_spec.rb +114 -114
- data/spec/unit/policyfile/reports/upload_spec.rb +94 -94
- data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -170
- data/spec/unit/policyfile/source_uri_spec.rb +36 -36
- data/spec/unit/policyfile/storage_config_spec.rb +180 -180
- data/spec/unit/policyfile/undo_record_spec.rb +258 -258
- data/spec/unit/policyfile/undo_stack_spec.rb +265 -265
- data/spec/unit/policyfile/uploader_spec.rb +409 -409
- data/spec/unit/policyfile_demands_spec.rb +1197 -1197
- data/spec/unit/policyfile_evaluation_spec.rb +628 -628
- data/spec/unit/policyfile_includes_dsl_spec.rb +159 -159
- data/spec/unit/policyfile_includes_spec.rb +720 -720
- data/spec/unit/policyfile_install_with_includes_spec.rb +232 -232
- data/spec/unit/policyfile_lock_build_spec.rb +1065 -1065
- data/spec/unit/policyfile_lock_install_spec.rb +137 -137
- data/spec/unit/policyfile_lock_serialization_spec.rb +424 -424
- data/spec/unit/policyfile_lock_validation_spec.rb +608 -608
- data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
- data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -272
- data/spec/unit/policyfile_services/export_repo_spec.rb +473 -473
- data/spec/unit/policyfile_services/install_spec.rb +209 -209
- data/spec/unit/policyfile_services/push_archive_spec.rb +359 -359
- data/spec/unit/policyfile_services/push_spec.rb +249 -249
- data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -237
- data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -263
- data/spec/unit/policyfile_services/show_policy_spec.rb +887 -887
- data/spec/unit/policyfile_services/undelete_spec.rb +302 -302
- data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -229
- data/spec/unit/policyfile_services/update_spec.rb +140 -140
- data/spec/unit/service_exception_inspectors/base_spec.rb +41 -41
- data/spec/unit/service_exception_inspectors/http_spec.rb +138 -138
- data/spec/unit/shell_out_spec.rb +34 -34
- data/tasks/announce.rb +57 -57
- data/tasks/bin/bundle-platform.bat +2 -2
- data/tasks/dependencies.rb +89 -89
- data/tasks/templates/prerelease.md.erb +35 -35
- data/tasks/templates/release.md.erb +34 -34
- data/warning.txt +9 -9
- metadata +2 -2
@@ -1,69 +1,69 @@
|
|
1
|
-
#
|
2
|
-
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
3
|
-
# License:: Apache License, Version 2.0
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
#
|
17
|
-
|
18
|
-
require "chef-dk/policyfile/reports/table_printer"
|
19
|
-
|
20
|
-
module ChefDK
|
21
|
-
module Policyfile
|
22
|
-
module Reports
|
23
|
-
|
24
|
-
class Install
|
25
|
-
|
26
|
-
attr_reader :ui
|
27
|
-
attr_reader :policyfile_compiler
|
28
|
-
|
29
|
-
def initialize(ui: nil, policyfile_compiler: nil)
|
30
|
-
@ui = ui
|
31
|
-
@policyfile_compiler = policyfile_compiler
|
32
|
-
|
33
|
-
@fixed_version_install_table = nil
|
34
|
-
@install_table = nil
|
35
|
-
end
|
36
|
-
|
37
|
-
def installing_fixed_version_cookbook(cookbook_spec)
|
38
|
-
verb = cookbook_spec.installed? ? "Using " : "Installing"
|
39
|
-
fixed_version_install_table.print_row(verb, cookbook_spec.name, cookbook_spec.version_constraint.to_s, "from #{cookbook_spec.source_type}")
|
40
|
-
end
|
41
|
-
|
42
|
-
def installing_cookbook(cookbook_spec)
|
43
|
-
verb = cookbook_spec.installed? ? "Using " : "Installing"
|
44
|
-
install_table.print_row(verb, cookbook_spec.name, cookbook_spec.version_constraint.version)
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def fixed_version_install_table
|
50
|
-
@fixed_version_install_table ||= TablePrinter.new(ui) do |t|
|
51
|
-
t.column(%w{Using Installing})
|
52
|
-
t.column(policyfile_compiler.fixed_version_cookbooks_specs.keys)
|
53
|
-
t.column
|
54
|
-
t.column
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def install_table
|
59
|
-
@install_table ||= TablePrinter.new(ui) do |t|
|
60
|
-
t.column(%w{Using Installing})
|
61
|
-
t.column(policyfile_compiler.graph_solution.keys)
|
62
|
-
t.column(policyfile_compiler.graph_solution.values)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require "chef-dk/policyfile/reports/table_printer"
|
19
|
+
|
20
|
+
module ChefDK
|
21
|
+
module Policyfile
|
22
|
+
module Reports
|
23
|
+
|
24
|
+
class Install
|
25
|
+
|
26
|
+
attr_reader :ui
|
27
|
+
attr_reader :policyfile_compiler
|
28
|
+
|
29
|
+
def initialize(ui: nil, policyfile_compiler: nil)
|
30
|
+
@ui = ui
|
31
|
+
@policyfile_compiler = policyfile_compiler
|
32
|
+
|
33
|
+
@fixed_version_install_table = nil
|
34
|
+
@install_table = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def installing_fixed_version_cookbook(cookbook_spec)
|
38
|
+
verb = cookbook_spec.installed? ? "Using " : "Installing"
|
39
|
+
fixed_version_install_table.print_row(verb, cookbook_spec.name, cookbook_spec.version_constraint.to_s, "from #{cookbook_spec.source_type}")
|
40
|
+
end
|
41
|
+
|
42
|
+
def installing_cookbook(cookbook_spec)
|
43
|
+
verb = cookbook_spec.installed? ? "Using " : "Installing"
|
44
|
+
install_table.print_row(verb, cookbook_spec.name, cookbook_spec.version_constraint.version)
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def fixed_version_install_table
|
50
|
+
@fixed_version_install_table ||= TablePrinter.new(ui) do |t|
|
51
|
+
t.column(%w{Using Installing})
|
52
|
+
t.column(policyfile_compiler.fixed_version_cookbooks_specs.keys)
|
53
|
+
t.column
|
54
|
+
t.column
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def install_table
|
59
|
+
@install_table ||= TablePrinter.new(ui) do |t|
|
60
|
+
t.column(%w{Using Installing})
|
61
|
+
t.column(policyfile_compiler.graph_solution.keys)
|
62
|
+
t.column(policyfile_compiler.graph_solution.values)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -1,57 +1,57 @@
|
|
1
|
-
#
|
2
|
-
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
3
|
-
# License:: Apache License, Version 2.0
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
#
|
17
|
-
|
18
|
-
module ChefDK
|
19
|
-
module Policyfile
|
20
|
-
module Reports
|
21
|
-
|
22
|
-
# Defines a table with a flexible number of columns and prints rows in
|
23
|
-
# the table. Columns are defined ahead of time, by calling the #column
|
24
|
-
# method, individual rows are printed by calling #print_row with the data
|
25
|
-
# for each cell.
|
26
|
-
class TablePrinter
|
27
|
-
|
28
|
-
attr_reader :ui
|
29
|
-
|
30
|
-
def initialize(ui)
|
31
|
-
@ui = ui
|
32
|
-
@column_widths = []
|
33
|
-
|
34
|
-
yield self
|
35
|
-
end
|
36
|
-
|
37
|
-
# Defines a column. If a collection is given, it is mapped to an array
|
38
|
-
# of strings and the longest string is used as the left justify width
|
39
|
-
# for that column when rows are printed.
|
40
|
-
def column(collection = [])
|
41
|
-
@column_widths << (collection.map(&:to_s).map(&:size).max || 0)
|
42
|
-
end
|
43
|
-
|
44
|
-
# Print a row.
|
45
|
-
def print_row(*cells)
|
46
|
-
row = ""
|
47
|
-
cells.each_with_index do |cell_data, i|
|
48
|
-
row << cell_data.to_s.ljust(@column_widths[i])
|
49
|
-
row << " "
|
50
|
-
end
|
51
|
-
ui.msg(row.strip)
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
module ChefDK
|
19
|
+
module Policyfile
|
20
|
+
module Reports
|
21
|
+
|
22
|
+
# Defines a table with a flexible number of columns and prints rows in
|
23
|
+
# the table. Columns are defined ahead of time, by calling the #column
|
24
|
+
# method, individual rows are printed by calling #print_row with the data
|
25
|
+
# for each cell.
|
26
|
+
class TablePrinter
|
27
|
+
|
28
|
+
attr_reader :ui
|
29
|
+
|
30
|
+
def initialize(ui)
|
31
|
+
@ui = ui
|
32
|
+
@column_widths = []
|
33
|
+
|
34
|
+
yield self
|
35
|
+
end
|
36
|
+
|
37
|
+
# Defines a column. If a collection is given, it is mapped to an array
|
38
|
+
# of strings and the longest string is used as the left justify width
|
39
|
+
# for that column when rows are printed.
|
40
|
+
def column(collection = [])
|
41
|
+
@column_widths << (collection.map(&:to_s).map(&:size).max || 0)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Print a row.
|
45
|
+
def print_row(*cells)
|
46
|
+
row = ""
|
47
|
+
cells.each_with_index do |cell_data, i|
|
48
|
+
row << cell_data.to_s.ljust(@column_widths[i])
|
49
|
+
row << " "
|
50
|
+
end
|
51
|
+
ui.msg(row.strip)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -1,70 +1,70 @@
|
|
1
|
-
#
|
2
|
-
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
3
|
-
# License:: Apache License, Version 2.0
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
#
|
17
|
-
|
18
|
-
require "chef-dk/policyfile/reports/table_printer"
|
19
|
-
|
20
|
-
module ChefDK
|
21
|
-
module Policyfile
|
22
|
-
module Reports
|
23
|
-
class Upload
|
24
|
-
|
25
|
-
attr_reader :reused_cbs
|
26
|
-
attr_reader :uploaded_cbs
|
27
|
-
attr_reader :ui
|
28
|
-
|
29
|
-
def initialize(reused_cbs: [], uploaded_cbs: [], ui: nil)
|
30
|
-
@reused_cbs = reused_cbs
|
31
|
-
@uploaded_cbs = uploaded_cbs
|
32
|
-
@ui = ui
|
33
|
-
|
34
|
-
@justify_name_width = nil
|
35
|
-
@justify_version_width = nil
|
36
|
-
end
|
37
|
-
|
38
|
-
def show
|
39
|
-
reused_cbs.each do |cb_with_lock|
|
40
|
-
lock = cb_with_lock.lock
|
41
|
-
table.print_row("Using", lock.name, lock.version, "(#{lock.identifier[0, 8]})")
|
42
|
-
end
|
43
|
-
|
44
|
-
uploaded_cbs.each do |cb_with_lock|
|
45
|
-
lock = cb_with_lock.lock
|
46
|
-
table.print_row("Uploaded", lock.name, lock.version, "(#{lock.identifier[0, 8]})")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def table
|
51
|
-
@table ||= TablePrinter.new(ui) do |t|
|
52
|
-
t.column(%w{ Using Uploaded })
|
53
|
-
t.column(cookbook_names)
|
54
|
-
t.column(cookbook_version_numbers)
|
55
|
-
t.column
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def cookbook_names
|
60
|
-
(reused_cbs + uploaded_cbs).map { |e| e.lock.name }
|
61
|
-
end
|
62
|
-
|
63
|
-
def cookbook_version_numbers
|
64
|
-
(reused_cbs + uploaded_cbs).map { |e| e.lock.version }
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require "chef-dk/policyfile/reports/table_printer"
|
19
|
+
|
20
|
+
module ChefDK
|
21
|
+
module Policyfile
|
22
|
+
module Reports
|
23
|
+
class Upload
|
24
|
+
|
25
|
+
attr_reader :reused_cbs
|
26
|
+
attr_reader :uploaded_cbs
|
27
|
+
attr_reader :ui
|
28
|
+
|
29
|
+
def initialize(reused_cbs: [], uploaded_cbs: [], ui: nil)
|
30
|
+
@reused_cbs = reused_cbs
|
31
|
+
@uploaded_cbs = uploaded_cbs
|
32
|
+
@ui = ui
|
33
|
+
|
34
|
+
@justify_name_width = nil
|
35
|
+
@justify_version_width = nil
|
36
|
+
end
|
37
|
+
|
38
|
+
def show
|
39
|
+
reused_cbs.each do |cb_with_lock|
|
40
|
+
lock = cb_with_lock.lock
|
41
|
+
table.print_row("Using", lock.name, lock.version, "(#{lock.identifier[0, 8]})")
|
42
|
+
end
|
43
|
+
|
44
|
+
uploaded_cbs.each do |cb_with_lock|
|
45
|
+
lock = cb_with_lock.lock
|
46
|
+
table.print_row("Uploaded", lock.name, lock.version, "(#{lock.identifier[0, 8]})")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def table
|
51
|
+
@table ||= TablePrinter.new(ui) do |t|
|
52
|
+
t.column(%w{ Using Uploaded })
|
53
|
+
t.column(cookbook_names)
|
54
|
+
t.column(cookbook_version_numbers)
|
55
|
+
t.column
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def cookbook_names
|
60
|
+
(reused_cbs + uploaded_cbs).map { |e| e.lock.name }
|
61
|
+
end
|
62
|
+
|
63
|
+
def cookbook_version_numbers
|
64
|
+
(reused_cbs + uploaded_cbs).map { |e| e.lock.version }
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -1,311 +1,311 @@
|
|
1
|
-
#
|
2
|
-
# Copyright:: Copyright (c) 2014-2018, Chef Software Inc.
|
3
|
-
# License:: Apache License, Version 2.0
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
#
|
17
|
-
|
18
|
-
require "semverse"
|
19
|
-
require "set"
|
20
|
-
require "chef-dk/exceptions"
|
21
|
-
|
22
|
-
module ChefDK
|
23
|
-
module Policyfile
|
24
|
-
|
25
|
-
class SolutionDependencies
|
26
|
-
|
27
|
-
Cookbook = Struct.new(:name, :version)
|
28
|
-
|
29
|
-
class Cookbook
|
30
|
-
|
31
|
-
VALID_STRING_FORMAT = /\A[^\s]+ \([^\s]+\)\Z/
|
32
|
-
|
33
|
-
def self.valid_str?(str)
|
34
|
-
!!(str =~ VALID_STRING_FORMAT)
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.parse(str)
|
38
|
-
name, version_w_parens = str.split(" ")
|
39
|
-
version = version_w_parens[/\(([^)]+)\)/, 1]
|
40
|
-
new(name, version)
|
41
|
-
end
|
42
|
-
|
43
|
-
def to_s
|
44
|
-
"#{name} (#{version})"
|
45
|
-
end
|
46
|
-
|
47
|
-
def eql?(other)
|
48
|
-
other.kind_of?(self.class) &&
|
49
|
-
other.name == name &&
|
50
|
-
other.version == version
|
51
|
-
end
|
52
|
-
|
53
|
-
def hash
|
54
|
-
[name, version].hash
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.from_lock(lock_data)
|
60
|
-
new.tap { |e| e.consume_lock_data(lock_data) }
|
61
|
-
end
|
62
|
-
|
63
|
-
attr_reader :policyfile_dependencies
|
64
|
-
|
65
|
-
attr_reader :cookbook_dependencies
|
66
|
-
|
67
|
-
def initialize
|
68
|
-
@policyfile_dependencies = []
|
69
|
-
@cookbook_dependencies = {}
|
70
|
-
end
|
71
|
-
|
72
|
-
def add_policyfile_dep(cookbook, constraint)
|
73
|
-
@policyfile_dependencies << [ cookbook, Semverse::Constraint.new(constraint) ]
|
74
|
-
end
|
75
|
-
|
76
|
-
def add_cookbook_dep(cookbook_name, version, dependency_list)
|
77
|
-
cookbook = Cookbook.new(cookbook_name, version)
|
78
|
-
add_cookbook_obj_dep(cookbook, dependency_list)
|
79
|
-
end
|
80
|
-
|
81
|
-
def update_cookbook_dep(cookbook_name, new_version, new_dependency_list)
|
82
|
-
@cookbook_dependencies.delete_if { |cb, _deps| cb.name == cookbook_name }
|
83
|
-
add_cookbook_dep(cookbook_name, new_version, new_dependency_list)
|
84
|
-
end
|
85
|
-
|
86
|
-
def consume_lock_data(lock_data)
|
87
|
-
unless lock_data.key?("Policyfile") && lock_data.key?("dependencies")
|
88
|
-
msg = %Q|lockfile solution_dependencies must be a Hash of the form `{"Policyfile": [], "dependencies": {} }' (got: #{lock_data.inspect})|
|
89
|
-
raise InvalidLockfile, msg
|
90
|
-
end
|
91
|
-
|
92
|
-
set_policyfile_deps_from_lock_data(lock_data)
|
93
|
-
set_cookbook_deps_from_lock_data(lock_data)
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_conflict!(cookbook_name, version)
|
97
|
-
unless have_cookbook_dep?(cookbook_name, version)
|
98
|
-
raise CookbookNotInWorkingSet, "Cookbook #{cookbook_name} (#{version}) not in the working set, cannot test for conflicts"
|
99
|
-
end
|
100
|
-
|
101
|
-
assert_cookbook_version_valid!(cookbook_name, version)
|
102
|
-
assert_cookbook_deps_valid!(cookbook_name, version)
|
103
|
-
end
|
104
|
-
|
105
|
-
def to_lock
|
106
|
-
{ "Policyfile" => policyfile_dependencies_for_lock, "dependencies" => cookbook_deps_for_lock }
|
107
|
-
end
|
108
|
-
|
109
|
-
def policyfile_dependencies_for_lock
|
110
|
-
policyfile_dependencies.map do |name, constraint|
|
111
|
-
[ name, constraint.to_s ]
|
112
|
-
end.sort
|
113
|
-
end
|
114
|
-
|
115
|
-
def cookbook_deps_for_lock
|
116
|
-
cookbook_dependencies.inject({}) do |map, (cookbook, deps)|
|
117
|
-
map[cookbook.to_s] = deps.map do |name, constraint|
|
118
|
-
[ name, constraint.to_s ]
|
119
|
-
end
|
120
|
-
map
|
121
|
-
end.sort.to_h
|
122
|
-
end
|
123
|
-
|
124
|
-
def transitive_deps(names)
|
125
|
-
deps = Set.new
|
126
|
-
to_explore = names.dup
|
127
|
-
until to_explore.empty?
|
128
|
-
ck_name = to_explore.shift
|
129
|
-
next unless deps.add?(ck_name) # explore each ck only once
|
130
|
-
my_deps = find_cookbook_dep_by_name(ck_name)
|
131
|
-
dep_names = my_deps[1].map(&:first)
|
132
|
-
to_explore += dep_names
|
133
|
-
end
|
134
|
-
deps.to_a.sort
|
135
|
-
end
|
136
|
-
|
137
|
-
private
|
138
|
-
|
139
|
-
def add_cookbook_obj_dep(cookbook, dependency_map)
|
140
|
-
@cookbook_dependencies[cookbook] = dependency_map.map do |dep_name, constraint|
|
141
|
-
[ dep_name, Semverse::Constraint.new(constraint) ]
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
def assert_cookbook_version_valid!(cookbook_name, version)
|
146
|
-
policyfile_conflicts = policyfile_conflicts_with(cookbook_name, version)
|
147
|
-
cookbook_conflicts = cookbook_conflicts_with(cookbook_name, version)
|
148
|
-
all_conflicts = policyfile_conflicts + cookbook_conflicts
|
149
|
-
|
150
|
-
return false if all_conflicts.empty?
|
151
|
-
|
152
|
-
details = all_conflicts.map { |source, name, constraint| "#{source} depends on #{name} #{constraint}" }
|
153
|
-
message = "Cookbook #{cookbook_name} (#{version}) conflicts with other dependencies:\n"
|
154
|
-
full_message = message + details.join("\n")
|
155
|
-
raise DependencyConflict, full_message
|
156
|
-
end
|
157
|
-
|
158
|
-
def assert_cookbook_deps_valid!(cookbook_name, version)
|
159
|
-
dependency_conflicts = cookbook_deps_conflicts_for(cookbook_name, version)
|
160
|
-
return false if dependency_conflicts.empty?
|
161
|
-
message = "Cookbook #{cookbook_name} (#{version}) has dependency constraints that cannot be met by the existing cookbook set:\n"
|
162
|
-
full_message = message + dependency_conflicts.join("\n")
|
163
|
-
raise DependencyConflict, full_message
|
164
|
-
end
|
165
|
-
|
166
|
-
def policyfile_conflicts_with(cookbook_name, version)
|
167
|
-
policyfile_conflicts = []
|
168
|
-
|
169
|
-
@policyfile_dependencies.each do |dep_name, constraint|
|
170
|
-
if dep_name == cookbook_name && !constraint.satisfies?(version)
|
171
|
-
policyfile_conflicts << ["Policyfile", dep_name, constraint]
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
policyfile_conflicts
|
176
|
-
end
|
177
|
-
|
178
|
-
def cookbook_conflicts_with(cookbook_name, version)
|
179
|
-
cookbook_conflicts = []
|
180
|
-
|
181
|
-
@cookbook_dependencies.each do |top_level_dep_name, dependencies|
|
182
|
-
dependencies.each do |dep_name, constraint|
|
183
|
-
if dep_name == cookbook_name && !constraint.satisfies?(version)
|
184
|
-
cookbook_conflicts << [top_level_dep_name, dep_name, constraint]
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
cookbook_conflicts
|
190
|
-
end
|
191
|
-
|
192
|
-
def cookbook_deps_conflicts_for(cookbook_name, version)
|
193
|
-
conflicts = []
|
194
|
-
transitive_deps = find_cookbook_dep_by_name_and_version(cookbook_name, version)
|
195
|
-
transitive_deps.each do |name, constraint|
|
196
|
-
existing_cookbook = find_cookbook_dep_by_name(name)
|
197
|
-
if existing_cookbook.nil?
|
198
|
-
conflicts << "Cookbook #{name} isn't included in the existing cookbook set."
|
199
|
-
elsif !constraint.satisfies?(existing_cookbook[0].version)
|
200
|
-
conflicts << "Dependency on #{name} #{constraint} conflicts with existing version #{existing_cookbook[0]}"
|
201
|
-
end
|
202
|
-
end
|
203
|
-
conflicts
|
204
|
-
end
|
205
|
-
|
206
|
-
def have_cookbook_dep?(name, version)
|
207
|
-
@cookbook_dependencies.key?(Cookbook.new(name, version))
|
208
|
-
end
|
209
|
-
|
210
|
-
def find_cookbook_dep_by_name(name)
|
211
|
-
@cookbook_dependencies.find { |k, v| k.name == name }
|
212
|
-
end
|
213
|
-
|
214
|
-
def find_cookbook_dep_by_name_and_version(name, version)
|
215
|
-
@cookbook_dependencies[Cookbook.new(name, version)]
|
216
|
-
end
|
217
|
-
|
218
|
-
def set_policyfile_deps_from_lock_data(lock_data)
|
219
|
-
policyfile_deps_data = lock_data["Policyfile"]
|
220
|
-
|
221
|
-
unless policyfile_deps_data.kind_of?(Array)
|
222
|
-
msg = "lockfile solution_dependencies Policyfile dependencies must be an array of cookbooks and constraints (got: #{policyfile_deps_data.inspect})"
|
223
|
-
raise InvalidLockfile, msg
|
224
|
-
end
|
225
|
-
|
226
|
-
policyfile_deps_data.each do |entry|
|
227
|
-
add_policyfile_dep_from_lock_data(entry)
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
def add_policyfile_dep_from_lock_data(entry)
|
232
|
-
unless entry.kind_of?(Array) && entry.size == 2
|
233
|
-
msg = %Q{lockfile solution_dependencies Policyfile dependencies entry must be like [ "$COOKBOOK_NAME", "$CONSTRAINT" ] (got: #{entry.inspect})}
|
234
|
-
raise InvalidLockfile, msg
|
235
|
-
end
|
236
|
-
|
237
|
-
cookbook_name, constraint = entry
|
238
|
-
|
239
|
-
unless cookbook_name.kind_of?(String) && !cookbook_name.empty?
|
240
|
-
msg = "lockfile solution_dependencies Policyfile dependencies entry. Cookbook name portion must be a string (got: #{entry.inspect})"
|
241
|
-
raise InvalidLockfile, msg
|
242
|
-
end
|
243
|
-
|
244
|
-
unless constraint.kind_of?(String) && !constraint.empty?
|
245
|
-
msg = "malformed lockfile solution_dependencies Policyfile dependencies entry. Version constraint portion must be a string (got: #{entry.inspect})"
|
246
|
-
raise InvalidLockfile, msg
|
247
|
-
end
|
248
|
-
add_policyfile_dep(cookbook_name, constraint)
|
249
|
-
rescue Semverse::InvalidConstraintFormat
|
250
|
-
msg = "malformed lockfile solution_dependencies Policyfile dependencies entry. Version constraint portion must be a valid version constraint (got: #{entry.inspect})"
|
251
|
-
raise InvalidLockfile, msg
|
252
|
-
end
|
253
|
-
|
254
|
-
def set_cookbook_deps_from_lock_data(lock_data)
|
255
|
-
cookbook_dependencies_data = lock_data["dependencies"]
|
256
|
-
|
257
|
-
unless cookbook_dependencies_data.kind_of?(Hash)
|
258
|
-
msg = "lockfile solution_dependencies dependencies entry must be a Hash (JSON object) of dependencies (got: #{cookbook_dependencies_data.inspect})"
|
259
|
-
raise InvalidLockfile, msg
|
260
|
-
end
|
261
|
-
|
262
|
-
cookbook_dependencies_data.each do |name_and_version, deps_list|
|
263
|
-
add_cookbook_dep_from_lock_data(name_and_version, deps_list)
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
def add_cookbook_dep_from_lock_data(name_and_version, deps_list)
|
268
|
-
unless name_and_version.kind_of?(String)
|
269
|
-
show = "#{name_and_version.inspect} => #{deps_list.inspect}"
|
270
|
-
msg = %Q{lockfile cookbook_dependencies entries must be of the form "$COOKBOOK_NAME ($VERSION)" => [ $dependency, ...] (got: #{show}) }
|
271
|
-
raise InvalidLockfile, msg
|
272
|
-
end
|
273
|
-
|
274
|
-
unless Cookbook.valid_str?(name_and_version)
|
275
|
-
msg = %Q{lockfile cookbook_dependencies entry keys must be of the form "$COOKBOOK_NAME ($VERSION)" (got: #{name_and_version.inspect}) }
|
276
|
-
raise InvalidLockfile, msg
|
277
|
-
end
|
278
|
-
|
279
|
-
unless deps_list.kind_of?(Array)
|
280
|
-
msg = %Q{lockfile cookbook_dependencies entry values must be an Array like [ [ "$COOKBOOK_NAME", "$CONSTRAINT" ], ... ] (got: #{deps_list.inspect}) }
|
281
|
-
raise InvalidLockfile, msg
|
282
|
-
end
|
283
|
-
|
284
|
-
deps_list.each do |entry|
|
285
|
-
|
286
|
-
unless entry.kind_of?(Array) && entry.size == 2
|
287
|
-
msg = %Q{lockfile solution_dependencies dependencies entry must be like [ "$COOKBOOK_NAME", "$CONSTRAINT" ] (got: #{entry.inspect})}
|
288
|
-
raise InvalidLockfile, msg
|
289
|
-
end
|
290
|
-
|
291
|
-
dep_name, constraint = entry
|
292
|
-
|
293
|
-
unless dep_name.kind_of?(String) && !dep_name.empty?
|
294
|
-
msg = "malformed lockfile solution_dependencies dependencies entry. Cookbook name portion must be a string (got: #{entry.inspect})"
|
295
|
-
raise InvalidLockfile, msg
|
296
|
-
end
|
297
|
-
|
298
|
-
unless constraint.kind_of?(String) && !constraint.empty?
|
299
|
-
msg = "malformed lockfile solution_dependencies dependencies entry. Version constraint portion must be a string (got: #{entry.inspect})"
|
300
|
-
raise InvalidLockfile, msg
|
301
|
-
end
|
302
|
-
end
|
303
|
-
|
304
|
-
cookbook = Cookbook.parse(name_and_version)
|
305
|
-
add_cookbook_obj_dep(cookbook, deps_list)
|
306
|
-
end
|
307
|
-
|
308
|
-
end
|
309
|
-
|
310
|
-
end
|
311
|
-
end
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright (c) 2014-2018, Chef Software Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require "semverse"
|
19
|
+
require "set"
|
20
|
+
require "chef-dk/exceptions"
|
21
|
+
|
22
|
+
module ChefDK
|
23
|
+
module Policyfile
|
24
|
+
|
25
|
+
class SolutionDependencies
|
26
|
+
|
27
|
+
Cookbook = Struct.new(:name, :version)
|
28
|
+
|
29
|
+
class Cookbook
|
30
|
+
|
31
|
+
VALID_STRING_FORMAT = /\A[^\s]+ \([^\s]+\)\Z/
|
32
|
+
|
33
|
+
def self.valid_str?(str)
|
34
|
+
!!(str =~ VALID_STRING_FORMAT)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.parse(str)
|
38
|
+
name, version_w_parens = str.split(" ")
|
39
|
+
version = version_w_parens[/\(([^)]+)\)/, 1]
|
40
|
+
new(name, version)
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
"#{name} (#{version})"
|
45
|
+
end
|
46
|
+
|
47
|
+
def eql?(other)
|
48
|
+
other.kind_of?(self.class) &&
|
49
|
+
other.name == name &&
|
50
|
+
other.version == version
|
51
|
+
end
|
52
|
+
|
53
|
+
def hash
|
54
|
+
[name, version].hash
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.from_lock(lock_data)
|
60
|
+
new.tap { |e| e.consume_lock_data(lock_data) }
|
61
|
+
end
|
62
|
+
|
63
|
+
attr_reader :policyfile_dependencies
|
64
|
+
|
65
|
+
attr_reader :cookbook_dependencies
|
66
|
+
|
67
|
+
def initialize
|
68
|
+
@policyfile_dependencies = []
|
69
|
+
@cookbook_dependencies = {}
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_policyfile_dep(cookbook, constraint)
|
73
|
+
@policyfile_dependencies << [ cookbook, Semverse::Constraint.new(constraint) ]
|
74
|
+
end
|
75
|
+
|
76
|
+
def add_cookbook_dep(cookbook_name, version, dependency_list)
|
77
|
+
cookbook = Cookbook.new(cookbook_name, version)
|
78
|
+
add_cookbook_obj_dep(cookbook, dependency_list)
|
79
|
+
end
|
80
|
+
|
81
|
+
def update_cookbook_dep(cookbook_name, new_version, new_dependency_list)
|
82
|
+
@cookbook_dependencies.delete_if { |cb, _deps| cb.name == cookbook_name }
|
83
|
+
add_cookbook_dep(cookbook_name, new_version, new_dependency_list)
|
84
|
+
end
|
85
|
+
|
86
|
+
def consume_lock_data(lock_data)
|
87
|
+
unless lock_data.key?("Policyfile") && lock_data.key?("dependencies")
|
88
|
+
msg = %Q|lockfile solution_dependencies must be a Hash of the form `{"Policyfile": [], "dependencies": {} }' (got: #{lock_data.inspect})|
|
89
|
+
raise InvalidLockfile, msg
|
90
|
+
end
|
91
|
+
|
92
|
+
set_policyfile_deps_from_lock_data(lock_data)
|
93
|
+
set_cookbook_deps_from_lock_data(lock_data)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_conflict!(cookbook_name, version)
|
97
|
+
unless have_cookbook_dep?(cookbook_name, version)
|
98
|
+
raise CookbookNotInWorkingSet, "Cookbook #{cookbook_name} (#{version}) not in the working set, cannot test for conflicts"
|
99
|
+
end
|
100
|
+
|
101
|
+
assert_cookbook_version_valid!(cookbook_name, version)
|
102
|
+
assert_cookbook_deps_valid!(cookbook_name, version)
|
103
|
+
end
|
104
|
+
|
105
|
+
def to_lock
|
106
|
+
{ "Policyfile" => policyfile_dependencies_for_lock, "dependencies" => cookbook_deps_for_lock }
|
107
|
+
end
|
108
|
+
|
109
|
+
def policyfile_dependencies_for_lock
|
110
|
+
policyfile_dependencies.map do |name, constraint|
|
111
|
+
[ name, constraint.to_s ]
|
112
|
+
end.sort
|
113
|
+
end
|
114
|
+
|
115
|
+
def cookbook_deps_for_lock
|
116
|
+
cookbook_dependencies.inject({}) do |map, (cookbook, deps)|
|
117
|
+
map[cookbook.to_s] = deps.map do |name, constraint|
|
118
|
+
[ name, constraint.to_s ]
|
119
|
+
end
|
120
|
+
map
|
121
|
+
end.sort.to_h
|
122
|
+
end
|
123
|
+
|
124
|
+
def transitive_deps(names)
|
125
|
+
deps = Set.new
|
126
|
+
to_explore = names.dup
|
127
|
+
until to_explore.empty?
|
128
|
+
ck_name = to_explore.shift
|
129
|
+
next unless deps.add?(ck_name) # explore each ck only once
|
130
|
+
my_deps = find_cookbook_dep_by_name(ck_name)
|
131
|
+
dep_names = my_deps[1].map(&:first)
|
132
|
+
to_explore += dep_names
|
133
|
+
end
|
134
|
+
deps.to_a.sort
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
|
139
|
+
def add_cookbook_obj_dep(cookbook, dependency_map)
|
140
|
+
@cookbook_dependencies[cookbook] = dependency_map.map do |dep_name, constraint|
|
141
|
+
[ dep_name, Semverse::Constraint.new(constraint) ]
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def assert_cookbook_version_valid!(cookbook_name, version)
|
146
|
+
policyfile_conflicts = policyfile_conflicts_with(cookbook_name, version)
|
147
|
+
cookbook_conflicts = cookbook_conflicts_with(cookbook_name, version)
|
148
|
+
all_conflicts = policyfile_conflicts + cookbook_conflicts
|
149
|
+
|
150
|
+
return false if all_conflicts.empty?
|
151
|
+
|
152
|
+
details = all_conflicts.map { |source, name, constraint| "#{source} depends on #{name} #{constraint}" }
|
153
|
+
message = "Cookbook #{cookbook_name} (#{version}) conflicts with other dependencies:\n"
|
154
|
+
full_message = message + details.join("\n")
|
155
|
+
raise DependencyConflict, full_message
|
156
|
+
end
|
157
|
+
|
158
|
+
def assert_cookbook_deps_valid!(cookbook_name, version)
|
159
|
+
dependency_conflicts = cookbook_deps_conflicts_for(cookbook_name, version)
|
160
|
+
return false if dependency_conflicts.empty?
|
161
|
+
message = "Cookbook #{cookbook_name} (#{version}) has dependency constraints that cannot be met by the existing cookbook set:\n"
|
162
|
+
full_message = message + dependency_conflicts.join("\n")
|
163
|
+
raise DependencyConflict, full_message
|
164
|
+
end
|
165
|
+
|
166
|
+
def policyfile_conflicts_with(cookbook_name, version)
|
167
|
+
policyfile_conflicts = []
|
168
|
+
|
169
|
+
@policyfile_dependencies.each do |dep_name, constraint|
|
170
|
+
if dep_name == cookbook_name && !constraint.satisfies?(version)
|
171
|
+
policyfile_conflicts << ["Policyfile", dep_name, constraint]
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
policyfile_conflicts
|
176
|
+
end
|
177
|
+
|
178
|
+
def cookbook_conflicts_with(cookbook_name, version)
|
179
|
+
cookbook_conflicts = []
|
180
|
+
|
181
|
+
@cookbook_dependencies.each do |top_level_dep_name, dependencies|
|
182
|
+
dependencies.each do |dep_name, constraint|
|
183
|
+
if dep_name == cookbook_name && !constraint.satisfies?(version)
|
184
|
+
cookbook_conflicts << [top_level_dep_name, dep_name, constraint]
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
cookbook_conflicts
|
190
|
+
end
|
191
|
+
|
192
|
+
def cookbook_deps_conflicts_for(cookbook_name, version)
|
193
|
+
conflicts = []
|
194
|
+
transitive_deps = find_cookbook_dep_by_name_and_version(cookbook_name, version)
|
195
|
+
transitive_deps.each do |name, constraint|
|
196
|
+
existing_cookbook = find_cookbook_dep_by_name(name)
|
197
|
+
if existing_cookbook.nil?
|
198
|
+
conflicts << "Cookbook #{name} isn't included in the existing cookbook set."
|
199
|
+
elsif !constraint.satisfies?(existing_cookbook[0].version)
|
200
|
+
conflicts << "Dependency on #{name} #{constraint} conflicts with existing version #{existing_cookbook[0]}"
|
201
|
+
end
|
202
|
+
end
|
203
|
+
conflicts
|
204
|
+
end
|
205
|
+
|
206
|
+
def have_cookbook_dep?(name, version)
|
207
|
+
@cookbook_dependencies.key?(Cookbook.new(name, version))
|
208
|
+
end
|
209
|
+
|
210
|
+
def find_cookbook_dep_by_name(name)
|
211
|
+
@cookbook_dependencies.find { |k, v| k.name == name }
|
212
|
+
end
|
213
|
+
|
214
|
+
def find_cookbook_dep_by_name_and_version(name, version)
|
215
|
+
@cookbook_dependencies[Cookbook.new(name, version)]
|
216
|
+
end
|
217
|
+
|
218
|
+
def set_policyfile_deps_from_lock_data(lock_data)
|
219
|
+
policyfile_deps_data = lock_data["Policyfile"]
|
220
|
+
|
221
|
+
unless policyfile_deps_data.kind_of?(Array)
|
222
|
+
msg = "lockfile solution_dependencies Policyfile dependencies must be an array of cookbooks and constraints (got: #{policyfile_deps_data.inspect})"
|
223
|
+
raise InvalidLockfile, msg
|
224
|
+
end
|
225
|
+
|
226
|
+
policyfile_deps_data.each do |entry|
|
227
|
+
add_policyfile_dep_from_lock_data(entry)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
def add_policyfile_dep_from_lock_data(entry)
|
232
|
+
unless entry.kind_of?(Array) && entry.size == 2
|
233
|
+
msg = %Q{lockfile solution_dependencies Policyfile dependencies entry must be like [ "$COOKBOOK_NAME", "$CONSTRAINT" ] (got: #{entry.inspect})}
|
234
|
+
raise InvalidLockfile, msg
|
235
|
+
end
|
236
|
+
|
237
|
+
cookbook_name, constraint = entry
|
238
|
+
|
239
|
+
unless cookbook_name.kind_of?(String) && !cookbook_name.empty?
|
240
|
+
msg = "lockfile solution_dependencies Policyfile dependencies entry. Cookbook name portion must be a string (got: #{entry.inspect})"
|
241
|
+
raise InvalidLockfile, msg
|
242
|
+
end
|
243
|
+
|
244
|
+
unless constraint.kind_of?(String) && !constraint.empty?
|
245
|
+
msg = "malformed lockfile solution_dependencies Policyfile dependencies entry. Version constraint portion must be a string (got: #{entry.inspect})"
|
246
|
+
raise InvalidLockfile, msg
|
247
|
+
end
|
248
|
+
add_policyfile_dep(cookbook_name, constraint)
|
249
|
+
rescue Semverse::InvalidConstraintFormat
|
250
|
+
msg = "malformed lockfile solution_dependencies Policyfile dependencies entry. Version constraint portion must be a valid version constraint (got: #{entry.inspect})"
|
251
|
+
raise InvalidLockfile, msg
|
252
|
+
end
|
253
|
+
|
254
|
+
def set_cookbook_deps_from_lock_data(lock_data)
|
255
|
+
cookbook_dependencies_data = lock_data["dependencies"]
|
256
|
+
|
257
|
+
unless cookbook_dependencies_data.kind_of?(Hash)
|
258
|
+
msg = "lockfile solution_dependencies dependencies entry must be a Hash (JSON object) of dependencies (got: #{cookbook_dependencies_data.inspect})"
|
259
|
+
raise InvalidLockfile, msg
|
260
|
+
end
|
261
|
+
|
262
|
+
cookbook_dependencies_data.each do |name_and_version, deps_list|
|
263
|
+
add_cookbook_dep_from_lock_data(name_and_version, deps_list)
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
def add_cookbook_dep_from_lock_data(name_and_version, deps_list)
|
268
|
+
unless name_and_version.kind_of?(String)
|
269
|
+
show = "#{name_and_version.inspect} => #{deps_list.inspect}"
|
270
|
+
msg = %Q{lockfile cookbook_dependencies entries must be of the form "$COOKBOOK_NAME ($VERSION)" => [ $dependency, ...] (got: #{show}) }
|
271
|
+
raise InvalidLockfile, msg
|
272
|
+
end
|
273
|
+
|
274
|
+
unless Cookbook.valid_str?(name_and_version)
|
275
|
+
msg = %Q{lockfile cookbook_dependencies entry keys must be of the form "$COOKBOOK_NAME ($VERSION)" (got: #{name_and_version.inspect}) }
|
276
|
+
raise InvalidLockfile, msg
|
277
|
+
end
|
278
|
+
|
279
|
+
unless deps_list.kind_of?(Array)
|
280
|
+
msg = %Q{lockfile cookbook_dependencies entry values must be an Array like [ [ "$COOKBOOK_NAME", "$CONSTRAINT" ], ... ] (got: #{deps_list.inspect}) }
|
281
|
+
raise InvalidLockfile, msg
|
282
|
+
end
|
283
|
+
|
284
|
+
deps_list.each do |entry|
|
285
|
+
|
286
|
+
unless entry.kind_of?(Array) && entry.size == 2
|
287
|
+
msg = %Q{lockfile solution_dependencies dependencies entry must be like [ "$COOKBOOK_NAME", "$CONSTRAINT" ] (got: #{entry.inspect})}
|
288
|
+
raise InvalidLockfile, msg
|
289
|
+
end
|
290
|
+
|
291
|
+
dep_name, constraint = entry
|
292
|
+
|
293
|
+
unless dep_name.kind_of?(String) && !dep_name.empty?
|
294
|
+
msg = "malformed lockfile solution_dependencies dependencies entry. Cookbook name portion must be a string (got: #{entry.inspect})"
|
295
|
+
raise InvalidLockfile, msg
|
296
|
+
end
|
297
|
+
|
298
|
+
unless constraint.kind_of?(String) && !constraint.empty?
|
299
|
+
msg = "malformed lockfile solution_dependencies dependencies entry. Version constraint portion must be a string (got: #{entry.inspect})"
|
300
|
+
raise InvalidLockfile, msg
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
cookbook = Cookbook.parse(name_and_version)
|
305
|
+
add_cookbook_obj_dep(cookbook, deps_list)
|
306
|
+
end
|
307
|
+
|
308
|
+
end
|
309
|
+
|
310
|
+
end
|
311
|
+
end
|