From b83eb08ea99392a94872a3e1a6a7402c19686fb9 Mon Sep 17 00:00:00 2001 From: Fabien Brousse <37183178+fbrousse@users.noreply.github.com> Date: Wed, 24 May 2023 12:12:19 +0200 Subject: [PATCH 1/3] Update helpers.py to read dict from payload the post method converts the json to string. Here we read from a os.environ and thus a string. So we send a string converted to string. It adds extra quotes and breaks for some server implementation (seen with grafana for provisioning). With the fix here we convert first the payload to dict to get it in the right format. --- src/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers.py b/src/helpers.py index 85fa4d9..d8c2c13 100755 --- a/src/helpers.py +++ b/src/helpers.py @@ -139,7 +139,7 @@ def request(url, method, enable_5xx=False, payload=None): if method == "GET" or not method: res = r.get("%s" % url, auth=auth, timeout=REQ_TIMEOUT, verify=REQ_TLS_VERIFY) elif method == "POST": - res = r.post("%s" % url, auth=auth, json=payload, timeout=REQ_TIMEOUT, verify=REQ_TLS_VERIFY) + res = r.post("%s" % url, auth=auth, json=json.loads(payload), timeout=REQ_TIMEOUT, verify=REQ_TLS_VERIFY) else: logger.warning(f"Invalid REQ_METHOD: '{method}', please use 'GET' or 'POST'. Doing nothing.") return From cf3e19070ecf2d845f78e0a0084857b55e06d7be Mon Sep 17 00:00:00 2001 From: Fabien Brousse <37183178+fbrousse@users.noreply.github.com> Date: Wed, 24 May 2023 14:58:02 +0200 Subject: [PATCH 2/3] - Move payload conversion to dedicated method - Fallback to payload if conversion fails --- src/helpers.py | 3 +-- src/resources.py | 9 +++++++++ src/sidecar.py | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/helpers.py b/src/helpers.py index d8c2c13..26ccf6c 100755 --- a/src/helpers.py +++ b/src/helpers.py @@ -109,7 +109,6 @@ def remove_file(folder, filename): logger.error(f"Unable to remove {complete_file}, file not found") return False - def request(url, method, enable_5xx=False, payload=None): enforce_status_codes = list() if enable_5xx else [500, 502, 503, 504] @@ -139,7 +138,7 @@ def request(url, method, enable_5xx=False, payload=None): if method == "GET" or not method: res = r.get("%s" % url, auth=auth, timeout=REQ_TIMEOUT, verify=REQ_TLS_VERIFY) elif method == "POST": - res = r.post("%s" % url, auth=auth, json=json.loads(payload), timeout=REQ_TIMEOUT, verify=REQ_TLS_VERIFY) + res = r.post("%s" % url, auth=auth, json=payload, timeout=REQ_TIMEOUT, verify=REQ_TLS_VERIFY) else: logger.warning(f"Invalid REQ_METHOD: '{method}', please use 'GET' or 'POST'. Doing nothing.") return diff --git a/src/resources.py b/src/resources.py index bcf7a67..25c201e 100755 --- a/src/resources.py +++ b/src/resources.py @@ -6,6 +6,7 @@ import signal import sys import traceback +import json from collections import defaultdict from multiprocessing import Process from time import sleep @@ -54,6 +55,14 @@ def signal_handler(signum, frame): signal.signal(signal.SIGTERM, signal_handler) +def prepare_payload(payload): + """Prepare payload as dict for request.""" + logger.debug(f"fbrousse testing.") + try: + payload_dict = json.loads(payload) + except ValueError as err: + return payload + return payload_dict def _get_file_data_and_name(full_filename, content, enable_5xx, content_type=CONTENT_TYPE_TEXT): if content_type == CONTENT_TYPE_BASE64_BINARY: diff --git a/src/sidecar.py b/src/sidecar.py index 4810fee..3c595a7 100755 --- a/src/sidecar.py +++ b/src/sidecar.py @@ -60,7 +60,7 @@ def main(): request_method = os.getenv(REQ_METHOD) request_url = os.getenv(REQ_URL) - request_payload = os.getenv(REQ_PAYLOAD) + request_payload = prepare_payload(os.getenv(REQ_PAYLOAD)) script = os.getenv(SCRIPT) _initialize_kubeclient_configuration() From 69576d9bbbfa16faa7fc0451673f27452530ed23 Mon Sep 17 00:00:00 2001 From: Fabien Brousse <37183178+fbrousse@users.noreply.github.com> Date: Wed, 24 May 2023 15:47:02 +0200 Subject: [PATCH 3/3] - Fixing the convert payload method - Handling empty REQ_PAYLOAD env var - Revert unwished removal --- src/helpers.py | 1 + src/resources.py | 4 ++-- src/sidecar.py | 5 ++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/helpers.py b/src/helpers.py index 26ccf6c..85fa4d9 100755 --- a/src/helpers.py +++ b/src/helpers.py @@ -109,6 +109,7 @@ def remove_file(folder, filename): logger.error(f"Unable to remove {complete_file}, file not found") return False + def request(url, method, enable_5xx=False, payload=None): enforce_status_codes = list() if enable_5xx else [500, 502, 503, 504] diff --git a/src/resources.py b/src/resources.py index 25c201e..b3dfe42 100755 --- a/src/resources.py +++ b/src/resources.py @@ -57,12 +57,12 @@ def signal_handler(signum, frame): def prepare_payload(payload): """Prepare payload as dict for request.""" - logger.debug(f"fbrousse testing.") try: payload_dict = json.loads(payload) + return payload_dict except ValueError as err: + logger.warning(f"Payload will be posted as quoted json") return payload - return payload_dict def _get_file_data_and_name(full_filename, content, enable_5xx, content_type=CONTENT_TYPE_TEXT): if content_type == CONTENT_TYPE_BASE64_BINARY: diff --git a/src/sidecar.py b/src/sidecar.py index 3c595a7..a3b169b 100755 --- a/src/sidecar.py +++ b/src/sidecar.py @@ -60,7 +60,10 @@ def main(): request_method = os.getenv(REQ_METHOD) request_url = os.getenv(REQ_URL) - request_payload = prepare_payload(os.getenv(REQ_PAYLOAD)) + + request_payload = os.getenv(REQ_PAYLOAD) + if request_payload: + request_payload = prepare_payload(os.getenv(REQ_PAYLOAD)) script = os.getenv(SCRIPT) _initialize_kubeclient_configuration()