class ComputeInstances

OpenStack Instance Management

Public Class Methods

new(compute, instances, settings) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 4
def initialize(compute, instances, settings)
  @compute = compute
  @instances = instances
  @settings = settings
end

Public Instance Methods

all_instances(*filter) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 10
def all_instances(*filter)
  filter = filter.shift || {}
  @instances = @compute.servers(filters: filter)
end
check_instance(instance_name) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 25
def check_instance(instance_name)
  return false if instance_name == nil || instance_name.empty? == true
  return true if get_instance(instance_name)
  false
end
create_instance(instance_name, image_id, flavor_id, keypair_name, *userdata) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 94
def create_instance(instance_name, image_id, flavor_id, keypair_name, *userdata)
  user_data = userdata ? userdata.first : nil

  instance = @compute.servers.create(name: instance_name,
                                    image_ref: image_id,
                                    flavor_ref: flavor_id,
                                    key_name: keypair_name,
                                    user_data: user_data)
  
  # add security_group
  # add volumes
  # handle user_data with base64 encoding

  # Put error handling from instance_prompts here
  
  instance.wait_for { ready? }
  instance
end
delete_instance(instance) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 113
def delete_instance(instance)
  instance = get_instance(instance) if instance.class == String    
  return 1 if instance == false

  instance_name = instance.name
  @compute.delete_server(instance.id)

  attempt = 1
  until check_instance(instance_name) == false
    return false if attempt == 5
    sleep(5)
    attempt += 1
  end

  addrs = [get_public_addresses(instance),
           get_private_addresses(instance)].flatten.compact!
  addrs.each { |addr| system("ssh-keygen -R #{addr} &>/dev/null") }

  return true
end
get_instance(instance_name) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 31
def get_instance(instance_name)
  instance = all_instances({ 'name' => [instance_name] })
  return false if !instance.first
  return false if !instance.collect{ |i| i.name }.include?(instance_name)
  instance.first
end
get_private_addresses(instance) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 45
def get_private_addresses(instance)
  instance = get_instance(instance) if instance.class == String
  addrs = instance.addresses
  return nil if !addrs['private']
  addrs['public'].map{|a| a['addr']}
end
get_public_addresses(instance) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 38
def get_public_addresses(instance)
  instance = get_instance(instance) if instance.class == String
  addrs = instance.addresses
  return nil if !addrs['public']
  addrs['public'].map{|a| a['addr']}
end
list_active_instances() click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 19
def list_active_instances
  @instances.collect do |i|
    i.name if i.state == 'ACTIVE'
  end.compact!
end
list_all_instances() click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 15
def list_all_instances
  @instances.collect { |i| i.name }
end
pause(instance) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 52
def pause(instance)
  instance = get_instance(instance) if instance.class == String

  return false unless instance.state == 'ACTIVE'
  instance.pause
end
rebuild_instance(instance, image) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 134
def rebuild_instance(instance, image)
  instance = get_instance(instance) if instance.class == String

  instance.rebuild(image.id, instance.name)
  addrs = [get_public_addresses(instance),
           get_private_addresses(instance)].flatten.compact!
  addrs.each { |addr| system("ssh-keygen -R #{addr} &>/dev/null") }

  # instance.wait_for { ready? }
  get_instance(instance.name)
end
resume(instance) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 73
def resume(instance)
  instance = get_instance(instance) if instance.class == String

  return false unless instance.state == 'SUSPENDED'
  instance.start
end
ssh_connector(instance) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 146
def ssh_connector(instance)
  addrs = get_public_addresses(instance.name)
  { ipv4: addrs.grep(/\./).first,
    ipv6: addrs.grep(/:/).first,
    ssh_user: user,
    ssh_key: pemfile }
end
start(instance) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 80
def start(instance)
  instance = get_instance(instance) if instance.class == String

  return false unless instance.state == 'SHUTOFF'
  instance.start
end
stop(instance) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 87
def stop(instance)
  instance = get_instance(instance) if instance.class == String

  return false unless instance.state == 'ACTIVE'
  instance.stop
end
suspend(instance) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 66
def suspend(instance)
  instance = get_instance(instance) if instance.class == String

  return false unless instance.state == 'ACTIVE'
  instance.suspend
end
unpause(instance) click to toggle source
# File lib/danarchy_sys/openstack/compute/instances.rb, line 59
def unpause(instance)
  instance = get_instance(instance) if instance.class == String

  return false unless instance.state == 'PAUSED'
  instance.start
end