Skip to content

Commit 9715c0b

Browse files
objectMask support
1 parent 62ef9ab commit 9715c0b

2 files changed

Lines changed: 52 additions & 22 deletions

File tree

SoftLayer/transports/soap.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from zeep import Client, Settings, Transport, xsd
1212
from zeep.helpers import serialize_object
1313
from zeep.cache import SqliteCache
14+
from zeep.plugins import HistoryPlugin
1415

1516
import requests
1617

@@ -31,43 +32,51 @@ def __init__(self, endpoint_url=None, timeout=None, proxy=None, user_agent=None,
3132

3233
# Throw an error for py < 3.6 because of f-strings
3334
logging.getLogger('zeep').setLevel(logging.ERROR)
35+
logging.getLogger('zeep.transports').setLevel(logging.DEBUG)
3436
self.endpoint_url = (endpoint_url or consts.API_PUBLIC_ENDPOINT).rstrip('/')
3537
self.timeout = timeout or None
3638
self.proxy = proxy
3739
self.user_agent = user_agent or consts.USER_AGENT
3840
self.verify = verify
3941
self._client = None
42+
self.history = HistoryPlugin()
4043

4144
def __call__(self, request):
4245
"""Makes a SoftLayer API call against the SOAP endpoint.
4346
4447
:param request request: Request object
4548
"""
46-
print("Making a SOAP API CALL...")
47-
# client = Client(f"{self.endpoint_url}/{request.service}?wsdl")
49+
4850
zeep_settings = Settings(strict=False, xml_huge_tree=True)
4951
zeep_transport = Transport(cache=SqliteCache(timeout=86400))
5052
client = Client(f"{self.endpoint_url}/{request.service}?wsdl",
51-
settings=zeep_settings, transport=zeep_transport)
52-
# authXsd = xsd.Element(
53-
# f"{self.endpoint_url}/authenticate",
54-
# xsd.ComplexType([
55-
# xsd.Element(f"{self.endpoint_url}/username", xsd.String()),
56-
# xsd.Element(f"{self.endpoint_url}/apiKey", xsd.String())
57-
# ])
58-
# )
53+
settings=zeep_settings, transport=zeep_transport, plugins=[self.history])
54+
55+
# MUST define headers like this because otherwise the objectMask header doesn't work
56+
# because it isn't sent in with a namespace.
5957
xsdUserAuth = xsd.Element(
60-
'{http://api.softlayer.com/soap/v3.1/}authenticate',
58+
'{http://api.softlayer.com/soap/v3/}authenticate',
6159
xsd.ComplexType([
62-
xsd.Element('{http://api.softlayer.com/soap/v3.1/}username', xsd.String()),
63-
xsd.Element('{http://api.softlayer.com/soap/v3.1/}apiKey', xsd.String())
60+
xsd.Element('{http://api.service.softlayer.com/soap/v3/}username', xsd.String()),
61+
xsd.Element('{http://api.service.softlayer.com/soap/v3/}apiKey', xsd.String())
6462
])
6563
)
66-
# transport = Transport(session=get_session())
67-
68-
authHeader = xsdUserAuth(username=request.transport_user, apiKey=request.transport_password)
64+
xsdMask = xsd.Element(
65+
'{http://api.service.softlayer.com/soap/v3.1/}SoftLayer_ObjectMask',
66+
xsd.ComplexType([
67+
xsd.Element('mask', xsd.String()),
68+
])
69+
)
70+
71+
headers = [
72+
xsdMask(mask=request.mask or ''),
73+
xsdUserAuth(username=request.transport_user, apiKey=request.transport_password)
74+
]
75+
76+
pp(headers)
77+
print("HEADERS ^^^^^")
6978
method = getattr(client.service, request.method)
70-
result = client.service.getObject(_soapheaders=[authHeader])
79+
result = client.service.getObject(_soapheaders=headers)
7180
return serialize_object(result)
7281
# result = transport.post(f"{self.endpoint_url}/{request.service}")
7382

@@ -80,4 +89,4 @@ def print_reproduceable(self, request):
8089
:param request request: Request object
8190
"""
8291

83-
return "THE SOAP API CALL..."
92+
return self.history.last_sent

tests/transports/soap_tests.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,21 +39,42 @@ def get_soap_response():
3939
return response
4040

4141

42-
class TestXmlRpcAPICall(testing.TestCase):
42+
class TestSoapAPICall(testing.TestCase):
4343

4444
def set_up(self):
4545
self.transport = SoapTransport(endpoint_url='https://api.softlayer.com/soap/v3.1/')
4646
self.response = get_soap_response()
4747
self.user = os.getenv('SL_USER')
4848
self.password = os.environ.get('SL_APIKEY')
49-
50-
def test_call(self):
5149
request = Request()
5250
request.service = 'SoftLayer_Account'
5351
request.method = 'getObject'
5452
request.transport_user = self.user
5553
request.transport_password = self.password
56-
data = self.transport(request)
54+
self.request = request
55+
56+
def test_call(self):
57+
58+
data = self.transport(self.request)
59+
pp(data)
60+
self.assertEqual(data.get('id'), 307608)
61+
self.assertEqual(data.get('companyName'), "SoftLayer Internal - Development Community")
62+
63+
# def test_debug_call(self):
64+
65+
# self.request.mask = "mask[id,accountName,companyName]"
66+
# data = self.transport(self.request)
67+
68+
# self.assertEqual(data.get('id'), 307608)
69+
# debug_data = self.transport.print_reproduceable(self.request)
70+
# print(debug_data['envelope'])
71+
# self.assertEqual(":sdfsdf", debug_data)
72+
73+
def test_objectMask(self):
74+
self.request.mask = "mask[id,companyName]"
75+
data = self.transport(self.request)
5776
pp(data)
77+
self.assertEqual(data.get('companyName'), "SoftLayer Internal - Development Community")
78+
self.assertIsNone(data.get('address1'))
5879
self.assertEqual(data.get('id'), 307608)
5980

0 commit comments

Comments
 (0)