1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-22 18:50:08 +03:00

B #5349: fix some bugs in onevm backup (#1167)

(cherry picked from commit b1ddfa9d71c5b349aed6cd6d3f5df8fe85549037)
This commit is contained in:
Alejandro Huertas Herrero 2021-04-29 18:21:42 +02:00 committed by Ruben S. Montero
parent 6c92337419
commit 8c7de39eb1
No known key found for this signature in database
GPG Key ID: A0CEA6FA880A1D87
2 changed files with 54 additions and 28 deletions

View File

@ -1437,25 +1437,33 @@ CommandParser::CmdParser.new(ARGV) do
helper.perform_action(args[0], options, 'Backup') do |vm|
vm.extend(OpenNebula::VirtualMachineExt)
# If logger is specified use it, if not use STDOUT
options[:logger].nil? ? log_to = STDOUT : log_to = options[:logger]
# Read user options
keep = options.key?(:keep)
logger = Logger.new(log_to)
format = '%Y-%m-%d %H:%M:%S'
logger.formatter = proc do |severity, datetime, _p, msg|
"#{datetime.strftime(format)} #{severity.ljust(5)} : #{msg}\n"
if options[:verbose]
log_to = STDOUT
elsif !options[:logger].nil?
log_to = options[:logger]
end
keep = options.key?(:keep)
if log_to
logger = Logger.new(log_to)
format = '%Y-%m-%d %H:%M:%S'
logger.formatter = proc do |severity, datetime, _p, msg|
"#{datetime.strftime(format)} " \
"#{severity.ljust(5)} : #{msg}\n"
end
end
binfo = {}
binfo[:market] = options[:market]
if options.key?(:oneshot)
binfo = {}
binfo[:name] = "VM #{vm.id} BACKUP - " \
"#{Time.now.strftime('%Y%m%d_%k%M')}"
binfo[:freq] = 1
binfo[:last] = Time.now.to_i - 100
binfo[:market] = options[:market]
end
begin

View File

@ -267,17 +267,20 @@ module OpenNebula::VirtualMachineExt
# --------------------------------------------------------------
# Check backup consistency
# --------------------------------------------------------------
unless binfo
rc = info
raise rc.message if OpenNebula.is_error?(rc)
rc = info
binfo = backup_info
raise rc.message if OpenNebula.is_error?(rc)
binfo.merge!(backup_info) do |key, old_val, new_val|
new_val.nil? ? old_val : new_val
end
raise 'No backup information' if binfo.nil?
raise 'No frequency defined' unless valid?(binfo[:freq])
raise 'No marketplace defined' unless valid?(binfo[:market])
return if Time.now.to_i - binfo[:last].to_i < binfo[:freq].to_i
# --------------------------------------------------------------
@ -319,19 +322,12 @@ module OpenNebula::VirtualMachineExt
# --------------------------------------------------------------
# Cleanup
# --------------------------------------------------------------
logger.info "Deleting template #{tmp.id}" if logger
tmp.delete(true)
binfo[:apps].each do |id|
logger.info "Deleting applicance #{id}" if logger
papp = OpenNebula::MarketPlaceApp.new_with_id(id, @client)
papp.delete
end if !keep && binfo[:apps]
backup_cleanup(keep, logger, binfo, tmp)
rescue Error, StandardError => e
backup_cleanup(keep, logger, binfo, tmp)
logger.fatal(e.inspect) if logger
raise
end
@ -421,9 +417,9 @@ module OpenNebula::VirtualMachineExt
private
# --------------------------------------------------------------
#-------------------------------------------------------------------
# Check an attribute is defined and valid
# --------------------------------------------------------------
#-------------------------------------------------------------------
def valid?(att)
return false if att.nil?
@ -454,6 +450,9 @@ module OpenNebula::VirtualMachineExt
binfo
end
#-------------------------------------------------------------------
# Generate backup information string
#-------------------------------------------------------------------
def backup_attr(binfo, ids)
'BACKUP=[' \
" MARKETPLACE_APP_IDS = \"#{ids.join(',')}\"," \
@ -462,6 +461,25 @@ module OpenNebula::VirtualMachineExt
" MARKETPLACE_ID = \"#{binfo[:market]}\" ]"
end
#-------------------------------------------------------------------
# Cleanup backup leftovers in case of failure
#-------------------------------------------------------------------
def backup_cleanup(keep, logger, binfo, template)
if template
logger.info "Deleting template #{template.id}" if logger
template.delete(true)
end
binfo[:apps].each do |id|
logger.info "Deleting applicance #{id}" if logger
papp = OpenNebula::MarketPlaceApp.new_with_id(id, @client)
papp.delete
end if !keep && binfo[:apps]
end
end
end