Merge remote-tracking branch 'origin/geni-v3' into geni-v3
[sfa.git] / sfa / planetlab / plaggregate.py
index dcb81d4..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
 
@@ -13,12 +13,15 @@ from sfa.rspecs.elements.location import Location
 from sfa.rspecs.elements.interface import Interface
 from sfa.rspecs.elements.services import Services
 from sfa.rspecs.elements.pltag import PLTag
+from sfa.rspecs.elements.lease import Lease
+from sfa.rspecs.elements.granularity import Granularity
 from sfa.rspecs.version_manager import VersionManager
 
-from sfa.util.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename
+from sfa.planetlab.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename, slicename_to_hrn
 from sfa.planetlab.vlink import get_tc_rate
 from sfa.planetlab.topology import Topology
 
+import time
 
 class PlAggregate:
 
@@ -115,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': []})
@@ -126,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': []})
@@ -149,11 +158,14 @@ class PlAggregate:
             tags_filter=filter.copy()
 
         geni_available = options.get('geni_available')    
-        if geni_available:
+        if geni_available == True:
             filter['boot_state'] = 'boot'     
         
         filter.update({'peer_id': None})
         nodes = self.driver.shell.GetNodes(filter)
+        
+        # get the granularity in second for the reservation system
+        grain = self.driver.shell.GetLeaseGranularity()
        
         site_ids = []
         interface_ids = []
@@ -205,6 +217,10 @@ class PlAggregate:
             if site['longitude'] and site['latitude']:  
                 location = Location({'longitude': site['longitude'], 'latitude': site['latitude'], 'country': 'unknown'})
                 rspec_node['location'] = location
+            # Granularity
+            granularity = Granularity({'grain': grain})
+            rspec_node['granularity'] = granularity
+
             rspec_node['interfaces'] = []
             if_count=0
             for if_id in node['interface_ids']:
@@ -234,32 +250,85 @@ class PlAggregate:
             rspec_nodes.append(rspec_node)
         return (rspec_nodes, links)
              
+
+    def get_leases(self, slice=None, options={}):
         
-    def get_rspec(self, slice_xrn=None, version = None, options={}):
+        now = int(time.time())
+        filter={}
+        filter.update({'clip':now})
+        if slice:
+           filter.update({'name':slice['name']})
+        return_fields = ['lease_id', 'hostname', 'site_id', 'name', 't_from', 't_until']
+        leases = self.driver.shell.GetLeases(filter)
+        grain = self.driver.shell.GetLeaseGranularity()
+
+        site_ids = []
+        for lease in leases:
+            site_ids.append(lease['site_id'])
+
+        # get sites
+        sites_dict  = self.get_sites({'site_id': site_ids}) 
+  
+        rspec_leases = []
+        for lease in leases:
+
+            rspec_lease = Lease()
+            
+            # xxx how to retrieve site['login_base']
+            site_id=lease['site_id']
+            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'])
+            slice_hrn = slicename_to_hrn(self.driver.hrn, lease['name'])
+            slice_urn = hrn_to_urn(slice_hrn, 'slice')
+            rspec_lease['slice_id'] = slice_urn
+            rspec_lease['start_time'] = lease['t_from']
+            rspec_lease['duration'] = (lease['t_until'] - lease['t_from']) / grain
+            rspec_leases.append(rspec_lease)
+        return rspec_leases
+
+    
+    def list_resources(self, version = None, options={}):
 
         version_manager = VersionManager()
         version = version_manager.get_version(version)
-        if not slice_xrn:
-            rspec_version = version_manager._get_version(version.type, version.version, 'ad')
-        else:
-            rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
-
-        slice, slivers = self.get_slice_and_slivers(slice_xrn)
+        rspec_version = version_manager._get_version(version.type, version.version, 'ad')
         rspec = RSpec(version=rspec_version, user_options=options)
+        
+        if not options.get('list_leases') or options.get('list_leases') and options['list_leases'] != 'leases':
+           nodes, links = self.get_nodes_and_links(options=options)
+           rspec.version.add_nodes(nodes)
+           rspec.version.add_links(links)
+        return rspec.toxml()
+
+    def describe(self, urns, version=None, options={}):
+        version_manager = VersionManager()
+        version = version_manager.get_version(version)
+        rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
+        rspec = RSpec(version=version, user_options=options)
+        slice, slivers = self.get_slice_and_slivers(urns)
         if slice and 'expires' in slice:
             rspec.xml.set('expires',  datetime_to_string(utcparse(slice['expires'])))
-
-        nodes, links = self.get_nodes_and_links(slice_xrn, slice, slivers)
-        rspec.version.add_nodes(nodes)
-        rspec.version.add_links(links)
+       
+        if not options.get('list_leases') or options.get('list_leases') and options['list_leases'] != 'leases':
+           nodes, links = self.get_nodes_and_links(urns, slice, slivers, options)
+           rspec.version.add_nodes(nodes)
+           rspec.version.add_links(links)
+           # add sliver defaults
+           default_sliver = slivers.get(None, [])
+           if default_sliver:
+              default_sliver_attribs = default_sliver.get('tags', [])
+              for attrib in default_sliver_attribs:
+                  rspec.version.add_default_sliver_attribute(attrib['tagname'], attrib['value'])
         
-        # add sliver defaults
-        default_sliver = slivers.get(None, [])
-        if default_sliver:
-            default_sliver_attribs = default_sliver.get('tags', [])
-            for attrib in default_sliver_attribs:
-                logger.info(attrib)
-                rspec.version.add_default_sliver_attribute(attrib['tagname'], attrib['value'])
-        return rspec.toxml()
 
+        if not options.get('list_leases') or options.get('list_leases') and options['list_leases'] != 'resources':
+           leases = self.get_leases(slice)
+           rspec.version.add_leases(leases)
+        
+        result = {'geni_urn': '',
+                  'geni_rspec': rspec.toxml(),
+                  'geni_slivers': []}
 
+        return result