from sfa.rspecs.elements.services import Services
from sfa.rspecs.elements.interface import Interface
from sfa.util.xrn import Xrn
-from sfa.util.plxrn import PlXrn, hrn_to_pl_slicename
-from sfa.util.osxrn import OSXrn
+from sfa.planetlab.plxrn import PlXrn
+from sfa.openstack.osxrn import OSXrn, hrn_to_os_slicename
from sfa.rspecs.version_manager import VersionManager
from sfa.openstack.image import ImageManager
from sfa.openstack.security_group import SecurityGroup
from sfa.util.sfalogging import logger
+def pubkeys_to_user_data(pubkeys):
+ user_data = "#!/bin/bash\n\n"
+ for pubkey in pubkeys:
+ pubkey = pubkey.replace('\n', '')
+ user_data += "echo %s >> /root/.ssh/authorized_keys" % pubkey
+ user_data += "\n"
+ user_data += "echo >> /root/.ssh/authorized_keys"
+ user_data += "\n"
+ return user_data
+
def instance_to_sliver(instance, slice_xrn=None):
# should include?
# * instance.image_ref
return rspec.toxml()
def get_availability_zones(self):
- zones = self.driver.shell.db.zone_get_all()
+ try:
+ # pre essex releases
+ zones = self.driver.shell.db.zone_get_all()
+ except:
+ # essex release
+ zones = self.driver.shell.db.dnsdomain_list()
+
if not zones:
zones = ['cloud']
else:
zones = [zone.name for zone in zones]
+ return zones
def get_slice_nodes(self, slice_xrn):
image_manager = ImageManager(self.driver)
zones = self.get_availability_zones()
- name = hrn_to_pl_slicename(slice_xrn)
+ name = hrn_to_os_slicename(slice_xrn)
instances = self.driver.shell.db.instance_get_all_by_project(name)
rspec_nodes = []
for instance in instances:
interface['ips'] = [{'address': fixed_ip['address'],
'netmask': fixed_ip['network'].netmask,
'type': 'ipv4'}]
+ interface['floating_ips'] = []
+ for floating_ip in fixed_ip.floating_ips:
+ interface['floating_ips'].append(floating_ip.address)
interfaces.append(interface)
if instance.availability_zone:
node_xrn = OSXrn(instance.availability_zone, 'node')
rspec_node['slivers'] = [sliver]
rspec_node['interfaces'] = interfaces
# slivers always provide the ssh service
- hostname = None
+ rspec_node['services'] = []
for interface in interfaces:
- if 'ips' in interface and interface['ips'] and \
- isinstance(interface['ips'], list):
- if interface['ips'][0].get('address'):
- hostname = interface['ips'][0].get('address')
- break
- login = Login({'authentication': 'ssh-keys',
- 'hostname': hostname,
- 'port':'22', 'username': 'root'})
- service = Services({'login': login})
- rspec_node['services'] = [service]
+ if 'floating_ips' in interface:
+ for hostname in interface['floating_ips']:
+ login = Login({'authentication': 'ssh-keys',
+ 'hostname': hostname,
+ 'port':'22', 'username': 'root'})
+ service = Services({'login': login})
+ rspec_node['services'].append(service)
rspec_nodes.append(rspec_node)
return rspec_nodes
def get_aggregate_nodes(self):
zones = self.get_availability_zones()
# available sliver/instance/vm types
- instances = self.driver.shell.db.instance_type_get_all().values()
+ instances = self.driver.shell.db.instance_type_get_all()
+ if isinstance(instances, dict):
+ instances = instances.values()
# available images
image_manager = ImageManager(self.driver)
disk_images = image_manager.get_available_disk_images()
# get requested slivers
rspec = RSpec(rspec)
- user_data = "\n".join(pubkeys)
+ user_data = pubkeys_to_user_data(pubkeys)
requested_instances = defaultdict(list)
# iterate over clouds/zones/nodes
for node in rspec.version.get_nodes_with_slivers():