Class: Chef::ChefFS::Knife

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

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, common_name, #config_file_settings, config_loader, #create_object, #delete_object, dependency_loaders, #format_rest_error, guess_category, #humanize_exception, #humanize_http_exception, #initialize, 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

Methods included from Mixin::PathSanity

#enforce_path_sanity

Constructor Details

This class inherits a constructor from Chef::Knife

Class Method Details

.depsObject

Workaround for CHEF-3932



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

def self.deps
  super do
    require "chef/config"
    require "chef/chef_fs/parallelizer"
    require "chef/chef_fs/config"
    require "chef/chef_fs/file_pattern"
    require "chef/chef_fs/path_utils"
    yield
  end
end

.inherited(c) ⇒ Object



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

def self.inherited(c)
  super

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

  c.options.merge!(options)
end

Instance Method Details

#chef_fsObject



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

def chef_fs
  @chef_fs_config.chef_fs
end

#configure_chefObject



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

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



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

def create_chef_fs
  @chef_fs_config.create_chef_fs
end

#create_local_fsObject



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

def create_local_fs
  @chef_fs_config.create_local_fs
end

#discover_repo_dir(dir) ⇒ Object



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

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



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

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

#local_fsObject



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

def local_fs
  @chef_fs_config.local_fs
end

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



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

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

#pattern_arg_from(arg) ⇒ Object



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
137
# File 'lib/chef/chef_fs/knife.rb', line 101

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



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

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

#pattern_args_from(args) ⇒ Object



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

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