From 043429a16cf480cdac15c7ca3835bb9f34dc2a68 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 | 3 ++- kubernetes_asyncio/client/api_client.py | 10 ++++++--- scripts/api_client_strategic_merge_patch.diff | 22 +++++++++++-------- scripts/update-client.sh | 2 +- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/examples/patch.py b/examples/patch.py index ba28e231..1182644f 100644 --- a/examples/patch.py +++ b/examples/patch.py @@ -99,7 +99,8 @@ async def main(): SERVICE_NAME, SERVICE_NS, patch, - _content_type="application/merge-patch+json", # required to force merge patch + # required to force merge patch when strategic merge patch would otherwise be used + _content_type="application/merge-patch+json", ) diff --git a/kubernetes_asyncio/client/api_client.py b/kubernetes_asyncio/client/api_client.py index dfa99b7e..3edca404 100644 --- a/kubernetes_asyncio/client/api_client.py +++ b/kubernetes_asyncio/client/api_client.py @@ -539,9 +539,13 @@ def select_header_content_type(self, content_types, method=None, body=None): 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..047e5548 100644 --- a/scripts/api_client_strategic_merge_patch.diff +++ b/scripts/api_client_strategic_merge_patch.diff @@ -1,9 +1,9 @@ ---- /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)): @@ -12,9 +12,13 @@ + 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"