from lxml import etree
from StringIO import StringIO
from types import StringTypes
-from sfa.util.rspec import merge_rspecs
+from sfa.util.rspecHelper import merge_rspecs
from sfa.util.namespace import *
from sfa.util.rspec import *
from sfa.util.specdict import *
from sfa.util.policy import Policy
from sfa.util.prefixTree import prefixTree
from sfa.util.sfaticket import *
+from sfa.trust.credential import Credential
from sfa.util.threadmanager import ThreadManager
import sfa.util.xmlrpcprotocol as xmlrpcprotocol
from sfa.util.debug import log
version['geni_api'] = 1
return version
-def delete_slice(api, xrn, origin_hrn=None):
- credential = api.getCredential()
- threads = ThreadManager()
- for aggregate in api.aggregates:
- server = api.aggregates[aggregate]
- threads.run(server.delete_slice, credential, xrn, origin_hrn)
- threads.get_results()
- return 1
+def slice_status(api, slice_xrn, creds ):
+ result = {}
+ result['geni_urn'] = slice_xrn
+ result['geni_status'] = 'unknown'
+ result['geni_resources'] = {}
+ return result
-def create_slice(api, xrn, rspec, origin_hrn=None):
+def create_slice(api, xrn, creds, rspec, users):
hrn, type = urn_to_hrn(xrn)
# Validate the RSpec against PlanetLab's schema --disabled for now
message = "%s (line %s)" % (error.message, error.line)
raise InvalidRSpec(message)
+ # XX
+ # XX TODO: Should try to use delegated credential first
+ # XX
cred = api.getCredential()
threads = ThreadManager()
for aggregate in api.aggregates:
if aggregate not in [api.auth.client_cred.get_gid_caller().get_hrn()]:
server = api.aggregates[aggregate]
# Just send entire RSpec to each aggregate
- threads.run(server.create_slice, cred, xrn, rspec, origin_hrn)
+ threads.run(server.CreateSliver, xrn, cred, rspec, users)
+
threads.get_results()
return 1
attrs = agg_ticket.get_attributes()
if not object_gid:
object_gid = agg_ticket.get_gid_object()
- print object_gid
rspecs.append(agg_ticket.get_rspec())
initscripts.extend(attrs.get('initscripts', []))
slivers.extend(attrs.get('slivers', []))
ticket.sign()
return ticket.save_to_string(save_parents=True)
-def start_slice(api, xrn):
+
+def delete_slice(api, xrn, origin_hrn=None):
+ # XX
+ # XX TODO: Should try to use delegated credential first
+ # XX
+ credential = api.getCredential()
+ threads = ThreadManager()
+ for aggregate in api.aggregates:
+ server = api.aggregates[aggregate]
+ threads.run(server.DeleteSliver, xrn, credential)
+ threads.get_results()
+ return 1
+
+def start_slice(api, xrn, creds):
+ # XX
+ # XX TODO: Should try to use delegated credential first
+ # XX
credential = api.getCredential()
threads = ThreadManager()
for aggregate in api.aggregates:
server = api.aggregates[aggregate]
- threads.run(server.stop_slice, credential, xrn)
+ threads.run(server.Start, xrn, credential)
threads.get_results()
return 1
-def stop_slice(api, xrn):
+def stop_slice(api, xrn, creds):
+ # XX
+ # XX TODO: Should try to use delegated credential first
+ # XX
credential = api.getCredential()
threads = ThreadManager()
for aggregate in api.aggregates:
server = api.aggregates[aggregate]
- threads.run(server.stop_slice, credential, xrn)
+ threads.run(server.Stop, xrn, credential)
threads.get_results()
return 1
def reset_slice(api, xrn):
- # XX not implemented at this interface
+ """
+ Not implemented
+ """
+ return 1
+
+def shutdown(api, xrn, creds):
+ """
+ Not implemented
+ """
+ return 1
+
+def status(api, xrn, creds):
+ """
+ Not implemented
+ """
return 1
def get_slices(api):
return slices
-def get_rspec(api, xrn=None, origin_hrn=None):
+def get_rspec(api, creds, options):
+ # get slice's hrn from options
+ xrn = options.get('geni_slice_urn', None)
+ hrn, type = urn_to_hrn(xrn)
+
+ # get hrn of the original caller
+ origin_hrn = options.get('origin_hrn', None)
+ if not origin_hrn:
+ origin_hrn = Credential(string=creds[0]).get_gid_caller().get_hrn()
+
# look in cache first
if api.cache and not xrn:
rspec = api.cache.get('nodes')
hrn, type = urn_to_hrn(xrn)
rspec = None
+ # XX
+ # XX TODO: Should try to use delegated credential first
+ # XX
cred = api.getCredential()
threads = ThreadManager()
+
for aggregate in api.aggregates:
- if aggregate not in [api.auth.client_cred.get_gid_caller().get_hrn()]:
+ if aggregate not in [api.auth.client_cred.get_gid_caller().get_hrn()]:
# get the rspec from the aggregate
server = api.aggregates[aggregate]
- threads.run(server.get_resources, cred, xrn, origin_hrn)
+ threads.run(server.ListResources, cred, options)
+ #threads.run(server.get_resources, cred, xrn, origin_hrn)
+
results = threads.get_results()
# combine the rspecs into a single rspec
rspec.append(deepcopy(network))
for request in root.iterfind("./request"):
rspec.append(deepcopy(request))
-
+
rspec = etree.tostring(rspec, xml_declaration=True, pretty_print=True)
# cache the result
if api.cache and not xrn:
return rspec
-"""
-Returns the request context required by sfatables. At some point, this
-mechanism should be changed to refer to "contexts", which is the
-information that sfatables is requesting. But for now, we just return
-the basic information needed in a dict.
-"""
-def fetch_context(slice_hrn, user_hrn, contexts):
- #slice_hrn = urn_to_hrn(slice_xrn)[0]
- #user_hrn = urn_to_hrn(user_xrn)[0]
- base_context = {'sfa':{'user':{'hrn':user_hrn}, 'slice':{'hrn':slice_hrn}}}
- return base_context
-
def main():
r = RSpec()
r.parseFile(sys.argv[1])