class Cloudkeeper::One::Opennebula::ImageHandler

Constants

EXPIRED_PERMISSIONS
IMAGE_STATES

Public Class Methods

new() click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 14
def initialize
  super
  @pool = OpenNebula::ImagePool.new client
end

Public Instance Methods

delete(image) click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 25
def delete(image)
  raise Cloudkeeper::One::Errors::ArgumentError, 'image cannot be nil' unless image

  id = image.id

  if used? image
    logger.warn "Image with id #{id.inspect} cannot be removed, still in use"
    return
  end

  super image
end
disable(image) click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 38
def disable(image)
  raise Cloudkeeper::One::Errors::ArgumentError, 'image cannot be nil' unless image

  id = image.id

  if disabled? image
    logger.info "Image with id #{id.inspect} is already disabled, skipping"
    return
  end

  unless free? image
    logger.warn "Image with id #{id.inspect} cannot be disabled"
    return
  end

  handle_opennebula_error { image.disable }

  timeout { sleep(Cloudkeeper::One::Opennebula::Handler::API_POLLING_WAIT) until disabled? image }
end
disabled?(image) click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 102
def disabled?(image)
  is?(image) { image.state_str == IMAGE_STATES[:disabled] }
end
error?(image) click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 118
def error?(image)
  is?(image) { image.state_str == IMAGE_STATES[:error] }
end
expire(image) click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 58
def expire(image)
  raise Cloudkeeper::One::Errors::ArgumentError, 'image cannot be nil' unless image

  id = image.id

  if expired? image
    logger.debug("Image with id #{id.inspect} is already expired, skipping")
    return
  end

  chmod image, EXPIRED_PERMISSIONS
  disable image

  expiration_attribute = "#{Tags::EXPIRED} = \"yes\""

  handle_opennebula_error { image.rename("EXPIRED_#{Time.now.to_i}_#{image.name}") }
  handle_opennebula_error { image.update(expiration_attribute, true) }
end
expired() click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 19
def expired
  xpaths = { "TEMPLATE/#{Tags::EXPIRED}" => 'yes' }

  find_all xpaths
end
expired?(image) click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 98
def expired?(image)
  is?(image) { image["TEMPLATE/#{Tags::EXPIRED}"] == 'yes' }
end
free?(image) click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 114
def free?(image)
  is?(image) { image.state_str == IMAGE_STATES[:ready] || image.state_str == IMAGE_STATES[:error] }
end
ready?(image) click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 106
def ready?(image)
  is?(image) { image.state_str == IMAGE_STATES[:ready] }
end
register(image_template, datastore) click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 77
def register(image_template, datastore)
  image_alloc = OpenNebula::Image.build_xml
  image = OpenNebula::Image.new(image_alloc, client)

  handle_opennebula_error { image.allocate(image_template, datastore.id) }

  timeout do
    until ready? image
      if error? image
        delete image
        raise Cloudkeeper::One::Errors::Opennebula::ResourceStateError, image['TEMPLATE/ERROR']
      end
      sleep(Cloudkeeper::One::Opennebula::Handler::API_POLLING_WAIT)
    end
  end

  chmod image, Cloudkeeper::One::Settings[:'appliances-permissions']

  image
end
used?(image) click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 110
def used?(image)
  is?(image) { image.state_str == IMAGE_STATES[:used] }
end

Private Instance Methods

is?(image) { || ... } click to toggle source
# File lib/cloudkeeper/one/opennebula/image_handler.rb, line 124
def is?(image)
  raise Cloudkeeper::One::Errors::ArgumentError, 'image cannot be nil' unless image

  handle_opennebula_error { image.info! }
  yield
end