Changeset c922f23 for fedd/fedd_util.py


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_util.py

    rdab4d56 rc922f23  
    55import tempfile
    66import logging
     7import copy
    78
    89from M2Crypto import SSL, X509, EVP
     10from M2Crypto.m2xmlrpclib import SSL_Transport
     11import M2Crypto.httpslib
    912from pyasn1.codec.der import decoder
    1013
    11 from xmlrpclib import Binary
     14from fedd_services import *
     15from fedd_internal_services import *
     16from service_error import *
     17from xmlrpclib import ServerProxy, dumps, loads, Fault, Error, Binary
    1218
    1319
     
    413419        decap_fedids = (('fedid', lambda x: fedid(bits=x.data)),)
    414420
    415         #p = decapsulate_binaries(params[0], input_binaries)
    416421        p = apply_to_tags(params[0], decap_fedids)
    417422        msg = method(p, fid)
    418423
    419424        if msg != None:
    420             return encapsulate_binaries({ body_name: msg }, ('fedid',))
     425            return make_unicode(encapsulate_binaries({ body_name: msg }, ('fedid',)))
    421426        else:
    422427            return None
     
    424429    return handler
    425430
     431def make_service_callers(service_name, port_name, request_message,
     432        request_body_name):
     433
     434    def call_xmlrpc_service(self, url, req, cert_file=None, cert_pwd=None,
     435            trusted_certs=None):
     436        """Send an XMLRPC request.  """
     437        decap_fedids = (('fedid', lambda x: fedid(bits=x.data)),)
     438
     439        # No retry loop here.  Proxy servers must correctly authenticate
     440        # themselves without help
     441        try:
     442            ctx = fedd_ssl_context(cert_file, trusted_certs, password=cert_pwd)
     443        except SSL.SSLError:
     444            raise service_error(service_error.server_config,
     445                    "Server certificates misconfigured")
     446
     447        # Of all the dumbass things.  The XMLRPC library in use here won't
     448        # properly encode unicode strings, so we make a copy of req with the
     449        # unicode objects converted.  We also convert the url to a basic string
     450        # if it isn't one already.
     451        r = strip_unicode(copy.deepcopy(req))
     452        url = str(url)
     453       
     454        transport = SSL_Transport(ctx)
     455        port = ServerProxy(url, transport=transport)
     456        try:
     457            remote_method = getattr(port, service_name, None)
     458            resp = remote_method(encapsulate_binaries({ request_body_name: r},
     459                ('fedid',)))
     460        except Fault, f:
     461            raise service_error(None, f.faultString, f.faultCode)
     462        except Error, e:
     463            raise service_error(service_error.proxy,
     464                    "Remote XMLRPC Fault: %s" % e)
     465
     466        return apply_to_tags(resp, decap_fedids)
     467
     468    def call_soap_service(self, url, req, loc_const, cert_file=None, cert_pwd=None,
     469            trusted_certs=None):
     470        """
     471        Send req on to the real destination in dt and return the response
     472
     473        Req is just the requestType object.  This function re-wraps it.  It
     474        also rethrows any faults.
     475        """
     476        # No retry loop here.  Proxy servers must correctly authenticate
     477        # themselves without help
     478        try:
     479            ctx = fedd_ssl_context(cert_file, trusted_certs, password=cert_pwd)
     480        except SSL.SSLError:
     481            raise service_error(service_error.server_config,
     482                    "Server certificates misconfigured")
     483
     484        loc = loc_const()
     485        get_port = getattr(loc, port_name, None)
     486        if not get_port:
     487            raise service_error(service_error.internal,
     488                    "Cannot get port %s from locator" % port_name)
     489        port = get_port(url,
     490                transport=M2Crypto.httpslib.HTTPSConnection,
     491                transdict={ 'ssl_context' : ctx })
     492        remote_method = getattr(port, service_name, None)
     493        if not remote_method:
     494            raise service_error(service_error.internal,
     495                    "Cannot get service from SOAP port")
     496
     497        # Reconstruct the full request message
     498        msg = request_message()
     499        set_element = getattr(msg, "set_element_%s" % request_body_name, None)
     500        if not set_element:
     501            raise service_error(service_error.internal,
     502                    "Cannot get element setting method for %s" % \
     503                            request_body_name)
     504        set_element(pack_soap(msg, request_body_name, req))
     505        try:
     506            resp = remote_method(msg)
     507        except ZSI.ParseException, e:
     508            raise service_error(service_error.proxy,
     509                    "Bad format message (XMLRPC??): %s" %
     510                    str(e))
     511        r = unpack_soap(resp)
     512        return r
     513
     514    return (call_soap_service, call_xmlrpc_service)
    426515
    427516def set_log_level(config, sect, log):
Note: See TracChangeset for help on using the changeset viewer.