Patch watch.py in python-kubernetes package
Patch the python2-kubernetes-8.0.0-8.el7.noarch.rpm with recent bug fix commits required for proper kubernetes watch functionality. Patches watch.py up to commit 10ae476 in the 'base' repo (kubernetes-client/python-base). Commits are taken from the cloned github repo, saved in patch format, and applied as a patch to the source RPM. Reference: https://github.com/kubernetes-client/python-base/commits/master/watch/watch.py This patch includes commits beginning with d56fdbc, up to and including 10ae476 Testing: - Built and testing on local distributed cloud system - Similar testing to this patch but ased on locally modified package has been done on 1000 subcloud system - Examine/compare contents of installed package vs. expected - Generating events which trigger the watch conditions - Monitor watches for proper behaviour on expiry Story: 2008960 Task: 43053 Signed-off-by: Kyle MacLeod <kyle.macleod@windriver.com> Change-Id: I7ad78957b6ef61e7204c45f482f201d5c281385b
This commit is contained in:
parent
7a14a9a2e0
commit
e2ab5cc2c8
@ -64,6 +64,7 @@ kubernetes/armada-helm-toolkit
|
||||
kubernetes/armada
|
||||
kubernetes/k8s-pod-recovery
|
||||
kubernetes/plugins/isolcpus-device-plugin
|
||||
python/python-kubernetes
|
||||
grub/grubby
|
||||
base/dpkg
|
||||
base/cluster-resource-agents
|
||||
|
@ -28,6 +28,7 @@ puppet-staging-1.0.4-1.b466d93git.el7.src.rpm
|
||||
puppet-stdlib-4.18.0-2.el7.src.rpm
|
||||
python-docker-3.3.0-1.el7.src.rpm
|
||||
python-keyring-5.7.1-1.el7.src.rpm
|
||||
python-kubernetes-8.0.0-8.el7.src.rpm
|
||||
python-psycopg2-2.5.1-3.el7.src.rpm
|
||||
python-voluptuous-0.8.9-1.el7.src.rpm
|
||||
resource-agents-4.1.1-12.el7_6.7.src.rpm
|
||||
|
1
python/python-kubernetes/centos/build_srpm.data
Normal file
1
python/python-kubernetes/centos/build_srpm.data
Normal file
@ -0,0 +1 @@
|
||||
TIS_PATCH_VER=PKG_GITREVCOUNT
|
@ -0,0 +1,95 @@
|
||||
From b33ab116b3a32578131712e9a450eb6c88782ef6 Mon Sep 17 00:00:00 2001
|
||||
From: Kyle MacLeod <kyle.macleod@windriver.com>
|
||||
Date: Tue, 17 Aug 2021 10:25:31 -0400
|
||||
Subject: [PATCH] Include watch.py bug fixes
|
||||
|
||||
Patches watch.py up to commit 10ae476 in the 'base' repo
|
||||
(kubernetes-client/python-base).
|
||||
---
|
||||
SPECS/python-kubernetes.spec | 45 +++++++++++++++++++++++++++++++++---
|
||||
1 file changed, 42 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/SPECS/python-kubernetes.spec b/SPECS/python-kubernetes.spec
|
||||
index 87c48ca..1c6fb59 100644
|
||||
--- a/SPECS/python-kubernetes.spec
|
||||
+++ b/SPECS/python-kubernetes.spec
|
||||
@@ -21,7 +21,7 @@ Source2: make-adal-optional.patch
|
||||
|
||||
Name: python-%{library}
|
||||
Version: 8.0.0
|
||||
-Release: 8%{?dist}
|
||||
+Release: 8.el7%{?_tis_dist}.%{tis_patch_ver}
|
||||
Summary: Python client for the kubernetes API.
|
||||
License: ASL 2.0
|
||||
URL: https://pypi.python.org/pypi/kubernetes
|
||||
@@ -30,6 +30,20 @@ Source0: https://github.com/kubernetes-incubator/client-python/archive/v%{ver
|
||||
Source1: https://github.com/kubernetes-client/python-base/archive/83ebb9d5fdc0d46bbb2e30afcd8eec42c5da4ad1.tar.gz
|
||||
BuildArch: noarch
|
||||
|
||||
+Source3: 0001-Verify-Boilerplate-fix.patch
|
||||
+Source4: 0002-fix-watching-with-a-specified-resource-version.patch
|
||||
+Source5: 0003-Making-watch-work-with-read_namespaced_pod_log.patch
|
||||
+Source6: 0004-Don-t-use-break-inside-finally.patch
|
||||
+Source7: 0005-Remove-all-shebangs-from-Python-modules-and-checker.patch
|
||||
+Source8: 0006-Fixed-Watch.unmarshal_event-when-data-is-not-a-JSON-.patch
|
||||
+Source9: 0007-watch-stream-stop-unmarshalling-when-streaming-log.patch
|
||||
+Source10: 0008-Retry-watch-if-request-expires.patch
|
||||
+Source11: 0009-Fix-a-Python-2-compatibility-issue.patch
|
||||
+Source12: 0010-Fixes-codestyle-failures.patch
|
||||
+Source13: 0011-Fix-Watch-retries-with-410-errors.patch
|
||||
+Source14: 0012-Fixes-kubernetes-client-python-issue-1047-ResponseNo.patch
|
||||
+Source15: 0013-quick-fix-of-decoding-error-for-BOOKMARK-event.patch
|
||||
+
|
||||
%if 0%{?with_python2}
|
||||
%package -n python2-%{library}
|
||||
Summary: Kubernetes Python Client
|
||||
@@ -133,11 +147,34 @@ mv python-base-83ebb9d5fdc0d46bbb2e30afcd8eec42c5da4ad1 base
|
||||
%if 0%{?rhel} == 7
|
||||
patch -p1 < %{SOURCE2}
|
||||
%endif
|
||||
+
|
||||
+# Apply StarlingX patches.
|
||||
+# The patches are taken from the context of the 'base' directory
|
||||
+# which is a git submodule.
|
||||
+# We have to use redirection since we can't run the patches
|
||||
+# via autosetup due to the above tarball extraction:
|
||||
+pushd base
|
||||
+patch -p1 < %{SOURCE3}
|
||||
+patch -p1 < %{SOURCE4}
|
||||
+patch -p1 < %{SOURCE5}
|
||||
+patch -p1 < %{SOURCE6}
|
||||
+patch -p1 < %{SOURCE7}
|
||||
+patch -p1 < %{SOURCE8}
|
||||
+patch -p1 < %{SOURCE9}
|
||||
+patch -p1 < %{SOURCE10}
|
||||
+patch -p1 < %{SOURCE11}
|
||||
+patch -p1 < %{SOURCE12}
|
||||
+patch -p1 < %{SOURCE13}
|
||||
+patch -p1 < %{SOURCE14}
|
||||
+patch -p1 < %{SOURCE15}
|
||||
+popd
|
||||
popd
|
||||
|
||||
%build
|
||||
%if 0%{?with_python2}
|
||||
-%py2_build
|
||||
+# NOTE: py2_build macro is called py_build in our loadbuild servers
|
||||
+# %py2_build
|
||||
+%py_build
|
||||
%endif
|
||||
%if 0%{?with_python3}
|
||||
%py3_build
|
||||
@@ -159,7 +196,9 @@ sphinx-build doc/source/ html
|
||||
|
||||
%install
|
||||
%if 0%{?with_python2}
|
||||
-%py2_install
|
||||
+# NOTE: py2_install macro is called py_install in our loadbuild servers
|
||||
+# %py2_install
|
||||
+%py_install
|
||||
cp -pr kubernetes/test %{buildroot}%{python2_sitelib}/%{library}/
|
||||
cp -pr kubernetes/e2e_test %{buildroot}%{python2_sitelib}/%{library}/
|
||||
%endif
|
||||
--
|
||||
2.25.1
|
||||
|
1
python/python-kubernetes/centos/meta_patches/PATCH_ORDER
Normal file
1
python/python-kubernetes/centos/meta_patches/PATCH_ORDER
Normal file
@ -0,0 +1 @@
|
||||
0001-Include-watch.py-bug-fixes.patch
|
@ -0,0 +1,22 @@
|
||||
From d56fdbc0cc33a6c8e4782c93b50c56c889fb3fa3 Mon Sep 17 00:00:00 2001
|
||||
From: Neha Yadav <inehayadav28@gmail.com>
|
||||
Date: Wed, 5 Dec 2018 22:22:59 +0530
|
||||
Subject: [PATCH 01/13] Verify Boilerplate fix
|
||||
|
||||
---
|
||||
watch/watch.py | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index 21899dd..fb4c1ab 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -1,3 +1,5 @@
|
||||
+#!/usr/bin/env python
|
||||
+
|
||||
# Copyright 2016 The Kubernetes Authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,41 @@
|
||||
From 3c30a3099336a5976074c18ea61814646689b4a8 Mon Sep 17 00:00:00 2001
|
||||
From: Julian Taylor <juliantaylor108@gmail.com>
|
||||
Date: Sat, 19 Jan 2019 12:38:57 +0100
|
||||
Subject: [PATCH 02/13] fix watching with a specified resource version
|
||||
|
||||
The watch code reset the version to the last found in the
|
||||
response.
|
||||
When you first list existing objects and then start watching from that
|
||||
resource version the existing versions are older than the version you
|
||||
wanted and the watch starts from the wrong version after the first
|
||||
restart.
|
||||
This leads to for example already deleted objects ending in the stream
|
||||
again.
|
||||
|
||||
Fix this by setting the minimum resource version to reset from to the
|
||||
input resource version. As long as k8s returns all objects in order in
|
||||
the watch this should work.
|
||||
We cannot use the integer value of the resource version to order it as
|
||||
one should be treat the value as opaque.
|
||||
|
||||
Closes https://github.com/kubernetes-client/python/issues/700
|
||||
---
|
||||
watch/watch.py | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index 21899dd..a9c315c 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -122,6 +122,8 @@ class Watch(object):
|
||||
return_type = self.get_return_type(func)
|
||||
kwargs['watch'] = True
|
||||
kwargs['_preload_content'] = False
|
||||
+ if 'resource_version' in kwargs:
|
||||
+ self.resource_version = kwargs['resource_version']
|
||||
|
||||
timeouts = ('timeout_seconds' in kwargs)
|
||||
while True:
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,76 @@
|
||||
From 8e6f0435a38e24aac700d9ebac700bdf6138ba8c Mon Sep 17 00:00:00 2001
|
||||
From: Mitar <mitar.git@tnode.com>
|
||||
Date: Mon, 15 Oct 2018 23:57:46 -0700
|
||||
Subject: [PATCH 03/13] Making watch work with read_namespaced_pod_log.
|
||||
|
||||
Fixes https://github.com/kubernetes-client/python/issues/199.
|
||||
---
|
||||
watch/watch.py | 21 +++++++++++++++++----
|
||||
1 file changed, 17 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index bdf24f1..79b2358 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -20,6 +20,7 @@ import pydoc
|
||||
from kubernetes import client
|
||||
|
||||
PYDOC_RETURN_LABEL = ":return:"
|
||||
+PYDOC_FOLLOW_PARAM = ":param bool follow:"
|
||||
|
||||
# Removing this suffix from return type name should give us event's object
|
||||
# type. e.g., if list_namespaces() returns "NamespaceList" type,
|
||||
@@ -65,7 +66,7 @@ class Watch(object):
|
||||
self._raw_return_type = return_type
|
||||
self._stop = False
|
||||
self._api_client = client.ApiClient()
|
||||
- self.resource_version = 0
|
||||
+ self.resource_version = None
|
||||
|
||||
def stop(self):
|
||||
self._stop = True
|
||||
@@ -78,8 +79,17 @@ class Watch(object):
|
||||
return return_type[:-len(TYPE_LIST_SUFFIX)]
|
||||
return return_type
|
||||
|
||||
+ def get_watch_argument_name(self, func):
|
||||
+ if PYDOC_FOLLOW_PARAM in pydoc.getdoc(func):
|
||||
+ return 'follow'
|
||||
+ else:
|
||||
+ return 'watch'
|
||||
+
|
||||
def unmarshal_event(self, data, return_type):
|
||||
- js = json.loads(data)
|
||||
+ try:
|
||||
+ js = json.loads(data)
|
||||
+ except ValueError:
|
||||
+ return data
|
||||
js['raw_object'] = js['object']
|
||||
if return_type:
|
||||
obj = SimpleNamespace(data=json.dumps(js['raw_object']))
|
||||
@@ -122,7 +132,7 @@ class Watch(object):
|
||||
|
||||
self._stop = False
|
||||
return_type = self.get_return_type(func)
|
||||
- kwargs['watch'] = True
|
||||
+ kwargs[self.get_watch_argument_name(func)] = True
|
||||
kwargs['_preload_content'] = False
|
||||
if 'resource_version' in kwargs:
|
||||
self.resource_version = kwargs['resource_version']
|
||||
@@ -136,9 +146,12 @@ class Watch(object):
|
||||
if self._stop:
|
||||
break
|
||||
finally:
|
||||
- kwargs['resource_version'] = self.resource_version
|
||||
resp.close()
|
||||
resp.release_conn()
|
||||
+ if self.resource_version is not None:
|
||||
+ kwargs['resource_version'] = self.resource_version
|
||||
+ else:
|
||||
+ break
|
||||
|
||||
if timeouts or self._stop:
|
||||
break
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,26 @@
|
||||
From 972a76a83d0133b45db03495b0f9fd05ed2b94a3 Mon Sep 17 00:00:00 2001
|
||||
From: Mitar <mitar.git@tnode.com>
|
||||
Date: Wed, 20 Feb 2019 23:56:38 -0800
|
||||
Subject: [PATCH 04/13] Don't use break inside finally.
|
||||
|
||||
It swallows exceptions.
|
||||
---
|
||||
watch/watch.py | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index 79b2358..5966eac 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -151,7 +151,7 @@ class Watch(object):
|
||||
if self.resource_version is not None:
|
||||
kwargs['resource_version'] = self.resource_version
|
||||
else:
|
||||
- break
|
||||
+ self._stop = True
|
||||
|
||||
if timeouts or self._stop:
|
||||
break
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,31 @@
|
||||
From c941d74b3745550fc886ebf20e40725aa4722f5c Mon Sep 17 00:00:00 2001
|
||||
From: Oz N Tiram <oz.tiram@gmail.com>
|
||||
Date: Tue, 20 Aug 2019 22:25:57 +0200
|
||||
Subject: [PATCH 05/13] Remove all shebangs from Python modules and checker
|
||||
|
||||
As discussed, Python modules which aren't intended to be invoked
|
||||
as scripts should not include a shebang line.
|
||||
|
||||
Update CONTRIBUTING.md and the checker script.
|
||||
This script now includes a list SKIP_FILES for files that
|
||||
should not be checked for boilerplate template.
|
||||
The tests will now fail if a Python module has a shebang line.
|
||||
Scripts which should have a shebang line and exists in the directory
|
||||
`hack` can be ignored by adding them to the SKIP_FILES list.
|
||||
---
|
||||
watch/watch.py | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index 5966eac..77b9794 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -1,5 +1,3 @@
|
||||
-#!/usr/bin/env python
|
||||
-
|
||||
# Copyright 2016 The Kubernetes Authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,28 @@
|
||||
From f11587d0e3cedf645ba12fe4dfd7971ee7162c9d Mon Sep 17 00:00:00 2001
|
||||
From: Alexey Volkov <alexey.volkov@ark-kun.com>
|
||||
Date: Thu, 17 Oct 2019 17:40:20 -0700
|
||||
Subject: [PATCH 06/13] Fixed Watch.unmarshal_event when data is not a
|
||||
JSON-serialized object
|
||||
|
||||
Fixes https://github.com/kubernetes-client/python/issues/982
|
||||
Fixes https://github.com/kubernetes-client/python/issues/983
|
||||
---
|
||||
watch/watch.py | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index 77b9794..ba87de9 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -88,6 +88,8 @@ class Watch(object):
|
||||
js = json.loads(data)
|
||||
except ValueError:
|
||||
return data
|
||||
+ if not (isinstance(js, dict) and 'object' in js):
|
||||
+ return data
|
||||
js['raw_object'] = js['object']
|
||||
if return_type:
|
||||
obj = SimpleNamespace(data=json.dumps(js['raw_object']))
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,54 @@
|
||||
From ea11e44daf06e38a9b49c5f8cc41f19447d79bfe Mon Sep 17 00:00:00 2001
|
||||
From: Haowei Cai <haoweic@google.com>
|
||||
Date: Fri, 21 Feb 2020 15:19:35 -0800
|
||||
Subject: [PATCH 07/13] watch stream: stop unmarshalling when streaming log
|
||||
|
||||
---
|
||||
watch/watch.py | 17 +++++++++--------
|
||||
1 file changed, 9 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index ba87de9..fe7a924 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -84,12 +84,7 @@ class Watch(object):
|
||||
return 'watch'
|
||||
|
||||
def unmarshal_event(self, data, return_type):
|
||||
- try:
|
||||
- js = json.loads(data)
|
||||
- except ValueError:
|
||||
- return data
|
||||
- if not (isinstance(js, dict) and 'object' in js):
|
||||
- return data
|
||||
+ js = json.loads(data)
|
||||
js['raw_object'] = js['object']
|
||||
if return_type:
|
||||
obj = SimpleNamespace(data=json.dumps(js['raw_object']))
|
||||
@@ -132,7 +127,8 @@ class Watch(object):
|
||||
|
||||
self._stop = False
|
||||
return_type = self.get_return_type(func)
|
||||
- kwargs[self.get_watch_argument_name(func)] = True
|
||||
+ watch_arg = self.get_watch_argument_name(func)
|
||||
+ kwargs[watch_arg] = True
|
||||
kwargs['_preload_content'] = False
|
||||
if 'resource_version' in kwargs:
|
||||
self.resource_version = kwargs['resource_version']
|
||||
@@ -142,7 +138,12 @@ class Watch(object):
|
||||
resp = func(*args, **kwargs)
|
||||
try:
|
||||
for line in iter_resp_lines(resp):
|
||||
- yield self.unmarshal_event(line, return_type)
|
||||
+ # unmarshal when we are receiving events from watch,
|
||||
+ # return raw string when we are streaming log
|
||||
+ if watch_arg == "watch":
|
||||
+ yield self.unmarshal_event(line, return_type)
|
||||
+ else:
|
||||
+ yield line
|
||||
if self._stop:
|
||||
break
|
||||
finally:
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,81 @@
|
||||
From 06e48c585c003742ff42fb1995ec18e85226055e Mon Sep 17 00:00:00 2001
|
||||
From: Mitar <mitar.git@tnode.com>
|
||||
Date: Mon, 11 Feb 2019 00:23:39 -0800
|
||||
Subject: [PATCH 08/13] Retry watch if request expires.
|
||||
|
||||
---
|
||||
watch/watch.py | 30 ++++++++++++++++++++++++++++--
|
||||
1 file changed, 28 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index fe7a924..f67dbe4 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -12,6 +12,7 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
+import http
|
||||
import json
|
||||
import pydoc
|
||||
|
||||
@@ -86,7 +87,7 @@ class Watch(object):
|
||||
def unmarshal_event(self, data, return_type):
|
||||
js = json.loads(data)
|
||||
js['raw_object'] = js['object']
|
||||
- if return_type:
|
||||
+ if return_type and js['type'] != 'ERROR':
|
||||
obj = SimpleNamespace(data=json.dumps(js['raw_object']))
|
||||
js['object'] = self._api_client.deserialize(obj, return_type)
|
||||
if hasattr(js['object'], 'metadata'):
|
||||
@@ -102,6 +103,14 @@ class Watch(object):
|
||||
def stream(self, func, *args, **kwargs):
|
||||
"""Watch an API resource and stream the result back via a generator.
|
||||
|
||||
+ Note that watching an API resource can expire. The method tries to
|
||||
+ resume automatically once from the last result, but if that last result
|
||||
+ is too old as well, an `ApiException` exception will be thrown with
|
||||
+ ``code`` 410. In that case you have to recover yourself, probably
|
||||
+ by listing the API resource to obtain the latest state and then
|
||||
+ watching from that state on by setting ``resource_version`` to
|
||||
+ one returned from listing.
|
||||
+
|
||||
:param func: The API function pointer. Any parameter to the function
|
||||
can be passed after this parameter.
|
||||
|
||||
@@ -134,6 +143,7 @@ class Watch(object):
|
||||
self.resource_version = kwargs['resource_version']
|
||||
|
||||
timeouts = ('timeout_seconds' in kwargs)
|
||||
+ retry_after_410 = False
|
||||
while True:
|
||||
resp = func(*args, **kwargs)
|
||||
try:
|
||||
@@ -141,7 +151,23 @@ class Watch(object):
|
||||
# unmarshal when we are receiving events from watch,
|
||||
# return raw string when we are streaming log
|
||||
if watch_arg == "watch":
|
||||
- yield self.unmarshal_event(line, return_type)
|
||||
+ event = self.unmarshal_event(line, return_type)
|
||||
+ if isinstance(event, dict) \
|
||||
+ and event['type'] == 'ERROR':
|
||||
+ obj = event['raw_object']
|
||||
+ # Current request expired, let's retry,
|
||||
+ # but only if we have not already retried.
|
||||
+ if not retry_after_410 and \
|
||||
+ obj['code'] == http.HTTPStatus.GONE:
|
||||
+ retry_after_410 = True
|
||||
+ break
|
||||
+ else:
|
||||
+ reason = "%s: %s" % (obj['reason'], obj['message'])
|
||||
+ raise client.rest.ApiException(status=obj['code'],
|
||||
+ reason=reason)
|
||||
+ else:
|
||||
+ retry_after_410 = False
|
||||
+ yield event
|
||||
else:
|
||||
yield line
|
||||
if self._stop:
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,60 @@
|
||||
From a54f404366c0800497f8b62122d7be77c143297f Mon Sep 17 00:00:00 2001
|
||||
From: Nabarun Pal <pal.nabarun95@gmail.com>
|
||||
Date: Thu, 16 Jul 2020 14:02:12 +0530
|
||||
Subject: [PATCH 09/13] Fix a Python 2 compatibility issue
|
||||
|
||||
PR #133 introduces the usage of `http` module for checking the status
|
||||
code for `GONE` HTTP status. However, this doesn't work in Python 2.7.
|
||||
|
||||
This commit checks if the interpreter is Python 2 and imports the
|
||||
status code from `httplib` module instead and unifies the approach
|
||||
to the checks.
|
||||
|
||||
Signed-off-by: Nabarun Pal <pal.nabarun95@gmail.com>
|
||||
---
|
||||
watch/watch.py | 13 +++++++++++--
|
||||
1 file changed, 11 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index f67dbe4..6410dfa 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -12,9 +12,9 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
-import http
|
||||
import json
|
||||
import pydoc
|
||||
+import sys
|
||||
|
||||
from kubernetes import client
|
||||
|
||||
@@ -29,6 +29,15 @@ PYDOC_FOLLOW_PARAM = ":param bool follow:"
|
||||
TYPE_LIST_SUFFIX = "List"
|
||||
|
||||
|
||||
+PY2 = sys.version_info[0] == 2
|
||||
+if PY2:
|
||||
+ import httplib
|
||||
+ HTTP_STATUS_GONE = httplib.GONE
|
||||
+else:
|
||||
+ import http
|
||||
+ HTTP_STATUS_GONE = http.HTTPStatus.GONE
|
||||
+
|
||||
+
|
||||
class SimpleNamespace:
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
@@ -158,7 +167,7 @@ class Watch(object):
|
||||
# Current request expired, let's retry,
|
||||
# but only if we have not already retried.
|
||||
if not retry_after_410 and \
|
||||
- obj['code'] == http.HTTPStatus.GONE:
|
||||
+ obj['code'] == HTTP_STATUS_GONE:
|
||||
retry_after_410 = True
|
||||
break
|
||||
else:
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,31 @@
|
||||
From b68ca3055178e31a5d87a0a98780e4987a4d23ae Mon Sep 17 00:00:00 2001
|
||||
From: Nabarun Pal <pal.nabarun95@gmail.com>
|
||||
Date: Thu, 16 Jul 2020 14:08:44 +0530
|
||||
Subject: [PATCH 10/13] Fixes codestyle failures
|
||||
|
||||
Signed-off-by: Nabarun Pal <pal.nabarun95@gmail.com>
|
||||
---
|
||||
watch/watch.py | 7 ++++---
|
||||
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index 6410dfa..3058ed9 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -171,9 +171,10 @@ class Watch(object):
|
||||
retry_after_410 = True
|
||||
break
|
||||
else:
|
||||
- reason = "%s: %s" % (obj['reason'], obj['message'])
|
||||
- raise client.rest.ApiException(status=obj['code'],
|
||||
- reason=reason)
|
||||
+ reason = "%s: %s" % (
|
||||
+ obj['reason'], obj['message'])
|
||||
+ raise client.rest.ApiException(
|
||||
+ status=obj['code'], reason=reason)
|
||||
else:
|
||||
retry_after_410 = False
|
||||
yield event
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,46 @@
|
||||
From ebea7e343046d7afbbdc0e199294d5c79ae87362 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Ayoub <chris.ayoubtexas@gmail.com>
|
||||
Date: Thu, 25 Feb 2021 00:27:33 -0500
|
||||
Subject: [PATCH 11/13] Fix Watch retries with 410 errors
|
||||
|
||||
---
|
||||
watch/watch.py | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index 3058ed9..b432778 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -151,7 +151,9 @@ class Watch(object):
|
||||
if 'resource_version' in kwargs:
|
||||
self.resource_version = kwargs['resource_version']
|
||||
|
||||
- timeouts = ('timeout_seconds' in kwargs)
|
||||
+ # Do not attempt retries if user specifies a timeout.
|
||||
+ # We want to ensure we are returning within that timeout.
|
||||
+ disable_retries = ('timeout_seconds' in kwargs)
|
||||
retry_after_410 = False
|
||||
while True:
|
||||
resp = func(*args, **kwargs)
|
||||
@@ -164,9 +166,9 @@ class Watch(object):
|
||||
if isinstance(event, dict) \
|
||||
and event['type'] == 'ERROR':
|
||||
obj = event['raw_object']
|
||||
- # Current request expired, let's retry,
|
||||
+ # Current request expired, let's retry, (if enabled)
|
||||
# but only if we have not already retried.
|
||||
- if not retry_after_410 and \
|
||||
+ if not disable_retries and not retry_after_410 and \
|
||||
obj['code'] == HTTP_STATUS_GONE:
|
||||
retry_after_410 = True
|
||||
break
|
||||
@@ -190,5 +192,5 @@ class Watch(object):
|
||||
else:
|
||||
self._stop = True
|
||||
|
||||
- if timeouts or self._stop:
|
||||
+ if self._stop or disable_retries:
|
||||
break
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,31 @@
|
||||
From 90399663f378b33227f723d3f0c1677965b6d96b Mon Sep 17 00:00:00 2001
|
||||
From: Darren Hague <d.hague@sap.com>
|
||||
Date: Thu, 8 Apr 2021 13:49:46 +0100
|
||||
Subject: [PATCH 12/13] Fixes kubernetes-client/python issue 1047
|
||||
"ResponseNotChunked from watch"
|
||||
|
||||
In recent versions of K8S (>1.16?), when a `Watch.stream()` call uses a
|
||||
resource_version which is too old the resulting 410 error is wrapped in JSON
|
||||
and returned in a non-chunked 200 response. Using `resp.stream()` instead of
|
||||
`resp.read_chunked()` automatically handles the response being either chunked or
|
||||
non-chunked.
|
||||
---
|
||||
watch/watch.py | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index b432778..3bbb770 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -53,7 +53,7 @@ def _find_return_type(func):
|
||||
|
||||
def iter_resp_lines(resp):
|
||||
prev = ""
|
||||
- for seg in resp.read_chunked(decode_content=False):
|
||||
+ for seg in resp.stream(amt=None, decode_content=False):
|
||||
if isinstance(seg, bytes):
|
||||
seg = seg.decode('utf8')
|
||||
seg = prev + seg
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,29 @@
|
||||
From 10ae4760b53a917116ae7525a7bbc94f35632cfb Mon Sep 17 00:00:00 2001
|
||||
From: Yu Liao <yliao@google.com>
|
||||
Date: Mon, 12 Apr 2021 17:17:42 -0700
|
||||
Subject: [PATCH 13/13] quick fix of decoding error for BOOKMARK event
|
||||
|
||||
---
|
||||
watch/watch.py | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/watch/watch.py b/watch/watch.py
|
||||
index 3bbb770..71fd459 100644
|
||||
--- a/watch/watch.py
|
||||
+++ b/watch/watch.py
|
||||
@@ -96,7 +96,11 @@ class Watch(object):
|
||||
def unmarshal_event(self, data, return_type):
|
||||
js = json.loads(data)
|
||||
js['raw_object'] = js['object']
|
||||
- if return_type and js['type'] != 'ERROR':
|
||||
+ # BOOKMARK event is treated the same as ERROR for a quick fix of
|
||||
+ # decoding exception
|
||||
+ # TODO: make use of the resource_version in BOOKMARK event for more
|
||||
+ # efficient WATCH
|
||||
+ if return_type and js['type'] != 'ERROR' and js['type'] != 'BOOKMARK':
|
||||
obj = SimpleNamespace(data=json.dumps(js['raw_object']))
|
||||
js['object'] = self._api_client.deserialize(obj, return_type)
|
||||
if hasattr(js['object'], 'metadata'):
|
||||
--
|
||||
2.25.1
|
||||
|
1
python/python-kubernetes/centos/srpm_path
Normal file
1
python/python-kubernetes/centos/srpm_path
Normal file
@ -0,0 +1 @@
|
||||
mirror:Source/python-kubernetes-8.0.0-8.el7.src.rpm
|
Loading…
Reference in New Issue
Block a user