Skip to content

Commit 955eacb

Browse files
got filters working, need to upload changes to zeep
1 parent afc6ec2 commit 955eacb

2 files changed

Lines changed: 47 additions & 14 deletions

File tree

SoftLayer/transports/soap.py

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from zeep.helpers import serialize_object
1313
from zeep.cache import SqliteCache
1414
from zeep.plugins import HistoryPlugin
15+
from zeep.wsdl.messages.multiref import process_multiref
16+
1517

1618
import 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):

tests/transports/soap_tests.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,13 @@ def test_objectFilter(self):
8383
self.request.method = "getAllObjects"
8484
self.request.mask = "mask[id,description,keyName,type[id,keyName],name]"
8585
self.request.filter = {'type': {'keyName': {'operation': 'BARE_METAL_CPU'}}}
86+
self.request.limit = 5
87+
self.request.offset = 0
8688
data = self.transport(self.request)
8789
# pp(data)
8890
# print("^^^ DATA **** ")
8991
for package in data:
90-
pp(package)
91-
print("^^^ PACKAGE **** ")
92-
self.assertEqual(package.get('type').get('keyName'), "BARE_METAL_CPU")
92+
93+
self.assertEqual(package.get('type').get('keyName'), "BARE_METAL_CPU")
94+
95+
## TODO MORE COMPLEX OBJECT FILTERS!

0 commit comments

Comments
 (0)