class RSpecSystem::NodeSet::Openstack

Constants

CONFIG_KEYS
PROVIDER_TYPE

Attributes

vmconf[RW]

Public Class Methods

new(name, config, custom_prefabs_path, options) click to toggle source
Calls superclass method RSpecSystem::NodeSet::Base::new
# File lib/rspec-system/node_set/openstack.rb, line 23
def initialize(name, config, custom_prefabs_path, options)
  super
  @vmconf = read_config
  @now = Time.now.strftime '%Y%m%d-%H:%M:%S.%L'
  RSpec.configuration.rs_storage[:nodes] ||= {}
end

Public Instance Methods

compute() click to toggle source
# File lib/rspec-system/node_set/openstack.rb, line 77
def compute
  @compute || @compute = Fog::Compute.new({
    :provider => :openstack,
    :openstack_username => vmconf[:username],
    :openstack_api_key => vmconf[:api_key],
    :openstack_auth_url => vmconf[:endpoint],
  })
end
connect() click to toggle source
# File lib/rspec-system/node_set/openstack.rb, line 46
def connect
  nodes.each do |k,v|
    server = RSpec.configuration.rs_storage[:nodes][k][:server]
    before = Time.new.to_i
    while true
      begin
        server.wait_for(5) { ready? }
        break
      rescue ::Fog::Errors::TimeoutError
        raise if Time.new.to_i - before > vmconf[:node_timeout]
        log.info "Timeout connecting to instance, trying again..."
      end
    end

    chan = ssh_connect(:host => k, :user => 'root', :net_ssh_options => {
      :keys => vmconf[:ssh_keys].split(':'),
      :host_name => server.addresses[vmconf[:network_name]].first['addr'],
      :paranoid => false
    })
    RSpec.configuration.rs_storage[:nodes][k][:ssh] = chan
  end
end
launch() click to toggle source
# File lib/rspec-system/node_set/openstack.rb, line 30
def launch
  nodes.each do |k,v|
    storage = RSpec.configuration.rs_storage[:nodes][k] ||= {}
    options = {
      :flavor_ref => flavor.id,
      :image_ref => image.id,
      :name => "#{k}-#{@now}",
      :key_name => vmconf[:keypair_name]
    }
    options[:nics] = [{'net_id' => nic.id}] if vmconf[:network_name]
    log.info "Launching openstack instance #{k}"
    result = compute.servers.create options
    storage[:server] = result
  end
end
network() click to toggle source
# File lib/rspec-system/node_set/openstack.rb, line 86
def network
  @network || @network = Fog::Network.new({
    :provider => :openstack,
    :openstack_username => vmconf[:username],
    :openstack_api_key => vmconf[:api_key],
    :openstack_auth_url => vmconf[:endpoint],
  })
end
teardown() click to toggle source
# File lib/rspec-system/node_set/openstack.rb, line 69
def teardown
  nodes.keys.each do |k|
    server = RSpec.configuration.rs_storage[:nodes][k][:server]
    log.info "Destroying server #{server.name}"
    server.destroy
  end
end

Private Instance Methods

flavor() click to toggle source
# File lib/rspec-system/node_set/openstack.rb, line 96
def flavor
  log.info "Looking up flavor #{vmconf[:flavor_name]}"
  compute.flavors.find { |x| x.name == vmconf[:flavor_name] } || raise("Couldn't find flavor: #{vmconf[:flavor_name]}")
end
image() click to toggle source
# File lib/rspec-system/node_set/openstack.rb, line 101
def image
  log.info "Looking up image #{vmconf[:image_name]}"
  compute.images.find { |x| x.name == vmconf[:image_name] } || raise("Couldn't find image: #{vmconf[:image_name]}")
end
nic() click to toggle source
# File lib/rspec-system/node_set/openstack.rb, line 106
def nic
  log.info "Looking up network #{vmconf[:network_name]}"
  network.networks.find { |x| x.name == vmconf[:network_name] } || raise("Couldn't find network: #{vmconf[:network_name]}")
end
read_config() click to toggle source
# File lib/rspec-system/node_set/openstack.rb, line 111
def read_config
  conf = ENV.inject({}) do |memo,(k,v)|
    if k =~ /^RS_OPENSTACK_(.+)/
      var = $1.downcase.to_sym
      memo[var] = v if ([var] & CONFIG_KEYS).any?
    end
    memo
  end

  conf[:node_timeout] = conf[:node_timeout].to_i unless conf[:node_timeout].nil?
  conf
end