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,36 +1,36 @@
|
|
|
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 "chef-dk/command/generator_commands/cookbook_code_file"
|
|
19
|
-
|
|
20
|
-
module ChefDK
|
|
21
|
-
module Command
|
|
22
|
-
module GeneratorCommands
|
|
23
|
-
# chef generate resource [path/to/cookbook_root] NAME
|
|
24
|
-
class Resource < CookbookCodeFile
|
|
25
|
-
|
|
26
|
-
banner "Usage: chef generate resource [path/to/cookbook] NAME [options]"
|
|
27
|
-
|
|
28
|
-
options.merge!(SharedGeneratorOptions.options)
|
|
29
|
-
|
|
30
|
-
def recipe
|
|
31
|
-
"resource"
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require "chef-dk/command/generator_commands/cookbook_code_file"
|
|
19
|
+
|
|
20
|
+
module ChefDK
|
|
21
|
+
module Command
|
|
22
|
+
module GeneratorCommands
|
|
23
|
+
# chef generate resource [path/to/cookbook_root] NAME
|
|
24
|
+
class Resource < CookbookCodeFile
|
|
25
|
+
|
|
26
|
+
banner "Usage: chef generate resource [path/to/cookbook] NAME [options]"
|
|
27
|
+
|
|
28
|
+
options.merge!(SharedGeneratorOptions.options)
|
|
29
|
+
|
|
30
|
+
def recipe
|
|
31
|
+
"resource"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -1,46 +1,46 @@
|
|
|
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 "chef-dk/command/generator_commands/cookbook_code_file"
|
|
19
|
-
|
|
20
|
-
module ChefDK
|
|
21
|
-
module Command
|
|
22
|
-
module GeneratorCommands
|
|
23
|
-
# chef generate template [path/to/cookbook_root] name --source=source_file
|
|
24
|
-
class Template < CookbookCodeFile
|
|
25
|
-
|
|
26
|
-
option :source,
|
|
27
|
-
:short => "-s SOURCE_FILE",
|
|
28
|
-
:long => "--source SOURCE_FILE",
|
|
29
|
-
:description => "Copy content from SOURCE_FILE"
|
|
30
|
-
|
|
31
|
-
banner "Usage: chef generate template [path/to/cookbook] NAME [options]"
|
|
32
|
-
|
|
33
|
-
options.merge!(SharedGeneratorOptions.options)
|
|
34
|
-
|
|
35
|
-
def recipe
|
|
36
|
-
"template"
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def setup_context
|
|
40
|
-
super
|
|
41
|
-
Generator.add_attr_to_context(:content_source, config[:source])
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require "chef-dk/command/generator_commands/cookbook_code_file"
|
|
19
|
+
|
|
20
|
+
module ChefDK
|
|
21
|
+
module Command
|
|
22
|
+
module GeneratorCommands
|
|
23
|
+
# chef generate template [path/to/cookbook_root] name --source=source_file
|
|
24
|
+
class Template < CookbookCodeFile
|
|
25
|
+
|
|
26
|
+
option :source,
|
|
27
|
+
:short => "-s SOURCE_FILE",
|
|
28
|
+
:long => "--source SOURCE_FILE",
|
|
29
|
+
:description => "Copy content from SOURCE_FILE"
|
|
30
|
+
|
|
31
|
+
banner "Usage: chef generate template [path/to/cookbook] NAME [options]"
|
|
32
|
+
|
|
33
|
+
options.merge!(SharedGeneratorOptions.options)
|
|
34
|
+
|
|
35
|
+
def recipe
|
|
36
|
+
"template"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def setup_context
|
|
40
|
+
super
|
|
41
|
+
Generator.add_attr_to_context(:content_source, config[:source])
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -1,120 +1,120 @@
|
|
|
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 "chef-dk/command/base"
|
|
19
|
-
require "chef-dk/ui"
|
|
20
|
-
require "chef-dk/policyfile_services/install"
|
|
21
|
-
require "chef-dk/configurable"
|
|
22
|
-
|
|
23
|
-
module ChefDK
|
|
24
|
-
module Command
|
|
25
|
-
|
|
26
|
-
class Install < Base
|
|
27
|
-
|
|
28
|
-
include Configurable
|
|
29
|
-
|
|
30
|
-
banner(<<-E)
|
|
31
|
-
Usage: chef install [ POLICY_FILE ] [options]
|
|
32
|
-
|
|
33
|
-
`chef install` evaluates a `Policyfile.rb` to find a compatible set of
|
|
34
|
-
cookbooks for the policy's run_list and caches them locally. It emits a
|
|
35
|
-
Policyfile.lock.json describing the locked cookbook set. You can use the
|
|
36
|
-
lockfile to install the locked cookbooks on another machine. You can also push
|
|
37
|
-
the lockfile to a "policy group" on a Chef Server and apply that exact set of
|
|
38
|
-
cookbooks to nodes in your infrastructure.
|
|
39
|
-
|
|
40
|
-
See our detailed README for more information:
|
|
41
|
-
|
|
42
|
-
https://docs.chef.io/policyfile.html
|
|
43
|
-
|
|
44
|
-
Options:
|
|
45
|
-
|
|
46
|
-
E
|
|
47
|
-
|
|
48
|
-
option :config_file,
|
|
49
|
-
short: "-c CONFIG_FILE",
|
|
50
|
-
long: "--config CONFIG_FILE",
|
|
51
|
-
description: "Path to configuration file"
|
|
52
|
-
|
|
53
|
-
option :debug,
|
|
54
|
-
short: "-D",
|
|
55
|
-
long: "--debug",
|
|
56
|
-
description: "Enable stacktraces and other debug output",
|
|
57
|
-
default: false
|
|
58
|
-
|
|
59
|
-
attr_reader :policyfile_relative_path
|
|
60
|
-
|
|
61
|
-
attr_accessor :ui
|
|
62
|
-
|
|
63
|
-
def initialize(*args)
|
|
64
|
-
super
|
|
65
|
-
@ui = UI.new
|
|
66
|
-
|
|
67
|
-
@policyfile_relative_path = nil
|
|
68
|
-
@installer = nil
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def run(params = [])
|
|
72
|
-
return 1 unless apply_params!(params)
|
|
73
|
-
# Force config file to be loaded. We don't use the configuration
|
|
74
|
-
# directly, but the user may have SSL configuration options that they
|
|
75
|
-
# need to talk to a private supermarket (e.g., trusted_certs or
|
|
76
|
-
# ssl_verify_mode)
|
|
77
|
-
chef_config
|
|
78
|
-
installer.run
|
|
79
|
-
0
|
|
80
|
-
rescue PolicyfileServiceError => e
|
|
81
|
-
handle_error(e)
|
|
82
|
-
1
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def installer
|
|
86
|
-
@installer ||= PolicyfileServices::Install.new(policyfile: policyfile_relative_path, ui: ui, root_dir: Dir.pwd, config: chef_config)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def debug?
|
|
90
|
-
!!config[:debug]
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def config_path
|
|
94
|
-
config[:config_file]
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def handle_error(error)
|
|
98
|
-
ui.err("Error: #{error.message}")
|
|
99
|
-
if error.respond_to?(:reason)
|
|
100
|
-
ui.err("Reason: #{error.reason}")
|
|
101
|
-
ui.err("")
|
|
102
|
-
ui.err(error.extended_error_info) if debug?
|
|
103
|
-
ui.err(error.cause.backtrace.join("\n")) if debug?
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def apply_params!(params)
|
|
108
|
-
remaining_args = parse_options(params)
|
|
109
|
-
if remaining_args.size > 1
|
|
110
|
-
ui.err(opt_parser)
|
|
111
|
-
return false
|
|
112
|
-
else
|
|
113
|
-
@policyfile_relative_path = remaining_args.first
|
|
114
|
-
true
|
|
115
|
-
end
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require "chef-dk/command/base"
|
|
19
|
+
require "chef-dk/ui"
|
|
20
|
+
require "chef-dk/policyfile_services/install"
|
|
21
|
+
require "chef-dk/configurable"
|
|
22
|
+
|
|
23
|
+
module ChefDK
|
|
24
|
+
module Command
|
|
25
|
+
|
|
26
|
+
class Install < Base
|
|
27
|
+
|
|
28
|
+
include Configurable
|
|
29
|
+
|
|
30
|
+
banner(<<-E)
|
|
31
|
+
Usage: chef install [ POLICY_FILE ] [options]
|
|
32
|
+
|
|
33
|
+
`chef install` evaluates a `Policyfile.rb` to find a compatible set of
|
|
34
|
+
cookbooks for the policy's run_list and caches them locally. It emits a
|
|
35
|
+
Policyfile.lock.json describing the locked cookbook set. You can use the
|
|
36
|
+
lockfile to install the locked cookbooks on another machine. You can also push
|
|
37
|
+
the lockfile to a "policy group" on a Chef Server and apply that exact set of
|
|
38
|
+
cookbooks to nodes in your infrastructure.
|
|
39
|
+
|
|
40
|
+
See our detailed README for more information:
|
|
41
|
+
|
|
42
|
+
https://docs.chef.io/policyfile.html
|
|
43
|
+
|
|
44
|
+
Options:
|
|
45
|
+
|
|
46
|
+
E
|
|
47
|
+
|
|
48
|
+
option :config_file,
|
|
49
|
+
short: "-c CONFIG_FILE",
|
|
50
|
+
long: "--config CONFIG_FILE",
|
|
51
|
+
description: "Path to configuration file"
|
|
52
|
+
|
|
53
|
+
option :debug,
|
|
54
|
+
short: "-D",
|
|
55
|
+
long: "--debug",
|
|
56
|
+
description: "Enable stacktraces and other debug output",
|
|
57
|
+
default: false
|
|
58
|
+
|
|
59
|
+
attr_reader :policyfile_relative_path
|
|
60
|
+
|
|
61
|
+
attr_accessor :ui
|
|
62
|
+
|
|
63
|
+
def initialize(*args)
|
|
64
|
+
super
|
|
65
|
+
@ui = UI.new
|
|
66
|
+
|
|
67
|
+
@policyfile_relative_path = nil
|
|
68
|
+
@installer = nil
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def run(params = [])
|
|
72
|
+
return 1 unless apply_params!(params)
|
|
73
|
+
# Force config file to be loaded. We don't use the configuration
|
|
74
|
+
# directly, but the user may have SSL configuration options that they
|
|
75
|
+
# need to talk to a private supermarket (e.g., trusted_certs or
|
|
76
|
+
# ssl_verify_mode)
|
|
77
|
+
chef_config
|
|
78
|
+
installer.run
|
|
79
|
+
0
|
|
80
|
+
rescue PolicyfileServiceError => e
|
|
81
|
+
handle_error(e)
|
|
82
|
+
1
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def installer
|
|
86
|
+
@installer ||= PolicyfileServices::Install.new(policyfile: policyfile_relative_path, ui: ui, root_dir: Dir.pwd, config: chef_config)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def debug?
|
|
90
|
+
!!config[:debug]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def config_path
|
|
94
|
+
config[:config_file]
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def handle_error(error)
|
|
98
|
+
ui.err("Error: #{error.message}")
|
|
99
|
+
if error.respond_to?(:reason)
|
|
100
|
+
ui.err("Reason: #{error.reason}")
|
|
101
|
+
ui.err("")
|
|
102
|
+
ui.err(error.extended_error_info) if debug?
|
|
103
|
+
ui.err(error.cause.backtrace.join("\n")) if debug?
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def apply_params!(params)
|
|
108
|
+
remaining_args = parse_options(params)
|
|
109
|
+
if remaining_args.size > 1
|
|
110
|
+
ui.err(opt_parser)
|
|
111
|
+
return false
|
|
112
|
+
else
|
|
113
|
+
@policyfile_relative_path = remaining_args.first
|
|
114
|
+
true
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -1,436 +1,436 @@
|
|
|
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 "ostruct"
|
|
19
|
-
|
|
20
|
-
require "chef-dk/command/base"
|
|
21
|
-
require "chef-dk/configurable"
|
|
22
|
-
require "chef-dk/chef_runner"
|
|
23
|
-
require "chef-dk/policyfile_services/push"
|
|
24
|
-
|
|
25
|
-
require "chef/provisioning"
|
|
26
|
-
|
|
27
|
-
module ChefDK
|
|
28
|
-
|
|
29
|
-
module ProvisioningData
|
|
30
|
-
|
|
31
|
-
def self.reset
|
|
32
|
-
@context = nil
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def self.context
|
|
36
|
-
@context ||= Context.new
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
class Context
|
|
40
|
-
|
|
41
|
-
attr_accessor :action
|
|
42
|
-
|
|
43
|
-
attr_accessor :node_name
|
|
44
|
-
|
|
45
|
-
attr_accessor :target
|
|
46
|
-
|
|
47
|
-
attr_accessor :enable_policyfile
|
|
48
|
-
|
|
49
|
-
attr_accessor :policy_group
|
|
50
|
-
|
|
51
|
-
attr_accessor :policy_name
|
|
52
|
-
|
|
53
|
-
attr_accessor :extra_chef_config
|
|
54
|
-
|
|
55
|
-
attr_accessor :opts
|
|
56
|
-
|
|
57
|
-
def initialize
|
|
58
|
-
@extra_chef_config = ""
|
|
59
|
-
@opts = nil
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def set_user_opts(hash)
|
|
63
|
-
@opts = OpenStruct.new(hash)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def convergence_options
|
|
67
|
-
{
|
|
68
|
-
chef_server: Chef::Config.chef_server_url,
|
|
69
|
-
chef_config: chef_config,
|
|
70
|
-
}
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def chef_config
|
|
74
|
-
config = <<-CONFIG
|
|
75
|
-
# SSL Settings:
|
|
76
|
-
ssl_verify_mode #{Chef::Config.ssl_verify_mode.inspect}
|
|
77
|
-
|
|
78
|
-
CONFIG
|
|
79
|
-
if enable_policyfile
|
|
80
|
-
policyfile_config = <<-CONFIG
|
|
81
|
-
# Policyfile Settings:
|
|
82
|
-
use_policyfile true
|
|
83
|
-
policy_document_native_api true
|
|
84
|
-
|
|
85
|
-
policy_group "#{policy_group}"
|
|
86
|
-
policy_name "#{policy_name}"
|
|
87
|
-
|
|
88
|
-
CONFIG
|
|
89
|
-
config << policyfile_config
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
config << extra_chef_config.to_s
|
|
93
|
-
config
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
module Command
|
|
100
|
-
|
|
101
|
-
class Provision < Base
|
|
102
|
-
|
|
103
|
-
banner(<<-E)
|
|
104
|
-
Usage: chef provision POLICY_GROUP --policy-name POLICY_NAME [options]
|
|
105
|
-
chef provision POLICY_GROUP --sync [POLICYFILE_PATH] [options]
|
|
106
|
-
chef provision --no-policy [options]
|
|
107
|
-
|
|
108
|
-
`chef provision` invokes an embedded chef-client run to provision machines
|
|
109
|
-
using Chef Provisioning. If not otherwise specified, `chef provision` will
|
|
110
|
-
expect to find a cookbook named 'provision' in the current working directory.
|
|
111
|
-
It runs a recipe in this cookbook which should use Chef Provisioning to create
|
|
112
|
-
one or more machines (or other infrastructure).
|
|
113
|
-
|
|
114
|
-
`chef provision` provides three forms of operation:
|
|
115
|
-
|
|
116
|
-
### chef provision POLICY_GROUP --policy-name POLICY_NAME
|
|
117
|
-
|
|
118
|
-
In the first form of the command, `chef provision` creates machines that will
|
|
119
|
-
operate in policyfile mode. The chef configuration passed to the cookbook will
|
|
120
|
-
set the policy group and policy name as given.
|
|
121
|
-
|
|
122
|
-
### chef provision POLICY_GROUP --sync [POLICYFILE_PATH] [options]
|
|
123
|
-
|
|
124
|
-
In the second form of the command, `chef provision` create machines that will
|
|
125
|
-
operate in policyfile mode and syncronizes a local policyfile to the server
|
|
126
|
-
before converging the machine(s) defined in the provision cookbook.
|
|
127
|
-
|
|
128
|
-
### chef provision --no-policy [options]
|
|
129
|
-
|
|
130
|
-
In the third form of the command, `chef provision` expects to create machines
|
|
131
|
-
that will not operate in policyfile mode.
|
|
132
|
-
|
|
133
|
-
Chef Provisioning is documented at https://docs.chef.io/provisioning.html
|
|
134
|
-
|
|
135
|
-
Options:
|
|
136
|
-
|
|
137
|
-
E
|
|
138
|
-
include Configurable
|
|
139
|
-
|
|
140
|
-
option :config_file,
|
|
141
|
-
short: "-c CONFIG_FILE",
|
|
142
|
-
long: "--config CONFIG_FILE",
|
|
143
|
-
description: "Path to configuration file"
|
|
144
|
-
|
|
145
|
-
option :policy_name,
|
|
146
|
-
short: "-p POLICY_NAME",
|
|
147
|
-
long: "--policy-name POLICY_NAME",
|
|
148
|
-
description: "Set the default policy name for provisioned machines"
|
|
149
|
-
|
|
150
|
-
option :sync,
|
|
151
|
-
short: "-s [POLICYFILE_PATH]",
|
|
152
|
-
long: "--sync [POLICYFILE_PATH]",
|
|
153
|
-
description: "Push policyfile to the server before converging node(s)"
|
|
154
|
-
|
|
155
|
-
option :enable_policyfile,
|
|
156
|
-
long: "--[no-]policy",
|
|
157
|
-
description: "Enable/disable policyfile integration (defaults to enabled, use --no-policy to disable)",
|
|
158
|
-
default: true
|
|
159
|
-
|
|
160
|
-
option :destroy,
|
|
161
|
-
short: "-d",
|
|
162
|
-
long: "--destroy",
|
|
163
|
-
description: "Set default machine action to :destroy",
|
|
164
|
-
default: false,
|
|
165
|
-
boolean: true
|
|
166
|
-
|
|
167
|
-
option :machine_recipe,
|
|
168
|
-
short: "-r RECIPE",
|
|
169
|
-
long: "--recipe RECIPE",
|
|
170
|
-
description: "Machine recipe to use",
|
|
171
|
-
default: "default"
|
|
172
|
-
|
|
173
|
-
option :cookbook,
|
|
174
|
-
long: "--cookbook COOKBOOK_PATH",
|
|
175
|
-
description: "Path to your provisioning cookbook",
|
|
176
|
-
default: "./provision"
|
|
177
|
-
|
|
178
|
-
option :node_name,
|
|
179
|
-
short: "-n NODE_NAME",
|
|
180
|
-
long: "--node-name NODE_NAME",
|
|
181
|
-
description: "Set default node name (may be overriden by provisioning cookbook)"
|
|
182
|
-
|
|
183
|
-
option :target,
|
|
184
|
-
short: "-t REMOTE_HOST",
|
|
185
|
-
long: "--target REMOTE_HOST",
|
|
186
|
-
description: "Set hostname or IP of the host to converge (may be overriden by provisioning cookbook)"
|
|
187
|
-
|
|
188
|
-
OPT_SEPARATOR = /[=\s]+/
|
|
189
|
-
|
|
190
|
-
def self.split_opt(key_value)
|
|
191
|
-
key, _separator, value = key_value.partition(OPT_SEPARATOR)
|
|
192
|
-
[key, value]
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
opts = {}
|
|
196
|
-
|
|
197
|
-
option :opts,
|
|
198
|
-
short: "-o OPT=VALUE",
|
|
199
|
-
long: "--opt OPT=VALUE",
|
|
200
|
-
description: "Set arbitrary option OPT on the provisioning context",
|
|
201
|
-
proc: lambda { |arg| key, value = split_opt(arg); opts[key] = value; opts },
|
|
202
|
-
default: {}
|
|
203
|
-
|
|
204
|
-
option :debug,
|
|
205
|
-
short: "-D",
|
|
206
|
-
long: "--debug",
|
|
207
|
-
description: "Enable stacktraces and other debug output",
|
|
208
|
-
default: false
|
|
209
|
-
|
|
210
|
-
attr_reader :params
|
|
211
|
-
attr_reader :policyfile_relative_path
|
|
212
|
-
attr_reader :policy_group
|
|
213
|
-
|
|
214
|
-
attr_accessor :ui
|
|
215
|
-
|
|
216
|
-
def initialize(*args)
|
|
217
|
-
super
|
|
218
|
-
|
|
219
|
-
@ui = UI.new
|
|
220
|
-
|
|
221
|
-
@policyfile_relative_path = nil
|
|
222
|
-
@policy_group = nil
|
|
223
|
-
|
|
224
|
-
@provisioning_cookbook_path = nil
|
|
225
|
-
@provisioning_cookbook_name = nil
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
def run(params = [])
|
|
229
|
-
return 1 unless apply_params!(params)
|
|
230
|
-
chef_config # force chef config to load
|
|
231
|
-
return 1 unless check_cookbook_and_recipe_path
|
|
232
|
-
|
|
233
|
-
push.run if sync_policy?
|
|
234
|
-
|
|
235
|
-
setup_context
|
|
236
|
-
|
|
237
|
-
chef_runner.converge
|
|
238
|
-
0
|
|
239
|
-
rescue ChefRunnerError, PolicyfileServiceError => e
|
|
240
|
-
handle_error(e)
|
|
241
|
-
1
|
|
242
|
-
# Chef Provisioning doesn't fail gracefully when a driver is missing:
|
|
243
|
-
# https://github.com/chef/chef-provisioning/issues/338
|
|
244
|
-
rescue StandardError, LoadError => error
|
|
245
|
-
ui.err("Error: #{error.message}")
|
|
246
|
-
1
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
# An instance of ChefRunner. Calling ChefRunner#converge will trigger
|
|
250
|
-
# convergence and generate the desired code.
|
|
251
|
-
def chef_runner
|
|
252
|
-
@chef_runner ||= ChefRunner.new(provisioning_cookbook_path, ["recipe[#{provisioning_cookbook_name}::#{recipe}]"])
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
def push
|
|
256
|
-
@push ||= PolicyfileServices::Push.new(policyfile: policyfile_relative_path,
|
|
257
|
-
ui: ui,
|
|
258
|
-
policy_group: policy_group,
|
|
259
|
-
config: chef_config,
|
|
260
|
-
root_dir: Dir.pwd)
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
def setup_context
|
|
264
|
-
ProvisioningData.context.tap do |c|
|
|
265
|
-
|
|
266
|
-
c.action = default_action
|
|
267
|
-
c.node_name = node_name
|
|
268
|
-
c.target = target
|
|
269
|
-
|
|
270
|
-
c.set_user_opts(user_opts)
|
|
271
|
-
|
|
272
|
-
c.enable_policyfile = enable_policyfile?
|
|
273
|
-
|
|
274
|
-
if enable_policyfile?
|
|
275
|
-
c.policy_group = policy_group
|
|
276
|
-
c.policy_name = policy_name
|
|
277
|
-
end
|
|
278
|
-
|
|
279
|
-
end
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
def policy_name
|
|
283
|
-
if sync_policy?
|
|
284
|
-
push.policy_data["name"]
|
|
285
|
-
else
|
|
286
|
-
config[:policy_name]
|
|
287
|
-
end
|
|
288
|
-
end
|
|
289
|
-
|
|
290
|
-
def default_action
|
|
291
|
-
if config[:destroy]
|
|
292
|
-
:destroy
|
|
293
|
-
else
|
|
294
|
-
:converge
|
|
295
|
-
end
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
def node_name
|
|
299
|
-
config[:node_name]
|
|
300
|
-
end
|
|
301
|
-
|
|
302
|
-
def target
|
|
303
|
-
config[:target]
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
def user_opts
|
|
307
|
-
config[:opts]
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
def recipe
|
|
311
|
-
config[:machine_recipe]
|
|
312
|
-
end
|
|
313
|
-
|
|
314
|
-
# Gives the `cookbook_path` in the chef-client sense, which is the
|
|
315
|
-
# directory that contains the provisioning cookbook.
|
|
316
|
-
def provisioning_cookbook_path
|
|
317
|
-
detect_provisioning_cookbook_name_and_path! unless @provisioning_cookbook_path
|
|
318
|
-
@provisioning_cookbook_path
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
# The name of the provisioning cookbook
|
|
322
|
-
def provisioning_cookbook_name
|
|
323
|
-
detect_provisioning_cookbook_name_and_path! unless @provisioning_cookbook_name
|
|
324
|
-
@provisioning_cookbook_name
|
|
325
|
-
end
|
|
326
|
-
|
|
327
|
-
def cookbook_path
|
|
328
|
-
config[:cookbook]
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
def enable_policyfile?
|
|
332
|
-
config[:enable_policyfile]
|
|
333
|
-
end
|
|
334
|
-
|
|
335
|
-
def apply_params!(params)
|
|
336
|
-
remaining_args = parse_options(params)
|
|
337
|
-
if enable_policyfile?
|
|
338
|
-
handle_policy_argv(remaining_args)
|
|
339
|
-
else
|
|
340
|
-
handle_no_policy_argv(remaining_args)
|
|
341
|
-
end
|
|
342
|
-
end
|
|
343
|
-
|
|
344
|
-
def debug?
|
|
345
|
-
!!config[:debug]
|
|
346
|
-
end
|
|
347
|
-
|
|
348
|
-
def sync_policy?
|
|
349
|
-
config.key?(:sync)
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
private
|
|
353
|
-
|
|
354
|
-
def detect_provisioning_cookbook_name_and_path!
|
|
355
|
-
given_path = File.expand_path(cookbook_path, Dir.pwd)
|
|
356
|
-
@provisioning_cookbook_name = File.basename(given_path)
|
|
357
|
-
@provisioning_cookbook_path = File.dirname(given_path)
|
|
358
|
-
end
|
|
359
|
-
|
|
360
|
-
def check_cookbook_and_recipe_path
|
|
361
|
-
if !File.exist?(cookbook_expanded_path)
|
|
362
|
-
ui.err("ERROR: Provisioning cookbook not found at path #{cookbook_expanded_path}")
|
|
363
|
-
false
|
|
364
|
-
elsif !File.exist?(provisioning_recipe_path)
|
|
365
|
-
ui.err("ERROR: Provisioning recipe not found at path #{provisioning_recipe_path}")
|
|
366
|
-
false
|
|
367
|
-
else
|
|
368
|
-
true
|
|
369
|
-
end
|
|
370
|
-
end
|
|
371
|
-
|
|
372
|
-
def provisioning_recipe_path
|
|
373
|
-
File.join(cookbook_expanded_path, "recipes", "#{recipe}.rb")
|
|
374
|
-
end
|
|
375
|
-
|
|
376
|
-
def cookbook_expanded_path
|
|
377
|
-
File.join(chef_runner.cookbook_path, provisioning_cookbook_name)
|
|
378
|
-
end
|
|
379
|
-
|
|
380
|
-
def handle_no_policy_argv(remaining_args)
|
|
381
|
-
if remaining_args.empty?
|
|
382
|
-
true
|
|
383
|
-
else
|
|
384
|
-
ui.err("The --no-policy flag cannot be combined with policyfile arguments")
|
|
385
|
-
ui.err("")
|
|
386
|
-
ui.err(opt_parser)
|
|
387
|
-
false
|
|
388
|
-
end
|
|
389
|
-
end
|
|
390
|
-
|
|
391
|
-
def handle_policy_argv(remaining_args)
|
|
392
|
-
if remaining_args.size > 1
|
|
393
|
-
ui.err("Too many arguments")
|
|
394
|
-
ui.err("")
|
|
395
|
-
ui.err(opt_parser)
|
|
396
|
-
false
|
|
397
|
-
elsif remaining_args.size < 1
|
|
398
|
-
ui.err("You must specify a POLICY_GROUP or disable policyfiles with --no-policy")
|
|
399
|
-
ui.err("")
|
|
400
|
-
ui.err(opt_parser)
|
|
401
|
-
false
|
|
402
|
-
elsif !sync_policy? && config[:policy_name].nil?
|
|
403
|
-
ui.err("You must pass either --sync or --policy-name to provision machines in policyfile mode")
|
|
404
|
-
ui.err("")
|
|
405
|
-
ui.err(opt_parser)
|
|
406
|
-
false
|
|
407
|
-
elsif sync_policy? && config[:policy_name]
|
|
408
|
-
ui.err("The --policy-name and --sync arguments cannot be combined")
|
|
409
|
-
ui.err("")
|
|
410
|
-
ui.err(opt_parser)
|
|
411
|
-
false
|
|
412
|
-
elsif sync_policy?
|
|
413
|
-
@policy_group = remaining_args[0]
|
|
414
|
-
@policyfile_relative_path = config[:sync]
|
|
415
|
-
true
|
|
416
|
-
elsif config[:policy_name]
|
|
417
|
-
@policy_group = remaining_args[0]
|
|
418
|
-
true
|
|
419
|
-
else
|
|
420
|
-
raise BUG, "Cannot properly parse input argv '#{ARGV.inspect}'"
|
|
421
|
-
end
|
|
422
|
-
end
|
|
423
|
-
|
|
424
|
-
def handle_error(error)
|
|
425
|
-
ui.err("Error: #{error.message}")
|
|
426
|
-
if error.respond_to?(:reason)
|
|
427
|
-
ui.err("Reason: #{error.reason}")
|
|
428
|
-
ui.err("")
|
|
429
|
-
ui.err(error.extended_error_info) if debug?
|
|
430
|
-
ui.err(error.cause.backtrace.join("\n")) if debug?
|
|
431
|
-
end
|
|
432
|
-
end
|
|
433
|
-
|
|
434
|
-
end
|
|
435
|
-
end
|
|
436
|
-
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 "ostruct"
|
|
19
|
+
|
|
20
|
+
require "chef-dk/command/base"
|
|
21
|
+
require "chef-dk/configurable"
|
|
22
|
+
require "chef-dk/chef_runner"
|
|
23
|
+
require "chef-dk/policyfile_services/push"
|
|
24
|
+
|
|
25
|
+
require "chef/provisioning"
|
|
26
|
+
|
|
27
|
+
module ChefDK
|
|
28
|
+
|
|
29
|
+
module ProvisioningData
|
|
30
|
+
|
|
31
|
+
def self.reset
|
|
32
|
+
@context = nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.context
|
|
36
|
+
@context ||= Context.new
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class Context
|
|
40
|
+
|
|
41
|
+
attr_accessor :action
|
|
42
|
+
|
|
43
|
+
attr_accessor :node_name
|
|
44
|
+
|
|
45
|
+
attr_accessor :target
|
|
46
|
+
|
|
47
|
+
attr_accessor :enable_policyfile
|
|
48
|
+
|
|
49
|
+
attr_accessor :policy_group
|
|
50
|
+
|
|
51
|
+
attr_accessor :policy_name
|
|
52
|
+
|
|
53
|
+
attr_accessor :extra_chef_config
|
|
54
|
+
|
|
55
|
+
attr_accessor :opts
|
|
56
|
+
|
|
57
|
+
def initialize
|
|
58
|
+
@extra_chef_config = ""
|
|
59
|
+
@opts = nil
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def set_user_opts(hash)
|
|
63
|
+
@opts = OpenStruct.new(hash)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def convergence_options
|
|
67
|
+
{
|
|
68
|
+
chef_server: Chef::Config.chef_server_url,
|
|
69
|
+
chef_config: chef_config,
|
|
70
|
+
}
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def chef_config
|
|
74
|
+
config = <<-CONFIG
|
|
75
|
+
# SSL Settings:
|
|
76
|
+
ssl_verify_mode #{Chef::Config.ssl_verify_mode.inspect}
|
|
77
|
+
|
|
78
|
+
CONFIG
|
|
79
|
+
if enable_policyfile
|
|
80
|
+
policyfile_config = <<-CONFIG
|
|
81
|
+
# Policyfile Settings:
|
|
82
|
+
use_policyfile true
|
|
83
|
+
policy_document_native_api true
|
|
84
|
+
|
|
85
|
+
policy_group "#{policy_group}"
|
|
86
|
+
policy_name "#{policy_name}"
|
|
87
|
+
|
|
88
|
+
CONFIG
|
|
89
|
+
config << policyfile_config
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
config << extra_chef_config.to_s
|
|
93
|
+
config
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
module Command
|
|
100
|
+
|
|
101
|
+
class Provision < Base
|
|
102
|
+
|
|
103
|
+
banner(<<-E)
|
|
104
|
+
Usage: chef provision POLICY_GROUP --policy-name POLICY_NAME [options]
|
|
105
|
+
chef provision POLICY_GROUP --sync [POLICYFILE_PATH] [options]
|
|
106
|
+
chef provision --no-policy [options]
|
|
107
|
+
|
|
108
|
+
`chef provision` invokes an embedded chef-client run to provision machines
|
|
109
|
+
using Chef Provisioning. If not otherwise specified, `chef provision` will
|
|
110
|
+
expect to find a cookbook named 'provision' in the current working directory.
|
|
111
|
+
It runs a recipe in this cookbook which should use Chef Provisioning to create
|
|
112
|
+
one or more machines (or other infrastructure).
|
|
113
|
+
|
|
114
|
+
`chef provision` provides three forms of operation:
|
|
115
|
+
|
|
116
|
+
### chef provision POLICY_GROUP --policy-name POLICY_NAME
|
|
117
|
+
|
|
118
|
+
In the first form of the command, `chef provision` creates machines that will
|
|
119
|
+
operate in policyfile mode. The chef configuration passed to the cookbook will
|
|
120
|
+
set the policy group and policy name as given.
|
|
121
|
+
|
|
122
|
+
### chef provision POLICY_GROUP --sync [POLICYFILE_PATH] [options]
|
|
123
|
+
|
|
124
|
+
In the second form of the command, `chef provision` create machines that will
|
|
125
|
+
operate in policyfile mode and syncronizes a local policyfile to the server
|
|
126
|
+
before converging the machine(s) defined in the provision cookbook.
|
|
127
|
+
|
|
128
|
+
### chef provision --no-policy [options]
|
|
129
|
+
|
|
130
|
+
In the third form of the command, `chef provision` expects to create machines
|
|
131
|
+
that will not operate in policyfile mode.
|
|
132
|
+
|
|
133
|
+
Chef Provisioning is documented at https://docs.chef.io/provisioning.html
|
|
134
|
+
|
|
135
|
+
Options:
|
|
136
|
+
|
|
137
|
+
E
|
|
138
|
+
include Configurable
|
|
139
|
+
|
|
140
|
+
option :config_file,
|
|
141
|
+
short: "-c CONFIG_FILE",
|
|
142
|
+
long: "--config CONFIG_FILE",
|
|
143
|
+
description: "Path to configuration file"
|
|
144
|
+
|
|
145
|
+
option :policy_name,
|
|
146
|
+
short: "-p POLICY_NAME",
|
|
147
|
+
long: "--policy-name POLICY_NAME",
|
|
148
|
+
description: "Set the default policy name for provisioned machines"
|
|
149
|
+
|
|
150
|
+
option :sync,
|
|
151
|
+
short: "-s [POLICYFILE_PATH]",
|
|
152
|
+
long: "--sync [POLICYFILE_PATH]",
|
|
153
|
+
description: "Push policyfile to the server before converging node(s)"
|
|
154
|
+
|
|
155
|
+
option :enable_policyfile,
|
|
156
|
+
long: "--[no-]policy",
|
|
157
|
+
description: "Enable/disable policyfile integration (defaults to enabled, use --no-policy to disable)",
|
|
158
|
+
default: true
|
|
159
|
+
|
|
160
|
+
option :destroy,
|
|
161
|
+
short: "-d",
|
|
162
|
+
long: "--destroy",
|
|
163
|
+
description: "Set default machine action to :destroy",
|
|
164
|
+
default: false,
|
|
165
|
+
boolean: true
|
|
166
|
+
|
|
167
|
+
option :machine_recipe,
|
|
168
|
+
short: "-r RECIPE",
|
|
169
|
+
long: "--recipe RECIPE",
|
|
170
|
+
description: "Machine recipe to use",
|
|
171
|
+
default: "default"
|
|
172
|
+
|
|
173
|
+
option :cookbook,
|
|
174
|
+
long: "--cookbook COOKBOOK_PATH",
|
|
175
|
+
description: "Path to your provisioning cookbook",
|
|
176
|
+
default: "./provision"
|
|
177
|
+
|
|
178
|
+
option :node_name,
|
|
179
|
+
short: "-n NODE_NAME",
|
|
180
|
+
long: "--node-name NODE_NAME",
|
|
181
|
+
description: "Set default node name (may be overriden by provisioning cookbook)"
|
|
182
|
+
|
|
183
|
+
option :target,
|
|
184
|
+
short: "-t REMOTE_HOST",
|
|
185
|
+
long: "--target REMOTE_HOST",
|
|
186
|
+
description: "Set hostname or IP of the host to converge (may be overriden by provisioning cookbook)"
|
|
187
|
+
|
|
188
|
+
OPT_SEPARATOR = /[=\s]+/
|
|
189
|
+
|
|
190
|
+
def self.split_opt(key_value)
|
|
191
|
+
key, _separator, value = key_value.partition(OPT_SEPARATOR)
|
|
192
|
+
[key, value]
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
opts = {}
|
|
196
|
+
|
|
197
|
+
option :opts,
|
|
198
|
+
short: "-o OPT=VALUE",
|
|
199
|
+
long: "--opt OPT=VALUE",
|
|
200
|
+
description: "Set arbitrary option OPT on the provisioning context",
|
|
201
|
+
proc: lambda { |arg| key, value = split_opt(arg); opts[key] = value; opts },
|
|
202
|
+
default: {}
|
|
203
|
+
|
|
204
|
+
option :debug,
|
|
205
|
+
short: "-D",
|
|
206
|
+
long: "--debug",
|
|
207
|
+
description: "Enable stacktraces and other debug output",
|
|
208
|
+
default: false
|
|
209
|
+
|
|
210
|
+
attr_reader :params
|
|
211
|
+
attr_reader :policyfile_relative_path
|
|
212
|
+
attr_reader :policy_group
|
|
213
|
+
|
|
214
|
+
attr_accessor :ui
|
|
215
|
+
|
|
216
|
+
def initialize(*args)
|
|
217
|
+
super
|
|
218
|
+
|
|
219
|
+
@ui = UI.new
|
|
220
|
+
|
|
221
|
+
@policyfile_relative_path = nil
|
|
222
|
+
@policy_group = nil
|
|
223
|
+
|
|
224
|
+
@provisioning_cookbook_path = nil
|
|
225
|
+
@provisioning_cookbook_name = nil
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def run(params = [])
|
|
229
|
+
return 1 unless apply_params!(params)
|
|
230
|
+
chef_config # force chef config to load
|
|
231
|
+
return 1 unless check_cookbook_and_recipe_path
|
|
232
|
+
|
|
233
|
+
push.run if sync_policy?
|
|
234
|
+
|
|
235
|
+
setup_context
|
|
236
|
+
|
|
237
|
+
chef_runner.converge
|
|
238
|
+
0
|
|
239
|
+
rescue ChefRunnerError, PolicyfileServiceError => e
|
|
240
|
+
handle_error(e)
|
|
241
|
+
1
|
|
242
|
+
# Chef Provisioning doesn't fail gracefully when a driver is missing:
|
|
243
|
+
# https://github.com/chef/chef-provisioning/issues/338
|
|
244
|
+
rescue StandardError, LoadError => error
|
|
245
|
+
ui.err("Error: #{error.message}")
|
|
246
|
+
1
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# An instance of ChefRunner. Calling ChefRunner#converge will trigger
|
|
250
|
+
# convergence and generate the desired code.
|
|
251
|
+
def chef_runner
|
|
252
|
+
@chef_runner ||= ChefRunner.new(provisioning_cookbook_path, ["recipe[#{provisioning_cookbook_name}::#{recipe}]"])
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def push
|
|
256
|
+
@push ||= PolicyfileServices::Push.new(policyfile: policyfile_relative_path,
|
|
257
|
+
ui: ui,
|
|
258
|
+
policy_group: policy_group,
|
|
259
|
+
config: chef_config,
|
|
260
|
+
root_dir: Dir.pwd)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def setup_context
|
|
264
|
+
ProvisioningData.context.tap do |c|
|
|
265
|
+
|
|
266
|
+
c.action = default_action
|
|
267
|
+
c.node_name = node_name
|
|
268
|
+
c.target = target
|
|
269
|
+
|
|
270
|
+
c.set_user_opts(user_opts)
|
|
271
|
+
|
|
272
|
+
c.enable_policyfile = enable_policyfile?
|
|
273
|
+
|
|
274
|
+
if enable_policyfile?
|
|
275
|
+
c.policy_group = policy_group
|
|
276
|
+
c.policy_name = policy_name
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
def policy_name
|
|
283
|
+
if sync_policy?
|
|
284
|
+
push.policy_data["name"]
|
|
285
|
+
else
|
|
286
|
+
config[:policy_name]
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def default_action
|
|
291
|
+
if config[:destroy]
|
|
292
|
+
:destroy
|
|
293
|
+
else
|
|
294
|
+
:converge
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def node_name
|
|
299
|
+
config[:node_name]
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def target
|
|
303
|
+
config[:target]
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def user_opts
|
|
307
|
+
config[:opts]
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def recipe
|
|
311
|
+
config[:machine_recipe]
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
# Gives the `cookbook_path` in the chef-client sense, which is the
|
|
315
|
+
# directory that contains the provisioning cookbook.
|
|
316
|
+
def provisioning_cookbook_path
|
|
317
|
+
detect_provisioning_cookbook_name_and_path! unless @provisioning_cookbook_path
|
|
318
|
+
@provisioning_cookbook_path
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
# The name of the provisioning cookbook
|
|
322
|
+
def provisioning_cookbook_name
|
|
323
|
+
detect_provisioning_cookbook_name_and_path! unless @provisioning_cookbook_name
|
|
324
|
+
@provisioning_cookbook_name
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def cookbook_path
|
|
328
|
+
config[:cookbook]
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def enable_policyfile?
|
|
332
|
+
config[:enable_policyfile]
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def apply_params!(params)
|
|
336
|
+
remaining_args = parse_options(params)
|
|
337
|
+
if enable_policyfile?
|
|
338
|
+
handle_policy_argv(remaining_args)
|
|
339
|
+
else
|
|
340
|
+
handle_no_policy_argv(remaining_args)
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def debug?
|
|
345
|
+
!!config[:debug]
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
def sync_policy?
|
|
349
|
+
config.key?(:sync)
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
private
|
|
353
|
+
|
|
354
|
+
def detect_provisioning_cookbook_name_and_path!
|
|
355
|
+
given_path = File.expand_path(cookbook_path, Dir.pwd)
|
|
356
|
+
@provisioning_cookbook_name = File.basename(given_path)
|
|
357
|
+
@provisioning_cookbook_path = File.dirname(given_path)
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
def check_cookbook_and_recipe_path
|
|
361
|
+
if !File.exist?(cookbook_expanded_path)
|
|
362
|
+
ui.err("ERROR: Provisioning cookbook not found at path #{cookbook_expanded_path}")
|
|
363
|
+
false
|
|
364
|
+
elsif !File.exist?(provisioning_recipe_path)
|
|
365
|
+
ui.err("ERROR: Provisioning recipe not found at path #{provisioning_recipe_path}")
|
|
366
|
+
false
|
|
367
|
+
else
|
|
368
|
+
true
|
|
369
|
+
end
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
def provisioning_recipe_path
|
|
373
|
+
File.join(cookbook_expanded_path, "recipes", "#{recipe}.rb")
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
def cookbook_expanded_path
|
|
377
|
+
File.join(chef_runner.cookbook_path, provisioning_cookbook_name)
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
def handle_no_policy_argv(remaining_args)
|
|
381
|
+
if remaining_args.empty?
|
|
382
|
+
true
|
|
383
|
+
else
|
|
384
|
+
ui.err("The --no-policy flag cannot be combined with policyfile arguments")
|
|
385
|
+
ui.err("")
|
|
386
|
+
ui.err(opt_parser)
|
|
387
|
+
false
|
|
388
|
+
end
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
def handle_policy_argv(remaining_args)
|
|
392
|
+
if remaining_args.size > 1
|
|
393
|
+
ui.err("Too many arguments")
|
|
394
|
+
ui.err("")
|
|
395
|
+
ui.err(opt_parser)
|
|
396
|
+
false
|
|
397
|
+
elsif remaining_args.size < 1
|
|
398
|
+
ui.err("You must specify a POLICY_GROUP or disable policyfiles with --no-policy")
|
|
399
|
+
ui.err("")
|
|
400
|
+
ui.err(opt_parser)
|
|
401
|
+
false
|
|
402
|
+
elsif !sync_policy? && config[:policy_name].nil?
|
|
403
|
+
ui.err("You must pass either --sync or --policy-name to provision machines in policyfile mode")
|
|
404
|
+
ui.err("")
|
|
405
|
+
ui.err(opt_parser)
|
|
406
|
+
false
|
|
407
|
+
elsif sync_policy? && config[:policy_name]
|
|
408
|
+
ui.err("The --policy-name and --sync arguments cannot be combined")
|
|
409
|
+
ui.err("")
|
|
410
|
+
ui.err(opt_parser)
|
|
411
|
+
false
|
|
412
|
+
elsif sync_policy?
|
|
413
|
+
@policy_group = remaining_args[0]
|
|
414
|
+
@policyfile_relative_path = config[:sync]
|
|
415
|
+
true
|
|
416
|
+
elsif config[:policy_name]
|
|
417
|
+
@policy_group = remaining_args[0]
|
|
418
|
+
true
|
|
419
|
+
else
|
|
420
|
+
raise BUG, "Cannot properly parse input argv '#{ARGV.inspect}'"
|
|
421
|
+
end
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
def handle_error(error)
|
|
425
|
+
ui.err("Error: #{error.message}")
|
|
426
|
+
if error.respond_to?(:reason)
|
|
427
|
+
ui.err("Reason: #{error.reason}")
|
|
428
|
+
ui.err("")
|
|
429
|
+
ui.err(error.extended_error_info) if debug?
|
|
430
|
+
ui.err(error.cause.backtrace.join("\n")) if debug?
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
end
|
|
435
|
+
end
|
|
436
|
+
end
|