From b57fd8cc122b3457ea50ca94b6a75da00d904b65 Mon Sep 17 00:00:00 2001 From: Jacob Henner Date: Wed, 18 Dec 2024 03:55:23 +0000 Subject: [PATCH] Fallback to merge patch Add fallback to merge patch if strategic merge patch is unavailable, as is the case for the custom objects API. --- examples/patch.py | 2 +- kubernetes_asyncio/client/api_client.py | 14 ++++++---- scripts/api_client_strategic_merge_patch.diff | 26 +++++++++++-------- scripts/update-client.sh | 2 +- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/examples/patch.py b/examples/patch.py index ba28e231..26e51d4c 100644 --- a/examples/patch.py +++ b/examples/patch.py @@ -99,7 +99,7 @@ async def main(): SERVICE_NAME, SERVICE_NS, patch, - _content_type="application/merge-patch+json", # required to force merge patch + _content_type="application/merge-patch+json", # required to force merge patch when strategic merge patch would otherwise be used ) diff --git a/kubernetes_asyncio/client/api_client.py b/kubernetes_asyncio/client/api_client.py index dfa99b7e..a96aeaa6 100644 --- a/kubernetes_asyncio/client/api_client.py +++ b/kubernetes_asyncio/client/api_client.py @@ -536,12 +536,16 @@ def select_header_content_type(self, content_types, method=None, body=None): content_types = [x.lower() for x in content_types] if method == 'PATCH': - if ('application/json-patch+json' in content_types and - isinstance(body, list)): + if 'application/json-patch+json' in content_types and + isinstance(body, list): return 'application/json-patch+json' - if ('application/strategic-merge-patch+json' in content_types and - (isinstance(body, dict) or hasattr(body, "to_dict"))): - return 'application/strategic-merge-patch+json' + if isinstance(body, dict) or hasattr(body, "to_dict"): + if 'application/strategic-merge-patch+json' in content_types: + return 'application/strategic-merge-patch+json' + elif 'application/merge-patch+json' in content_types: + # Intended for cases where strategic merge patch is not + # supported, like when patching custom objects. + return 'application/merge-patch+json' if 'application/json' in content_types or '*/*' in content_types: return 'application/json' diff --git a/scripts/api_client_strategic_merge_patch.diff b/scripts/api_client_strategic_merge_patch.diff index f286b88d..05183401 100644 --- a/scripts/api_client_strategic_merge_patch.diff +++ b/scripts/api_client_strategic_merge_patch.diff @@ -1,20 +1,24 @@ ---- /tmp/api_client.py 2024-02-25 20:40:28.143350042 +0100 -+++ kubernetes_asyncio/client/api_client.py 2024-02-25 20:40:32.954201652 +0100 -@@ -535,10 +535,13 @@ - +--- /tmp/api_client.py 2024-12-18 03:36:59.552742383 +0000 ++++ kubernetes_asyncio/client/api_client.py 2024-12-18 03:36:11.062928089 +0000 +@@ -535,10 +535,17 @@ + content_types = [x.lower() for x in content_types] - + - if (method == 'PATCH' and - 'application/json-patch+json' in content_types and - isinstance(body, list)): - return 'application/json-patch+json' + if method == 'PATCH': -+ if ('application/json-patch+json' in content_types and -+ isinstance(body, list)): ++ if 'application/json-patch+json' in content_types and ++ isinstance(body, list): + return 'application/json-patch+json' -+ if ('application/strategic-merge-patch+json' in content_types and -+ (isinstance(body, dict) or hasattr(body, "to_dict"))): -+ return 'application/strategic-merge-patch+json' - ++ if isinstance(body, dict) or hasattr(body, "to_dict"): ++ if 'application/strategic-merge-patch+json' in content_types: ++ return 'application/strategic-merge-patch+json' ++ elif 'application/merge-patch+json' in content_types: ++ # Intended for cases where strategic merge patch is not ++ # supported, like when patching custom objects. ++ return 'application/merge-patch+json' + if 'application/json' in content_types or '*/*' in content_types: return 'application/json' diff --git a/scripts/update-client.sh b/scripts/update-client.sh index a9e68d48..dd8ee9f5 100755 --- a/scripts/update-client.sh +++ b/scripts/update-client.sh @@ -35,7 +35,7 @@ pushd "${CLIENT_ROOT}" > /dev/null CLIENT_ROOT=`pwd` popd > /dev/null -TEMP_FOLDER=$(mktemp -d) +TEMP_FOLDER=$(mktemp -d) trap "rm -rf ${TEMP_FOLDER}" EXIT SIGINT SETTING_FILE="${TEMP_FOLDER}/settings"