Class: Chef::Application::Apply

Inherits:
Chef::Application show all
Includes:
LicenseAcceptance::CLIFlags::MixlibCLI
Defined in:
lib/chef/application/apply.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Chef::Application

#apply_extra_config_options, #check_license_acceptance, #chef_config, #chef_configfetcher, #configure_chef, #configure_encoding, #configure_log_location, #configure_logging, debug_stacktrace, #emit_warnings, exit!, fatal!, #load_config_file, logger, #logger, normalize_exit_code, #resolve_log_level, #run_chef_client, #set_specific_recipes, #setup_application, #setup_signal_handlers, use_separate_defaults?, #using_output_formatter?

Constructor Details

#initializeApply

Returns a new instance of Apply.



133
134
135
# File 'lib/chef/application/apply.rb', line 133

def initialize
  super
end

Instance Attribute Details

#json_attribsObject (readonly)

Returns the value of attribute json_attribs.



131
132
133
# File 'lib/chef/application/apply.rb', line 131

def json_attribs
  @json_attribs
end

Instance Method Details

#get_recipe_and_run_contextObject



167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/chef/application/apply.rb', line 167

def get_recipe_and_run_context
  Chef::Config[:solo_legacy_mode] = true
  @chef_client = Chef::Client.new(@json_attribs)
  @chef_client.run_ohai
  @chef_client.load_node
  @chef_client.build_node
  run_context = if @chef_client.events.nil?
                  Chef::RunContext.new(@chef_client.node, {})
                else
                  Chef::RunContext.new(@chef_client.node, {}, @chef_client.events)
                end
  recipe = Chef::Recipe.new("(#{Chef::Dist::APPLY} cookbook)", "(#{Chef::Dist::APPLY} recipe)", run_context)
  [recipe, run_context]
end

#parse_jsonObject



146
147
148
149
150
151
# File 'lib/chef/application/apply.rb', line 146

def parse_json
  if Chef::Config[:json_attribs]
    config_fetcher = Chef::ConfigFetcher.new(Chef::Config[:json_attribs])
    @json_attribs = config_fetcher.fetch_json
  end
end

#read_recipe_file(file_name) ⇒ Object



153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/chef/application/apply.rb', line 153

def read_recipe_file(file_name)
  if file_name.nil?
    Chef::Application.fatal!("No recipe file was provided", Chef::Exceptions::RecipeNotFound.new)
  else
    recipe_path = File.expand_path(file_name)
    unless File.exist?(recipe_path)
      Chef::Application.fatal!("No file exists at #{recipe_path}", Chef::Exceptions::RecipeNotFound.new)
    end
    recipe_fh = open(recipe_path)
    recipe_text = recipe_fh.read
    [recipe_text, recipe_fh]
  end
end

#reconfigureObject



137
138
139
140
141
142
143
144
# File 'lib/chef/application/apply.rb', line 137

def reconfigure
  parse_options
  Chef::Config.merge!(config)
  configure_logging
  Chef::Config.export_proxies
  Chef::Config.init_openssl
  parse_json
end

#run(enforce_license = false) ⇒ Object

Get this party started



236
237
238
239
240
# File 'lib/chef/application/apply.rb', line 236

def run(enforce_license = false)
  reconfigure
  check_license_acceptance if enforce_license
  run_application
end

#run_applicationObject



224
225
226
227
228
229
230
231
232
233
# File 'lib/chef/application/apply.rb', line 224

def run_application
  parse_options
  run_chef_recipe
  Chef::Application.exit! "Exiting", 0
rescue SystemExit
  raise
rescue Exception => e
  Chef::Application.debug_stacktrace(e)
  Chef::Application.fatal!("#{e.class}: #{e.message}", e)
end

#run_chef_recipeObject



191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
# File 'lib/chef/application/apply.rb', line 191

def run_chef_recipe
  if config[:execute]
    @recipe_text = config[:execute]
    temp_recipe_file
  elsif config[:stdin]
    @recipe_text = STDIN.read
    temp_recipe_file
  else
    unless ARGV[0]
      puts opt_parser
      Chef::Application.exit! "No recipe file provided", Chef::Exceptions::RecipeNotFound.new
    end
    @recipe_filename = ARGV[0]
    @recipe_text, @recipe_fh = read_recipe_file @recipe_filename
  end
  recipe, run_context = get_recipe_and_run_context
  if config[:yaml] || File.extname(@recipe_filename) == ".yml"
    logger.info "Parsing recipe as YAML"
    recipe.from_yaml(@recipe_text)
  else
    recipe.instance_eval(@recipe_text, @recipe_filename, 1)
  end
  runner = Chef::Runner.new(run_context)
  catch(:end_client_run_early) do
    begin
      runner.converge
    ensure
      @recipe_fh.close
    end
  end
  Chef::Platform::Rebooter.reboot_if_needed!(runner)
end

#temp_recipe_fileObject

write recipe to temp file, so in case of error, user gets error w/ context



184
185
186
187
188
189
# File 'lib/chef/application/apply.rb', line 184

def temp_recipe_file
  @recipe_fh = Tempfile.open("recipe-temporary-file")
  @recipe_fh.write(@recipe_text)
  @recipe_fh.rewind
  @recipe_filename = @recipe_fh.path
end