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!, #force_force_logger, #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.



139
140
141
# File 'lib/chef/application/apply.rb', line 139

def initialize
  super
end

Instance Attribute Details

#json_attribsObject (readonly)

Returns the value of attribute json_attribs.



137
138
139
# File 'lib/chef/application/apply.rb', line 137

def json_attribs
  @json_attribs
end

Instance Method Details

#get_recipe_and_run_contextObject



173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/chef/application/apply.rb', line 173

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("(#{ChefUtils::Dist::Apply::EXEC} cookbook)", "(#{ChefUtils::Dist::Apply::EXEC} recipe)", run_context)
  [recipe, run_context]
end

#parse_jsonObject



152
153
154
155
156
157
# File 'lib/chef/application/apply.rb', line 152

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



159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/chef/application/apply.rb', line 159

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



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

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



242
243
244
245
246
# File 'lib/chef/application/apply.rb', line 242

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

#run_applicationObject



230
231
232
233
234
235
236
237
238
239
# File 'lib/chef/application/apply.rb', line 230

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



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
223
224
225
226
227
228
# File 'lib/chef/application/apply.rb', line 197

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

    runner.converge
  ensure
    @recipe_fh.close

  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



190
191
192
193
194
195
# File 'lib/chef/application/apply.rb', line 190

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