Skip to content

Commit c168dff

Browse files
Merge pull request #2190 from allmightyspiff/issues2129
Added get_total_items to SoftLayerListResult.
2 parents bd1ecce + 9663ba8 commit c168dff

File tree

9 files changed

+32
-22
lines changed

9 files changed

+32
-22
lines changed

Diff for: .secrets.baseline

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"files": "^.secrets.baseline$",
44
"lines": null
55
},
6-
"generated_at": "2024-04-25T01:18:20Z",
6+
"generated_at": "2024-10-04T22:18:14Z",
77
"plugins_used": [
88
{
99
"name": "AWSKeyDetector"
@@ -720,7 +720,7 @@
720720
"hashed_secret": "9878e362285eb314cfdbaa8ee8c300c285856810",
721721
"is_secret": false,
722722
"is_verified": false,
723-
"line_number": 323,
723+
"line_number": 324,
724724
"type": "Secret Keyword",
725725
"verified_result": null
726726
}

Diff for: SoftLayer/testing/xmlrpc.py

+9-15
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,17 @@ def do_POST(self):
4545
req.args = args[1:]
4646
req.filter = _item_by_key_postfix(headers, 'ObjectFilter') or None
4747
req.mask = _item_by_key_postfix(headers, 'ObjectMask').get('mask')
48-
req.identifier = _item_by_key_postfix(headers,
49-
'InitParameters').get('id')
50-
req.transport_headers = dict(((k.lower(), v)
51-
for k, v in self.headers.items()))
48+
req.identifier = _item_by_key_postfix(headers, 'InitParameters').get('id')
49+
req.transport_headers = dict(((k.lower(), v) for k, v in self.headers.items()))
5250
req.headers = headers
5351

5452
# Get response
5553
response = self.server.transport(req)
5654

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

6160
self.send_response(200)
6261
self.send_header("Content-type", "application/xml; charset=UTF-8")
@@ -70,18 +69,14 @@ def do_POST(self):
7069
self.send_response(200)
7170
self.end_headers()
7271
response = xmlrpc.client.Fault(404, str(ex))
73-
response_body = xmlrpc.client.dumps(response,
74-
allow_none=True,
75-
methodresponse=True)
72+
response_body = xmlrpc.client.dumps(response, allow_none=True, methodresponse=True)
7673
self.wfile.write(response_body.encode('utf-8'))
7774

7875
except SoftLayer.SoftLayerAPIError as ex:
7976
self.send_response(200)
8077
self.end_headers()
8178
response = xmlrpc.client.Fault(ex.faultCode, str(ex.reason))
82-
response_body = xmlrpc.client.dumps(response,
83-
allow_none=True,
84-
methodresponse=True)
79+
response_body = xmlrpc.client.dumps(response, allow_none=True, methodresponse=True)
8580
self.wfile.write(response_body.encode('utf-8'))
8681
except Exception:
8782
self.send_response(500)
@@ -103,7 +98,6 @@ def _item_by_key_postfix(dictionary, key_prefix):
10398
def create_test_server(transport, host='localhost', port=0):
10499
"""Create a test XML-RPC server in a new thread."""
105100
server = TestServer(transport, (host, port), TestHandler)
106-
thread = threading.Thread(target=server.serve_forever,
107-
kwargs={'poll_interval': 0.01})
101+
thread = threading.Thread(target=server.serve_forever, kwargs={'poll_interval': 0.01})
108102
thread.start()
109103
return server

Diff for: SoftLayer/transports/fixture.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
import importlib
1010

11+
from .transport import SoftLayerListResult
12+
1113

1214
class FixtureTransport(object):
1315
"""Implements a transport which returns fixtures."""
@@ -21,7 +23,10 @@ def __call__(self, call):
2123
message = f'{call.service} fixture is not implemented'
2224
raise NotImplementedError(message) from ex
2325
try:
24-
return getattr(module, call.method)
26+
result = getattr(module, call.method)
27+
if isinstance(result, list):
28+
return SoftLayerListResult(result, len(result))
29+
return result
2530
except AttributeError as ex:
2631
message = f'{call.service}::{call.method} fixture is not implemented'
2732
raise NotImplementedError(message) from ex

Diff for: SoftLayer/transports/rest.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,7 @@ def __call__(self, request):
138138
request.result = result
139139

140140
if isinstance(result, list):
141-
return SoftLayerListResult(
142-
result, int(resp.headers.get('softlayer-total-items', 0)))
141+
return SoftLayerListResult(result, int(resp.headers.get('softlayer-total-items', 0)))
143142
else:
144143
return result
145144
except requests.HTTPError as ex:

Diff for: SoftLayer/transports/transport.py

+4
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ def __init__(self, items=None, total_count=0):
121121
self.total_count = total_count
122122
super().__init__(items)
123123

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

125129
def _proxies_dict(proxy):
126130
"""Makes a proxy dict appropriate to pass to requests."""

Diff for: SoftLayer/transports/xmlrpc.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,7 @@ def __call__(self, request):
100100
resp.raise_for_status()
101101
result = xmlrpc.client.loads(resp.content)[0][0]
102102
if isinstance(result, list):
103-
return SoftLayerListResult(
104-
result, int(resp.headers.get('softlayer-total-items', 0)))
103+
return SoftLayerListResult(result, int(resp.headers.get('softlayer-total-items', 0)))
105104
else:
106105
return result
107106
except xmlrpc.client.Fault as ex:

Diff for: tests/transports/rest_tests.py

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def test_basic(self, request):
3737
self.assertEqual(resp, [])
3838
self.assertIsInstance(resp, transports.SoftLayerListResult)
3939
self.assertEqual(resp.total_count, 10)
40+
self.assertEqual(resp.get_total_items(), 10)
4041
request.assert_called_with(
4142
'GET', 'http://something9999999999999999999999.com/SoftLayer_Service/Resource.json',
4243
headers=mock.ANY,

Diff for: tests/transports/transport_tests.py

+7
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ def test_basic(self):
2020
resp = self.transport(req)
2121
self.assertEqual(resp['accountId'], 1234)
2222

23+
def test_total_items(self):
24+
req = transports.Request()
25+
req.service = 'SoftLayer_Account'
26+
req.method = 'getHardware'
27+
resp = self.transport(req)
28+
self.assertEqual(resp.get_total_items(), 4)
29+
2330
def test_no_module(self):
2431
req = transports.Request()
2532
req.service = 'Doesnt_Exist'

Diff for: tests/transports/xmlrpc_tests.py

+1
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ def test_nonascii_characters(self, request):
409409
self.assertEqual(resp, [])
410410
self.assertIsInstance(resp, transports.SoftLayerListResult)
411411
self.assertEqual(resp.total_count, 10)
412+
self.assertEqual(resp.get_total_items(), 10)
412413

413414

414415
@mock.patch('SoftLayer.transports.xmlrpc.requests.Session.request')

0 commit comments

Comments
 (0)