chef-dk 2.6.2 → 3.0.36
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 +126 -121
- data/Gemfile.lock +812 -807
- 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 -126
- 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 -151
- 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 -150
- data/lib/chef-dk/generator.rb +165 -165
- data/lib/chef-dk/helpers.rb +176 -176
- data/lib/chef-dk/pager.rb +104 -105
- 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 -164
- 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 -0
- 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 -123
- 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 -122
- 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 -312
- data/lib/chef-dk/policyfile/source_uri.rb +57 -57
- data/lib/chef-dk/policyfile/storage_config.rb +112 -102
- 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 -420
- 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 -200
- 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 -236
- 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 -107
- 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 -54
- 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 -152
- 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 -0
- 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 -756
- 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 -0
- 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 -638
- 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 -478
- data/spec/unit/policyfile_services/install_spec.rb +209 -209
- data/spec/unit/policyfile_services/push_archive_spec.rb +359 -374
- 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 +9 -5
|
@@ -1,209 +1,209 @@
|
|
|
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_services/install"
|
|
20
|
-
|
|
21
|
-
describe ChefDK::PolicyfileServices::Install do
|
|
22
|
-
|
|
23
|
-
include ChefDK::Helpers
|
|
24
|
-
|
|
25
|
-
let(:working_dir) do
|
|
26
|
-
path = File.join(tempdir, "policyfile_services_test_working_dir")
|
|
27
|
-
Dir.mkdir(path)
|
|
28
|
-
path
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
let(:policyfile_rb_explicit_name) { nil }
|
|
32
|
-
|
|
33
|
-
let(:policyfile_rb_name) { policyfile_rb_explicit_name || "Policyfile.rb" }
|
|
34
|
-
|
|
35
|
-
let(:policyfile_lock_name) { "Policyfile.lock.json" }
|
|
36
|
-
|
|
37
|
-
let(:policyfile_rb_path) { File.join(working_dir, policyfile_rb_name) }
|
|
38
|
-
|
|
39
|
-
let(:policyfile_lock_path) { File.join(working_dir, policyfile_lock_name) }
|
|
40
|
-
|
|
41
|
-
let(:local_cookbooks_root) do
|
|
42
|
-
File.join(fixtures_path, "local_path_cookbooks")
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
let(:policyfile_content) do
|
|
46
|
-
<<-E
|
|
47
|
-
name 'install-example'
|
|
48
|
-
|
|
49
|
-
run_list 'local-cookbook'
|
|
50
|
-
|
|
51
|
-
cookbook 'local-cookbook', path: '#{local_cookbooks_root}/local-cookbook'
|
|
52
|
-
E
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
let(:overwrite) { false }
|
|
56
|
-
|
|
57
|
-
let(:ui) { TestHelpers::TestUI.new }
|
|
58
|
-
|
|
59
|
-
let(:install_service) { described_class.new(policyfile: policyfile_rb_name, ui: ui, root_dir: working_dir, overwrite: overwrite) }
|
|
60
|
-
|
|
61
|
-
let(:storage_config) do
|
|
62
|
-
ChefDK::Policyfile::StorageConfig.new( cache_path: nil, relative_paths_root: local_cookbooks_root )
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def result_policyfile_lock
|
|
66
|
-
expect(File).to exist(policyfile_lock_path)
|
|
67
|
-
content = IO.read(policyfile_lock_path)
|
|
68
|
-
lock_data = FFI_Yajl::Parser.parse(content)
|
|
69
|
-
ChefDK::PolicyfileLock.new(storage_config).build_from_lock_data(lock_data)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
context "when no Policyfile is present or specified" do
|
|
73
|
-
|
|
74
|
-
it "errors out" do
|
|
75
|
-
expect { install_service.run }.to raise_error(ChefDK::PolicyfileNotFound, "Policyfile not found at path #{policyfile_rb_path}")
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
context "when a Policyfile exists" do
|
|
81
|
-
|
|
82
|
-
before do
|
|
83
|
-
with_file(policyfile_rb_path) { |f| f.print(policyfile_content) }
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
it "infers that the Policyfile.rb is located at $CWD/Policyfile.rb" do
|
|
87
|
-
expect(install_service.policyfile_expanded_path).to eq(policyfile_rb_path)
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
it "reads the policyfile from disk" do
|
|
91
|
-
expect(install_service.policyfile_content).to eq(policyfile_content)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
context "and the policyfile has an error" do
|
|
95
|
-
|
|
96
|
-
let(:policyfile_content) { 'raise "borkbork"' }
|
|
97
|
-
|
|
98
|
-
it "errors out and creates no lockfile" do
|
|
99
|
-
expect { install_service.run }.to raise_error(ChefDK::PolicyfileInstallError)
|
|
100
|
-
expect(File).to_not exist(policyfile_lock_path)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
context "and no lockfile exists" do
|
|
106
|
-
|
|
107
|
-
it "solves the Policyfile demands, installs cookbooks, emits a lockfile" do
|
|
108
|
-
install_service.run
|
|
109
|
-
generated_lock = result_policyfile_lock
|
|
110
|
-
expect(generated_lock.name).to eq("install-example")
|
|
111
|
-
expect(generated_lock.cookbook_locks).to have_key("local-cookbook")
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
it "prints the policy name" do
|
|
115
|
-
install_service.run
|
|
116
|
-
expect(ui.output).to include("Building policy install-example")
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
it "prints the expanded run list" do
|
|
120
|
-
install_service.run
|
|
121
|
-
expect(ui.output).to include("Expanded run list: recipe[local-cookbook]")
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it "prints the lockfile path" do
|
|
125
|
-
install_service.run
|
|
126
|
-
expect(ui.output).to include("Lockfile written to #{working_dir}/Policyfile.lock.json")
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
it "prints the lockfile's revision id" do
|
|
130
|
-
install_service.run
|
|
131
|
-
expect(ui.output).to include("Policy revision id: 7da81d2c7bb97f904637f97e7f8b487fa4bb1ed682edea7087743dec84c254ec")
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
context "and a lockfile exists and `overwrite` is specified" do
|
|
137
|
-
|
|
138
|
-
let(:overwrite) { true }
|
|
139
|
-
|
|
140
|
-
before do
|
|
141
|
-
File.binwrite(policyfile_lock_path, "This is the old lockfile content")
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
it "solves the Policyfile demands, installs cookbooks, emits a lockfile" do
|
|
145
|
-
install_service.run
|
|
146
|
-
generated_lock = result_policyfile_lock
|
|
147
|
-
expect(generated_lock.name).to eq("install-example")
|
|
148
|
-
expect(generated_lock.cookbook_locks).to have_key("local-cookbook")
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
context "and a lockfile exists" do
|
|
154
|
-
|
|
155
|
-
before do
|
|
156
|
-
install_service.dup.run
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
it "reads the policyfile lock from disk" do
|
|
160
|
-
lock = install_service.policyfile_lock
|
|
161
|
-
expect(lock).to be_an_instance_of(ChefDK::PolicyfileLock)
|
|
162
|
-
expect(lock.name).to eq("install-example")
|
|
163
|
-
expect(lock.cookbook_locks).to have_key("local-cookbook")
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
it "ensures that cookbooks are installed" do
|
|
167
|
-
expect(install_service.policyfile_lock).to receive(:install_cookbooks).and_call_original
|
|
168
|
-
install_service.run
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
describe "when an error occurs during the install" do
|
|
172
|
-
|
|
173
|
-
before do
|
|
174
|
-
expect(install_service.policyfile_lock).to receive(:install_cookbooks).and_raise("some error")
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
it "raises a PolicyfileInstallError" do
|
|
178
|
-
expect { install_service.run }.to raise_error(ChefDK::PolicyfileInstallError)
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
context "and the Policyfile has updated dependendencies" do
|
|
184
|
-
|
|
185
|
-
# For very first iteration, we won't tackle this case if it's hard
|
|
186
|
-
it "Conservatively updates deps, recomputes lock, and installs"
|
|
187
|
-
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
context "and an explicit Policyfile name is given" do
|
|
193
|
-
|
|
194
|
-
let(:policyfile_rb_explicit_name) { "MyPolicy.rb" }
|
|
195
|
-
|
|
196
|
-
let(:policyfile_lock_name) { "MyPolicy.lock.json" }
|
|
197
|
-
|
|
198
|
-
it "infers that the Policyfile.rb is located at $CWD/$POLICYFILE_NAME" do
|
|
199
|
-
expect(install_service.policyfile_expanded_path).to eq(policyfile_rb_path)
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
it "reads the policyfile from disk" do
|
|
203
|
-
expect(install_service.policyfile_content).to eq(policyfile_content)
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
end
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
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 "spec_helper"
|
|
19
|
+
require "chef-dk/policyfile_services/install"
|
|
20
|
+
|
|
21
|
+
describe ChefDK::PolicyfileServices::Install do
|
|
22
|
+
|
|
23
|
+
include ChefDK::Helpers
|
|
24
|
+
|
|
25
|
+
let(:working_dir) do
|
|
26
|
+
path = File.join(tempdir, "policyfile_services_test_working_dir")
|
|
27
|
+
Dir.mkdir(path)
|
|
28
|
+
path
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
let(:policyfile_rb_explicit_name) { nil }
|
|
32
|
+
|
|
33
|
+
let(:policyfile_rb_name) { policyfile_rb_explicit_name || "Policyfile.rb" }
|
|
34
|
+
|
|
35
|
+
let(:policyfile_lock_name) { "Policyfile.lock.json" }
|
|
36
|
+
|
|
37
|
+
let(:policyfile_rb_path) { File.join(working_dir, policyfile_rb_name) }
|
|
38
|
+
|
|
39
|
+
let(:policyfile_lock_path) { File.join(working_dir, policyfile_lock_name) }
|
|
40
|
+
|
|
41
|
+
let(:local_cookbooks_root) do
|
|
42
|
+
File.join(fixtures_path, "local_path_cookbooks")
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
let(:policyfile_content) do
|
|
46
|
+
<<-E
|
|
47
|
+
name 'install-example'
|
|
48
|
+
|
|
49
|
+
run_list 'local-cookbook'
|
|
50
|
+
|
|
51
|
+
cookbook 'local-cookbook', path: '#{local_cookbooks_root}/local-cookbook'
|
|
52
|
+
E
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
let(:overwrite) { false }
|
|
56
|
+
|
|
57
|
+
let(:ui) { TestHelpers::TestUI.new }
|
|
58
|
+
|
|
59
|
+
let(:install_service) { described_class.new(policyfile: policyfile_rb_name, ui: ui, root_dir: working_dir, overwrite: overwrite) }
|
|
60
|
+
|
|
61
|
+
let(:storage_config) do
|
|
62
|
+
ChefDK::Policyfile::StorageConfig.new( cache_path: nil, relative_paths_root: local_cookbooks_root )
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def result_policyfile_lock
|
|
66
|
+
expect(File).to exist(policyfile_lock_path)
|
|
67
|
+
content = IO.read(policyfile_lock_path)
|
|
68
|
+
lock_data = FFI_Yajl::Parser.parse(content)
|
|
69
|
+
ChefDK::PolicyfileLock.new(storage_config).build_from_lock_data(lock_data)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context "when no Policyfile is present or specified" do
|
|
73
|
+
|
|
74
|
+
it "errors out" do
|
|
75
|
+
expect { install_service.run }.to raise_error(ChefDK::PolicyfileNotFound, "Policyfile not found at path #{policyfile_rb_path}")
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "when a Policyfile exists" do
|
|
81
|
+
|
|
82
|
+
before do
|
|
83
|
+
with_file(policyfile_rb_path) { |f| f.print(policyfile_content) }
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "infers that the Policyfile.rb is located at $CWD/Policyfile.rb" do
|
|
87
|
+
expect(install_service.policyfile_expanded_path).to eq(policyfile_rb_path)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "reads the policyfile from disk" do
|
|
91
|
+
expect(install_service.policyfile_content).to eq(policyfile_content)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
context "and the policyfile has an error" do
|
|
95
|
+
|
|
96
|
+
let(:policyfile_content) { 'raise "borkbork"' }
|
|
97
|
+
|
|
98
|
+
it "errors out and creates no lockfile" do
|
|
99
|
+
expect { install_service.run }.to raise_error(ChefDK::PolicyfileInstallError)
|
|
100
|
+
expect(File).to_not exist(policyfile_lock_path)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
context "and no lockfile exists" do
|
|
106
|
+
|
|
107
|
+
it "solves the Policyfile demands, installs cookbooks, emits a lockfile" do
|
|
108
|
+
install_service.run
|
|
109
|
+
generated_lock = result_policyfile_lock
|
|
110
|
+
expect(generated_lock.name).to eq("install-example")
|
|
111
|
+
expect(generated_lock.cookbook_locks).to have_key("local-cookbook")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it "prints the policy name" do
|
|
115
|
+
install_service.run
|
|
116
|
+
expect(ui.output).to include("Building policy install-example")
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "prints the expanded run list" do
|
|
120
|
+
install_service.run
|
|
121
|
+
expect(ui.output).to include("Expanded run list: recipe[local-cookbook]")
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "prints the lockfile path" do
|
|
125
|
+
install_service.run
|
|
126
|
+
expect(ui.output).to include("Lockfile written to #{working_dir}/Policyfile.lock.json")
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "prints the lockfile's revision id" do
|
|
130
|
+
install_service.run
|
|
131
|
+
expect(ui.output).to include("Policy revision id: 7da81d2c7bb97f904637f97e7f8b487fa4bb1ed682edea7087743dec84c254ec")
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
context "and a lockfile exists and `overwrite` is specified" do
|
|
137
|
+
|
|
138
|
+
let(:overwrite) { true }
|
|
139
|
+
|
|
140
|
+
before do
|
|
141
|
+
File.binwrite(policyfile_lock_path, "This is the old lockfile content")
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it "solves the Policyfile demands, installs cookbooks, emits a lockfile" do
|
|
145
|
+
install_service.run
|
|
146
|
+
generated_lock = result_policyfile_lock
|
|
147
|
+
expect(generated_lock.name).to eq("install-example")
|
|
148
|
+
expect(generated_lock.cookbook_locks).to have_key("local-cookbook")
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
context "and a lockfile exists" do
|
|
154
|
+
|
|
155
|
+
before do
|
|
156
|
+
install_service.dup.run
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it "reads the policyfile lock from disk" do
|
|
160
|
+
lock = install_service.policyfile_lock
|
|
161
|
+
expect(lock).to be_an_instance_of(ChefDK::PolicyfileLock)
|
|
162
|
+
expect(lock.name).to eq("install-example")
|
|
163
|
+
expect(lock.cookbook_locks).to have_key("local-cookbook")
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it "ensures that cookbooks are installed" do
|
|
167
|
+
expect(install_service.policyfile_lock).to receive(:install_cookbooks).and_call_original
|
|
168
|
+
install_service.run
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
describe "when an error occurs during the install" do
|
|
172
|
+
|
|
173
|
+
before do
|
|
174
|
+
expect(install_service.policyfile_lock).to receive(:install_cookbooks).and_raise("some error")
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "raises a PolicyfileInstallError" do
|
|
178
|
+
expect { install_service.run }.to raise_error(ChefDK::PolicyfileInstallError)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
context "and the Policyfile has updated dependendencies" do
|
|
184
|
+
|
|
185
|
+
# For very first iteration, we won't tackle this case if it's hard
|
|
186
|
+
it "Conservatively updates deps, recomputes lock, and installs"
|
|
187
|
+
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
context "and an explicit Policyfile name is given" do
|
|
193
|
+
|
|
194
|
+
let(:policyfile_rb_explicit_name) { "MyPolicy.rb" }
|
|
195
|
+
|
|
196
|
+
let(:policyfile_lock_name) { "MyPolicy.lock.json" }
|
|
197
|
+
|
|
198
|
+
it "infers that the Policyfile.rb is located at $CWD/$POLICYFILE_NAME" do
|
|
199
|
+
expect(install_service.policyfile_expanded_path).to eq(policyfile_rb_path)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it "reads the policyfile from disk" do
|
|
203
|
+
expect(install_service.policyfile_content).to eq(policyfile_content)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
end
|
|
@@ -1,374 +1,359 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Copyright:: Copyright (c) 2015 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_services/push_archive"
|
|
20
|
-
|
|
21
|
-
describe ChefDK::PolicyfileServices::PushArchive do
|
|
22
|
-
|
|
23
|
-
FileToTar = Struct.new(:name, :content)
|
|
24
|
-
|
|
25
|
-
def create_archive
|
|
26
|
-
Zlib::GzipWriter.open(archive_file_path) do |gz_file|
|
|
27
|
-
Archive::Tar::Minitar::Writer.open(gz_file) do |tar|
|
|
28
|
-
|
|
29
|
-
archive_dirs.each do |dir|
|
|
30
|
-
tar.mkdir(dir, mode: 0755)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
archive_files.each do |file|
|
|
34
|
-
name = file.name
|
|
35
|
-
content = file.content
|
|
36
|
-
size = content.bytesize
|
|
37
|
-
tar.add_file_simple(name, mode: 0644, size: size) { |f| f.write(content) }
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
let(:valid_lockfile) do
|
|
45
|
-
<<-E
|
|
46
|
-
{
|
|
47
|
-
"name": "install-example",
|
|
48
|
-
"run_list": [
|
|
49
|
-
"recipe[local-cookbook::default]"
|
|
50
|
-
],
|
|
51
|
-
"cookbook_locks": {
|
|
52
|
-
"local-cookbook": {
|
|
53
|
-
"version": "2.3.4",
|
|
54
|
-
"identifier": "fab501cfaf747901bd82c1bc706beae7dc3a350c",
|
|
55
|
-
"dotted_decimal_identifier": "70567763561641081.489844270461035.258281553147148",
|
|
56
|
-
"source": "project-cookbooks/local-cookbook",
|
|
57
|
-
"cache_key": null,
|
|
58
|
-
"scm_info": null,
|
|
59
|
-
"source_options": {
|
|
60
|
-
"path": "project-cookbooks/local-cookbook"
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
"default_attributes": {},
|
|
65
|
-
"override_attributes": {},
|
|
66
|
-
"solution_dependencies": {
|
|
67
|
-
"Policyfile": [
|
|
68
|
-
[
|
|
69
|
-
"local-cookbook",
|
|
70
|
-
">= 0.0.0"
|
|
71
|
-
]
|
|
72
|
-
],
|
|
73
|
-
"dependencies": {
|
|
74
|
-
"local-cookbook (2.3.4)": [
|
|
75
|
-
|
|
76
|
-
]
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
E
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
let(:archive_files) { [] }
|
|
84
|
-
|
|
85
|
-
let(:archive_dirs) { [] }
|
|
86
|
-
|
|
87
|
-
let(:working_dir) do
|
|
88
|
-
path = File.join(tempdir, "policyfile_services_test_working_dir")
|
|
89
|
-
Dir.mkdir(path)
|
|
90
|
-
path
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
let(:archive_file_name) { "example-policy-abc123.tgz" }
|
|
94
|
-
|
|
95
|
-
let(:archive_file_path) { File.join(working_dir, archive_file_name) }
|
|
96
|
-
|
|
97
|
-
let(:policy_group) { "dev-cluster-1" }
|
|
98
|
-
|
|
99
|
-
let(:config) do
|
|
100
|
-
double("Chef::Config",
|
|
101
|
-
chef_server_url: "https://localhost:10443",
|
|
102
|
-
client_key: "/path/to/client/key.pem",
|
|
103
|
-
node_name: "deuce",
|
|
104
|
-
policy_document_native_api: true)
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
let(:ui) { TestHelpers::TestUI.new }
|
|
108
|
-
|
|
109
|
-
subject(:push_archive_service) do
|
|
110
|
-
described_class.new(archive_file: archive_file_name,
|
|
111
|
-
policy_group: policy_group,
|
|
112
|
-
root_dir: working_dir,
|
|
113
|
-
ui: ui,
|
|
114
|
-
config: config)
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
it "has an archive file" do
|
|
118
|
-
expect(push_archive_service.archive_file).to eq(archive_file_name)
|
|
119
|
-
expect(push_archive_service.archive_file_path).to eq(archive_file_path)
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
it "configures an HTTP client" do
|
|
123
|
-
expect(Chef::ServerAPI).to receive(:new).with("https://localhost:10443",
|
|
124
|
-
signing_key_filename: "/path/to/client/key.pem",
|
|
125
|
-
client_name: "deuce")
|
|
126
|
-
push_archive_service.http_client
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
context "with an invalid archive" do
|
|
130
|
-
|
|
131
|
-
let(:exception) do
|
|
132
|
-
begin
|
|
133
|
-
push_archive_service.run
|
|
134
|
-
rescue ChefDK::PolicyfilePushArchiveError => e
|
|
135
|
-
e
|
|
136
|
-
else
|
|
137
|
-
nil
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
let(:exception_cause) { exception.cause }
|
|
142
|
-
|
|
143
|
-
context "when the archive is malformed/corrupted/etc" do
|
|
144
|
-
|
|
145
|
-
context "when the archive file doesn't exist" do
|
|
146
|
-
|
|
147
|
-
it "errors out" do
|
|
148
|
-
expect(exception).to_not be_nil
|
|
149
|
-
expect(exception.message).to eq("Failed to publish archived policy")
|
|
150
|
-
expect(exception_cause).to be_a(ChefDK::InvalidPolicyArchive)
|
|
151
|
-
expect(exception_cause.message).to eq("Archive file #{archive_file_path} not found")
|
|
152
|
-
end
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
context "when the archive is
|
|
156
|
-
|
|
157
|
-
before do
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
expect(
|
|
165
|
-
expect(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
expect(exception
|
|
181
|
-
expect(
|
|
182
|
-
expect(exception_cause
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
expect(
|
|
215
|
-
expect(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
let(:archive_files) { [ FileToTar.new("Policyfile.lock.json",
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
expect(exception_cause).to
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
end
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
end
|
|
362
|
-
|
|
363
|
-
describe "when the upload fails" do
|
|
364
|
-
|
|
365
|
-
it "raises a nested error" do
|
|
366
|
-
expect(uploader).to receive(:upload).and_raise("an error")
|
|
367
|
-
expect { push_archive_service.run }.to raise_error(ChefDK::PolicyfilePushArchiveError)
|
|
368
|
-
end
|
|
369
|
-
|
|
370
|
-
end
|
|
371
|
-
|
|
372
|
-
end
|
|
373
|
-
|
|
374
|
-
end
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2015 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_services/push_archive"
|
|
20
|
+
|
|
21
|
+
describe ChefDK::PolicyfileServices::PushArchive do
|
|
22
|
+
|
|
23
|
+
FileToTar = Struct.new(:name, :content)
|
|
24
|
+
|
|
25
|
+
def create_archive
|
|
26
|
+
Zlib::GzipWriter.open(archive_file_path) do |gz_file|
|
|
27
|
+
Archive::Tar::Minitar::Writer.open(gz_file) do |tar|
|
|
28
|
+
|
|
29
|
+
archive_dirs.each do |dir|
|
|
30
|
+
tar.mkdir(dir, mode: 0755)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
archive_files.each do |file|
|
|
34
|
+
name = file.name
|
|
35
|
+
content = file.content
|
|
36
|
+
size = content.bytesize
|
|
37
|
+
tar.add_file_simple(name, mode: 0644, size: size) { |f| f.write(content) }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
let(:valid_lockfile) do
|
|
45
|
+
<<-E
|
|
46
|
+
{
|
|
47
|
+
"name": "install-example",
|
|
48
|
+
"run_list": [
|
|
49
|
+
"recipe[local-cookbook::default]"
|
|
50
|
+
],
|
|
51
|
+
"cookbook_locks": {
|
|
52
|
+
"local-cookbook": {
|
|
53
|
+
"version": "2.3.4",
|
|
54
|
+
"identifier": "fab501cfaf747901bd82c1bc706beae7dc3a350c",
|
|
55
|
+
"dotted_decimal_identifier": "70567763561641081.489844270461035.258281553147148",
|
|
56
|
+
"source": "project-cookbooks/local-cookbook",
|
|
57
|
+
"cache_key": null,
|
|
58
|
+
"scm_info": null,
|
|
59
|
+
"source_options": {
|
|
60
|
+
"path": "project-cookbooks/local-cookbook"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"default_attributes": {},
|
|
65
|
+
"override_attributes": {},
|
|
66
|
+
"solution_dependencies": {
|
|
67
|
+
"Policyfile": [
|
|
68
|
+
[
|
|
69
|
+
"local-cookbook",
|
|
70
|
+
">= 0.0.0"
|
|
71
|
+
]
|
|
72
|
+
],
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"local-cookbook (2.3.4)": [
|
|
75
|
+
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
E
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
let(:archive_files) { [] }
|
|
84
|
+
|
|
85
|
+
let(:archive_dirs) { [] }
|
|
86
|
+
|
|
87
|
+
let(:working_dir) do
|
|
88
|
+
path = File.join(tempdir, "policyfile_services_test_working_dir")
|
|
89
|
+
Dir.mkdir(path)
|
|
90
|
+
path
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
let(:archive_file_name) { "example-policy-abc123.tgz" }
|
|
94
|
+
|
|
95
|
+
let(:archive_file_path) { File.join(working_dir, archive_file_name) }
|
|
96
|
+
|
|
97
|
+
let(:policy_group) { "dev-cluster-1" }
|
|
98
|
+
|
|
99
|
+
let(:config) do
|
|
100
|
+
double("Chef::Config",
|
|
101
|
+
chef_server_url: "https://localhost:10443",
|
|
102
|
+
client_key: "/path/to/client/key.pem",
|
|
103
|
+
node_name: "deuce",
|
|
104
|
+
policy_document_native_api: true)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
let(:ui) { TestHelpers::TestUI.new }
|
|
108
|
+
|
|
109
|
+
subject(:push_archive_service) do
|
|
110
|
+
described_class.new(archive_file: archive_file_name,
|
|
111
|
+
policy_group: policy_group,
|
|
112
|
+
root_dir: working_dir,
|
|
113
|
+
ui: ui,
|
|
114
|
+
config: config)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "has an archive file" do
|
|
118
|
+
expect(push_archive_service.archive_file).to eq(archive_file_name)
|
|
119
|
+
expect(push_archive_service.archive_file_path).to eq(archive_file_path)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "configures an HTTP client" do
|
|
123
|
+
expect(Chef::ServerAPI).to receive(:new).with("https://localhost:10443",
|
|
124
|
+
signing_key_filename: "/path/to/client/key.pem",
|
|
125
|
+
client_name: "deuce")
|
|
126
|
+
push_archive_service.http_client
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
context "with an invalid archive" do
|
|
130
|
+
|
|
131
|
+
let(:exception) do
|
|
132
|
+
begin
|
|
133
|
+
push_archive_service.run
|
|
134
|
+
rescue ChefDK::PolicyfilePushArchiveError => e
|
|
135
|
+
e
|
|
136
|
+
else
|
|
137
|
+
nil
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
let(:exception_cause) { exception.cause }
|
|
142
|
+
|
|
143
|
+
context "when the archive is malformed/corrupted/etc" do
|
|
144
|
+
|
|
145
|
+
context "when the archive file doesn't exist" do
|
|
146
|
+
|
|
147
|
+
it "errors out" do
|
|
148
|
+
expect(exception).to_not be_nil
|
|
149
|
+
expect(exception.message).to eq("Failed to publish archived policy")
|
|
150
|
+
expect(exception_cause).to be_a(ChefDK::InvalidPolicyArchive)
|
|
151
|
+
expect(exception_cause.message).to eq("Archive file #{archive_file_path} not found")
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
context "when the archive is a gzip file of a garbage file" do
|
|
156
|
+
|
|
157
|
+
before do
|
|
158
|
+
Zlib::GzipWriter.open(archive_file_path) do |gz_file|
|
|
159
|
+
gz_file << "lol this isn't a tar file"
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it "errors out" do
|
|
164
|
+
expect(exception).to_not be_nil
|
|
165
|
+
expect(exception.message).to eq("Failed to publish archived policy")
|
|
166
|
+
expect(exception_cause).to be_a(ChefDK::InvalidPolicyArchive)
|
|
167
|
+
expect(exception_cause.message).to eq("Archive file #{archive_file_path} could not be unpacked. Unrecognized archive format")
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
context "when the archive is a gzip file of a very malformed tar archive" do
|
|
172
|
+
|
|
173
|
+
before do
|
|
174
|
+
Zlib::GzipWriter.open(archive_file_path) do |gz_file|
|
|
175
|
+
gz_file << "\0\0\0\0\0"
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it "errors out" do
|
|
180
|
+
expect(exception).to_not be_nil
|
|
181
|
+
expect(exception.message).to eq("Failed to publish archived policy")
|
|
182
|
+
expect(exception_cause).to be_a(ChefDK::InvalidPolicyArchive)
|
|
183
|
+
expect(exception_cause.message).to eq("Archive file #{archive_file_path} could not be unpacked. Unrecognized archive format")
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
context "when the archive is well-formed but has invalid content" do
|
|
189
|
+
|
|
190
|
+
before do
|
|
191
|
+
create_archive
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
context "when the archive is missing Policyfile.lock.json" do
|
|
195
|
+
|
|
196
|
+
let(:archive_files) { [ FileToTar.new("empty.txt", "") ] }
|
|
197
|
+
|
|
198
|
+
it "errors out" do
|
|
199
|
+
expect(exception).to_not be_nil
|
|
200
|
+
expect(exception.message).to eq("Failed to publish archived policy")
|
|
201
|
+
expect(exception_cause).to be_a(ChefDK::InvalidPolicyArchive)
|
|
202
|
+
expect(exception_cause.message).to eq("Archive does not contain a Policyfile.lock.json")
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
context "when the archive has no cookbook_artifacts/ directory" do
|
|
208
|
+
|
|
209
|
+
let(:archive_files) { [ FileToTar.new("Policyfile.lock.json", "") ] }
|
|
210
|
+
|
|
211
|
+
it "errors out" do
|
|
212
|
+
expect(exception).to_not be_nil
|
|
213
|
+
expect(exception.message).to eq("Failed to publish archived policy")
|
|
214
|
+
expect(exception_cause).to be_a(ChefDK::InvalidPolicyArchive)
|
|
215
|
+
expect(exception_cause.message).to eq("Archive does not contain a cookbook_artifacts directory")
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
context "when the archive has the correct files but the lockfile is invalid" do
|
|
221
|
+
|
|
222
|
+
let(:archive_dirs) { ["cookbook_artifacts"] }
|
|
223
|
+
|
|
224
|
+
let(:archive_files) { [ FileToTar.new("Policyfile.lock.json", lockfile_content) ] }
|
|
225
|
+
|
|
226
|
+
context "when the lockfile has invalid JSON" do
|
|
227
|
+
|
|
228
|
+
let(:lockfile_content) { ":::" }
|
|
229
|
+
|
|
230
|
+
it "errors out" do
|
|
231
|
+
expect(exception).to_not be_nil
|
|
232
|
+
expect(exception.message).to eq("Failed to publish archived policy")
|
|
233
|
+
expect(exception_cause).to be_a(FFI_Yajl::ParseError)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
context "when the lockfile is semantically invalid" do
|
|
239
|
+
|
|
240
|
+
let(:lockfile_content) { "{ }" }
|
|
241
|
+
|
|
242
|
+
it "errors out" do
|
|
243
|
+
expect(exception).to_not be_nil
|
|
244
|
+
expect(exception.message).to eq("Failed to publish archived policy")
|
|
245
|
+
expect(exception_cause).to be_a(ChefDK::InvalidLockfile)
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
context "when the archive does not have all the necessary cookbooks" do
|
|
251
|
+
|
|
252
|
+
let(:lockfile_content) { valid_lockfile }
|
|
253
|
+
|
|
254
|
+
it "errors out" do
|
|
255
|
+
expect(exception).to_not be_nil
|
|
256
|
+
expect(exception.message).to eq("Failed to publish archived policy")
|
|
257
|
+
expect(exception_cause).to be_a(ChefDK::InvalidPolicyArchive)
|
|
258
|
+
|
|
259
|
+
msg = "Archive does not have all cookbooks required by the Policyfile.lock. Missing cookbooks: 'local-cookbook'."
|
|
260
|
+
expect(exception_cause.message).to eq(msg)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
# `chef export` previously generated Chef repos designed for
|
|
266
|
+
# compatibility mode Policyfile usage. We don't intend to be backwards
|
|
267
|
+
# compatible, but we want to kindly explain what's going on.
|
|
268
|
+
context "when the archive is in the old format" do
|
|
269
|
+
|
|
270
|
+
let(:lockfile_content) { valid_lockfile }
|
|
271
|
+
|
|
272
|
+
let(:archive_dirs) { %w{ cookbooks data_bags } }
|
|
273
|
+
|
|
274
|
+
let(:archive_files) do
|
|
275
|
+
[
|
|
276
|
+
FileToTar.new("Policyfile.lock.json", lockfile_content),
|
|
277
|
+
FileToTar.new("client.rb", "#content"),
|
|
278
|
+
]
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
it "errors out, explaining the compatibility issue" do
|
|
282
|
+
expect(exception).to_not be_nil
|
|
283
|
+
expect(exception.message).to eq("Failed to publish archived policy")
|
|
284
|
+
expect(exception_cause).to be_a(ChefDK::InvalidPolicyArchive)
|
|
285
|
+
|
|
286
|
+
msg = <<-MESSAGE
|
|
287
|
+
This archive is in an unsupported format.
|
|
288
|
+
|
|
289
|
+
This archive was created with an older version of ChefDK. This version of
|
|
290
|
+
ChefDK does not support archives in the older format. Re-create the archive
|
|
291
|
+
with a newer version of ChefDK or downgrade ChefDK.
|
|
292
|
+
MESSAGE
|
|
293
|
+
expect(exception_cause.message).to eq(msg)
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
context "with a valid archive" do
|
|
303
|
+
|
|
304
|
+
let(:lockfile_content) { valid_lockfile }
|
|
305
|
+
|
|
306
|
+
let(:cookbook_name) { "local-cookbook" }
|
|
307
|
+
|
|
308
|
+
let(:identifier) { "fab501cfaf747901bd82c1bc706beae7dc3a350c" }
|
|
309
|
+
|
|
310
|
+
let(:cookbook_artifact_dir) { File.join("cookbook_artifacts", "#{cookbook_name}-#{identifier}") }
|
|
311
|
+
|
|
312
|
+
let(:recipes_dir) { File.join(cookbook_artifact_dir, "recipes") }
|
|
313
|
+
|
|
314
|
+
let(:archive_dirs) { ["cookbook_artifacts", cookbook_artifact_dir, recipes_dir] }
|
|
315
|
+
|
|
316
|
+
let(:archive_files) do
|
|
317
|
+
[
|
|
318
|
+
FileToTar.new("Policyfile.lock.json", lockfile_content),
|
|
319
|
+
FileToTar.new(File.join(cookbook_artifact_dir, "metadata.rb"), "name 'local-cookbook'"),
|
|
320
|
+
FileToTar.new(File.join(recipes_dir, "default.rb"), "puts 'hello'"),
|
|
321
|
+
]
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
let(:http_client) { instance_double(Chef::ServerAPI) }
|
|
325
|
+
|
|
326
|
+
let(:uploader) { instance_double(ChefDK::Policyfile::Uploader) }
|
|
327
|
+
|
|
328
|
+
before do
|
|
329
|
+
expect(push_archive_service).to receive(:http_client).and_return(http_client)
|
|
330
|
+
|
|
331
|
+
expect(ChefDK::Policyfile::Uploader).to receive(:new).
|
|
332
|
+
# TODO: need more verification that the policyfile.lock is right (?)
|
|
333
|
+
with(an_instance_of(ChefDK::PolicyfileLock), policy_group, http_client: http_client, ui: ui, policy_document_native_api: true).
|
|
334
|
+
and_return(uploader)
|
|
335
|
+
|
|
336
|
+
create_archive
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
describe "when the upload is successful" do
|
|
340
|
+
|
|
341
|
+
it "uploads the cookbooks and lockfile" do
|
|
342
|
+
expect(uploader).to receive(:upload)
|
|
343
|
+
push_archive_service.run
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
describe "when the upload fails" do
|
|
349
|
+
|
|
350
|
+
it "raises a nested error" do
|
|
351
|
+
expect(uploader).to receive(:upload).and_raise("an error")
|
|
352
|
+
expect { push_archive_service.run }.to raise_error(ChefDK::PolicyfilePushArchiveError)
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
end
|