Skip to content

Commit c65e212

Browse files
authored
Merge pull request kragniz#1567 from MrManicotti/master
kragniz#1566: Fix repeatable filter assignment
2 parents 9df6671 + 4abed57 commit c65e212

2 files changed

Lines changed: 43 additions & 1 deletion

File tree

etcd3/watch.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def _create_watch_request(self, key, range_end=None, start_revision=None,
6060
if progress_notify:
6161
create_watch.progress_notify = progress_notify
6262
if filters is not None:
63-
create_watch.filters = filters
63+
create_watch.filters.extend(filters)
6464
if prev_kv:
6565
create_watch.prev_kv = prev_kv
6666
return etcdrpc.WatchRequest(create_request=create_watch)

tests/test_etcd3.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,48 @@ def callback(event):
446446
assert events[1].key.decode() == '/doot/watch/prefix/callback/1'
447447
assert events[1].value.decode() == '1'
448448

449+
def test_watch_prefix_callback_with_filter(self, etcd):
450+
def update_etcd(v):
451+
etcdctl('put', '/doot/watch/prefix/callback/' + v, v)
452+
out = etcdctl('get', '/doot/watch/prefix/callback/' + v)
453+
assert base64.b64decode(out['kvs'][0]['value']) == \
454+
utils.to_bytes(v)
455+
456+
def delete_etcd(v):
457+
etcdctl('del', '/doot/watch/prefix/callback/' + v)
458+
459+
def update_key():
460+
time.sleep(3)
461+
update_etcd('0')
462+
time.sleep(1)
463+
update_etcd('1')
464+
time.sleep(1)
465+
delete_etcd('1')
466+
time.sleep(1)
467+
468+
events = []
469+
470+
def callback(event):
471+
events.extend(event.events)
472+
473+
t = threading.Thread(name="update_key_prefix", target=update_key)
474+
t.start()
475+
476+
watch_id = etcd.add_watch_prefix_callback(
477+
'/doot/watch/prefix/callback/',
478+
callback,
479+
filters=[etcdrpc.WatchCreateRequest.FilterType.Value('NODELETE')]
480+
)
481+
482+
t.join()
483+
etcd.cancel_watch(watch_id)
484+
485+
assert len(events) == 2
486+
assert events[0].key.decode() == '/doot/watch/prefix/callback/0'
487+
assert events[0].value.decode() == '0'
488+
assert events[1].key.decode() == '/doot/watch/prefix/callback/1'
489+
assert events[1].value.decode() == '1'
490+
449491
def test_sequential_watch_prefix_once(self, etcd):
450492
try:
451493
etcd.watch_prefix_once('/doot/', 1)

0 commit comments

Comments
 (0)