class Cloudkeeper::Managers::ApplianceManager

Attributes

acceptable_formats[R]
backend_connector[R]
image_list_manager[R]

Public Class Methods

new() click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 8
def initialize
  @backend_connector = Cloudkeeper::BackendConnector.new
  @image_list_manager = Cloudkeeper::Managers::ImageListManager.new
  @acceptable_formats = Cloudkeeper::Settings[:formats].map(&:to_sym)
end

Public Instance Methods

errors() click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 25
def errors
  { backend_errors: backend_connector.errors }
end
synchronize_appliances() click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 14
def synchronize_appliances
  logger.debug 'Running appliance synchronization...'
  backend_connector.pre_action

  synchronize

  backend_connector.post_action
rescue Cloudkeeper::Errors::BackendError, Cloudkeeper::Errors::ImageList::ImageListError => ex
  abort ex.message
end

Private Instance Methods

add_appliance(appliance) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 143
def add_appliance(appliance)
  modify_appliance :add_appliance, appliance
end
add_appliances(backend_appliances, image_list_appliances) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 98
def add_appliances(backend_appliances, image_list_appliances)
  logger.debug 'Registering new appliances...'
  add_list = image_list_appliances.keys - backend_appliances.keys
  logger.debug "Appliances to register: #{add_list.inspect}"
  add_list.each do |appliance_identifier|
    appliance = image_list_appliances[appliance_identifier]
    if appliance.expired?
      log_expired appliance, 'Skipping expired appliance'
      next
    end

    add_appliance appliance
  end
end
add_new_appliances(image_list) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 55
def add_new_appliances(image_list)
  image_list.appliances.each_value do |appliance|
    if appliance.expired?
      log_expired appliance, 'Skipping expired appliance'
      next
    end

    add_appliance appliance
  end
end
modify_appliance(method, appliance) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 147
def modify_appliance(method, appliance)
  prepare_image!(appliance) if appliance.image
  backend_connector.send method, appliance
rescue Cloudkeeper::Errors::Image::DownloadError, Cloudkeeper::Errors::Image::ConversionError => ex
  logger.error "Image preparation error: #{ex.message}"
rescue Cloudkeeper::Errors::Appliance::PropagationError => ex
  logger.error "Appliance propagation error: #{ex.message}"
ensure
  clean_image_files appliance
end
remove_appliances(backend_appliances, image_list_appliances) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 91
def remove_appliances(backend_appliances, image_list_appliances)
  logger.debug 'Removing previously registered appliances...'
  remove_list = backend_appliances.keys - image_list_appliances.keys
  logger.debug "Appliances to remove: #{remove_list.inspect}"
  remove_list.each { |appliance_identifier| backend_connector.remove_appliance backend_appliances[appliance_identifier] }
end
remove_expired_image_list(image_list) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 86
def remove_expired_image_list(image_list)
  logger.debug "Removing expired image list #{image_list.identifier.inspect}"
  backend_connector.remove_image_list image_list.identifier
end
sync_image_list(image_list) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 77
def sync_image_list(image_list)
  backend_appliances = backend_connector.appliances image_list.identifier
  image_list_appliances = image_list.appliances

  remove_appliances backend_appliances, image_list_appliances
  add_appliances backend_appliances, image_list_appliances
  update_appliances backend_appliances, image_list_appliances
end
sync_new_image_list(image_list) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 44
def sync_new_image_list(image_list)
  logger.debug "Registering appliances from new image list #{image_list.identifier.inspect}"

  if image_list.expired?
    log_expired image_list, 'Not registering expired image list'
    return
  end

  add_new_appliances image_list
end
sync_old_image_list(image_list) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 66
def sync_old_image_list(image_list)
  logger.debug "Synchronizing registered appliances from image list #{image_list.identifier.inspect}"

  if image_list.expired?
    remove_expired_image_list image_list
    return
  end

  sync_image_list image_list
end
synchronize() click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 31
def synchronize
  backend_connector.remove_expired_appliances

  image_list_manager.download_image_list

  image_list = image_list_manager.image_list
  if backend_connector.image_lists.include? image_list.identifier
    sync_old_image_list image_list
  else
    sync_new_image_list image_list
  end
end
update_appliance(appliance) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 134
def update_appliance(appliance)
  modify_appliance :update_appliance, appliance
end
update_appliance_metadata(appliance) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 138
def update_appliance_metadata(appliance)
  appliance.image = nil
  modify_appliance :update_appliance_metadata, appliance
end
update_appliances(backend_appliances, image_list_appliances) click to toggle source
# File lib/cloudkeeper/managers/appliance_manager.rb, line 113
def update_appliances(backend_appliances, image_list_appliances)
  logger.debug 'Updating appliances...'
  update_list = backend_appliances.keys & image_list_appliances.keys
  logger.debug "Appliances for potential update: #{update_list.inspect}"
  update_list.each do |appliance_identifier|
    image_list_appliance = image_list_appliances[appliance_identifier]
    backend_appliance = backend_appliances[appliance_identifier]

    if image_list_appliance.expired?
      log_expired image_list_appliance, 'Removing expired appliance'
      backend_connector.remove_appliance image_list_appliance
      next
    end

    method = :update_appliance_metadata if update_metadata?(image_list_appliance, backend_appliance)
    method = :update_appliance if update_image?(image_list_appliance, backend_appliance)

    send method, image_list_appliance if method
  end
end