class Nifty::Events::Opennebula::RegistrationEvent

OpenNebula registration event

@author Michal Kimle

Attributes

group_handler[RW]
image_handler[RW]
original_disks[RW]
template_handler[RW]

Public Class Methods

event?() click to toggle source

@see Nifty::Events::Event#event?

# File lib/nifty/events/opennebula/registration_event.rb, line 10
def self.event?
  true
end
new(appliance, transfer_method, client, datastores, parameters) click to toggle source

@see Nifty::Events::Opennebula::Event#initialize @attr [Nifty::Backends::Utils::Opennebula::ImageHandler] image_handler @attr [Nifty::Backends::Utils::Opennebula::TemplateHandler] template_handler @attr [Nifty::Backends::Utils::Opennebula::GroupHandler] group_handler @attr [Array] original_disks array of original image file paths before transfer

Calls superclass method Nifty::Events::Opennebula::Event::new
# File lib/nifty/events/opennebula/registration_event.rb, line 21
def initialize(appliance, transfer_method, client, datastores, parameters)
  super(appliance, transfer_method, client, datastores, parameters)

  @image_handler = Nifty::Backends::Utils::Opennebula::ImageHandler.new(client)
  @template_handler = Nifty::Backends::Utils::Opennebula::TemplateHandler.new(client)
  @group_handler = Nifty::Backends::Utils::Opennebula::GroupHandler.new(client)
  @original_disks = []
end

Public Instance Methods

run() click to toggle source

@see Nifty::Events::Event#run

# File lib/nifty/events/opennebula/registration_event.rb, line 31
def run
  logger.debug("Runnig event #{self.inspect}")
  transfer_disks

  expire_appliance(template_handler, image_handler, appliance, parameters)

  groups = groups(group_handler, appliance, parameters[:groups])
  # due to OpenNebula restrictions appliances have to be registered separately for each datastore and each group
  datastores.each do |datastore|
    groups.each do |group|
      image_data = register_disks(group, datastore)
      register_appliance(image_data, group, datastore)
    end
  end

  clean_original_disks
rescue Nifty::Errors::Backends::OpennebulaError, Nifty::Errors::TransferMethodError, Nifty::Errors::ApiCallTimeoutError => ex
  fail Nifty::Errors::Events::EventError, ex
ensure
  clean_copied_disks
end

Private Instance Methods

clean_copied_disks() click to toggle source

Calls a selected transfer method's cleanup for previously transfered disks

# File lib/nifty/events/opennebula/registration_event.rb, line 71
def clean_copied_disks
  original_disks.each do |disk|
    transfer_method.clean_copy disk
  end
end
clean_original_disks() click to toggle source

Calls a selected transfer method's cleanup for original disks

# File lib/nifty/events/opennebula/registration_event.rb, line 64
def clean_original_disks
  original_disks.each do |disk|
    transfer_method.clean_original disk
  end
end
register_appliance(image_data, group, datastore) click to toggle source

Registers an appliance in OpenNebula Creates VM templates pointing to previously registered disks in OpenNebula

@param [Hash] image_data hash containing username of the user owning the disks in OpenNebula and their names @param [String] group @param [String] datastore

# File lib/nifty/events/opennebula/registration_event.rb, line 105
def register_appliance(image_data, group, datastore)
  logger.debug("Registering appliance #{appliance.inspect}")
  name = parameters[:"description-naming"] ? "#{appliance.identifier}@#{datastore.name}" : ::SecureRandom.uuid
  template_template = Nifty::Backends::Utils::Opennebula::TemplateHandler.prepare_template(parameters[:"template-dir"], appliance: appliance, disk_names: image_data[:disk_names], name: name, username: image_data[:username])
  template = template_handler.register_template(template_template)
  Nifty::Backends::Utils::Opennebula::Handler.chown(template, Nifty::Backends::Utils::Opennebula::Handler::LEAVE_AS_IS, group.id)
  Nifty::Backends::Utils::Opennebula::Handler.chmod(template, parameters[:permissions])
end
register_disks(group, datastore) click to toggle source

Registers disks of event's applaince

@param [String] group @param [OpenNebula::Datastore] datastore @return [Hash] hash containing username of the user owning the disks in OpenNebula and their names

# File lib/nifty/events/opennebula/registration_event.rb, line 82
def register_disks(group, datastore)
  disk_names = []
  image = nil

  appliance.disks.each_with_index do |disk, index|
    logger.debug("Registering disk #{disk.inspect}")
    name = parameters[:"description-naming"] ? "#{appliance.identifier}-#{appliance.version}-#{'%02d' % (index + 1)}@#{datastore.name}" : ::SecureRandom.uuid
    template = Nifty::Backends::Utils::Opennebula::ImageHandler.prepare_template(parameters[:"template-dir"], appliance: appliance, disk: disk, name: name)
    image = image_handler.register_image(template, datastore)
    Nifty::Backends::Utils::Opennebula::Handler.chown(image, Nifty::Backends::Utils::Opennebula::Handler::LEAVE_AS_IS, group.id)
    Nifty::Backends::Utils::Opennebula::Handler.chmod(image, parameters[:permissions])
    disk_names << name
  end

  { :username => image['UNAME'], :disk_names => disk_names }
end
transfer_disks() click to toggle source

Calls a selected transfer method on all disks within an appliance

# File lib/nifty/events/opennebula/registration_event.rb, line 56
def transfer_disks
  appliance.disks.each do |disk|
    original_disks << disk.path
    disk.path = transfer_method.transfer disk.path
  end
end