1212from zeep .helpers import serialize_object
1313from zeep .cache import SqliteCache
1414from zeep .plugins import HistoryPlugin
15+ from zeep .wsdl .messages .multiref import process_multiref
16+
1517
1618import requests
1719
@@ -53,6 +55,8 @@ def __call__(self, request):
5355 client = Client (f"{ self .endpoint_url } /{ request .service } ?wsdl" ,
5456 settings = zeep_settings , transport = zeep_transport , plugins = [self .history ])
5557
58+ # print(client.wsdl.dump())
59+ # print("=============== WSDL ==============")
5660 # MUST define headers like this because otherwise the objectMask header doesn't work
5761 # because it isn't sent in with a namespace.
5862 xsdUserAuth = xsd .Element (
@@ -65,7 +69,7 @@ def __call__(self, request):
6569 factory = client .type_factory (f"{ self .soapNS } " )
6670 theMask = client .get_type (f"{{{ self .soapNS } }}SoftLayer_ObjectMask" )
6771 xsdMask = xsd .Element (
68- '{http://api.service.softlayer.com/soap/v3.1/} SoftLayer_ObjectMask' ,
72+ f"{{ { self . soapNS } }} SoftLayer_ObjectMask" ,
6973 factory ['SoftLayer_ObjectMask' ]
7074 )
7175
@@ -84,22 +88,48 @@ def __call__(self, request):
8488 ])
8589 )
8690
87- test = { "type" :{ "keyName" :{ "operation" : "BARE_METAL_CPU" }} }
91+ # Might one day want to support unauthenticated requests, but for now assume user auth.
8892 headers = [
89- xsdMask (mask = request .mask or '' ),
9093 xsdUserAuth (username = request .transport_user , apiKey = request .transport_password ),
91- xsdResultLimit (limit = 2 , offset = 0 ),
92- xsdFilter (** request .filter or '' ) # The ** here forces python to treat this dict as properties
9394 ]
9495
95- pp (headers )
96- print ("HEADERS ^^^^^" )
97- method = getattr (client .service , request .method )
96+ if request .limit :
97+ headers .append (xsdResultLimit (limit = request .limit , offset = request .offset ))
98+ if request .mask :
99+ headers .append (xsdMask (mask = request .mask ))
100+ if request .filter :
101+ # The ** here forces python to treat this dict as properties
102+ headers .append (xsdFilter (** request .filter ))
103+
104+
105+ try :
106+ method = getattr (client .service , request .method )
107+ except AttributeError as ex :
108+ message = f"{ request .service } ::{ request .method } () does not exist in { self .soapNS } { request .service } ?wsdl"
109+ raise exceptions .TransportError (404 , message ) from ex
98110
99- # result = client.service.getObject(_soapheaders=headers)
100111 result = method (_soapheaders = headers )
101- return serialize_object (result ['body' ]['getAllObjectsReturn' ])
102- # result = transport.post(f"{self.endpoint_url}/{request.service}")
112+ # result = client.service.getObject(_soapheaders=headers)
113+
114+ # process_multiref(result['body']['getAllObjectsReturn'])
115+
116+ # print("^^^ RESULT ^^^^^^^")
117+
118+ # TODO GET A WAY TO FIND TOTAL ITEMS
119+ # print(result['header']['totalItems']['amount'])
120+ # print(" ^^ ITEMS ^^^ ")
121+
122+ try :
123+ methodReturn = f"{ request .method } Return"
124+ serialize = serialize_object (result )
125+ if serialize .get ('body' ):
126+ return serialize ['body' ][methodReturn ]
127+ else :
128+ # Some responses (like SoftLayer_Account::getObject) don't have a body?
129+ return serialize
130+ except KeyError as e :
131+ message = f"Error serializeing response\n { result } \n "
132+ raise exceptions .TransportError (500 , message )
103133
104134
105135 def print_reproduceable (self , request ):
0 commit comments