Ignore:
Timestamp:
Nov 20, 2008 7:14:58 PM (15 years ago)
Author:
Ted Faber <faber@…>
Branches:
axis_example, compt_changes, info-ops, master, version-1.30, version-2.00, version-3.01, version-3.02
Children:
cfabc40
Parents:
c922f23
Message:

Unify the code for calling SOAP and XMLRPC services into a couple classes.
Before there were slightly different semantics everywhere.

Also make the handlers classes rather than the output of stub compiling
functions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fedd/fedd_client.py

    rc922f23 r058f58e  
    2121
    2222from fedd_util import fedid, fedd_ssl_context, pack_soap, unpack_soap, \
    23         pack_id, unpack_id, encapsulate_binaries, decapsulate_binaries
     23        pack_id, unpack_id, encapsulate_binaries, decapsulate_binaries, \
     24        service_caller
     25from service_error import *
    2426
    2527from optparse import OptionParser, OptionValueError
     
    190192    def __init__(self, pre):
    191193        """
    192         Specialize the class for the prc method
     194        Specialize the class for the pre method
    193195        """
    194196        self.RequestMessage = globals()["%sRequestMessage" % pre]
     
    197199        self.ResponseBody="%sResponseBody" % pre
    198200        self.method = pre
     201
     202        method_call = getattr(feddServiceLocator().getfeddPortType(),
     203                self.method, None)
     204        if method_call:
     205            # The pre method is a fedd external service
     206            self.caller = service_caller(self.method, 'getfeddPortType',
     207                    feddServiceLocator, self.RequestMessage, self.RequestBody)
     208        else:
     209            # The pre method is a fedd internal service
     210            self.caller = service_caller(self.method,
     211                    'getfeddInternalPortType', feddInternalServiceLocator,
     212                    self.RequestMessage, self.RequestBody)
     213
    199214        self.RPCException = fedd_rpc.RPCException
    200215
     
    265280
    266281        if transport == "soap":
    267             loc = feddServiceLocator();
    268             port = loc.getfeddPortType(url,
    269                     transport=M2Crypto.httpslib.HTTPSConnection,
    270                     transdict={ 'ssl_context' : context },
    271                     tracefile=tracefile)
    272             method_call = getattr(port, self.method, None)
    273 
    274             if not method_call:
    275                 loc = feddInternalServiceLocator();
    276                 port = loc.getfeddInternalPortType(url,
    277                         transport=M2Crypto.httpslib.HTTPSConnection,
    278                         transdict={ 'ssl_context' : context },
    279                         tracefile=tracefile)
    280                 method_call = getattr(port, self.method, None)
    281                 if not method_call:
    282                     raise RuntimeError("Can't find method: %s" % self.method)
    283 
    284             req = self.RequestMessage()
    285 
    286             set_req = getattr(req, "set_element_%s" % self.RequestBody, None)
    287             set_req(pack_soap(req, self.RequestBody, req_dict))
    288 
    289282            if serialize_only:
    290283                sw = SoapWriter()
     
    292285                print str(sw)
    293286                sys.exit(0)
    294 
    295             try:
    296                 method_call = getattr(port, self.method, None)
    297                 resp = method_call(req)
    298             except ZSI.ParseException, e:
    299                 raise RuntimeError("Malformed response (XMLPRC?): %s" % e)
    300             except ZSI.FaultException, e:
    301                 resp = e.fault.detail[0]
    302 
    303             if resp:
    304                 resp_call = getattr(resp, "get_element_%s" %self.ResponseBody,
    305                         None)
    306                 if resp_call:
    307                     resp_body = resp_call()
    308                     if ( resp_body != None):
    309                         try:
    310                             return unpack_soap(resp_body)
    311                         except RuntimeError, e:
    312                             raise RuntimeError("Bad response. %s" % e.message)
    313                 elif 'get_element_FeddFaultBody' in dir(resp):
    314                     resp_body = resp.get_element_FeddFaultBody()
    315                     if resp_body != None:
    316                         try:
    317                             fb = unpack_soap(resp_body)
    318                         except RuntimeError, e:
    319                             raise RuntimeError("Bad response. %s" % e.message)
    320                         raise self.RPCException(fb)
    321                 else:
    322                     raise RuntimeError("No body in response!?")
    323             else:
    324                 raise RuntimeError("No response?!?")
     287            else:
     288                try:
     289                    resp = self.caller.call_soap_service(url, req_dict,
     290                            context=context, tracefile=tracefile)
     291                except service_error, e:
     292                    raise self.RPCException( {'code': e.code, 'desc': e.desc })
    325293        elif transport == "xmlrpc":
    326294            if serialize_only:
     
    328296                print ser
    329297                sys.exit(0)
    330 
    331             xtransport = SSL_Transport(context)
    332             port = ServerProxy(url, transport=xtransport)
    333 
    334             try:
    335                 method_call = getattr(port, self.method, None)
    336                 resp = method_call(
    337                         encapsulate_binaries({ self.RequestBody: req_dict},\
    338                             ('fedid',)))
    339             except Error, e:
    340                 resp = { 'FeddFaultBody': \
    341                         { 'errstr' : getattr(e, "faultCode", "No fault code"),
    342                         'desc' : getattr(e, "faultString", "No fault string") }\
    343                         }
    344             if resp:
    345                 if resp.has_key(self.ResponseBody):
    346                     return decapsulate_binaries(resp[self.ResponseBody],
    347                             ('fedid',))
    348                 elif resp.has_key('FeddFaultBody'):
    349                     raise self.RPCException(resp['FeddFaultBody'])
    350                 else:
    351                     raise RuntimeError("No body in response!?")
    352             else:
    353                 raise RuntimeError("No response?!?")
     298            else:
     299                try:
     300                    resp = self.caller.call_xmlrpc_service(url, req_dict,
     301                            context=context, tracefile=tracefile)
     302                except service_error, e:
     303                    raise self.RPCException( {'code': e.code, 'desc': e.desc })
     304
    354305        else:
    355306            raise RuntimeError("Unknown RPC transport: %s" % transport)
     307
     308        if resp.has_key(self.ResponseBody):
     309            return resp[self.ResponseBody]
     310        else:
     311            raise RuntimeError("No body in response??")
    356312
    357313# Querying experiment data follows the same control flow regardless of the
     
    606562            for id in eid:
    607563                for k in id.keys():
    608                     if k == 'fedid': print "%s: %s" % (k,fedid(bits=id[k]))
    609                     else: print "%s: %s" % (k, id[k])
     564                    print "%s: %s" % (k, id[k])
    610565
    611566class split(fedd_rpc):
Note: See TracChangeset for help on using the changeset viewer.