Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added get_total_items to SoftLayerListResult. #2190

Merged
merged 2 commits into from
Oct 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .secrets.baseline
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"files": "^.secrets.baseline$",
"lines": null
},
"generated_at": "2024-04-25T01:18:20Z",
"generated_at": "2024-10-04T22:18:14Z",
"plugins_used": [
{
"name": "AWSKeyDetector"
Expand Down Expand Up @@ -720,7 +720,7 @@
"hashed_secret": "9878e362285eb314cfdbaa8ee8c300c285856810",
"is_secret": false,
"is_verified": false,
"line_number": 323,
"line_number": 324,
"type": "Secret Keyword",
"verified_result": null
}
Expand Down
24 changes: 9 additions & 15 deletions SoftLayer/testing/xmlrpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,17 @@ def do_POST(self):
req.args = args[1:]
req.filter = _item_by_key_postfix(headers, 'ObjectFilter') or None
req.mask = _item_by_key_postfix(headers, 'ObjectMask').get('mask')
req.identifier = _item_by_key_postfix(headers,
'InitParameters').get('id')
req.transport_headers = dict(((k.lower(), v)
for k, v in self.headers.items()))
req.identifier = _item_by_key_postfix(headers, 'InitParameters').get('id')
req.transport_headers = dict(((k.lower(), v) for k, v in self.headers.items()))
req.headers = headers

# Get response
response = self.server.transport(req)

response_body = xmlrpc.client.dumps((response,),
allow_none=True,
methodresponse=True)
# Need to convert BACK to list, so xmlrpc can dump it out properly.
if isinstance(response, SoftLayer.transports.transport.SoftLayerListResult):
response = list(response)
response_body = xmlrpc.client.dumps((response,), allow_none=True, methodresponse=True)

self.send_response(200)
self.send_header("Content-type", "application/xml; charset=UTF-8")
Expand All @@ -70,18 +69,14 @@ def do_POST(self):
self.send_response(200)
self.end_headers()
response = xmlrpc.client.Fault(404, str(ex))
response_body = xmlrpc.client.dumps(response,
allow_none=True,
methodresponse=True)
response_body = xmlrpc.client.dumps(response, allow_none=True, methodresponse=True)
self.wfile.write(response_body.encode('utf-8'))

except SoftLayer.SoftLayerAPIError as ex:
self.send_response(200)
self.end_headers()
response = xmlrpc.client.Fault(ex.faultCode, str(ex.reason))
response_body = xmlrpc.client.dumps(response,
allow_none=True,
methodresponse=True)
response_body = xmlrpc.client.dumps(response, allow_none=True, methodresponse=True)
self.wfile.write(response_body.encode('utf-8'))
except Exception:
self.send_response(500)
Expand All @@ -103,7 +98,6 @@ def _item_by_key_postfix(dictionary, key_prefix):
def create_test_server(transport, host='localhost', port=0):
"""Create a test XML-RPC server in a new thread."""
server = TestServer(transport, (host, port), TestHandler)
thread = threading.Thread(target=server.serve_forever,
kwargs={'poll_interval': 0.01})
thread = threading.Thread(target=server.serve_forever, kwargs={'poll_interval': 0.01})
thread.start()
return server
7 changes: 6 additions & 1 deletion SoftLayer/transports/fixture.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

import importlib

from .transport import SoftLayerListResult


class FixtureTransport(object):
"""Implements a transport which returns fixtures."""
Expand All @@ -21,7 +23,10 @@ def __call__(self, call):
message = f'{call.service} fixture is not implemented'
raise NotImplementedError(message) from ex
try:
return getattr(module, call.method)
result = getattr(module, call.method)
if isinstance(result, list):
return SoftLayerListResult(result, len(result))
return result
except AttributeError as ex:
message = f'{call.service}::{call.method} fixture is not implemented'
raise NotImplementedError(message) from ex
Expand Down
3 changes: 1 addition & 2 deletions SoftLayer/transports/rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,7 @@ def __call__(self, request):
request.result = result

if isinstance(result, list):
return SoftLayerListResult(
result, int(resp.headers.get('softlayer-total-items', 0)))
return SoftLayerListResult(result, int(resp.headers.get('softlayer-total-items', 0)))
else:
return result
except requests.HTTPError as ex:
Expand Down
4 changes: 4 additions & 0 deletions SoftLayer/transports/transport.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,10 @@ def __init__(self, items=None, total_count=0):
self.total_count = total_count
super().__init__(items)

def get_total_items(self):
"""A simple getter to totalCount, but its called getTotalItems since that is the header returned"""
return self.total_count


def _proxies_dict(proxy):
"""Makes a proxy dict appropriate to pass to requests."""
Expand Down
3 changes: 1 addition & 2 deletions SoftLayer/transports/xmlrpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,7 @@ def __call__(self, request):
resp.raise_for_status()
result = xmlrpc.client.loads(resp.content)[0][0]
if isinstance(result, list):
return SoftLayerListResult(
result, int(resp.headers.get('softlayer-total-items', 0)))
return SoftLayerListResult(result, int(resp.headers.get('softlayer-total-items', 0)))
else:
return result
except xmlrpc.client.Fault as ex:
Expand Down
1 change: 1 addition & 0 deletions tests/transports/rest_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ def test_basic(self, request):
self.assertEqual(resp, [])
self.assertIsInstance(resp, transports.SoftLayerListResult)
self.assertEqual(resp.total_count, 10)
self.assertEqual(resp.get_total_items(), 10)
request.assert_called_with(
'GET', 'http://something9999999999999999999999.com/SoftLayer_Service/Resource.json',
headers=mock.ANY,
Expand Down
7 changes: 7 additions & 0 deletions tests/transports/transport_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ def test_basic(self):
resp = self.transport(req)
self.assertEqual(resp['accountId'], 1234)

def test_total_items(self):
req = transports.Request()
req.service = 'SoftLayer_Account'
req.method = 'getHardware'
resp = self.transport(req)
self.assertEqual(resp.get_total_items(), 4)

def test_no_module(self):
req = transports.Request()
req.service = 'Doesnt_Exist'
Expand Down
1 change: 1 addition & 0 deletions tests/transports/xmlrpc_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,7 @@ def test_nonascii_characters(self, request):
self.assertEqual(resp, [])
self.assertIsInstance(resp, transports.SoftLayerListResult)
self.assertEqual(resp.total_count, 10)
self.assertEqual(resp.get_total_items(), 10)


@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')
Expand Down
Loading