diff --git a/src/cli/onevm b/src/cli/onevm index 281c827294..81a009c1de 100755 --- a/src/cli/onevm +++ b/src/cli/onevm @@ -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 diff --git a/src/oca/ruby/opennebula/virtual_machine_ext.rb b/src/oca/ruby/opennebula/virtual_machine_ext.rb index d0733c9976..def70c5f29 100644 --- a/src/oca/ruby/opennebula/virtual_machine_ext.rb +++ b/src/oca/ruby/opennebula/virtual_machine_ext.rb @@ -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