diff --git a/.secrets.baseline b/.secrets.baseline index ea850e071..9062c20d5 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -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" @@ -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 } diff --git a/SoftLayer/testing/xmlrpc.py b/SoftLayer/testing/xmlrpc.py index b60c2bf0c..a572fd79d 100644 --- a/SoftLayer/testing/xmlrpc.py +++ b/SoftLayer/testing/xmlrpc.py @@ -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") @@ -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) @@ -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 diff --git a/SoftLayer/transports/fixture.py b/SoftLayer/transports/fixture.py index 6975e92b6..7a6b64e19 100644 --- a/SoftLayer/transports/fixture.py +++ b/SoftLayer/transports/fixture.py @@ -8,6 +8,8 @@ import importlib +from .transport import SoftLayerListResult + class FixtureTransport(object): """Implements a transport which returns fixtures.""" @@ -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 diff --git a/SoftLayer/transports/rest.py b/SoftLayer/transports/rest.py index 30ce11bad..9d2a13269 100644 --- a/SoftLayer/transports/rest.py +++ b/SoftLayer/transports/rest.py @@ -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: diff --git a/SoftLayer/transports/transport.py b/SoftLayer/transports/transport.py index ab5ebedde..9496be50b 100644 --- a/SoftLayer/transports/transport.py +++ b/SoftLayer/transports/transport.py @@ -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.""" diff --git a/SoftLayer/transports/xmlrpc.py b/SoftLayer/transports/xmlrpc.py index 57ba4e9f6..66cdb5707 100644 --- a/SoftLayer/transports/xmlrpc.py +++ b/SoftLayer/transports/xmlrpc.py @@ -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: diff --git a/tests/transports/rest_tests.py b/tests/transports/rest_tests.py index 2c3d5f68f..20186e95f 100644 --- a/tests/transports/rest_tests.py +++ b/tests/transports/rest_tests.py @@ -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, diff --git a/tests/transports/transport_tests.py b/tests/transports/transport_tests.py index c22d11b9d..e4f2d7280 100644 --- a/tests/transports/transport_tests.py +++ b/tests/transports/transport_tests.py @@ -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' diff --git a/tests/transports/xmlrpc_tests.py b/tests/transports/xmlrpc_tests.py index 6e669279e..051e13822 100644 --- a/tests/transports/xmlrpc_tests.py +++ b/tests/transports/xmlrpc_tests.py @@ -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')