merge with geni_api branch
authorTony Mack <tmack@cs.princeton.edu>
Thu, 3 Jun 2010 15:51:25 +0000 (15:51 +0000)
committerTony Mack <tmack@cs.princeton.edu>
Thu, 3 Jun 2010 15:51:25 +0000 (15:51 +0000)
sfa/managers/geni_am_pl.py [new file with mode: 0644]
sfa/server/geni_aggregate.py [new file with mode: 0644]

diff --git a/sfa/managers/geni_am_pl.py b/sfa/managers/geni_am_pl.py
new file mode 100644 (file)
index 0000000..1637d0b
--- /dev/null
@@ -0,0 +1,133 @@
+from sfa.util.namespace import *
+from sfa.util.rspec import *
+from sfa.util.specdict import *
+from sfa.util.faults import *
+from sfa.trust.credential import Credential
+from sfa.util.record import *
+
+from sfa.plc.slices import *
+from sfa.util.sfalogging import *
+from sfa.util.record import SfaRecord
+from StringIO import StringIO
+from time import mktime
+
+from lxml import etree
+
+def GetVersion():
+    version = {}
+    version['geni_api'] = 1
+    version['geni_stitching'] = False
+    return version
+
+
+def ListResources(api, creds, options):
+    manager_base = 'sfa.managers'
+    mgr_type = 'pl'
+    manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
+    manager = __import__(manager_module, fromlist=[manager_base])
+
+    xrn = None
+    if options.has_key('geni_slice_urn'):
+        xrn = options['geni_slice_urn']
+        api.logger.info(xrn)
+
+
+    rspec = manager.get_rspec(api, xrn, None)
+    
+    
+    # Filter out those objects that aren't allocated
+    if xrn:
+        tree = etree.parse(StringIO(rspec))    
+        used_nodes = [sliver.getparent() for sliver in tree.iterfind("./network/site/node/sliver")]
+        used_sites = [node.getparent() for node in used_nodes]
+        for node in tree.iterfind("./network/site/node"):
+            if node not in used_nodes:
+                parent = node.getparent()
+                parent.remove(node)
+        
+        # Remove unused sites
+        for site in tree.iterfind("./network/site"):
+            if site not in used_sites:
+                parent = site.getparent()
+                parent.remove(site)
+        rspec = etree.tostring(tree)
+
+    return rspec
+
+
+def CreateSliver(api, slice_xrn, creds, rspec, users):
+    hrn, type = urn_to_hrn(slice_xrn)
+    
+    hrn_auth = get_authority(hrn)
+    
+    # Build up objects that an SFA registry would return if SFA
+    # could contact the slice's registry directly
+    reg_objects = None
+    
+    if users:
+        reg_objects = {}
+    
+        site = {}
+        site['site_id'] = 0
+        site['name'] = 'geni.%s' % hrn_auth
+        site['enabled'] = True
+        site['max_slices'] = 100
+        
+        # Note:
+        # Is it okay if this login base is the same as one already at this myplc site?  
+        # Do we need uniqueness?  Should use hrn_auth instead of just the leaf perhaps?
+        site['login_base'] = get_leaf(hrn_auth)
+        site['abbreviated_name'] = hrn
+        site['max_slivers'] = 1000    
+        reg_objects['site'] = site
+        
+        slice = {}
+        slice['expires'] = int(mktime(Credential(string=creds[0]).get_lifetime().timetuple()))
+        slice['hrn'] = hrn
+        slice['name'] = site['login_base'] + "_" +  get_leaf(hrn)
+        slice['url'] = hrn
+        slice['description'] = hrn
+        slice['pointer'] = 0
+        reg_objects['slice_record'] = slice
+        
+        reg_objects['users'] = {}
+        for user in users:
+            user['key_ids'] = []
+            hrn, _ = urn_to_hrn(user['urn'])
+            user['email'] = hrn + "@geni.net"
+            user['first_name'] = hrn
+            user['last_name'] = hrn
+            reg_objects['users'][user['email']] = user     
+            
+               
+    manager_base = 'sfa.managers'
+    mgr_type = 'pl'
+    manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
+    manager = __import__(manager_module, fromlist=[manager_base])
+
+    allocated = manager.create_slice(api, slice_xrn, rspec, reg_objects)
+    
+    return allocated
+
+def DeleteSliver(api, slice_xrn, creds):
+    manager_base = 'sfa.managers'
+    mgr_type = 'pl'
+    manager_module = manager_base + ".aggregate_manager_%s" % mgr_type
+    manager = __import__(manager_module, fromlist=[manager_base])
+
+    allocated = manager.delete_slice(api, slice_xrn)
+    return allocated
+
+def SliverStatus(api, slice_xrn, creds):
+    result = {}
+    result['geni_urn'] = slice_xrn
+    result['geni_status'] = 'unknown'
+    result['geni_resources'] = {}
+    return result
+
+def RenewSliver(api, slice_xrn, creds, renew_time):
+    return False
+
+def Shutdown(api, slice_xrn, creds):
+    return False
+
diff --git a/sfa/server/geni_aggregate.py b/sfa/server/geni_aggregate.py
new file mode 100644 (file)
index 0000000..c4c3a02
--- /dev/null
@@ -0,0 +1,36 @@
+### $Id: aggregate.py 16477 2010-01-05 16:31:37Z thierry $
+### $URL: svn+ssh://svn.planet-lab.org/svn/sfa/branches/geni-api/sfa/server/aggregate.py $
+
+import os
+import sys
+import datetime
+import time
+import xmlrpclib
+from types import StringTypes, ListType
+
+from sfa.util.server import SfaServer
+from sfa.util.storage import *
+from sfa.util.faults import *
+import sfa.util.xmlrpcprotocol as xmlrpcprotocol
+import sfa.util.soapprotocol as soapprotocol
+
+# GeniLight client support is optional
+try:
+    from egeni.geniLight_client import *
+except ImportError:
+    GeniClientLight = None
+
+
+class GENIAggregate(SfaServer):
+
+    ##
+    # Create a new aggregate object.
+    #
+    # @param ip the ip address to listen on
+    # @param port the port to listen on
+    # @param key_file private key filename of registry
+    # @param cert_file certificate filename containing public key (could be a GID file)     
+    def __init__(self, ip, port, key_file, cert_file):
+        SfaServer.__init__(self, ip, port, key_file, cert_file)
+        self.server.interface = 'geni_am'
+        self.server.method_map = {'Resolve': 'ResolveGENI'}