Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Commit 81c7dd8

Browse files
committed
Retry watch if request expires.
1 parent 1d5231c commit 81c7dd8

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

watch/watch.py

+17-2
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def unmarshal_event(self, data, return_type):
9191
except ValueError:
9292
return data
9393
js['raw_object'] = js['object']
94-
if return_type:
94+
if return_type and js['type'] != 'ERROR':
9595
obj = SimpleNamespace(data=json.dumps(js['raw_object']))
9696
js['object'] = self._api_client.deserialize(obj, return_type)
9797
if hasattr(js['object'], 'metadata'):
@@ -138,11 +138,26 @@ def stream(self, func, *args, **kwargs):
138138
self.resource_version = kwargs['resource_version']
139139

140140
timeouts = ('timeout_seconds' in kwargs)
141+
retry_after_410 = False
141142
while True:
142143
resp = func(*args, **kwargs)
143144
try:
144145
for line in iter_resp_lines(resp):
145-
yield self.unmarshal_event(line, return_type)
146+
event = self.unmarshal_event(line, return_type)
147+
if isinstance(event, dict) and event['type'] == 'ERROR':
148+
obj = event['raw_object']
149+
# Current request expired, let's retry,
150+
# but only if we have not already retried.
151+
if not retry_after_410 and obj['code'] == 410:
152+
retry_after_410 = True
153+
break
154+
else:
155+
reason = "%s: %s" % (obj['reason'], obj['message'])
156+
raise client.rest.ApiException(status=obj['code'],
157+
reason=reason)
158+
else:
159+
retry_after_410 = False
160+
yield event
146161
if self._stop:
147162
break
148163
finally:

0 commit comments

Comments
 (0)