Skip to content

Commit 645aec9

Browse files
authored
Merge pull request #669 from rackerlabs/nautobot-api-response-logging
fix: Further updates to Nautobot api response logging
2 parents 056067a + 23eff58 commit 645aec9

File tree

1 file changed

+25
-8
lines changed
  • python/neutron-understack/neutron_understack

1 file changed

+25
-8
lines changed

python/neutron-understack/neutron_understack/nautobot.py

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212

1313
class NautobotRequestError(exc.NeutronException):
14-
message = "Nautobot API returned error %(code)s for %(url)s: %(body)s"
14+
message = "Nautobot API ERROR %(code)s for %(url)s %(method)s %(payload)s: %(body)s"
1515

1616

1717
class NautobotOSError(exc.NeutronException):
@@ -26,6 +26,14 @@ class NautobotCustomFieldNotFoundError(exc.NeutronException):
2626
message = "Custom field with name %(cf_name)s not found for %(obj)s"
2727

2828

29+
def _truncated(message: str | bytes, maxlen=200) -> str:
30+
input = str(message)
31+
if len(input) <= maxlen:
32+
return input
33+
34+
return f"{input[:maxlen]}...{len(input) - maxlen} more chars"
35+
36+
2937
class Nautobot:
3038
"""Basic Nautobot wrapper because pynautobot doesn't expose plugin APIs."""
3139

@@ -56,16 +64,25 @@ def make_api_request(
5664
except Exception as e:
5765
raise NautobotOSError(err=e) from e
5866

67+
if response.content:
68+
try:
69+
response_data = response.json()
70+
except requests.exceptions.JSONDecodeError:
71+
response_data = {"body": _truncated(response.content)}
72+
73+
else:
74+
response_data = {"status_code": response.status_code, "body": ""}
75+
5976
if response.status_code >= 300:
77+
response_data = response_data.get("error", response_data)
78+
6079
raise NautobotRequestError(
61-
code=response.status_code, url=full_url, body=response.content
80+
code=response.status_code,
81+
url=full_url,
82+
method=method,
83+
payload=payload,
84+
body=response_data,
6285
)
63-
if not response.content:
64-
response_data = {"status_code": response.status_code}
65-
try:
66-
response_data = response.json()
67-
except requests.exceptions.JSONDecodeError:
68-
response_data = {"body": response.content}
6986

7087
caller_function = inspect.stack()[1].function
7188
LOG.debug(

0 commit comments

Comments
 (0)