class ChefCLI::Command::GeneratorCommands::Cookbook
the relevant generators.
omitted, the user is expected to add additional files as needed using
Generates a basic cookbook directory structure. Most file types are
chef generate cookbook path/to/basename –generator-cookbook=path/to/generator
## CookbookFile
def cookbook_full_path
def cookbook_full_path File.expand_path(cookbook_name_or_path, Dir.pwd) end
def cookbook_name
def cookbook_name File.basename(cookbook_full_path) end
def cookbook_path_in_git_repo?
def cookbook_path_in_git_repo? Pathname.new(cookbook_full_path).ascend do |dir| return true if File.directory?(File.join(dir.to_s, ".git")) end false end
def cookbook_root
def cookbook_root File.dirname(cookbook_full_path) end
def create_vscode_dir?
def create_vscode_dir? ::File.exist?("/Applications/Visual Studio Code.app") || ::File.exist?("#{ENV["APPDATA"]}\\Code") end
def emit_post_create_message
def emit_post_create_message if have_delivery_config? msg("Your cookbook is ready. To setup the pipeline, type `cd #{cookbook_name_or_path}`, then run `delivery init`") else msg("Your cookbook is ready. Type `cd #{cookbook_name_or_path}` to enter it.") msg("\nThere are several commands you can run to get started locally developing and testing your cookbook.") msg("Type `delivery local --help` to see a full list of local testing commands.") msg("\nWhy not start by writing an InSpec test? Tests for the default recipe are stored at:\n") msg("test/integration/default/default_test.rb") msg("\nIf you'd prefer to dive right in, the default recipe can be found at:") msg("\nrecipes/default.rb\n") end end
def enable_workflow?
def enable_workflow? config[:workflow] end
def have_delivery_config?
-
(Boolean)
-
def have_delivery_config? # delivery-cli's logic is to look recursively upward for # .delivery/cli.toml starting from pwd: # https://github.com/chef/delivery-cli/blob/22cbef3987ebd0aee98405b7e161a100edc87e49/src/delivery/config/mod.rs#L225-L247 Pathname.pwd.ascend.any? { |path| path.join(".delivery/cli.toml").exist? } end
def initialize(params)
def initialize(params) @params_valid = true @cookbook_name = nil @policy_mode = true @verbose = false super end
def kitchen
def kitchen config[:kitchen] end
def params_valid?
def params_valid? @params_valid end
def pipeline
def pipeline config[:pipeline] end
def policy_mode?
def policy_mode? @policy_mode end
def policy_name
def policy_name cookbook_name end
def policy_run_list
def policy_run_list "#{cookbook_name}::#{recipe_name}" end
def read_and_validate_params
def read_and_validate_params arguments = parse_options(params) @cookbook_name_or_path = arguments[0] if !@cookbook_name_or_path @params_valid = false elsif File.basename(@cookbook_name_or_path).include?("-") msg("Hyphens are discouraged in cookbook names as they may cause problems with custom resources. See https://docs.chef.io/workstation/ctl_chef/#chef-generate-cookbook for more information.") end if config[:berks] && config[:policy] err("Berkshelf and Policyfiles are mutually exclusive. Please specify only one.") @params_valid = false end if config[:berks] @policy_mode = false end if config[:verbose] @verbose = true end true end
def recipe
def recipe "cookbook" end
def recipe_name
def recipe_name "default" end
def run
def run read_and_validate_params if params_valid? setup_context msg("Generating cookbook #{cookbook_name}") chef_runner.converge msg("") emit_post_create_message 0 else err(opt_parser) 1 end rescue ChefCLI::ChefRunnerError => e err("ERROR: #{e}") 1 end
def setup_context
def setup_context super Generator.add_attr_to_context(:skip_git_init, cookbook_path_in_git_repo?) Generator.add_attr_to_context(:cookbook_root, cookbook_root) Generator.add_attr_to_context(:cookbook_name, cookbook_name) Generator.add_attr_to_context(:recipe_name, recipe_name) Generator.add_attr_to_context(:include_chef_repo_source, false) Generator.add_attr_to_context(:policy_name, policy_name) Generator.add_attr_to_context(:policy_run_list, policy_run_list) Generator.add_attr_to_context(:policy_local_cookbook, ".") Generator.add_attr_to_context(:enable_workflow, enable_workflow?) Generator.add_attr_to_context(:workflow_project_dir, cookbook_full_path) Generator.add_attr_to_context(:build_cookbook_parent_is_cookbook, true) Generator.add_attr_to_context(:workflow_project_git_initialized, have_git? && !cookbook_path_in_git_repo?) Generator.add_attr_to_context(:verbose, verbose?) Generator.add_attr_to_context(:use_policyfile, policy_mode?) Generator.add_attr_to_context(:pipeline, pipeline) Generator.add_attr_to_context(:kitchen, kitchen) Generator.add_attr_to_context(:vscode_dir, create_vscode_dir?) end
def verbose?
def verbose? @verbose end