fuel-astute/lib/astute/dump.rb

71 lines
2.6 KiB
Ruby

# Copyright 2013 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
module Astute
module Dump
def self.dump_environment(ctx, settings)
lastdump = settings['lastdump']
timeout = Astute.config.dump_timeout
shell = MClient.new(ctx, 'execute_shell_command', ['master'], check_result=true, timeout=timeout, retries=1)
upload_file = MClient.new(ctx, 'uploadfile', ['master'])
begin
config_path = '/tmp/dump_config'
upload_file.upload(
:path => config_path,
:content => settings.to_json,
:user_owner => 'root',
:group_owner => 'root',
:overwrite => true)
dump_cmd = "shotgun -c #{config_path} >> /var/log/dump.log 2>&1 && cat #{lastdump}"
Astute.logger.debug("Try to execute command: #{dump_cmd}")
result = shell.execute(:cmd => dump_cmd).first.results
Astute.logger.debug("#{ctx.task_id}: \
stdout: #{result[:data][:stdout]} stderr: #{result[:data][:stderr]} \
exit code: #{result[:data][:exit_code]}")
if result[:data][:exit_code] == 0
Astute.logger.info("#{ctx.task_id}: Snapshot is done. Result: #{result[:data][:stdout]}")
report_success(ctx, result[:data][:stdout].rstrip)
else
Astute.logger.error("#{ctx.task_id}: Dump command returned non zero exit code")
report_error(ctx, "exit code: #{result[:data][:exit_code]} stderr: #{result[:data][:stderr]}")
end
rescue Timeout::Error
msg = "Dump is timed out"
Astute.logger.error("#{ctx.task_id}: #{msg}")
report_error(ctx, msg)
rescue => e
msg = "Exception occured during dump task: message: #{e.message} \
trace: #{e.backtrace.inspect}"
Astute.logger.error("#{ctx.task_id}: #{msg}")
report_error(ctx, msg)
end
end
def self.report_success(ctx, msg=nil)
success_msg = {'status' => 'ready', 'progress' => 100}
success_msg.merge!({'msg' => msg}) if msg
ctx.reporter.report(success_msg)
end
def self.report_error(ctx, msg)
ctx.reporter.report({'status' => 'error', 'error' => msg, 'progress' => 100})
end
end
end