chef-cli 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +32 -0
- data/LICENSE +201 -0
- data/Rakefile +70 -0
- data/bin/chef +25 -0
- data/chef-cli.gemspec +53 -0
- data/lib/chef-cli.rb +19 -0
- data/lib/chef-cli/authenticated_http.rb +22 -0
- data/lib/chef-cli/builtin_commands.rb +62 -0
- data/lib/chef-cli/chef_runner.rb +114 -0
- data/lib/chef-cli/chef_server_api_multi.rb +73 -0
- data/lib/chef-cli/cli.rb +206 -0
- data/lib/chef-cli/command/base.rb +89 -0
- data/lib/chef-cli/command/clean_policy_cookbooks.rb +115 -0
- data/lib/chef-cli/command/clean_policy_revisions.rb +112 -0
- data/lib/chef-cli/command/delete_policy.rb +121 -0
- data/lib/chef-cli/command/delete_policy_group.rb +121 -0
- data/lib/chef-cli/command/describe_cookbook.rb +98 -0
- data/lib/chef-cli/command/diff.rb +316 -0
- data/lib/chef-cli/command/env.rb +99 -0
- data/lib/chef-cli/command/exec.rb +45 -0
- data/lib/chef-cli/command/export.rb +156 -0
- data/lib/chef-cli/command/gem.rb +48 -0
- data/lib/chef-cli/command/generate.rb +123 -0
- data/lib/chef-cli/command/generator_commands.rb +83 -0
- data/lib/chef-cli/command/generator_commands/attribute.rb +37 -0
- data/lib/chef-cli/command/generator_commands/base.rb +157 -0
- data/lib/chef-cli/command/generator_commands/build_cookbook.rb +126 -0
- data/lib/chef-cli/command/generator_commands/chef_exts/generator_desc_resource.rb +40 -0
- data/lib/chef-cli/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -0
- data/lib/chef-cli/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -0
- data/lib/chef-cli/command/generator_commands/cookbook.rb +251 -0
- data/lib/chef-cli/command/generator_commands/cookbook_code_file.rb +100 -0
- data/lib/chef-cli/command/generator_commands/cookbook_file.rb +46 -0
- data/lib/chef-cli/command/generator_commands/generator_generator.rb +175 -0
- data/lib/chef-cli/command/generator_commands/helpers.rb +37 -0
- data/lib/chef-cli/command/generator_commands/policyfile.rb +125 -0
- data/lib/chef-cli/command/generator_commands/recipe.rb +37 -0
- data/lib/chef-cli/command/generator_commands/repo.rb +140 -0
- data/lib/chef-cli/command/generator_commands/resource.rb +37 -0
- data/lib/chef-cli/command/generator_commands/template.rb +47 -0
- data/lib/chef-cli/command/install.rb +121 -0
- data/lib/chef-cli/command/provision.rb +38 -0
- data/lib/chef-cli/command/push.rb +118 -0
- data/lib/chef-cli/command/push_archive.rb +126 -0
- data/lib/chef-cli/command/shell_init.rb +185 -0
- data/lib/chef-cli/command/show_policy.rb +164 -0
- data/lib/chef-cli/command/undelete.rb +155 -0
- data/lib/chef-cli/command/update.rb +140 -0
- data/lib/chef-cli/command/verify.rb +548 -0
- data/lib/chef-cli/commands_map.rb +113 -0
- data/lib/chef-cli/completions/bash.sh.erb +5 -0
- data/lib/chef-cli/completions/chef.fish.erb +10 -0
- data/lib/chef-cli/completions/zsh.zsh.erb +21 -0
- data/lib/chef-cli/component_test.rb +226 -0
- data/lib/chef-cli/configurable.rb +88 -0
- data/lib/chef-cli/cookbook_metadata.rb +45 -0
- data/lib/chef-cli/cookbook_omnifetch.rb +32 -0
- data/lib/chef-cli/cookbook_profiler/git.rb +152 -0
- data/lib/chef-cli/cookbook_profiler/identifiers.rb +72 -0
- data/lib/chef-cli/cookbook_profiler/null_scm.rb +31 -0
- data/lib/chef-cli/dist.rb +31 -0
- data/lib/chef-cli/exceptions.rb +153 -0
- data/lib/chef-cli/generator.rb +165 -0
- data/lib/chef-cli/helpers.rb +170 -0
- data/lib/chef-cli/pager.rb +104 -0
- data/lib/chef-cli/policyfile/artifactory_cookbook_source.rb +102 -0
- data/lib/chef-cli/policyfile/attribute_merge_checker.rb +110 -0
- data/lib/chef-cli/policyfile/chef_repo_cookbook_source.rb +138 -0
- data/lib/chef-cli/policyfile/chef_server_cookbook_source.rb +99 -0
- data/lib/chef-cli/policyfile/chef_server_lock_fetcher.rb +167 -0
- data/lib/chef-cli/policyfile/community_cookbook_source.rb +95 -0
- data/lib/chef-cli/policyfile/comparison_base.rb +123 -0
- data/lib/chef-cli/policyfile/cookbook_location_specification.rb +154 -0
- data/lib/chef-cli/policyfile/cookbook_locks.rb +466 -0
- data/lib/chef-cli/policyfile/cookbook_sources.rb +23 -0
- data/lib/chef-cli/policyfile/delivery_supermarket_source.rb +89 -0
- data/lib/chef-cli/policyfile/differ.rb +263 -0
- data/lib/chef-cli/policyfile/dsl.rb +288 -0
- data/lib/chef-cli/policyfile/git_lock_fetcher.rb +265 -0
- data/lib/chef-cli/policyfile/included_policies_cookbook_source.rb +156 -0
- data/lib/chef-cli/policyfile/lister.rb +229 -0
- data/lib/chef-cli/policyfile/local_lock_fetcher.rb +132 -0
- data/lib/chef-cli/policyfile/lock_applier.rb +80 -0
- data/lib/chef-cli/policyfile/lock_fetcher_mixin.rb +37 -0
- data/lib/chef-cli/policyfile/null_cookbook_source.rb +49 -0
- data/lib/chef-cli/policyfile/policyfile_location_specification.rb +128 -0
- data/lib/chef-cli/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -0
- data/lib/chef-cli/policyfile/remote_lock_fetcher.rb +108 -0
- data/lib/chef-cli/policyfile/reports/install.rb +69 -0
- data/lib/chef-cli/policyfile/reports/table_printer.rb +57 -0
- data/lib/chef-cli/policyfile/reports/upload.rb +70 -0
- data/lib/chef-cli/policyfile/solution_dependencies.rb +311 -0
- data/lib/chef-cli/policyfile/source_uri.rb +57 -0
- data/lib/chef-cli/policyfile/storage_config.rb +112 -0
- data/lib/chef-cli/policyfile/undo_record.rb +139 -0
- data/lib/chef-cli/policyfile/undo_stack.rb +128 -0
- data/lib/chef-cli/policyfile/uploader.rb +222 -0
- data/lib/chef-cli/policyfile_compiler.rb +528 -0
- data/lib/chef-cli/policyfile_lock.rb +581 -0
- data/lib/chef-cli/policyfile_services/clean_policies.rb +95 -0
- data/lib/chef-cli/policyfile_services/clean_policy_cookbooks.rb +123 -0
- data/lib/chef-cli/policyfile_services/export_repo.rb +419 -0
- data/lib/chef-cli/policyfile_services/install.rb +167 -0
- data/lib/chef-cli/policyfile_services/push.rb +112 -0
- data/lib/chef-cli/policyfile_services/push_archive.rb +164 -0
- data/lib/chef-cli/policyfile_services/rm_policy.rb +141 -0
- data/lib/chef-cli/policyfile_services/rm_policy_group.rb +85 -0
- data/lib/chef-cli/policyfile_services/show_policy.rb +234 -0
- data/lib/chef-cli/policyfile_services/undelete.rb +108 -0
- data/lib/chef-cli/policyfile_services/update_attributes.rb +110 -0
- data/lib/chef-cli/service_exception_inspectors.rb +24 -0
- data/lib/chef-cli/service_exception_inspectors/base.rb +39 -0
- data/lib/chef-cli/service_exception_inspectors/http.rb +119 -0
- data/lib/chef-cli/service_exceptions.rb +142 -0
- data/lib/chef-cli/shell_out.rb +36 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/Berksfile +3 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/README.md +146 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/kitchen.yml +21 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +8 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/chefignore +110 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README.md +66 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/delivery-config.json +17 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/delivery-project.toml +34 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/gitignore +22 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/README.md +20 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +6 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +4 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/README.md +9 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/example.json +13 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/policyfiles/README.md +24 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/README.md +9 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/example.json +13 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper.rb +2 -0
- data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -0
- data/lib/chef-cli/skeletons/code_generator/metadata.rb +8 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/attribute.rb +11 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/build_cookbook.rb +175 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/cookbook.rb +167 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/cookbook_file.rb +23 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/helpers.rb +19 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/policyfile.rb +7 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/recipe.rb +50 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/repo.rb +71 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/resource.rb +12 -0
- data/lib/chef-cli/skeletons/code_generator/recipes/template.rb +31 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/README.md.erb +4 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +9 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/helpers.rb.erb +39 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +16 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen.yml.erb +38 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_dokken.yml.erb +36 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +32 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/metadata.rb.erb +20 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/recipe.rb.erb +5 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/recipe_spec.rb.erb +29 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/resource.rb.erb +1 -0
- data/lib/chef-cli/skeletons/code_generator/templates/default/template.erb +0 -0
- data/lib/chef-cli/ui.rb +57 -0
- data/lib/chef-cli/version.rb +20 -0
- data/lib/kitchen/provisioner/policyfile_zero.rb +195 -0
- data/spec/shared/a_file_generator.rb +125 -0
- data/spec/shared/a_generated_file.rb +12 -0
- data/spec/shared/command_with_ui_object.rb +11 -0
- data/spec/shared/custom_generator_cookbook.rb +136 -0
- data/spec/shared/fixture_cookbook_checksums.rb +46 -0
- data/spec/shared/setup_git_committer_config.rb +54 -0
- data/spec/shared/setup_git_cookbooks.rb +53 -0
- data/spec/spec_helper.rb +51 -0
- data/spec/test_helpers.rb +84 -0
- data/spec/unit/chef_runner_spec.rb +139 -0
- data/spec/unit/chef_server_api_multi_spec.rb +120 -0
- data/spec/unit/cli_spec.rb +375 -0
- data/spec/unit/command/base_spec.rb +195 -0
- data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -0
- data/spec/unit/command/clean_policy_revisions_spec.rb +180 -0
- data/spec/unit/command/delete_policy_group_spec.rb +206 -0
- data/spec/unit/command/delete_policy_spec.rb +206 -0
- data/spec/unit/command/diff_spec.rb +311 -0
- data/spec/unit/command/env_spec.rb +86 -0
- data/spec/unit/command/exec_spec.rb +178 -0
- data/spec/unit/command/export_spec.rb +199 -0
- data/spec/unit/command/generate_spec.rb +142 -0
- data/spec/unit/command/generator_commands/attribute_spec.rb +31 -0
- data/spec/unit/command/generator_commands/base_spec.rb +180 -0
- data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -0
- data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +77 -0
- data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -0
- data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -0
- data/spec/unit/command/generator_commands/cookbook_spec.rb +769 -0
- data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -0
- data/spec/unit/command/generator_commands/helpers_spec.rb +31 -0
- data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -0
- data/spec/unit/command/generator_commands/recipe_spec.rb +37 -0
- data/spec/unit/command/generator_commands/repo_spec.rb +374 -0
- data/spec/unit/command/generator_commands/resource_spec.rb +31 -0
- data/spec/unit/command/generator_commands/template_spec.rb +31 -0
- data/spec/unit/command/install_spec.rb +179 -0
- data/spec/unit/command/push_archive_spec.rb +153 -0
- data/spec/unit/command/push_spec.rb +198 -0
- data/spec/unit/command/shell_init_spec.rb +339 -0
- data/spec/unit/command/show_policy_spec.rb +234 -0
- data/spec/unit/command/undelete_spec.rb +244 -0
- data/spec/unit/command/update_spec.rb +283 -0
- data/spec/unit/command/verify_spec.rb +341 -0
- data/spec/unit/commands_map_spec.rb +57 -0
- data/spec/unit/component_test_spec.rb +128 -0
- data/spec/unit/configurable_spec.rb +68 -0
- data/spec/unit/cookbook_metadata_spec.rb +96 -0
- data/spec/unit/cookbook_profiler/git_spec.rb +176 -0
- data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -0
- data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -0
- data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -0
- data/spec/unit/fixtures/command/cli_test_command.rb +26 -0
- data/spec/unit/fixtures/command/explicit_path_example.rb +7 -0
- data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -0
- data/spec/unit/fixtures/configurable/test_configurable.rb +10 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -0
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/kitchen.yml +16 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -0
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -0
- data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -0
- data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -0
- data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1322 -0
- data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -0
- data/spec/unit/fixtures/cookbooks_api/universe.json +1 -0
- data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +33 -0
- data/spec/unit/fixtures/dev_cookbooks/README.md +16 -0
- data/spec/unit/fixtures/dev_cookbooks/bar-cookbook.gitbundle +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/bin/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/bin/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_component/bin/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/berkshelf/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/test-kitchen/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/bin/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/bin/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef-dk/.keep +0 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -0
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/bin/.keep +0 -0
- data/spec/unit/fixtures/example_app/Policyfile.rb +0 -0
- data/spec/unit/fixtures/example_cookbook/.gitignore +17 -0
- data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -0
- data/spec/unit/fixtures/example_cookbook/Berksfile +3 -0
- data/spec/unit/fixtures/example_cookbook/README.md +4 -0
- data/spec/unit/fixtures/example_cookbook/chefignore +96 -0
- data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -0
- data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -0
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -0
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -0
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/extra/extra_file.txt +0 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -0
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
- data/spec/unit/generator_spec.rb +119 -0
- data/spec/unit/pager_spec.rb +117 -0
- data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -0
- data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -0
- data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -0
- data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -0
- data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -0
- data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -0
- data/spec/unit/policyfile/comparison_base_spec.rb +340 -0
- data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -0
- data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -0
- data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -0
- data/spec/unit/policyfile/differ_spec.rb +686 -0
- data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -0
- data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -0
- data/spec/unit/policyfile/lister_spec.rb +268 -0
- data/spec/unit/policyfile/local_lock_fetcher_spec.rb +199 -0
- data/spec/unit/policyfile/lock_applier_spec.rb +100 -0
- data/spec/unit/policyfile/lock_fetcher_mixin_spec.rb +60 -0
- data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -0
- data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -0
- data/spec/unit/policyfile/remote_lock_fetcher_spec.rb +129 -0
- data/spec/unit/policyfile/reports/install_spec.rb +114 -0
- data/spec/unit/policyfile/reports/upload_spec.rb +94 -0
- data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -0
- data/spec/unit/policyfile/source_uri_spec.rb +36 -0
- data/spec/unit/policyfile/storage_config_spec.rb +180 -0
- data/spec/unit/policyfile/undo_record_spec.rb +258 -0
- data/spec/unit/policyfile/undo_stack_spec.rb +265 -0
- data/spec/unit/policyfile/uploader_spec.rb +410 -0
- data/spec/unit/policyfile_demands_spec.rb +1197 -0
- data/spec/unit/policyfile_evaluation_spec.rb +628 -0
- data/spec/unit/policyfile_includes_dsl_spec.rb +220 -0
- data/spec/unit/policyfile_includes_spec.rb +720 -0
- data/spec/unit/policyfile_install_with_includes_spec.rb +232 -0
- data/spec/unit/policyfile_lock_build_spec.rb +1065 -0
- data/spec/unit/policyfile_lock_install_spec.rb +137 -0
- data/spec/unit/policyfile_lock_serialization_spec.rb +424 -0
- data/spec/unit/policyfile_lock_validation_spec.rb +608 -0
- data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -0
- data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -0
- data/spec/unit/policyfile_services/export_repo_spec.rb +473 -0
- data/spec/unit/policyfile_services/install_spec.rb +209 -0
- data/spec/unit/policyfile_services/push_archive_spec.rb +359 -0
- data/spec/unit/policyfile_services/push_spec.rb +249 -0
- data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -0
- data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -0
- data/spec/unit/policyfile_services/show_policy_spec.rb +887 -0
- data/spec/unit/policyfile_services/undelete_spec.rb +302 -0
- data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -0
- data/spec/unit/policyfile_services/update_spec.rb +162 -0
- data/spec/unit/service_exception_inspectors/base_spec.rb +41 -0
- data/spec/unit/service_exception_inspectors/http_spec.rb +138 -0
- data/spec/unit/shell_out_spec.rb +34 -0
- metadata +796 -0
|
@@ -0,0 +1,95 @@
|
|
|
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_relative "../exceptions"
|
|
19
|
+
require_relative "../service_exceptions"
|
|
20
|
+
require_relative "../policyfile/lister"
|
|
21
|
+
|
|
22
|
+
module ChefCLI
|
|
23
|
+
module PolicyfileServices
|
|
24
|
+
class CleanPolicies
|
|
25
|
+
|
|
26
|
+
Orphan = Struct.new(:policy_name, :revision_id)
|
|
27
|
+
|
|
28
|
+
attr_reader :chef_config
|
|
29
|
+
attr_reader :ui
|
|
30
|
+
|
|
31
|
+
def initialize(config: nil, ui: nil)
|
|
32
|
+
@chef_config = config
|
|
33
|
+
@ui = ui
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def run
|
|
37
|
+
revisions_to_remove = orphaned_policies
|
|
38
|
+
|
|
39
|
+
if revisions_to_remove.empty?
|
|
40
|
+
ui.err("No policy revisions deleted")
|
|
41
|
+
return true
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
results = revisions_to_remove.map do |policy|
|
|
45
|
+
[ remove_policy(policy), policy ]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
failures = results.select { |result, _policy| result.kind_of?(Exception) }
|
|
49
|
+
|
|
50
|
+
unless failures.empty?
|
|
51
|
+
details = failures.map do |result, policy|
|
|
52
|
+
"- #{policy.policy_name} (#{policy.revision_id}): #{result.class} #{result}"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
message = "Failed to delete some policy revisions:\n" + details.join("\n") + "\n"
|
|
56
|
+
|
|
57
|
+
raise PolicyfileCleanError.new(message, MultipleErrors.new("multiple errors"))
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
true
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def orphaned_policies
|
|
64
|
+
policy_lister.policies_by_name.keys.inject([]) do |orphans, policy_name|
|
|
65
|
+
orphans + policy_lister.orphaned_revisions(policy_name).map do |revision_id|
|
|
66
|
+
Orphan.new(policy_name, revision_id)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
rescue => e
|
|
70
|
+
raise PolicyfileCleanError.new("Failed to list policies for cleaning.", e)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def policy_lister
|
|
74
|
+
@policy_lister ||= Policyfile::Lister.new(config: chef_config)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def http_client
|
|
78
|
+
@http_client ||= Chef::ServerAPI.new(chef_config.chef_server_url,
|
|
79
|
+
signing_key_filename: chef_config.client_key,
|
|
80
|
+
client_name: chef_config.node_name)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
|
|
85
|
+
def remove_policy(policy)
|
|
86
|
+
ui.msg("DELETE #{policy.policy_name} #{policy.revision_id}")
|
|
87
|
+
http_client.delete("/policies/#{policy.policy_name}/revisions/#{policy.revision_id}")
|
|
88
|
+
:ok
|
|
89
|
+
rescue => e
|
|
90
|
+
e
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
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 "set" unless defined?(Set)
|
|
19
|
+
|
|
20
|
+
require "chef/server_api"
|
|
21
|
+
require_relative "../service_exceptions"
|
|
22
|
+
|
|
23
|
+
module ChefCLI
|
|
24
|
+
module PolicyfileServices
|
|
25
|
+
|
|
26
|
+
class CleanPolicyCookbooks
|
|
27
|
+
|
|
28
|
+
attr_reader :chef_config
|
|
29
|
+
|
|
30
|
+
attr_reader :ui
|
|
31
|
+
|
|
32
|
+
def initialize(config: nil, ui: nil)
|
|
33
|
+
@chef_config = config
|
|
34
|
+
@ui = ui
|
|
35
|
+
|
|
36
|
+
@all_cookbooks = nil
|
|
37
|
+
@active_cookbooks = nil
|
|
38
|
+
@all_policies = nil
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def run
|
|
42
|
+
gc_cookbooks
|
|
43
|
+
rescue => e
|
|
44
|
+
raise PolicyCookbookCleanError.new("Failed to cleanup policy cookbooks", e)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def gc_cookbooks
|
|
48
|
+
cookbooks = cookbooks_to_clean
|
|
49
|
+
|
|
50
|
+
if cookbooks.empty?
|
|
51
|
+
ui.msg("No cookbooks deleted.")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
cookbooks.each do |name, identifiers|
|
|
55
|
+
identifiers.each do |identifier|
|
|
56
|
+
http_client.delete("/cookbook_artifacts/#{name}/#{identifier}")
|
|
57
|
+
ui.msg("DELETE #{name} #{identifier}")
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def all_cookbooks
|
|
63
|
+
cookbook_list = http_client.get("/cookbook_artifacts")
|
|
64
|
+
cookbook_list.inject({}) do |cb_map, (name, cb_info)|
|
|
65
|
+
cb_map[name] = cb_info["versions"].map { |v| v["identifier"] }
|
|
66
|
+
cb_map
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def active_cookbooks
|
|
71
|
+
policy_revisions_by_name.inject({}) do |cb_map, (policy_name, revision_ids)|
|
|
72
|
+
revision_ids.each do |revision_id|
|
|
73
|
+
cookbook_revisions_in_policy(policy_name, revision_id).each do |cb_name, identifier|
|
|
74
|
+
cb_map[cb_name] ||= Set.new
|
|
75
|
+
cb_map[cb_name] << identifier
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
cb_map
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def cookbooks_to_clean
|
|
83
|
+
active_cbs = active_cookbooks
|
|
84
|
+
|
|
85
|
+
all_cookbooks.inject({}) do |cb_map, (cb_name, revisions)|
|
|
86
|
+
active_revs = active_cbs[cb_name] || Set.new
|
|
87
|
+
inactive_revs = Set.new(revisions) - active_revs
|
|
88
|
+
cb_map[cb_name] = inactive_revs unless inactive_revs.empty?
|
|
89
|
+
|
|
90
|
+
cb_map
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# @api private
|
|
95
|
+
def policy_revisions_by_name
|
|
96
|
+
policies_list = http_client.get("/policies")
|
|
97
|
+
policies_list.inject({}) do |policies_map, (name, policy_info)|
|
|
98
|
+
policies_map[name] = policy_info["revisions"].keys
|
|
99
|
+
policies_map
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# @api private
|
|
104
|
+
def cookbook_revisions_in_policy(name, revision_id)
|
|
105
|
+
policy_revision_data = http_client.get("/policies/#{name}/revisions/#{revision_id}")
|
|
106
|
+
|
|
107
|
+
policy_revision_data["cookbook_locks"].inject({}) do |cb_map, (cb_name, lock_info)|
|
|
108
|
+
cb_map[cb_name] = lock_info["identifier"]
|
|
109
|
+
cb_map
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# @api private
|
|
114
|
+
# An instance of Chef::ServerAPI configured with the user's
|
|
115
|
+
# server URL and credentials.
|
|
116
|
+
def http_client
|
|
117
|
+
@http_client ||= Chef::ServerAPI.new(chef_config.chef_server_url,
|
|
118
|
+
signing_key_filename: chef_config.client_key,
|
|
119
|
+
client_name: chef_config.node_name)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2014-2019 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 "pathname" unless defined?(Pathname)
|
|
19
|
+
require "fileutils" unless defined?(FileUtils)
|
|
20
|
+
require "tmpdir" unless defined?(Dir.mktmpdir)
|
|
21
|
+
require "zlib"
|
|
22
|
+
|
|
23
|
+
require "archive/tar/minitar"
|
|
24
|
+
|
|
25
|
+
require "chef/cookbook/chefignore"
|
|
26
|
+
|
|
27
|
+
require_relative "../service_exceptions"
|
|
28
|
+
require_relative "../policyfile_lock"
|
|
29
|
+
require_relative "../policyfile/storage_config"
|
|
30
|
+
|
|
31
|
+
module ChefCLI
|
|
32
|
+
module PolicyfileServices
|
|
33
|
+
|
|
34
|
+
class ExportRepo
|
|
35
|
+
|
|
36
|
+
# Policy groups provide namespaces for policies so that a Chef Infra Server can
|
|
37
|
+
# have multiple active iterations of a policy at once, but we don't need
|
|
38
|
+
# this when serving a single exported policy via Chef Zero, so hardcode
|
|
39
|
+
# it to a "well known" value:
|
|
40
|
+
POLICY_GROUP = "local".freeze
|
|
41
|
+
|
|
42
|
+
include Policyfile::StorageConfigDelegation
|
|
43
|
+
|
|
44
|
+
attr_reader :storage_config
|
|
45
|
+
attr_reader :root_dir
|
|
46
|
+
attr_reader :export_dir
|
|
47
|
+
|
|
48
|
+
def initialize(policyfile: nil, export_dir: nil, root_dir: nil, archive: false, force: false)
|
|
49
|
+
@root_dir = root_dir
|
|
50
|
+
@export_dir = File.expand_path(export_dir)
|
|
51
|
+
@archive = archive
|
|
52
|
+
@force_export = force
|
|
53
|
+
|
|
54
|
+
@policy_data = nil
|
|
55
|
+
@policyfile_lock = nil
|
|
56
|
+
|
|
57
|
+
policyfile_rel_path = policyfile || "Policyfile.rb"
|
|
58
|
+
policyfile_full_path = File.expand_path(policyfile_rel_path, root_dir)
|
|
59
|
+
@storage_config = Policyfile::StorageConfig.new.use_policyfile(policyfile_full_path)
|
|
60
|
+
|
|
61
|
+
@staging_dir = nil
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def archive?
|
|
65
|
+
@archive
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def policy_name
|
|
69
|
+
policyfile_lock.name
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def run
|
|
73
|
+
assert_lockfile_exists!
|
|
74
|
+
assert_export_dir_clean!
|
|
75
|
+
|
|
76
|
+
validate_lockfile
|
|
77
|
+
write_updated_lockfile
|
|
78
|
+
export
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def policy_data
|
|
82
|
+
@policy_data ||= FFI_Yajl::Parser.parse(IO.read(policyfile_lock_expanded_path))
|
|
83
|
+
rescue => error
|
|
84
|
+
raise PolicyfileExportRepoError.new("Error reading lockfile #{policyfile_lock_expanded_path}", error)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def policyfile_lock
|
|
88
|
+
@policyfile_lock || validate_lockfile
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def archive_file_location
|
|
92
|
+
return nil unless archive?
|
|
93
|
+
filename = "#{policyfile_lock.name}-#{policyfile_lock.revision_id}.tgz"
|
|
94
|
+
File.join(export_dir, filename)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def export
|
|
98
|
+
with_staging_dir do
|
|
99
|
+
create_repo_structure
|
|
100
|
+
copy_cookbooks
|
|
101
|
+
create_policyfile_repo_item
|
|
102
|
+
create_policy_group_repo_item
|
|
103
|
+
copy_policyfile_lock
|
|
104
|
+
create_client_rb
|
|
105
|
+
create_readme_md
|
|
106
|
+
if archive?
|
|
107
|
+
create_archive
|
|
108
|
+
else
|
|
109
|
+
mv_staged_repo
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
rescue => error
|
|
113
|
+
msg = "Failed to export policy (in #{policyfile_filename}) to #{export_dir}"
|
|
114
|
+
raise PolicyfileExportRepoError.new(msg, error)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
private
|
|
118
|
+
|
|
119
|
+
def with_staging_dir
|
|
120
|
+
p = Process.pid
|
|
121
|
+
t = Time.new.utc.strftime("%Y%m%d%H%M%S")
|
|
122
|
+
Dir.mktmpdir("chefcli-export-#{p}-#{t}") do |d|
|
|
123
|
+
begin
|
|
124
|
+
@staging_dir = d
|
|
125
|
+
yield
|
|
126
|
+
ensure
|
|
127
|
+
@staging_dir = nil
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def create_archive
|
|
133
|
+
Dir.chdir(staging_dir) do
|
|
134
|
+
targets = Find.find(".").collect { |e| e }
|
|
135
|
+
Mixlib::Archive.new(archive_file_location).create(targets, gzip: true)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def staging_dir
|
|
140
|
+
@staging_dir
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def create_repo_structure
|
|
144
|
+
FileUtils.mkdir_p(export_dir)
|
|
145
|
+
FileUtils.mkdir_p(dot_chef_staging_dir)
|
|
146
|
+
FileUtils.mkdir_p(cookbook_artifacts_staging_dir)
|
|
147
|
+
FileUtils.mkdir_p(policies_staging_dir)
|
|
148
|
+
FileUtils.mkdir_p(policy_groups_staging_dir)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def copy_cookbooks
|
|
152
|
+
policyfile_lock.cookbook_locks.each do |name, lock|
|
|
153
|
+
copy_cookbook(lock)
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def copy_cookbook(lock)
|
|
158
|
+
dirname = "#{lock.name}-#{lock.identifier}"
|
|
159
|
+
export_path = File.join(staging_dir, "cookbook_artifacts", dirname)
|
|
160
|
+
metadata_rb_path = File.join(export_path, "metadata.rb")
|
|
161
|
+
FileUtils.mkdir(export_path) if not File.directory?(export_path)
|
|
162
|
+
copy_unignored_cookbook_files(lock, export_path)
|
|
163
|
+
FileUtils.rm_f(metadata_rb_path)
|
|
164
|
+
metadata = lock.cookbook_version.metadata
|
|
165
|
+
|
|
166
|
+
metadata_json_path = File.join(export_path, "metadata.json")
|
|
167
|
+
|
|
168
|
+
File.open(metadata_json_path, "wb+") do |f|
|
|
169
|
+
f.print(FFI_Yajl::Encoder.encode(metadata.to_hash, pretty: true ))
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def copy_unignored_cookbook_files(lock, export_path)
|
|
174
|
+
cookbook_files_to_copy(lock.cookbook_path).each do |rel_path|
|
|
175
|
+
full_source_path = File.join(lock.cookbook_path, rel_path)
|
|
176
|
+
full_dest_path = File.join(export_path, rel_path)
|
|
177
|
+
dest_dirname = File.dirname(full_dest_path)
|
|
178
|
+
FileUtils.mkdir_p(dest_dirname) unless File.directory?(dest_dirname)
|
|
179
|
+
FileUtils.cp(full_source_path, full_dest_path)
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def cookbook_files_to_copy(cookbook_path)
|
|
184
|
+
cookbook = cookbook_loader_for(cookbook_path).cookbook_version
|
|
185
|
+
|
|
186
|
+
root = Pathname.new(cookbook.root_dir)
|
|
187
|
+
|
|
188
|
+
cookbook.all_files.map do |full_path|
|
|
189
|
+
Pathname.new(full_path).relative_path_from(root).to_s
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def cookbook_loader_for(cookbook_path)
|
|
194
|
+
loader = Chef::Cookbook::CookbookVersionLoader.new(cookbook_path, chefignore_for(cookbook_path))
|
|
195
|
+
loader.load!
|
|
196
|
+
loader
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def chefignore_for(cookbook_path)
|
|
200
|
+
Chef::Cookbook::Chefignore.new(File.join(cookbook_path, "chefignore"))
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def create_policyfile_repo_item
|
|
204
|
+
File.open(policyfile_repo_item_path, "wb+") do |f|
|
|
205
|
+
f.print(FFI_Yajl::Encoder.encode(policyfile_lock.to_lock, pretty: true ))
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def create_policy_group_repo_item
|
|
210
|
+
data = {
|
|
211
|
+
"policies" => {
|
|
212
|
+
policyfile_lock.name => {
|
|
213
|
+
"revision_id" => policyfile_lock.revision_id,
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
File.open(policy_group_repo_item_path, "wb+") do |f|
|
|
219
|
+
f.print(FFI_Yajl::Encoder.encode(data, pretty: true ))
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def copy_policyfile_lock
|
|
224
|
+
File.open(lockfile_staging_path, "wb+") do |f|
|
|
225
|
+
f.print(FFI_Yajl::Encoder.encode(policyfile_lock.to_lock, pretty: true ))
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def create_client_rb
|
|
230
|
+
File.open(client_rb_staging_path, "wb+") do |f|
|
|
231
|
+
f.print( <<~CONFIG )
|
|
232
|
+
### Chef Infra Client Configuration ###
|
|
233
|
+
# The settings in this file will configure chef to apply the exported policy in
|
|
234
|
+
# this directory. To use it, run:
|
|
235
|
+
#
|
|
236
|
+
# chef-client -z
|
|
237
|
+
#
|
|
238
|
+
|
|
239
|
+
policy_name '#{policy_name}'
|
|
240
|
+
policy_group 'local'
|
|
241
|
+
|
|
242
|
+
use_policyfile true
|
|
243
|
+
policy_document_native_api true
|
|
244
|
+
|
|
245
|
+
# In order to use this repo, you need a version of Chef Infra Client and Chef Zero
|
|
246
|
+
# that supports policyfile "native mode" APIs:
|
|
247
|
+
current_version = Gem::Version.new(Chef::VERSION)
|
|
248
|
+
unless Gem::Requirement.new(">= 12.7").satisfied_by?(current_version)
|
|
249
|
+
puts("!" * 80)
|
|
250
|
+
puts(<<-MESSAGE)
|
|
251
|
+
This Chef Repo requires features introduced in Chef Infra Client 12.7, but you are using
|
|
252
|
+
Chef \#{Chef::VERSION}. Please upgrade to Chef Infra Client 12.7 or later.
|
|
253
|
+
MESSAGE
|
|
254
|
+
puts("!" * 80)
|
|
255
|
+
exit!(1)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
CONFIG
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def create_readme_md
|
|
263
|
+
File.open(readme_staging_path, "wb+") do |f|
|
|
264
|
+
f.print( <<~README )
|
|
265
|
+
# Exported Chef Infra Repository for Policy '#{policy_name}'
|
|
266
|
+
|
|
267
|
+
Policy revision: #{policyfile_lock.revision_id}
|
|
268
|
+
|
|
269
|
+
This directory contains all the cookbooks and configuration necessary for Chef
|
|
270
|
+
to converge a system using this exported policy. To converge a system with the
|
|
271
|
+
exported policy, use a privileged account to run `chef-client -z` from the
|
|
272
|
+
directory containing the exported policy.
|
|
273
|
+
|
|
274
|
+
## Contents:
|
|
275
|
+
|
|
276
|
+
### Policyfile.lock.json
|
|
277
|
+
|
|
278
|
+
A copy of the exported policy, used by the `chef push-archive` command.
|
|
279
|
+
|
|
280
|
+
### .chef/config.rb
|
|
281
|
+
|
|
282
|
+
A configuration file for Chef Infra Client. This file configures Chef Infra Client to
|
|
283
|
+
use the correct `policy_name` and `policy_group` for this exported repository. Chef
|
|
284
|
+
Infra Client will use this configuration automatically if you've set your working
|
|
285
|
+
directory properly.
|
|
286
|
+
|
|
287
|
+
### cookbook_artifacts/
|
|
288
|
+
|
|
289
|
+
All of the cookbooks required by the policy will be stored in this directory.
|
|
290
|
+
|
|
291
|
+
### policies/
|
|
292
|
+
|
|
293
|
+
A different copy of the exported policy, used by the `chef-client` command.
|
|
294
|
+
|
|
295
|
+
### policy_groups/
|
|
296
|
+
|
|
297
|
+
Policy groups are used by Chef Infra Server to manage multiple revisions of the same
|
|
298
|
+
policy. However, exported policies contain only a single policy revision, so
|
|
299
|
+
this policy group name is hardcoded to "local" and should not be changed.
|
|
300
|
+
|
|
301
|
+
README
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
def mv_staged_repo
|
|
306
|
+
# If we got here, either these dirs are empty/don't exist or force is
|
|
307
|
+
# set to true.
|
|
308
|
+
FileUtils.rm_rf(cookbook_artifacts_dir)
|
|
309
|
+
FileUtils.rm_rf(policies_dir)
|
|
310
|
+
FileUtils.rm_rf(policy_groups_dir)
|
|
311
|
+
FileUtils.rm_rf(dot_chef_dir)
|
|
312
|
+
|
|
313
|
+
FileUtils.mv(cookbook_artifacts_staging_dir, export_dir)
|
|
314
|
+
FileUtils.mv(policies_staging_dir, export_dir)
|
|
315
|
+
FileUtils.mv(policy_groups_staging_dir, export_dir)
|
|
316
|
+
FileUtils.mv(lockfile_staging_path, export_dir)
|
|
317
|
+
FileUtils.mv(dot_chef_staging_dir, export_dir)
|
|
318
|
+
FileUtils.mv(readme_staging_path, export_dir)
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
def validate_lockfile
|
|
322
|
+
return @policyfile_lock if @policyfile_lock
|
|
323
|
+
@policyfile_lock = ChefCLI::PolicyfileLock.new(storage_config).build_from_lock_data(policy_data)
|
|
324
|
+
# TODO: enumerate any cookbook that have been updated
|
|
325
|
+
@policyfile_lock.validate_cookbooks!
|
|
326
|
+
@policyfile_lock
|
|
327
|
+
rescue PolicyfileExportRepoError
|
|
328
|
+
raise
|
|
329
|
+
rescue => error
|
|
330
|
+
raise PolicyfileExportRepoError.new("Invalid lockfile data", error)
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
def write_updated_lockfile
|
|
334
|
+
File.open(policyfile_lock_expanded_path, "wb+") do |f|
|
|
335
|
+
f.print(FFI_Yajl::Encoder.encode(policyfile_lock.to_lock, pretty: true ))
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def assert_lockfile_exists!
|
|
340
|
+
unless File.exist?(policyfile_lock_expanded_path)
|
|
341
|
+
raise LockfileNotFound, "No lockfile at #{policyfile_lock_expanded_path} - you need to run `install` before `push`"
|
|
342
|
+
end
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def assert_export_dir_clean!
|
|
346
|
+
if !force_export? && !conflicting_fs_entries.empty? && !archive?
|
|
347
|
+
msg = "Export dir (#{export_dir}) not clean. Refusing to export. (Conflicting files: #{conflicting_fs_entries.join(', ')})"
|
|
348
|
+
raise ExportDirNotEmpty, msg
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
def force_export?
|
|
353
|
+
@force_export
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
def conflicting_fs_entries
|
|
357
|
+
Dir.glob(File.join(cookbook_artifacts_dir, "*")) +
|
|
358
|
+
Dir.glob(File.join(policies_dir, "*")) +
|
|
359
|
+
Dir.glob(File.join(policy_groups_dir, "*")) +
|
|
360
|
+
Dir.glob(File.join(export_dir, "Policyfile.lock.json"))
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def cookbook_artifacts_dir
|
|
364
|
+
File.join(export_dir, "cookbook_artifacts")
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def policies_dir
|
|
368
|
+
File.join(export_dir, "policies")
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
def policy_groups_dir
|
|
372
|
+
File.join(export_dir, "policy_groups")
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
def dot_chef_dir
|
|
376
|
+
File.join(export_dir, ".chef")
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
def policyfile_repo_item_path
|
|
380
|
+
basename = "#{policyfile_lock.name}-#{policyfile_lock.revision_id}"
|
|
381
|
+
File.join(staging_dir, "policies", "#{basename}.json")
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
def policy_group_repo_item_path
|
|
385
|
+
File.join(staging_dir, "policy_groups", "local.json")
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
def dot_chef_staging_dir
|
|
389
|
+
File.join(staging_dir, ".chef")
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
def cookbook_artifacts_staging_dir
|
|
393
|
+
File.join(staging_dir, "cookbook_artifacts")
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
def policies_staging_dir
|
|
397
|
+
File.join(staging_dir, "policies")
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
def policy_groups_staging_dir
|
|
401
|
+
File.join(staging_dir, "policy_groups")
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
def lockfile_staging_path
|
|
405
|
+
File.join(staging_dir, "Policyfile.lock.json")
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
def client_rb_staging_path
|
|
409
|
+
File.join(dot_chef_staging_dir, "config.rb")
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
def readme_staging_path
|
|
413
|
+
File.join(staging_dir, "README.md")
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
end
|
|
419
|
+
end
|