Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e824e81

Browse files
committedApr 26, 2018
Watch properly decode resourceVersion from custom object response
1 parent 789de6a commit e824e81

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed
 

‎watch/watch.py

+5
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ def unmarshal_event(self, data, return_type):
8484
js['object'] = self._api_client.deserialize(obj, return_type)
8585
if hasattr(js['object'], 'metadata'):
8686
self.resource_version = js['object'].metadata.resource_version
87+
# For custom objects that we don't have model defined, json
88+
# deserialization results in dictionary
89+
elif isinstance(js['object'], dict) and 'metadata' in js['object']:
90+
self.resource_version = js['object']['metadata'][
91+
'resourceVersion']
8792
return js
8893

8994
def stream(self, func, *args, **kwargs):

‎watch/watch_test.py

+23-6
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ def test_watch_with_decode(self):
2727
fake_resp.release_conn = Mock()
2828
fake_resp.read_chunked = Mock(
2929
return_value=[
30-
'{"type": "ADDED", "object": {"metadata": {"name": "test1"}'
31-
',"spec": {}, "status": {}}}\n',
32-
'{"type": "ADDED", "object": {"metadata": {"name": "test2"}'
33-
',"spec": {}, "sta',
30+
'{"type": "ADDED", "object": {"metadata": {"name": "test1",'
31+
'"resourceVersion": "1"}, "spec": {}, "status": {}}}\n',
32+
'{"type": "ADDED", "object": {"metadata": {"name": "test2",'
33+
'"resourceVersion": "2"}, "spec": {}, "sta',
3434
'tus": {}}}\n'
35-
'{"type": "ADDED", "object": {"metadata": {"name": "test3"},'
36-
'"spec": {}, "status": {}}}\n',
35+
'{"type": "ADDED", "object": {"metadata": {"name": "test3",'
36+
'"resourceVersion": "3"}, "spec": {}, "status": {}}}\n',
3737
'should_not_happened\n'])
3838

3939
fake_api = Mock()
@@ -46,6 +46,10 @@ def test_watch_with_decode(self):
4646
self.assertEqual("ADDED", e['type'])
4747
# make sure decoder worked and we got a model with the right name
4848
self.assertEqual("test%d" % count, e['object'].metadata.name)
49+
# make sure decoder worked and updated Watch.resource_version
50+
self.assertEqual(
51+
"%d" % count, e['object'].metadata.resource_version)
52+
self.assertEqual("%d" % count, w.resource_version)
4953
count += 1
5054
# make sure we can stop the watch and the last event with won't be
5155
# returned
@@ -133,6 +137,19 @@ def test_unmarshal_with_no_return_type(self):
133137
self.assertEqual(["test1"], event['object'])
134138
self.assertEqual(["test1"], event['raw_object'])
135139

140+
def test_unmarshal_with_custom_object(self):
141+
w = Watch()
142+
event = w.unmarshal_event('{"type": "ADDED", "object": {"apiVersion":'
143+
'"test.com/v1beta1","kind":"foo","metadata":'
144+
'{"name": "bar", "resourceVersion": "1"}}}',
145+
'object')
146+
self.assertEqual("ADDED", event['type'])
147+
# make sure decoder deserialized json into dictionary and updated
148+
# Watch.resource_version
149+
self.assertTrue(isinstance(event['object'], dict))
150+
self.assertEqual("1", event['object']['metadata']['resourceVersion'])
151+
self.assertEqual("1", w.resource_version)
152+
136153
def test_watch_with_exception(self):
137154
fake_resp = Mock()
138155
fake_resp.close = Mock()

0 commit comments

Comments
 (0)
This repository has been archived.