AKIWEB
AKIWEB

Reputation: 19612

How to watch for events on the descendant nodes in ZooKeeper using kazoo?

I recently started working with Python for Zookeeper. I am using kazoo library for Zookeeper. I need to keep a watch on my root node which is -

/my/example

couple of other nodes which might get added to my above root node will be like this -

/my/example/workflow
/my/example/workflow/v1
/my/example/workflow/v1/step1
/my/example/workflow/v1/step2

Now I need to check whether the children which got added in root node /my/example is /my/example/workflow or not. If workflow node gets added up in /my/example then I will keep a watch on /my/example/workflow node only and if any new children gets added up in /my/example/workflow node then I need to keep a watch on that node as well.

Let's say, children of /my/example/workflow is /my/example/workflow/v1, so now I need to keep a watch on /my/example/workflow/v1 and then if any new nodes gets added up on this node /my/example/workflow/v1 such as /my/example/workflow/v1/step1 and /my/example/workflow/v1/step2 then I need to print the children of /my/example/workflow/v1 node and I won't make any new watches now.

Now I am not sure how to keep on calling watches on my children until certain point, here in this case till /my/example/workflow/v1 I need to keep on watching and as soon as all the steps nodes gets added up, I need to print the children of /my/example/workflow/v1. Below is my code which works fine for watching on only one root node and now I am not sure how to do my above problem?

#!/usr/bin/python
from kazoo.client import KazooClient

zk = KazooClient(hosts='127.0.0.1:2181')
zk.start()

@zk.ChildrenWatch("/my/example")
def watch_children(children):
    print("Children are now: %s" % children)

Any help is really appreciated on this. I was following the documentation by reading the kazoo tutorial from here

Upvotes: 1

Views: 3664

Answers (1)

user2961646
user2961646

Reputation:

Try something like this out:

import time
from kazoo.client import KazooClient

zk = KazooClient(hosts='127.0.0.1:2181')
zk.start()



children = zk.get_children("/my/example/")
if "/workflow" in children:
    children_testing = zk.get_children("/my/example/testing/")
        if children_testing != []: 
            @zk.ChildrenWatch("/my/example/testing")
            def watch_children(children):
                print(children)
        else:
            @zk.ChildrenWatch("/my/example/")
            def watch_children(children):
            print(children)
while True:
    time.sleep(5)

Upvotes: 2

Related Questions