# Get all plc sites
# retrieve only required stuf
sites = shell.GetSites({'peer_id': None, 'enabled' : True},
- ['site_id','login_base','node_ids','slice_ids','person_ids',])
+ ['site_id','login_base','node_ids','slice_ids','person_ids', 'name'])
# create a hash of sites by login_base
# sites_by_login_base = dict ( [ ( site['login_base'], site ) for site in sites ] )
# Get all plc users
# start importing
for site in sites:
+ if site['name'].startswith('sfa.'):
+ continue
+
site_hrn = _get_site_hrn(interface_hrn, site)
# import if hrn is not in list of existing hrns or if the hrn exists
# but its not a site record
forward_options['rspec_version'] = version_manager.get_version('SFA 1').to_dict()
else:
forward_options['rspec_version'] = version_manager.get_version('ProtoGENI 2').to_dict()
- forward_options['geni_rspec_version'] = {'type': 'geni', 'version': '3.0'}
+ forward_options['geni_rspec_version'] = {'type': 'geni', 'version': '3'}
rspec = server.ListResources(credential, forward_options)
return {"aggregate": aggregate, "rspec": rspec, "elapsed": time.time()-tStart, "status": "success"}
except Exception, e:
#!/usr/bin/python
-from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn
+from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn, get_authority, get_leaf
from sfa.util.sfatime import utcparse, datetime_to_string
from sfa.util.sfalogging import logger
from sfa.rspecs.elements.granularity import Granularity
from sfa.rspecs.version_manager import VersionManager
-from sfa.planetlab.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename, slicename_to_hrn
+from sfa.planetlab.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename, slicename_to_hrn, xrn_to_ext_slicename, top_auth
from sfa.planetlab.vlink import get_tc_rate
from sfa.planetlab.topology import Topology
slice = None
if not slice_xrn:
return (slice, slivers)
+
slice_urn = hrn_to_urn(slice_xrn, 'slice')
slice_hrn, _ = urn_to_hrn(slice_xrn)
- slice_name = hrn_to_pl_slicename(slice_hrn)
+ top_auth_hrn = top_auth(slice_hrn)
+ if top_auth_hrn == self.driver.hrn:
+ slice_name = hrn_to_pl_slicename(slice_hrn)
+ else:
+ slice_name = xrn_to_ext_slicename(slice_hrn)
+
slices = self.driver.shell.GetSlices(slice_name)
if not slices:
return (slice, slivers)
site=sites_dict[site_id]
#rspec_lease['lease_id'] = lease['lease_id']
- rspec_lease['component_id'] = hostname_to_urn(self.driver.hrn, site['login_base'], lease['hostname'])
+ rspec_lease['component_id'] = hrn_to_urn(self.driver.shell.GetNodeHrn(lease['hostname']), 'node')
+ #rspec_lease['component_id'] = hostname_to_urn(self.driver.hrn, site['login_base'], lease['hostname'])
if slice_xrn:
slice_urn = slice_xrn
- slice_hrn = urn_to_hrn(slice_urn)
+ slice_hrn, _ = urn_to_hrn(slice_urn)
+ # Check slice HRN
+ if slice_hrn != self.driver.shell.GetSliceHrn(lease['slice_id']):
+ self.driver.shell.SetSliceHrn(lease['slice_id'], slice_hrn)
else:
- slice_hrn = slicename_to_hrn(self.driver.hrn, lease['name'])
+ slice_hrn = self.driver.shell.GetSliceHrn(lease['slice_id'])
slice_urn = hrn_to_urn(slice_hrn, 'slice')
rspec_lease['slice_id'] = slice_urn
rspec_lease['start_time'] = lease['t_from']
import sfa.planetlab.peers as peers
from sfa.planetlab.plaggregate import PlAggregate
from sfa.planetlab.plslices import PlSlices
-from sfa.planetlab.plxrn import PlXrn, slicename_to_hrn, hostname_to_hrn, hrn_to_pl_slicename, xrn_to_hostname
+from sfa.planetlab.plxrn import PlXrn, slicename_to_hrn, hostname_to_hrn, hrn_to_pl_slicename, xrn_to_hostname, xrn_to_ext_slicename, top_auth
def list_to_dict(recs, key):
version=rspec.version)
def delete_sliver (self, slice_urn, slice_hrn, creds, options):
- slicename = hrn_to_pl_slicename(slice_hrn)
+
+ top_auth_hrn = top_auth(slice_hrn)
+ if top_auth_hrn == self.hrn:
+ slicename = hrn_to_pl_slicename(slice_hrn)
+ else:
+ slicename = xrn_to_ext_slicename(slice_hrn)
+
slices = self.shell.GetSlices({'name': slicename})
if not slices:
return True
return True
def renew_sliver (self, slice_urn, slice_hrn, creds, expiration_time, options):
- slicename = hrn_to_pl_slicename(slice_hrn)
+ top_auth_hrn = top_auth(slice_hrn)
+ if top_auth_hrn == self.hrn:
+ slicename = hrn_to_pl_slicename(slice_hrn)
+ else:
+ slicename = xrn_to_ext_slicename(slice_hrn)
+
slices = self.shell.GetSlices({'name': slicename}, ['slice_id'])
if not slices:
raise RecordNotFound(slice_hrn)
# remove the 'enabled' tag
def start_slice (self, slice_urn, slice_hrn, creds):
- slicename = hrn_to_pl_slicename(slice_hrn)
+ top_auth_hrn = top_auth(slice_hrn)
+ if top_auth_hrn == self.hrn:
+ slicename = hrn_to_pl_slicename(slice_hrn)
+ else:
+ slicename = xrn_to_ext_slicename(slice_hrn)
+
slices = self.shell.GetSlices({'name': slicename}, ['slice_id'])
if not slices:
raise RecordNotFound(slice_hrn)
# set the 'enabled' tag to 0
def stop_slice (self, slice_urn, slice_hrn, creds):
- slicename = hrn_to_pl_slicename(slice_hrn)
+ top_auth_hrn = top_auth(slice_hrn)
+ if top_auth_hrn == self.hrn:
+ slicename = hrn_to_pl_slicename(slice_hrn)
+ else:
+ slicename = xrn_to_ext_slicename(slice_hrn)
+
slices = self.shell.GetSlices({'name': slicename}, ['slice_id'])
if not slices:
raise RecordNotFound(slice_hrn)
'GetSites','GetNodes',
# Lease management methods
'GetLeases', 'GetLeaseGranularity', 'DeleteLeases','UpdateLeases',
- 'AddLeases'
+ 'AddLeases',
+ # HRN management methods
+ 'SetPersonHrn', 'GetPersonHrn', 'SetSliceHrn', 'GetSliceHrn',
+ 'SetNodeHrn', 'GetNodeHrn'
]
# support for other names - this is experimental
alias_calls = { 'get_authorities':'GetSites',
from sfa.rspecs.rspec import RSpec
from sfa.planetlab.vlink import VLink
-from sfa.planetlab.plxrn import PlXrn, hrn_to_pl_slicename, xrn_to_hostname
+from sfa.planetlab.plxrn import PlXrn, hrn_to_pl_slicename, xrn_to_hostname, xrn_to_ext_slicename, hrn_to_ext_loginbase, top_auth
import time
requested_leases = []
for lease in rspec_requested_leases:
requested_lease = {}
- slice_name = hrn_to_pl_slicename(lease['slice_id'])
+ slice_hrn, _ = urn_to_hrn(lease['slice_id'])
+ top_auth_hrn = top_auth(slice_hrn)
+ if top_auth_hrn == self.driver.hrn:
+ slice_name = hrn_to_pl_slicename(lease['slice_id'])
+ else:
+ slice_name = xrn_to_ext_slicename(lease['slice_id'])
if slice_name != slice['name']:
continue
elif Xrn(lease['component_id']).get_authority_urn().split(':')[0] != self.driver.hrn:
def verify_site(self, slice_xrn, slice_record={}, peer=None, sfa_peer=None, options={}):
(slice_hrn, type) = urn_to_hrn(slice_xrn)
- site_hrn = get_authority(slice_hrn)
- # login base can't be longer than 20 characters
- slicename = hrn_to_pl_slicename(slice_hrn)
- authority_name = slicename.split('_')[0]
- login_base = authority_name[:20]
+ top_auth_hrn = top_auth(slice_hrn)
+ if top_auth_hrn == self.driver.hrn:
+ # login base can't be longer than 20 characters
+ slicename = hrn_to_pl_slicename(slice_hrn)
+ authority_name = slicename.split('_')[0]
+ login_base = authority_name[:20]
+ else:
+ login_base = hrn_to_ext_loginbase(slice_hrn)
+ authority_name = login_base
+
sites = self.driver.shell.GetSites(login_base)
if not sites:
# create new site record
- site = {'name': 'geni.%s' % authority_name,
+ site = {'name': 'sfa.%s' % authority_name,
'abbreviated_name': authority_name,
'login_base': login_base,
'max_slices': 100,
return site
def verify_slice(self, slice_hrn, slice_record, peer, sfa_peer, options={}):
- slicename = hrn_to_pl_slicename(slice_hrn)
- parts = slicename.split("_")
- login_base = parts[0]
- slices = self.driver.shell.GetSlices([slicename])
+ top_auth_hrn = top_auth(slice_hrn)
+ if top_auth_hrn == self.driver.hrn:
+ slice_name = hrn_to_pl_slicename(slice_hrn)
+ parts = slice_name.split("_")
+ login_base = parts[0]
+ else:
+ login_base = hrn_to_ext_loginbase(slice_hrn)
+ slice_name = xrn_to_ext_slicename(slice_hrn)
+
+ slices = self.driver.shell.GetSlices([slice_name])
if not slices:
- slice = {'name': slicename,
+ slice = {'name': slice_name,
'url': slice_record.get('url', slice_hrn),
'description': slice_record.get('description', slice_hrn)}
# add the slice
slice['slice_id'] = self.driver.shell.AddSlice(slice)
+ # set the slice HRN
+ self.driver.shell.SetSliceHrn(int(slice['slice_id']), slice_hrn)
+
slice['node_ids'] = []
slice['person_ids'] = []
if peer:
# self.registry.register_peer_object(self.credential, peer_dict)
else:
slice = slices[0]
+ # Check slice HRN
+ if self.driver.shell.GetSliceHrn(slice['slice_id']) != slice_hrn:
+ self.driver.shell.SetSliceHrn(slice['slice_id'], slice_hrn)
+
if peer:
slice['peer_slice_id'] = slice_record.get('slice_id', None)
# unbind from peer so we can modify if necessary. Will bind back later
user['urn'] = user['urn'].lower()
hrn, type = urn_to_hrn(user['urn'])
username = get_leaf(hrn)
- login_base = PlXrn(xrn=user['urn']).pl_login_base()
user['username'] = username
- user['site'] = login_base
+
+ top_auth_hrn = top_auth(hrn)
+
+ if top_auth_hrn == self.driver.hrn:
+ login_base = PlXrn(xrn=user['urn']).pl_login_base()
+ else:
+ login_base = hrn_to_ext_loginbase(hrn)
+ user['site'] = login_base
if 'email' in user:
user['email'] = user['email'].lower()
users_by_email[user['email']] = user
'first_name': added_user.get('first_name', hrn),
'last_name': added_user.get('last_name', hrn),
'email': added_user_id,
- 'peer_person_id': None,
- 'keys': [],
+ #'peer_person_id': None,
+ #'keys': [],
#'key_ids': added_user.get('key_ids', []),
}
person['person_id'] = self.driver.shell.AddPerson(person)
+ self.driver.shell.AddRoleToPerson('user', int(person['person_id']))
+ # check user HRN
+ if self.driver.shell.GetPersonHrn(int(person['person_id'])) != hrn:
+ self.driver.shell.SetPersonHrn(int(person['person_id']), hrn)
+
if peer:
person['peer_person_id'] = added_user['person_id']
added_persons.append(person)
for key_string in added_user.get('keys', []):
key = {'key':key_string, 'key_type':'ssh'}
key['key_id'] = self.driver.shell.AddPersonKey(person['person_id'], key)
+ if 'keys' not in person:
+ person['keys'] = []
person['keys'].append(key)
# add the registry record
# specialized Xrn class for PlanetLab
import re
-from sfa.util.xrn import Xrn
+from sfa.util.xrn import Xrn, get_authority
# temporary helper functions to use this module instead of namespace
def hostname_to_hrn (auth, login_base, hostname):
def xrn_to_hostname(hrn):
return Xrn.unescape(PlXrn(xrn=hrn, type='node').get_leaf())
+# helpers to handle external objects created via fedaration
+def xrn_to_ext_slicename (xrn):
+ slice_hrn=PlXrn(xrn=xrn,type='slice').get_hrn()
+ site_hrn = get_authority(slice_hrn)
+ login_base = '8'.join(site_hrn.split('.'))
+ slice_name = '_'.join([login_base, slice_hrn.split('.')[-1]])
+ return slice_name
+
+def hrn_to_ext_loginbase (hrn):
+ site_hrn = get_authority(hrn)
+ login_base = '8'.join(site_hrn.split('.'))[:20]
+ return login_base
+
+def top_auth (hrn):
+ return hrn.split('.')[0]
+
class PlXrn (Xrn):
@staticmethod
network_elem.set('login', unicode(iotlab_network_dict['login']))
@staticmethod
- def add_nodes(xml, nodes):
+ def add_nodes(xml, nodes, rspec_content_type=None):
"""Adds the nodes to the xml.
Adds the nodes as well as dedicated iotlab fields to the node xml
#'value': initscript['name']})
Iotlabv1Sliver.add_slivers(node_elem, slivers)
+
+ # add sliver tag in Request Rspec
+ if rspec_content_type == "request":
+ node_elem.add_instance('sliver', '', [])
+
return node_elems
@staticmethod
tag_elem = node_elem.add_element(tag['tagname'])
tag_elem.set_text(tag['value'])
NITOSv1Sliver.add_slivers(node_elem, node.get('slivers', []))
+
+ # add sliver tag in Request Rspec
+ if rspec_content_type == "request":
+ node_elem.add_instance('sliver', '', [])
@staticmethod
def add_slivers(xml, slivers):
from sfa.rspecs.elements.versions.pgv2Interface import PGv2Interface
from sfa.rspecs.elements.lease import Lease
-from sfa.planetlab.plxrn import xrn_to_hostname
class PGv2Lease:
@staticmethod
-from sfa.util.xrn import Xrn
+from sfa.util.xrn import Xrn, get_leaf
from sfa.util.xml import XpathFilter
from sfa.rspecs.elements.node import Node
from sfa.rspecs.elements.granularity import Granularity
from sfa.rspecs.elements.attribute import Attribute
-from sfa.planetlab.plxrn import xrn_to_hostname
class PGv2Node:
@staticmethod
- def add_nodes(xml, nodes):
+ def add_nodes(xml, nodes, rspec_content_type=None):
node_elems = []
for node in nodes:
node_fields = ['component_manager_id', 'component_id', 'client_id', 'sliver_id', 'exclusive']
node_elems.append(node_elem)
# set component name
if node.get('component_id'):
- component_name = xrn_to_hostname(node['component_id'])
+ component_name = Xrn.unescape(get_leaf(Xrn(node['component_id']).get_hrn()))
node_elem.set('component_name', component_name)
# set hardware types
if node.get('hardware_types'):
node_elem.add_instance('location', node['location'], Location.fields)
# set granularity
- if node['exclusive'] == "true":
+ if node.get('exclusive') == "true":
granularity = node.get('granularity')
node_elem.add_instance('granularity', granularity, granularity.fields)
# set interfaces
tag['name'] = tag.pop('tagname')
node_elem.add_instance('{%s}attribute' % xml.namespaces['planetlab'], tag, ['name', 'value'])
+ # add sliver tag in Request Rspec
+ if rspec_content_type == "request":
+ node_elem.add_instance('sliver', '', [])
+
return node_elems
node['boot_state'] = 'disabled'
# get initscripts
- node['pl_initscripts'] = []
- initscript_elems = node_elem.xpath('./default:sliver_type/planetlab:initscript | ./sliver_type/initscript')
- if len(initscript_elems) > 0:
- for initscript_elem in initscript_elems:
- if 'name' in initscript_elem.attrib:
- node['pl_initscripts'].append(dict(initscript_elem.attrib))
+ try:
+ node['pl_initscripts'] = []
+ initscript_elems = node_elem.xpath('./default:sliver_type/planetlab:initscript | ./sliver_type/initscript')
+ if len(initscript_elems) > 0:
+ for initscript_elem in initscript_elems:
+ if 'name' in initscript_elem.attrib:
+ node['pl_initscripts'].append(dict(initscript_elem.attrib))
+ except:
+ pass
# get node tags
- tag_elems = node_elem.xpath('./planetlab:attribute | ./attribute')
- node['tags'] = []
- if len(tag_elems) > 0:
- for tag_elem in tag_elems:
- tag = dict(tag_elem.get_instance(Attribute))
- tag['tagname'] = tag.pop('name')
- node['tags'].append(tag)
+ try:
+ tag_elems = node_elem.xpath('./planetlab:attribute | ./attribute')
+ node['tags'] = []
+ if len(tag_elems) > 0:
+ for tag_elem in tag_elems:
+ tag = dict(tag_elem.get_instance(Attribute))
+ tag['tagname'] = tag.pop('name')
+ node['tags'].append(tag)
+ except:
+ pass
+
return nodes
from sfa.rspecs.elements.versions.pgv2Services import PGv2Services
from sfa.rspecs.elements.lease import Lease
-from sfa.planetlab.plxrn import xrn_to_hostname
class SFAv1Lease:
from sfa.util.sfalogging import logger
from sfa.util.xml import XpathFilter
-from sfa.util.xrn import Xrn
+from sfa.util.xrn import Xrn, get_leaf
from sfa.rspecs.elements.element import Element
from sfa.rspecs.elements.node import Node
from sfa.rspecs.elements.versions.sfav1PLTag import SFAv1PLTag
from sfa.rspecs.elements.versions.pgv2Services import PGv2Services
-from sfa.planetlab.plxrn import xrn_to_hostname
class SFAv1Node:
@staticmethod
- def add_nodes(xml, nodes):
+ def add_nodes(xml, nodes, rspec_content_type=None):
network_elems = xml.xpath('//network')
if len(network_elems) > 0:
network_elem = network_elems[0]
# set component_name attribute and hostname element
if 'component_id' in node and node['component_id']:
- component_name = xrn_to_hostname(node['component_id'])
+ component_name = Xrn.unescape(get_leaf(Xrn(node['component_id']).get_hrn()))
node_elem.set('component_name', component_name)
hostname_elem = node_elem.add_element('hostname')
hostname_elem.set_text(component_name)
tag_elem.set_text(tag['value'])
SFAv1Sliver.add_slivers(node_elem, node.get('slivers', []))
+ # add sliver tag in Request Rspec
+ if rspec_content_type == "request":
+ node_elem.add_instance('sliver', '', [])
+
@staticmethod
def add_slivers(xml, slivers):
component_ids = []
from sfa.rspecs.elements.sliver import Sliver
from sfa.rspecs.elements.versions.sfav1PLTag import SFAv1PLTag
-from sfa.planetlab.plxrn import PlXrn
class SFAv1Sliver:
def add_connection_information(self, ldap_username, sites_set):
return Iotlabv1Node.add_connection_information(self.xml,ldap_username, sites_set)
- def add_nodes(self, nodes, check_for_dupes=False):
- return Iotlabv1Node.add_nodes(self.xml,nodes )
+ def add_nodes(self, nodes, check_for_dupes=False, rspec_content_type=None):
+ return Iotlabv1Node.add_nodes(self.xml,nodes, rspec_content_type)
def merge_node(self, source_node_tag, network, no_dupes = False):
logger.debug("SLABV1 merge_node")
def get_nodes_with_slivers(self):
return NITOSv1Node.get_nodes_with_slivers(self.xml)
- def add_nodes(self, nodes, network = None, no_dupes=False):
- NITOSv1Node.add_nodes(self.xml, nodes)
+ def add_nodes(self, nodes, network = None, no_dupes=False, rspec_content_type=None):
+ NITOSv1Node.add_nodes(self.xml, nodes, rspec_content_type)
def merge_node(self, source_node_tag, network, no_dupes=False):
if no_dupes and self.get_node_element(node['hostname']):
def get_nodes_with_slivers(self):
return PGv2Node.get_nodes_with_slivers(self.xml)
- def add_nodes(self, nodes, check_for_dupes=False):
- return PGv2Node.add_nodes(self.xml, nodes)
+ def add_nodes(self, nodes, check_for_dupes=False, rspec_content_type=None):
+ return PGv2Node.add_nodes(self.xml, nodes, rspec_content_type)
def merge_node(self, source_node_tag):
# this is untested
def get_nodes_with_slivers(self):
return SFAv1Node.get_nodes_with_slivers(self.xml)
- def add_nodes(self, nodes, network = None, no_dupes=False):
- SFAv1Node.add_nodes(self.xml, nodes)
+ def add_nodes(self, nodes, network = None, no_dupes=False, rspec_content_type=None):
+ SFAv1Node.add_nodes(self.xml, nodes, rspec_content_type)
def merge_node(self, source_node_tag, network, no_dupes=False):
if no_dupes and self.get_node_element(node['hostname']):