Class: Chef::ChefFS::Knife

Inherits:
Knife
  • Object
show all
Defined in:
lib/chef/chef_fs/knife.rb

Constant Summary

Constants inherited from Knife

Knife::CHEF_ORGANIZATION_MANAGEMENT, Knife::OFFICIAL_PLUGINS, Knife::OPSCODE_HOSTED_CHEF_ACCESS_CONTROL

Instance Attribute Summary

Attributes inherited from Knife

#name_args, #ui

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Knife

#api_key, #apply_computed_config, category, chef_config_dir, #cli_keys, common_name, #config_file_settings, config_loader, #config_source, #create_object, #delete_object, dependency_loaders, #format_rest_error, guess_category, #humanize_exception, #humanize_http_exception, #initialize, list_commands, load_commands, load_config, load_deps, #maybe_setup_fips, #merge_configs, msg, #noauth_rest, #parse_options, reset_config_loader!, reset_subcommands!, #rest, run, #run_with_pretty_exceptions, #server_url, #show_usage, snake_case_name, subcommand_category, subcommand_class_from, subcommand_files, subcommand_loader, subcommands, subcommands_by_category, #test_mandatory_field, ui, unnamed?, use_separate_defaults?, #username

Methods included from Mixin::ConvertToClassName

#constantize, #convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #normalize_snake_case_name, #snake_case_basename

Constructor Details

This class inherits a constructor from Chef::Knife

Class Method Details

.depsObject

Workaround for CHEF-3932



27
28
29
30
31
32
33
34
35
36
# File 'lib/chef/chef_fs/knife.rb', line 27

def self.deps
  super do
    require_relative "../config"
    require_relative "parallelizer"
    require_relative "config"
    require_relative "file_pattern"
    require_relative "path_utils"
    yield
  end
end

.inherited(c) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/chef/chef_fs/knife.rb', line 38

def self.inherited(c)
  super

  # Ensure we always get to do our includes, whether subclass calls deps or not
  c.deps do
  end
end

Instance Method Details

#chef_fsObject



76
77
78
# File 'lib/chef/chef_fs/knife.rb', line 76

def chef_fs
  @chef_fs_config.chef_fs
end

#configure_chefObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/chef/chef_fs/knife.rb', line 58

def configure_chef
  super
  Chef::Config[:repo_mode] = config[:repo_mode] if config[:repo_mode]
  Chef::Config[:concurrency] = config[:concurrency].to_i if config[:concurrency]

  # --chef-repo-path forcibly overrides all other paths
  if config[:chef_repo_path]
    Chef::Config[:chef_repo_path] = config[:chef_repo_path]
    Chef::ChefFS::Config::INFLECTIONS.each_value do |variable_name|
      Chef::Config.delete("#{variable_name}_path".to_sym)
    end
  end

  @chef_fs_config = Chef::ChefFS::Config.new(Chef::Config, Dir.pwd, config, ui)

  Chef::ChefFS::Parallelizer.threads = (Chef::Config[:concurrency] || 10) - 1
end

#create_chef_fsObject



80
81
82
# File 'lib/chef/chef_fs/knife.rb', line 80

def create_chef_fs
  @chef_fs_config.create_chef_fs
end

#create_local_fsObject



88
89
90
# File 'lib/chef/chef_fs/knife.rb', line 88

def create_local_fs
  @chef_fs_config.create_local_fs
end

#discover_repo_dir(dir) ⇒ Object



146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/chef/chef_fs/knife.rb', line 146

def discover_repo_dir(dir)
  %w{.chef cookbooks data_bags environments roles}.each do |subdir|
    return dir if File.directory?(File.join(dir, subdir))
  end
  # If this isn't it, check the parent
  parent = File.dirname(dir)
  if parent && parent != dir
    discover_repo_dir(parent)
  else
    nil
  end
end

#format_path(entry) ⇒ Object



138
139
140
# File 'lib/chef/chef_fs/knife.rb', line 138

def format_path(entry)
  @chef_fs_config.format_path(entry)
end

#local_fsObject



84
85
86
# File 'lib/chef/chef_fs/knife.rb', line 84

def local_fs
  @chef_fs_config.local_fs
end

#parallelize(inputs, options = {}, &block) ⇒ Object



142
143
144
# File 'lib/chef/chef_fs/knife.rb', line 142

def parallelize(inputs, options = {}, &block)
  Chef::ChefFS::Parallelizer.parallelize(inputs, options, &block)
end

#pattern_arg_from(arg) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/chef/chef_fs/knife.rb', line 100

def pattern_arg_from(arg)
  inferred_path = nil
  if Chef::ChefFS::PathUtils.is_absolute?(arg)
    # We should be able to use this as-is - but the user might have incorrectly provided
    # us with a path that is based off of the OS root path instead of the Chef-FS root.
    # Do a quick and dirty sanity check.
    if possible_server_path = @chef_fs_config.server_path(arg)
      ui.warn("The absolute path provided is suspicious: #{arg}")
      ui.warn("If you wish to refer to a file location, please provide a path that is rooted at the chef-repo.")
      ui.warn("Consider writing '#{possible_server_path}' instead of '#{arg}'")
    end
    # Use the original path because we can't be sure.
    inferred_path = arg
  elsif arg[0, 1] == "~"
    # Let's be nice and fix it if possible - but warn the user.
    ui.warn("A path relative to a user home directory has been provided: #{arg}")
    ui.warn("Paths provided need to be rooted at the chef-repo being considered or be relative paths.")
    inferred_path = @chef_fs_config.server_path(arg)
    ui.warn("Using '#{inferred_path}' as the path instead of '#{arg}'.")
  elsif Pathname.new(arg).absolute?
    # It is definitely a system absolute path (such as C:\ or \\foo\bar) but it cannot be
    # interpreted as a Chef-FS absolute path.  Again attempt to be nice but warn the user.
    ui.warn("An absolute file system path that isn't a server path was provided: #{arg}")
    ui.warn("Paths provided need to be rooted at the chef-repo being considered or be relative paths.")
    inferred_path = @chef_fs_config.server_path(arg)
    ui.warn("Using '#{inferred_path}' as the path instead of '#{arg}'.")
  elsif @chef_fs_config.base_path.nil?
    # These are all relative paths.  We can't resolve and root paths unless we are in the
    # chef repo.
    ui.error("Attempt to use relative path '#{arg}' when current directory is outside the repository path.")
    ui.error("Current working directory is '#{@chef_fs_config.cwd}'.")
    exit(1)
  else
    inferred_path = Chef::ChefFS::PathUtils.join(@chef_fs_config.base_path, arg)
  end
  Chef::ChefFS::FilePattern.new(inferred_path)
end

#pattern_argsObject



92
93
94
# File 'lib/chef/chef_fs/knife.rb', line 92

def pattern_args
  @pattern_args ||= pattern_args_from(name_args)
end

#pattern_args_from(args) ⇒ Object



96
97
98
# File 'lib/chef/chef_fs/knife.rb', line 96

def pattern_args_from(args)
  args.map { |arg| pattern_arg_from(arg) }
end