better support for sliver urns
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Thu, 16 Aug 2012 22:00:34 +0000 (18:00 -0400)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Thu, 16 Aug 2012 22:00:34 +0000 (18:00 -0400)
sfa/openstack/nova_driver.py
sfa/openstack/osaggregate.py
sfa/openstack/osxrn.py
sfa/planetlab/plaggregate.py
sfa/planetlab/pldriver.py
sfa/rspecs/versions/pgv2.py
sfa/util/osxrn.py [deleted file]
sfa/util/xrn.py

index 6786fd7..0b2dd92 100644 (file)
@@ -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':
index 047d142..8dae28f 100644 (file)
@@ -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),
index e7d1d21..f2bd288 100644 (file)
@@ -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
-        
-        
-            
+       
index 5ce948e..eb109ac 100644 (file)
@@ -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': []})
index cfbb697..33b8804 100644 (file)
@@ -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:
index f96b449..9506e5d 100644 (file)
@@ -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 (file)
index 752feec..0000000
+++ /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
-
-    
index 4a47b58..f2ab48b 100644 (file)
@@ -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\r
 def hrn_authfor_hrn(parenthrn, hrn): return Xrn.hrn_is_auth_for_hrn(parenthrn, hrn)\r
 \r
-def urn_to_sliver_id(urn, slice_id, node_id, index=0, authority=None):\r
-    return Xrn(urn).get_sliver_id(slice_id, node_id, index, authority)\r
-\r
 class Xrn:\r
 \r
     ########## basic tools on HRNs\r
@@ -119,12 +116,15 @@ class Xrn:
     # self.type\r
     # self.path\r
     # provide either urn, or (hrn + type)\r
-    def __init__ (self, xrn, type=None):\r
+    def __init__ (self, xrn, type=None, id=None):\r
         if not xrn: xrn = ""\r
         # user has specified xrn : guess if urn or hrn\r
+        self.id = id\r
         if Xrn.is_urn(xrn):\r
             self.hrn=None\r
             self.urn=xrn\r
+            if id:\r
+                self.urn = "%s:%s" % (self.urn, str(id))\r
             self.urn_to_hrn()\r
         else:\r
             self.urn=None\r
@@ -168,19 +168,20 @@ class Xrn:
         self._normalize()\r
         return ':'.join( [Xrn.unescape(x) for x in self.authority] )\r
 \r
-    def get_sliver_id(self, slice_id, node_id=None, index=0, authority=None):\r
+    def set_authority(self, authority):\r
+        """\r
+        update the authority section of an existing urn\r
+        """\r
+        authority_hrn = self.get_authority_hrn()\r
+        if not authority_hrn.startswith(authority):\r
+            hrn = ".".join([authority,authority_hrn, self.get_leaf()])\r
+        else:\r
+            hrn = ".".join([authority_hrn, self.get_leaf()])\r
+            \r
+        self.hrn = hrn \r
+        self.hrn_to_urn()\r
         self._normalize()\r
-        urn = self.get_urn()\r
-        if authority:\r
-            authority_hrn = self.get_authority_hrn()\r
-            if not authority_hrn.startswith(authority):\r
-                hrn = ".".join([authority,authority_hrn, self.get_leaf()])\r
-            else:\r
-                hrn = ".".join([authority_hrn, self.get_leaf()])\r
-            urn = Xrn(hrn, self.get_type()).get_urn()\r
-        parts = [part for part in [urn, slice_id, node_id, index] if part is not None]\r
-        return ":".join(map(str, [parts]))\r
-\r
+        \r
     def urn_to_hrn(self):\r
         """\r
         compute tuple (hrn, type) from urn\r
@@ -210,6 +211,10 @@ class Xrn:
         hrn = '.'.join([Xrn.escape(part).replace(':','.') for part in parts if part])\r
         # dont replace ':' in the name section\r
         if name:\r
+            parts = name.split(':')\r
+            if len(parts) > 1:\r
+                self.id = ":".join(parts[1:])\r
+                name = parts[0]    \r
             hrn += '.%s' % Xrn.escape(name) \r
 \r
         self.hrn=str(hrn)\r
@@ -245,7 +250,10 @@ class Xrn:
             urn = "+".join(['',authority_string,Xrn.unescape(name)])\r
         else:\r
             urn = "+".join(['',authority_string,self.type,Xrn.unescape(name)])\r
-        \r
+\r
+        if self.id:\r
+            urn = "%s:%s" % (urn, self.id)        \r
+\r
         self.urn = Xrn.URN_PREFIX + urn\r
 \r
     def dump_string(self):\r