add support of leases for both pgv2 and pgv3 rspecs
authorMohamed Larabi <mohamed.larabi@inria.fr>
Thu, 14 Mar 2013 13:24:26 +0000 (14:24 +0100)
committerMohamed Larabi <mohamed.larabi@inria.fr>
Thu, 14 Mar 2013 13:24:26 +0000 (14:24 +0100)
sfa/rspecs/elements/versions/pgv2Lease.py [new file with mode: 0644]
sfa/rspecs/elements/versions/pgv2Node.py
sfa/rspecs/versions/pgv2.py

diff --git a/sfa/rspecs/elements/versions/pgv2Lease.py b/sfa/rspecs/elements/versions/pgv2Lease.py
new file mode 100644 (file)
index 0000000..8ba53cb
--- /dev/null
@@ -0,0 +1,72 @@
+from sfa.util.xrn import Xrn
+from sfa.util.xml import XpathFilter
+
+from sfa.rspecs.elements.node import Node
+from sfa.rspecs.elements.sliver import Sliver
+from sfa.rspecs.elements.location import Location
+from sfa.rspecs.elements.hardware_type import HardwareType
+from sfa.rspecs.elements.disk_image import DiskImage
+from sfa.rspecs.elements.interface import Interface
+from sfa.rspecs.elements.bwlimit import BWlimit
+from sfa.rspecs.elements.pltag import PLTag
+from sfa.rspecs.elements.versions.pgv2Services import PGv2Services     
+from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType     
+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
+    def add_leases(xml, leases):
+        # group the leases by slice and timeslots
+        grouped_leases = []
+
+        while leases:
+             slice_id = leases[0]['slice_id']
+             start_time = leases[0]['start_time']
+             duration = leases[0]['duration']
+             group = []
+
+             for lease in leases:
+                  if slice_id == lease['slice_id'] and start_time == lease['start_time'] and duration == lease['duration']:
+                      group.append(lease)
+
+             grouped_leases.append(group)
+
+             for lease1 in group:
+                  leases.remove(lease1)
+
+        lease_elems = []
+        for lease in grouped_leases:
+            lease_fields = ['slice_id', 'start_time', 'duration']
+            lease_elem = xml.add_instance('lease', lease[0], lease_fields)
+            lease_elems.append(lease_elem)
+
+            # add nodes of this lease
+            for node in lease:
+                 lease_elem.add_instance('node', node, ['component_id'])
+
+
+    @staticmethod
+    def get_leases(xml, filter={}):
+        xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
+        lease_elems = xml.xpath(xpath)
+        return PGv2Lease.get_lease_objs(lease_elems)
+
+
+    @staticmethod
+    def get_lease_objs(lease_elems):
+        leases = []
+        for lease_elem in lease_elems:
+            #get nodes
+            node_elems = lease_elem.xpath('./default:node | ./node')
+            for node_elem in node_elems:
+                 lease = Lease(lease_elem.attrib, lease_elem)
+                 lease['slice_id'] = lease_elem.attrib['slice_id']
+                 lease['start_time'] = lease_elem.attrib['start_time']
+                 lease['duration'] = lease_elem.attrib['duration']
+                 lease['component_id'] = node_elem.attrib['component_id']
+                 leases.append(lease)
+
+        return leases
index 5191689..4b42403 100644 (file)
@@ -12,6 +12,7 @@ from sfa.rspecs.elements.pltag import PLTag
 from sfa.rspecs.elements.versions.pgv2Services import PGv2Services     
 from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType     
 from sfa.rspecs.elements.versions.pgv2Interface import PGv2Interface     
+from sfa.rspecs.elements.granularity import Granularity
 
 from sfa.planetlab.plxrn import xrn_to_hostname
 
@@ -34,6 +35,11 @@ class PGv2Node:
             # set location
             if node.get('location'):
                 node_elem.add_instance('location', node['location'], Location.fields)       
+
+            # set granularity
+            if node['exclusive'] == "true":
+                granularity = node.get('granularity')
+                node_elem.add_instance('granularity', granularity, granularity.fields)
             # set interfaces
             PGv2Interface.add_interfaces(node_elem, node.get('interfaces'))
             #if node.get('interfaces'):
@@ -91,6 +97,11 @@ class PGv2Node:
             if len(locations) > 0:
                 node['location'] = locations[0]
 
+            # get granularity
+            granularity_elems = node_elem.xpath('./default:granularity | ./granularity')
+            if len(granularity_elems) > 0:
+                node['granularity'] = granularity_elems[0].get_instance(Granularity)
+
             # get interfaces
             iface_elems = node_elem.xpath('./default:interface | ./interface')
             node['interfaces'] = [iface_elem.get_instance(Interface) for iface_elem in iface_elems]
index f8759d8..fbd8a39 100644 (file)
@@ -5,6 +5,7 @@ from sfa.rspecs.version import RSpecVersion
 from sfa.rspecs.elements.versions.pgv2Link import PGv2Link
 from sfa.rspecs.elements.versions.pgv2Node import PGv2Node
 from sfa.rspecs.elements.versions.pgv2SliverType import PGv2SliverType
+from sfa.rspecs.elements.versions.pgv2Lease import PGv2Lease
  
 class PGv2(RSpecVersion):
     type = 'ProtoGENI'
@@ -176,10 +177,10 @@ class PGv2(RSpecVersion):
     # Leases
 
     def get_leases(self, filter=None):
-        pass
+        return PGv2Lease.get_leases(self.xml, filter)
 
     def add_leases(self, leases, network = None, no_dupes=False):
-        pass
+        PGv2Lease.add_leases(self.xml, leases)
 
     # Utility
 
@@ -194,13 +195,20 @@ class PGv2(RSpecVersion):
 
         nodes = in_rspec.version.get_nodes()
         # protogeni rspecs need to advertise the availabel sliver types
+        main_nodes = []
         for node in nodes:
+            if not node['component_name']:
+                # this node element is part of a lease
+                continue
             if not node.has_key('sliver') or not node['sliver']:
                 node['sliver'] = {'name': 'plab-vserver'}
-            
-        self.add_nodes(nodes)
+                main_nodes.append(node)
+        self.add_nodes(main_nodes)
         self.add_links(in_rspec.version.get_links())
         
+        # Leases
+        leases = in_rspec.version.get_leases()
+        self.add_leases(leases)
         #
         #rspec = RSpec(in_rspec)
         #for child in rspec.xml.iterchildren():