Refactored ListResources, ListSlices. ListResources no longer returns slice resources...
[sfa.git] / sfa / planetlab / pldriver.py
index 3191182..623c30e 100644 (file)
@@ -3,7 +3,6 @@ import datetime
 #
 from sfa.util.faults import MissingSfaInfo, UnknownSfaType, \
     RecordNotFound, SfaNotImplemented, SliverDoesNotExist
 #
 from sfa.util.faults import MissingSfaInfo, UnknownSfaType, \
     RecordNotFound, SfaNotImplemented, SliverDoesNotExist
-
 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.sfalogging import logger
 from sfa.util.defaultdict import defaultdict
 from sfa.util.sfatime import utcparse, datetime_to_string, datetime_to_epoch
@@ -16,18 +15,16 @@ from sfa.storage.model import RegRecord
 
 # used to be used in get_ticket
 #from sfa.trust.sfaticket import SfaTicket
 
 # used to be used in get_ticket
 #from sfa.trust.sfaticket import SfaTicket
-
 from sfa.rspecs.version_manager import VersionManager
 from sfa.rspecs.rspec import RSpec
 
 # the driver interface, mostly provides default behaviours
 from sfa.managers.driver import Driver
 from sfa.rspecs.version_manager import VersionManager
 from sfa.rspecs.rspec import RSpec
 
 # the driver interface, mostly provides default behaviours
 from sfa.managers.driver import Driver
-
 from sfa.planetlab.plshell import PlShell
 import sfa.planetlab.peers as peers
 from sfa.planetlab.plaggregate import PlAggregate
 from sfa.planetlab.plslices import PlSlices
 from sfa.planetlab.plshell import PlShell
 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
+from sfa.planetlab.plxrn import PlXrn, slicename_to_hrn, hostname_to_hrn, hrn_to_pl_slicename, xrn_to_hostname
 
 
 def list_to_dict(recs, key):
 
 
 def list_to_dict(recs, key):
@@ -160,6 +157,10 @@ class PlDriver (Driver):
                            'password', 'phone', 'url', 'bio', 'accepted_aup',
                            'enabled']:
                     update_fields[key] = all_fields[key]
                            'password', 'phone', 'url', 'bio', 'accepted_aup',
                            'enabled']:
                     update_fields[key] = all_fields[key]
+            # when updating a user, we always get a 'email' field at this point
+            # this is because 'email' is a native field in the RegUser object...
+            if 'email' in update_fields and not update_fields['email']:
+                del update_fields['email']
             self.shell.UpdatePerson(pointer, update_fields)
     
             if new_key:
             self.shell.UpdatePerson(pointer, update_fields)
     
             if new_key:
@@ -559,74 +560,24 @@ class PlDriver (Driver):
 
     def testbed_name (self): return "myplc"
 
 
     def testbed_name (self): return "myplc"
 
-    # 'geni_request_rspec_versions' and 'geni_ad_rspec_versions' are mandatory
     def aggregate_version (self):
     def aggregate_version (self):
-        version_manager = VersionManager()
-        ad_rspec_versions = []
-        request_rspec_versions = []
-        for rspec_version in version_manager.versions:
-            if rspec_version.content_type in ['*', 'ad']:
-                ad_rspec_versions.append(rspec_version.to_dict())
-            if rspec_version.content_type in ['*', 'request']:
-                request_rspec_versions.append(rspec_version.to_dict()) 
-        return {
-            'testbed':self.testbed_name(),
-            'geni_request_rspec_versions': request_rspec_versions,
-            'geni_ad_rspec_versions': ad_rspec_versions,
-            }
+        return {}
 
     def list_slices (self, creds, options):
 
     def list_slices (self, creds, options):
-        # look in cache first
-        if self.cache:
-            slices = self.cache.get('slices')
-            if slices:
-                logger.debug("PlDriver.list_slices returns from cache")
-                return slices
-    
         # get data from db 
         slices = self.shell.GetSlices({'peer_id': None}, ['name'])
         slice_hrns = [slicename_to_hrn(self.hrn, slice['name']) for slice in slices]
         slice_urns = [hrn_to_urn(slice_hrn, 'slice') for slice_hrn in slice_hrns]
         # get data from db 
         slices = self.shell.GetSlices({'peer_id': None}, ['name'])
         slice_hrns = [slicename_to_hrn(self.hrn, slice['name']) for slice in slices]
         slice_urns = [hrn_to_urn(slice_hrn, 'slice') for slice_hrn in slice_hrns]
-    
-        # cache the result
-        if self.cache:
-            logger.debug ("PlDriver.list_slices stores value in cache")
-            self.cache.add('slices', slice_urns) 
-    
         return slice_urns
         
     # first 2 args are None in case of resource discovery
         return slice_urns
         
     # first 2 args are None in case of resource discovery
-    def list_resources (self, slice_urn, slice_hrn, creds, options):
-        cached_requested = options.get('cached', True) 
-    
-        version_manager = VersionManager()
-        # get the rspec's return format from options
-        rspec_version = version_manager.get_version(options.get('geni_rspec_version'))
-        version_string = "rspec_%s" % (rspec_version)
-    
-        #panos adding the info option to the caching key (can be improved)
-        if options.get('info'):
-            version_string = version_string + "_"+options.get('info', 'default')
-    
-        # look in cache first
-        if cached_requested and self.cache and not slice_hrn:
-            rspec = self.cache.get(version_string)
-            if rspec:
-                logger.debug("PlDriver.ListResources: returning cached advertisement")
-                return rspec 
-    
-        #panos: passing user-defined options
-        #print "manager options = ",options
+    def list_resources (self, creds, options):
         aggregate = PlAggregate(self)
         aggregate = PlAggregate(self)
-        rspec =  aggregate.get_rspec(slice_xrn=slice_urn, version=rspec_version, 
-                                     options=options)
-    
-        # cache the result
-        if self.cache and not slice_hrn:
-            logger.debug("PlDriver.ListResources: stores advertisement in cache")
-            self.cache.add(version_string, rspec)
-    
+        rspec =  aggregate.get_rspec(version=rspec_version, options=options)
         return rspec
         return rspec
+
+    def describe(self, creds, urns, options):
+        return {}
     
     def sliver_status (self, slice_urn, slice_hrn):
         # find out where this slice is currently running
     
     def sliver_status (self, slice_urn, slice_hrn):
         # find out where this slice is currently running
@@ -650,7 +601,7 @@ class PlDriver (Driver):
             persons = self.shell.GetPersons(slice['person_ids'], ['key_ids'])
             key_ids = [key_id for person in persons for key_id in person['key_ids']]
             person_keys = self.shell.GetKeys(key_ids)
             persons = self.shell.GetPersons(slice['person_ids'], ['key_ids'])
             key_ids = [key_id for person in persons for key_id in person['key_ids']]
             person_keys = self.shell.GetKeys(key_ids)
-            keys = [key['key'] for key in keys]
+            keys = [key['key'] for key in person_keys]
 
             user.update({'urn': slice_urn,
                          'login': slice['name'],
 
             user.update({'urn': slice_urn,
                          'login': slice['name'],
@@ -661,9 +612,6 @@ class PlDriver (Driver):
         site_ids = [node['site_id'] for node in nodes]
     
         result = {}
         site_ids = [node['site_id'] for node in nodes]
     
         result = {}
-        top_level_status = 'unknown'
-        if nodes:
-            top_level_status = 'ready'
         result['geni_urn'] = slice_urn
         result['pl_login'] = slice['name']
         result['pl_expires'] = datetime_to_string(utcparse(slice['expires']))
         result['geni_urn'] = slice_urn
         result['pl_login'] = slice['name']
         result['pl_expires'] = datetime_to_string(utcparse(slice['expires']))
@@ -685,14 +633,12 @@ class PlDriver (Driver):
                 res['geni_status'] = 'ready'
             else:
                 res['geni_status'] = 'failed'
                 res['geni_status'] = 'ready'
             else:
                 res['geni_status'] = 'failed'
-                top_level_status = 'failed' 
+            res['geni_allocation_status'] = 'geni_provisioned'
                 
             res['geni_error'] = ''
             res['users'] = [user]  
                 
             res['geni_error'] = ''
             res['users'] = [user]  
-    
             resources.append(res)
             
             resources.append(res)
             
-        result['geni_status'] = top_level_status
         result['geni_resources'] = resources
         return result
 
         result['geni_resources'] = resources
         return result
 
@@ -733,6 +679,22 @@ class PlDriver (Driver):
    
         # add/remove links links 
         slices.verify_slice_links(slice, rspec.version.get_link_requests(), nodes)
    
         # add/remove links links 
         slices.verify_slice_links(slice, rspec.version.get_link_requests(), nodes)
+
+        # add/remove leases
+        requested_leases = []
+        kept_leases = []
+        for lease in rspec.version.get_leases():
+            requested_lease = {}
+            if not lease.get('lease_id'):
+               requested_lease['hostname'] = xrn_to_hostname(lease.get('component_id').strip())
+               requested_lease['start_time'] = lease.get('start_time')
+               requested_lease['duration'] = lease.get('duration')
+            else:
+               kept_leases.append(int(lease['lease_id']))
+            if requested_lease.get('hostname'):
+                requested_leases.append(requested_lease)
+
+        leases = slices.verify_slice_leases(slice, requested_leases, kept_leases, peer)
     
         # handle MyPLC peer association.
         # only used by plc and ple.
     
         # handle MyPLC peer association.
         # only used by plc and ple.