From: Tony Mack Date: Thu, 16 Aug 2012 22:00:34 +0000 (-0400) Subject: better support for sliver urns X-Git-Tag: sfa-3.0-0~143^2 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=11d6fde6e6553c9b5ff2f46ed304bf68b717e1dc;p=sfa.git better support for sliver urns --- diff --git a/sfa/openstack/nova_driver.py b/sfa/openstack/nova_driver.py index 6786fd78..0b2dd92b 100644 --- a/sfa/openstack/nova_driver.py +++ b/sfa/openstack/nova_driver.py @@ -8,7 +8,7 @@ from sfa.util.faults import MissingSfaInfo, UnknownSfaType, \ from sfa.util.sfalogging import logger from sfa.util.defaultdict import defaultdict from sfa.util.sfatime import utcparse, datetime_to_string, datetime_to_epoch -from sfa.util.xrn import Xrn, hrn_to_urn, get_leaf, urn_to_sliver_id +from sfa.util.xrn import Xrn, hrn_to_urn, get_leaf from sfa.openstack.osxrn import OSXrn, hrn_to_os_slicename, hrn_to_os_tenant_name from sfa.util.cache import Cache from sfa.trust.credential import Credential @@ -366,7 +366,7 @@ class NovaDriver(Driver): res['plos_created_at'] = datetime_to_string(utcparse(instance.created)) res['plos_boot_state'] = instance.status res['plos_sliver_type'] = self.shell.nova_manager.flavors.find(id=instance.flavor['id']).name - sliver_id = Xrn(slice_urn).get_sliver_id(instance.id) + sliver_id = Xrn(slice_urn, id=instance.id).get_urn() res['geni_urn'] = sliver_id if instance.status.lower() == 'active': diff --git a/sfa/openstack/osaggregate.py b/sfa/openstack/osaggregate.py index 047d1424..8dae28fa 100644 --- a/sfa/openstack/osaggregate.py +++ b/sfa/openstack/osaggregate.py @@ -33,13 +33,12 @@ def pubkeys_to_user_data(pubkeys): user_data += "\n" return user_data -def instance_to_sliver(instance, slice_xrn=None): - sliver_id = None +def instance_to_sliver(instance, xrn=None): + sliver_urn = None if slice_xrn: - xrn = Xrn(slice_xrn, 'slice') - sliver_id = xrn.get_sliver_id(instance.project_id, instance.hostname, instance.id) + sliver_xrn = Xrn(xrn=slice_xrn, type='slice', id=instance.id).get_urn() - sliver = Sliver({'slice_id': sliver_id, + sliver = Sliver({'slice_id': sliver_urn, 'name': instance.name, 'type': instance.name, 'cpus': str(instance.vcpus), diff --git a/sfa/openstack/osxrn.py b/sfa/openstack/osxrn.py index e7d1d21d..f2bd288e 100644 --- a/sfa/openstack/osxrn.py +++ b/sfa/openstack/osxrn.py @@ -17,6 +17,7 @@ class OSXrn(Xrn): def __init__(self, name=None, auth=None, **kwds): config = Config() + self.id = id if name is not None: if 'type' in kwds: self.type = kwds['type'] @@ -50,6 +51,4 @@ class OSXrn(Xrn): self._normalize() tenant_name = self.hrn.replace('\.', '') return tenant_name - - - + diff --git a/sfa/planetlab/plaggregate.py b/sfa/planetlab/plaggregate.py index 5ce948e1..eb109ac8 100644 --- a/sfa/planetlab/plaggregate.py +++ b/sfa/planetlab/plaggregate.py @@ -1,5 +1,5 @@ #!/usr/bin/python -from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn, urn_to_sliver_id +from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn from sfa.util.sfatime import utcparse, datetime_to_string from sfa.util.sfalogging import logger @@ -118,7 +118,12 @@ class PlAggregate: # sort slivers by node id for node_id in slice['node_ids']: - sliver = Sliver({'sliver_id': urn_to_sliver_id(slice_urn, slice['slice_id'], node_id, authority=self.driver.hrn), + + id = ":".join(map(str, [slice['slice_id'], node_id])) + xrn = Xrn(slice_urn, id=id).get_urn() + xrn.set_authority(self.driver.hrn) + sliver_urn = xrn.get_urn() + sliver = Sliver({'sliver_id': sliver_urn, 'name': slice['name'], 'type': 'plab-vserver', 'tags': []}) @@ -129,7 +134,8 @@ class PlAggregate: for tag in tags: # most likely a default/global sliver attribute (node_id == None) if tag['node_id'] not in slivers: - sliver = Sliver({'sliver_id': urn_to_sliver_id(slice_urn, slice['slice_id'], ""), + sliver_urn = Xrn(slice_urn, id = slice['slice_id']).get_urn() + sliver = Sliver({'sliver_id': sliver_urn, 'name': slice['name'], 'type': 'plab-vserver', 'tags': []}) diff --git a/sfa/planetlab/pldriver.py b/sfa/planetlab/pldriver.py index cfbb6975..33b88049 100644 --- a/sfa/planetlab/pldriver.py +++ b/sfa/planetlab/pldriver.py @@ -6,7 +6,7 @@ from sfa.util.faults import MissingSfaInfo, UnknownSfaType, \ from sfa.util.sfalogging import logger from sfa.util.defaultdict import defaultdict from sfa.util.sfatime import utcparse, datetime_to_string, datetime_to_epoch -from sfa.util.xrn import hrn_to_urn, get_leaf, urn_to_sliver_id +from sfa.util.xrn import hrn_to_urn, get_leaf from sfa.util.cache import Cache # one would think the driver should not need to mess with the SFA db, but.. @@ -627,8 +627,10 @@ class PlDriver (Driver): if node['last_contact'] is not None: res['pl_last_contact'] = datetime_to_string(utcparse(node['last_contact'])) - sliver_id = urn_to_sliver_id(slice_urn, slice['slice_id'], node['node_id'], authority=self.hrn) - res['geni_urn'] = sliver_id + sliver_id = "%s:%s" % (slice['slice_id'], node['node_id']) + sliver_xrn = Xrn(slice_urn, id = sliver_id) + sliver_xrn.set_authority(self.hrn) + res['geni_urn'] = sliver_xrn.get_urn() if node['boot_state'] == 'boot': res['geni_status'] = 'ready' else: diff --git a/sfa/rspecs/versions/pgv2.py b/sfa/rspecs/versions/pgv2.py index f96b449d..9506e5df 100644 --- a/sfa/rspecs/versions/pgv2.py +++ b/sfa/rspecs/versions/pgv2.py @@ -1,6 +1,6 @@ from copy import deepcopy from StringIO import StringIO -from sfa.util.xrn import Xrn, urn_to_sliver_id +from sfa.util.xrn import Xrn from sfa.rspecs.version import RSpecVersion from sfa.rspecs.elements.versions.pgv2Link import PGv2Link from sfa.rspecs.elements.versions.pgv2Node import PGv2Node @@ -143,7 +143,6 @@ class PGv2(RSpecVersion): # set the sliver id #slice_id = sliver_info.get('slice_id', -1) #node_id = sliver_info.get('node_id', -1) - #sliver_id = urn_to_sliver_id(sliver_urn, slice_id, node_id) #node_elem.set('sliver_id', sliver_id) # add the sliver type elemnt diff --git a/sfa/util/osxrn.py b/sfa/util/osxrn.py deleted file mode 100644 index 752feecc..00000000 --- a/sfa/util/osxrn.py +++ /dev/null @@ -1,27 +0,0 @@ -import re -from sfa.util.xrn import Xrn -from sfa.util.config import Config - -class OSXrn(Xrn): - - def __init__(self, name=None, type=None, **kwds): - - config = Config() - if name is not None: - self.type = type - self.hrn = config.SFA_INTERFACE_HRN + "." + name - self.hrn_to_urn() - else: - Xrn.__init__(self, **kwds) - - self.name = self.get_name() - - def get_name(self): - self._normalize() - leaf = self.leaf - sliver_id_parts = leaf.split(':') - name = sliver_id_parts[0] - name = re.sub('[^a-zA-Z0-9_]', '', name) - return name - - diff --git a/sfa/util/xrn.py b/sfa/util/xrn.py index 4a47b581..f2ab48bc 100644 --- a/sfa/util/xrn.py +++ b/sfa/util/xrn.py @@ -32,9 +32,6 @@ def urn_to_hrn(urn): xrn=Xrn(urn); return (xrn.hrn, xrn.type) def hrn_to_urn(hrn,type): return Xrn(hrn, type=type).urn def hrn_authfor_hrn(parenthrn, hrn): return Xrn.hrn_is_auth_for_hrn(parenthrn, hrn) -def urn_to_sliver_id(urn, slice_id, node_id, index=0, authority=None): - return Xrn(urn).get_sliver_id(slice_id, node_id, index, authority) - class Xrn: ########## basic tools on HRNs @@ -119,12 +116,15 @@ class Xrn: # self.type # self.path # provide either urn, or (hrn + type) - def __init__ (self, xrn, type=None): + def __init__ (self, xrn, type=None, id=None): if not xrn: xrn = "" # user has specified xrn : guess if urn or hrn + self.id = id if Xrn.is_urn(xrn): self.hrn=None self.urn=xrn + if id: + self.urn = "%s:%s" % (self.urn, str(id)) self.urn_to_hrn() else: self.urn=None @@ -168,19 +168,20 @@ class Xrn: self._normalize() return ':'.join( [Xrn.unescape(x) for x in self.authority] ) - def get_sliver_id(self, slice_id, node_id=None, index=0, authority=None): + def set_authority(self, authority): + """ + update the authority section of an existing urn + """ + authority_hrn = self.get_authority_hrn() + if not authority_hrn.startswith(authority): + hrn = ".".join([authority,authority_hrn, self.get_leaf()]) + else: + hrn = ".".join([authority_hrn, self.get_leaf()]) + + self.hrn = hrn + self.hrn_to_urn() self._normalize() - urn = self.get_urn() - if authority: - authority_hrn = self.get_authority_hrn() - if not authority_hrn.startswith(authority): - hrn = ".".join([authority,authority_hrn, self.get_leaf()]) - else: - hrn = ".".join([authority_hrn, self.get_leaf()]) - urn = Xrn(hrn, self.get_type()).get_urn() - parts = [part for part in [urn, slice_id, node_id, index] if part is not None] - return ":".join(map(str, [parts])) - + def urn_to_hrn(self): """ compute tuple (hrn, type) from urn @@ -210,6 +211,10 @@ class Xrn: hrn = '.'.join([Xrn.escape(part).replace(':','.') for part in parts if part]) # dont replace ':' in the name section if name: + parts = name.split(':') + if len(parts) > 1: + self.id = ":".join(parts[1:]) + name = parts[0] hrn += '.%s' % Xrn.escape(name) self.hrn=str(hrn) @@ -245,7 +250,10 @@ class Xrn: urn = "+".join(['',authority_string,Xrn.unescape(name)]) else: urn = "+".join(['',authority_string,self.type,Xrn.unescape(name)]) - + + if self.id: + urn = "%s:%s" % (urn, self.id) + self.urn = Xrn.URN_PREFIX + urn def dump_string(self):