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, #auto_log_level?, #check_license_acceptance, #chef_config, #chef_configfetcher, #configure_chef, #configure_encoding, #configure_log_location, #configure_logging, #configure_stdout_logger, 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?, #want_additional_logger?

Constructor Details

#initializeApply

Returns a new instance of Apply.



121
122
123
# File 'lib/chef/application/apply.rb', line 121

def initialize
  super
end

Instance Attribute Details

#json_attribsObject (readonly)

Returns the value of attribute json_attribs.



119
120
121
# File 'lib/chef/application/apply.rb', line 119

def json_attribs
  @json_attribs
end

Instance Method Details

#get_recipe_and_run_contextObject



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

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



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

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



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

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



125
126
127
128
129
130
131
132
# File 'lib/chef/application/apply.rb', line 125

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



219
220
221
222
223
# File 'lib/chef/application/apply.rb', line 219

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

#run_applicationObject



207
208
209
210
211
212
213
214
215
216
# File 'lib/chef/application/apply.rb', line 207

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



179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/chef/application/apply.rb', line 179

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
  recipe.instance_eval(@recipe_text, @recipe_filename, 1)
  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



172
173
174
175
176
177
# File 'lib/chef/application/apply.rb', line 172

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