class VagrantPlugins::OVirtProvider::Action::ConnectOVirt

Public Class Methods

new(app, env) click to toggle source
# File lib/vagrant-ovirt3/action/connect_ovirt.rb, line 10
def initialize(app, env)
  @logger = Log4r::Logger.new("vagrant_ovirt3::action::connect_ovirt")
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/vagrant-ovirt3/action/connect_ovirt.rb, line 15
def call(env)

  # We need both, fog and rbovirt client. Sometimes fog doesn't
  # support some operations like managing quotas, or working with
  # networks. For this rbovirt client is used.
  env[:ovirt_client] = OVirtProvider.ovirt_client if              OVirtProvider.ovirt_client != nil

  if OVirtProvider.ovirt_connection != nil
    env[:ovirt_compute] = OVirtProvider.ovirt_connection
    return @app.call(env)
  end
  
  # Get config options for ovirt provider.
  config = env[:machine].provider_config

  conn_attr = {}
  conn_attr[:provider] = 'ovirt'
  conn_attr[:ovirt_url] = "#{config.url}/api"
  conn_attr[:ovirt_username] = config.username if config.username
  conn_attr[:ovirt_password] = config.password if config.password
  conn_attr[:ovirt_ca_no_verify] = config.ca_no_verify if config.ca_no_verify
  conn_attr[:ovirt_ca_cert_store] = config.ca_cert_store if config.ca_cert_store
  conn_attr[:ovirt_ca_cert_file] = config.ca_cert_file if config.ca_cert_file
  conn_attr[:ovirt_filtered_api] = config.filtered_api if config.filtered_api

  # We need datacenter id in fog connection initialization. But it's
  # much simpler to use datacenter name in Vagrantfile. So get
  # datacenter id here from rbovirt client before connecting to fog.
  env[:ovirt_client] = ovirt_connect(conn_attr)
  begin
    datacenter = OVirtProvider::Util::Collection.find_matching(
      env[:ovirt_client].datacenters, config.datacenter)
  rescue OVIRT::OvirtException => e
    raise Errors::FogOVirtConnectionError,
      :error_message => e.message
  end

  raise Errors::NoDatacenterError if datacenter == nil
  conn_attr[:ovirt_datacenter] = datacenter.id

  # Reconnect and prepar rbovirt client with datacenter set from
  # configuration.
  env[:ovirt_client] = ovirt_connect(conn_attr)
  OVirtProvider.ovirt_client = env[:ovirt_client]
  
  # Establish fog connection now.
  @logger.info("Connecting to oVirt (#{config.url}) ...")
  begin
    env[:ovirt_compute] = Fog::Compute.new(conn_attr)
  rescue OVIRT::OvirtException => e
    raise Errors::FogOVirtConnectionError,
      :error_message => e.message
  end
  OVirtProvider.ovirt_connection = env[:ovirt_compute]

  @app.call(env)
end

Private Instance Methods

ovirt_connect(credentials) click to toggle source
# File lib/vagrant-ovirt3/action/connect_ovirt.rb, line 76
def ovirt_connect(credentials)
  OVIRT::Client.new(
    credentials[:ovirt_username],
    credentials[:ovirt_password],
    credentials[:ovirt_url],
    { :datacenter_id => credentials[:ovirt_datacenter],
      :ca_no_verify => credentials[:ovirt_ca_no_verify],
      :ca_cert_store => credentials[:ovirt_ca_cert_store],
      :ca_cert_file => credentials[:ovirt_ca_cert_file],
      :filtered_api => credentials[:ovirt_filtered_api]
    }
  )
end