### $Id$
### $URL$
-import xmlrpclib
-
from sfa.trust.gid import *
from sfa.trust.credential import *
from sfa.util.record import *
-from sfa.util.geniticket import *
-
-##
-# ServerException, ExceptionUnmarshaller
-#
-# Used to convert server exception strings back to an exception.
-# from usenet, Raghuram Devarakonda
-
-class ServerException(Exception):
- pass
-
-class ExceptionUnmarshaller(xmlrpclib.Unmarshaller):
- def close(self):
- try:
- return xmlrpclib.Unmarshaller.close(self)
- except xmlrpclib.Fault, e:
- raise ServerException(e.faultString)
-
-##
-# GeniTransport
-#
-# A transport for XMLRPC that works on top of HTTPS
-
-class GeniTransport(xmlrpclib.Transport):
- key_file = None
- cert_file = None
- def make_connection(self, host):
- # create a HTTPS connection object from a host descriptor
- # host may be a string, or a (host, x509-dict) tuple
- import httplib
- host, extra_headers, x509 = self.get_host_info(host)
- try:
- HTTPS = httplib.HTTPS()
- except AttributeError:
- raise NotImplementedError(
- "your version of httplib doesn't support HTTPS"
- )
- else:
- return httplib.HTTPS(host, None, key_file=self.key_file, cert_file=self.cert_file) #**(x509 or {}))
-
- def getparser(self):
- unmarshaller = ExceptionUnmarshaller()
- parser = xmlrpclib.ExpatParser(unmarshaller)
- return parser, unmarshaller
+from sfa.util.sfaticket import SfaTicket
##
# The GeniClient class provides stubs for executing Geni operations. A given
# public key that is containing in the GID that the client is providing for
# those functions that take a GID.
-class GeniClient():
+class GeniClient:
##
# Create a new GeniClient object.
#
# @param key_file = private key file of client
# @param cert_file = x.509 cert containing the client's public key. This
# could be a GID certificate, or any x.509 cert.
+ # @param protocol The ORPC protocol to use. Can be "soap" or "xmlrpc"
- def __init__(self, url, key_file, cert_file):
+ def __init__(self, url, key_file, cert_file, protocol="xmlrpc"):
self.url = url
self.key_file = key_file
self.cert_file = cert_file
- self.transport = GeniTransport()
- self.transport.key_file = self.key_file
- self.transport.cert_file = self.cert_file
- self.server = xmlrpclib.ServerProxy(self.url, self.transport, allow_none=True)
+
+ if (protocol=="xmlrpc"):
+ import xmlrpcprotocol
+ self.server = xmlrpcprotocol.get_server(self.url, self.key_file, self.cert_file)
+ elif (protocol=="soap"):
+ import soapprotocol
+ self.server = soapprotocol.get_server(self.url, self.key_file, self.cert_file)
+ else:
+ raise Exception("Attempted use of undefined protocol %s"%protocol)
+
# -------------------------------------------------------------------------
# Registry Interface
#
# @return list of record objects
- def list(self, cred, auth_hrn):
- result_dict_list = self.server.list(cred.save_to_string(save_parents=True), auth_hrn)
+ def list(self, cred, auth_hrn, caller_cred=None):
+ result_dict_list = self.server.list(cred.save_to_string(save_parents=True), auth_hrn, caller_cred)
result_rec_list = []
for dict in result_dict_list:
result_rec_list.append(GeniRecord(dict=dict))
# @param cred a credential
# @param hrn slice hrn
- def get_resources(self, cred, hrn=None):
- result = self.server.get_resources(cred.save_to_string(save_parents=True), hrn)
+ def get_resources(self, cred, hrn=None, caller_cred=None):
+ result = self.server.get_resources(cred.save_to_string(save_parents=True), hrn, caller_cred)
return result
def get_aggregates(self, cred, hrn=None):
- result = self.server.get_resources(cred.save_to_string(save_parents=True), hrn)
+ result = self.server.get_aggregates(cred.save_to_string(save_parents=True), hrn)
return result
+ def get_registries(self, cred, hrn=None):
+ result = self.server.get_registries(cred.save_to_string(save_parents=True), hrn)
+ return result
+
## get policy
#
# @param cred a credential
# @param cred a credential
# @param rspec resource specification defining how to instantiate the slice
- def create_slice(self, cred, hrn, rspec):
- result = self.server.create_slice(cred.save_to_string(save_parents=True), hrn, rspec)
+ def create_slice(self, cred, hrn, rspec, caller_cred=None):
+ result = self.server.create_slice(cred.save_to_string(save_parents=True), hrn, rspec, caller_cred)
return result
#
# @param cred a credential
# @param hrn slice to delete
- def delete_slice(self, cred, hrn):
- result = self.server.delete_slice(cred.save_to_string(save_parents=True), hrn)
+ def delete_slice(self, cred, hrn, caller_cred=None):
+ result = self.server.delete_slice(cred.save_to_string(save_parents=True), hrn, caller_cred)
return result
# ------------------------------------------------------------------------
# @param cred a credential identifying the caller (callerGID) and the slice
# (objectGID)
- def delete_slice(self, cred, hrn):
- result = self.server.delete_slice(cred.save_to_string(save_parents=True), hrn)
+ def delete_slice(self, cred, hrn, caller_cred=None):
+ result = self.server.delete_slice(cred.save_to_string(save_parents=True), hrn, caller_cred)
return result
##
def get_ticket(self, cred, name, rspec):
ticket_str = self.server.get_ticket(cred.save_to_string(save_parents=True), name, rspec)
- ticket = Ticket(string=ticket_str)
+ ticket = SfaTicket(string=ticket_str)
return ticket
##