--- /dev/null
+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
+
--- /dev/null
+### $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'}