class Cyoi::Providers::Clients::OpenStackProviderClient

Public Instance Methods

associate_ip_address_with_server(ip_address, server) click to toggle source
# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 32
def associate_ip_address_with_server(ip_address, server)
  address = fog_compute.addresses.find { |a| a.ip == ip_address }
  address.server = server
end
authorize_port_range(sg, port_range, protocol, ip_range) click to toggle source

Hook method for FogProviderClient#create_security_group

# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 82
def authorize_port_range(sg, port_range, protocol, ip_range)
  rules = ip_permissions(sg)
  rules.create(parent_group_id: sg.id, from_port: port_range.min, to_port: port_range.max, ip_range: {"cidr" => ip_range}, ip_protocol: protocol)
end
configuration() click to toggle source
# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 106
def configuration
  configuration = Fog.symbolize_credentials(attributes.credentials)
  configuration[:provider] = "OpenStack"
  if attributes.credentials.openstack_region && attributes.credentials.openstack_region.empty?
    configuration.delete(:openstack_region)
  end
  configuration
end
create_and_attach_volume(name, disk_size, server, device) click to toggle source
# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 92
def create_and_attach_volume(name, disk_size, server, device)
  volume = fog_compute.volumes.create(:name => name,
                                      :description => "",
                                      :size => disk_size,
                                      :availability_zone => server.availability_zone)
  volume.wait_for { volume.status == 'available' }
  volume.attach(server.id, device)
  volume.wait_for { volume.status == 'in-use' }
end
delete_security_group_and_servers(sg_name) click to toggle source
# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 102
def delete_security_group_and_servers(sg_name)
  raise "not implemented yet"
end
find_server_device(server, device) click to toggle source
# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 87
def find_server_device(server, device)
  va = fog_compute.get_server_volumes(server.id).body['volumeAttachments']
  va.find { |v| v["device"] == device }
end
fog_network() click to toggle source
# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 127
def fog_network
  @fog_network ||= Fog::Network.new(configuration)
rescue Fog::Errors::NotFound
  nil
end
fog_storage() click to toggle source

May throw odd exception if OpenStack doesn’t support Swift, like:

NoMethodError: undefined method `join' for "object-store":String
# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 117
def fog_storage
  @fog_storage ||= Fog::Storage.new(configuration)
end
ip_addresses_assigned_to_servers() click to toggle source
# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 63
def ip_addresses_assigned_to_servers
  fog_compute.servers.map {|s| s.addresses}.map {|address_hash| address_hash.map {|name, addrs| addrs}}.flatten.map {|addr| addr["addr"]}
end
ip_permissions(sg) click to toggle source

Hook method for FogProviderClient#create_security_group

# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 68
def ip_permissions(sg)
  sg.security_group_rules
end
networks?() click to toggle source

@return [boolean] true if target OpenStack running Neutron networks

# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 11
def networks?
  fog_network
end
next_available_ip_in_subnet(subnet) click to toggle source

@return [String] IP that is available for a new VM to use allocation_pools look like: “allocation_pools” => [{“start”=>“192.168.101.2”, “end”=>“192.168.101.254”}]

# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 54
def next_available_ip_in_subnet(subnet)
  ip = IPAddr.new(subnet.allocation_pools.first["start"])
  skip_ips = ip_addresses_assigned_to_servers
  while skip_ips.include?(ip.to_s)
    ip = ip.succ
  end
  ip.to_s
end
openstack_constants() click to toggle source
# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 133
def openstack_constants
  Cyoi::Providers::Constants::OpenStackConstants
end
port_open?(ip_permissions, port_range, protocol, ip_range) click to toggle source
# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 72
def port_open?(ip_permissions, port_range, protocol, ip_range)
  ip_permissions && ip_permissions.find do |ip|
    ip.ip_protocol == protocol \
    && ip.ip_range["cidr"] == ip_range \
    && ip.from_port <= port_range.min \
    && ip.to_port >= port_range.max
  end
end
provision_public_ip_address(options={}) click to toggle source

@return [String] provisions a new public IP address in target region

# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 20
def provision_public_ip_address(options={})
  pool_name = options.delete("pool_name")
  pool_name ||= begin
    pool = fog_compute.addresses.get_address_pools.first
    pool["name"]
  end
  address = fog_compute.addresses.create(:pool => pool_name)
  address.ip
rescue NoMethodError
  print "No Public IP Found"
end
setup_fog_connection() click to toggle source

Construct a Fog::Compute object Uses attributes which normally originates from settings.provider

# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 123
def setup_fog_connection
  @fog_compute = Fog::Compute.new(configuration)
end
subnets() click to toggle source
# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 15
def subnets
  fog_network.subnets
end
unallocated_floating_ip_addresses(options={}) click to toggle source

@return [Array] of IPs that are not allocated to a server Defaults to the first address pool unless “pool_name” is provided in options

# File lib/cyoi/providers/clients/openstack_provider_client.rb, line 40
def unallocated_floating_ip_addresses(options={})
  pool_name = options.delete("pool_name")
  pool_name ||= begin
    pool = fog_compute.addresses.get_address_pools.first
    pool["name"]
  end
  fog_compute.addresses.
    select { |a| a.pool == pool_name && a.instance_id.nil? }.
    map(&:ip)
end