Ignore:
Timestamp:
Nov 19, 2008 7:24:16 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:
058f58e
Parents:
dab4d56
Message:

Start the move to unified service calling routines

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fedd/fedd_access.py

    rdab4d56 rc922f23  
    5151            "dynamic_projects_cert_pwd", "dynamic_projects_trusted_certs")
    5252    id_list_attrs = ("restricted",)
     53
     54    proxy_request, proxy_xmlrpc_request = make_service_callers('RequestAccess',
     55            'getfeddPortType', RequestAccessRequestMessage,
     56            'RequestAccessRequestBody')
    5357
    5458    def __init__(self, config=None):
     
    387391            self.log.warning(("[read_state]: No saved state: " + \
    388392                    "Unpickling failed: %s") % e)
    389 
    390 
    391     def proxy_xmlrpc_request(self, dt, req):
    392         """Send an XMLRPC proxy request.  Called if the SOAP RPC fails"""
    393 
    394         # No retry loop here.  Proxy servers must correctly authenticate
    395         # themselves without help
    396         try:
    397             ctx = fedd_ssl_context(self.proxy_cert_file,
    398                     self.proxy_trusted_certs, password=self.proxy_cert_pwd)
    399         except SSL.SSLError:
    400             raise service_error(service_error.server_config,
    401                     "Server certificates misconfigured")
    402 
    403         # Of all the dumbass things.  The XMLRPC library in use here won't
    404         # properly encode unicode strings, so we make a copy of req with the
    405         # unicode objects converted.  We also convert the destination testbed
    406         # to a basic string if it isn't one already.
    407         if isinstance(dt, str): url = dt
    408         else: url = str(dt)
    409 
    410         r = strip_unicode(copy.deepcopy(req))
    411        
    412         transport = SSL_Transport(ctx)
    413         port = xmlrpclib.ServerProxy(url, transport=transport)
    414 
    415         # Reconstruct the full request message
    416         try:
    417             resp = port.RequestAccess(
    418                     { "RequestAccessRequestBody": r})
    419             resp, method = xmlrpclib.loads(resp)
    420         except xmlrpclib.Fault, f:
    421             se = service_error(None, f.faultString, f.faultCode)
    422             raise se
    423         except xmlrpclib.Error, e:
    424             raise service_error(service_error.proxy,
    425                     "Remote XMLRPC Fault: %s" % e)
    426        
    427         if resp[0].has_key('RequestAccessResponseBody'):
    428             return resp[0]['RequestAccessResponseBody']
    429         else:
    430             raise service_error(service_error.proxy,
    431                     "Bad proxy response")
    432 
    433     def proxy_request(self, dt, req):
    434         """
    435         Send req on to the real destination in dt and return the response
    436 
    437         Req is just the requestType object.  This function re-wraps it.  It
    438         also rethrows any faults.
    439         """
    440         # No retry loop here.  Proxy servers must correctly authenticate
    441         # themselves without help
    442         try:
    443             ctx = fedd_ssl_context(self.proxy_cert_file,
    444                     self.proxy_trusted_certs, password=self.proxy_cert_pwd)
    445         except SSL.SSLError:
    446             raise service_error(service_error.server_config,
    447                     "Server certificates misconfigured")
    448 
    449         loc = feddServiceLocator();
    450         port = loc.getfeddPortType(dt,
    451                 transport=M2Crypto.httpslib.HTTPSConnection,
    452                 transdict={ 'ssl_context' : ctx })
    453 
    454         # Reconstruct the full request message
    455         msg = RequestAccessRequestMessage()
    456         msg.set_element_RequestAccessRequestBody(
    457                 pack_soap(msg, "RequestAccessRequestBody", req))
    458         try:
    459             resp = port.RequestAccess(msg)
    460         except ZSI.ParseException, e:
    461             raise service_error(service_error.proxy,
    462                     "Bad format message (XMLRPC??): %s" %
    463                     str(e))
    464         r = unpack_soap(resp)
    465 
    466         if r.has_key('RequestAccessResponseBody'):
    467             return r['RequestAccessResponseBody']
    468         else:
    469             raise service_error(service_error.proxy,
    470                     "Bad proxy response")
    471393
    472394    def permute_wildcards(self, a, p):
     
    779701            try:
    780702                # Proxy the request using SOAP
    781                 return self.proxy_request(dt, req)
     703                self.log.debug("Sending proxy message to %s" % dt)
     704                resp = self.proxy_request(dt, req, feddServiceLocator,
     705                        self.proxy_cert_file, self.proxy_cert_pwd,
     706                        self.proxy_trusted_certs)
     707                if resp.has_key('RequestAccessResponseBody'):
     708                    return resp['RequestAccessResponseBody']
     709                elif resp.has_key('Fedd_FaultBody'):
     710                    raise service_error(resp['FeddFaultBody']['code'],
     711                            resp['FeddFaultBody']['desc'])
    782712            except service_error, e:
    783713                if e.code == service_error.proxy: p_fault = None
     
    791721            # out.
    792722            if p_fault == None:
    793                 return self.proxy_xmlrpc_request(dt, req)
     723                resp = self.proxy_xmlrpc_request(dt, req, self.proxy_cert_file,
     724                    self.proxy_cert_pwd, self.proxy_trusted_certs)
     725                if resp.has_key('RequestAccessResponseBody'):
     726                    return resp['RequestAccessResponseBody']
    794727            else:
    795728                # Build the fault
Note: See TracChangeset for help on using the changeset viewer.