Package: aio_etcd
A python client for Etcdhttps://github.com/coreos/etcdOfficial documentation:http://python-aio-etcd.readthedocs.org/InstallationPre-requirementsThis version of python-etcd will only work correctly with the etcd server version 2.0.x or later. If you are running an older version of etcd, please use python-etcd 0.3.3 or earlier.This client is known to work with python 3.5. It will not work in older versions of python due to ist use of “async def” syntax.Python 2 is not supported.From source$pythonsetup.pyinstallUsageThe basic methods of the client have changed compared to previous versions, to reflect the new API structure; however a compatibility layer has been maintained so that you don’t necessarily need to rewrite all your existing code.Create a client objectimportaio_etcdasetcdclient=etcd.Client()# this will create a client against etcd server running on localhost on port 4001client=etcd.Client(port=4002)client=etcd.Client(host='127.0.0.1',port=4003)client=etcd.Client(host=(('127.0.0.1',4001),('127.0.0.1',4002),('127.0.0.1',4003)))client=etcd.Client(host='127.0.0.1',port=4003,allow_redirect=False)# wont let you run sensitive commands on non-leader machines, default is true# If you have defined a SRV record for _etcd._tcp.example.com pointing to the clientsclient=etcd.Client(srv_domain='example.com',protocol="https")# create a client against https://api.example.com:443/etcdclient=etcd.Client(host='api.example.com',protocol='https',port=443,version_prefix='/etcd')Write a keyawaitclient.write('/nodes/n1',1)# with ttlawaitclient.set('/nodes/n1',1)# Equivalent, for compatibility reasons.awaitclient.write('/nodes/n2',2,ttl=4)# sets the ttl to 4 secondsRead a key(awaitclient.read('/nodes/n2')).value# read a value(awaitclient.get('/nodes/n2')).value# Equivalent, for compatibility reasons.awaitclient.read('/nodes',recursive=True)# get all the values of a directory, recursively.# raises etcd.EtcdKeyNotFound when key not foundtry:client.read('/invalid/path')exceptetcd.EtcdKeyNotFound:# do somethingprint"error"Delete a keyawaitclient.delete('/nodes/n1')Atomic Compare and Swapawaitclient.write('/nodes/n2',2,prevValue=4)# will set /nodes/n2 's value to 2 only if its previous value was 4awaitclient.write('/nodes/n2',2,prevExist=False)# will set /nodes/n2 's value to 2 only if the key did not exist beforeawaitclient.write('/nodes/n2',2,prevIndex=30)# will set /nodes/n2 's value to 2 only if the key was last modified at index 30awaitclient.test_and_set('/nodes/n2',2,4)#equivalent to client.write('/nodes/n2', 2, prevValue = 4)You can also atomically update a result:awaitclient.write('/foo','bar')result=awaitclient.read('/foo')print(result.value)# barresult.value+=u'bar'updated=awaitclient.update(result)# if any other client wrote to '/foo' in the meantime this will failprint(updated.value)# barbarWatch a keyresult=awaitclient.read('/nodes/n1')# start from a known initial valueresult=awaitclient.read('/nodes/n1',wait=True,waitIndex=result.modifiedIndex+1)# will wait till the key is changed, and return once it's changedresult=awaitclient.read('/nodes/n1',wait=True,waitIndex=10)# get all changes on this key starting from index 10result=awaitclient.watch('/nodes/n1')# equivalent to client.read('/nodes/n1', wait = True)result=awaitclient.watch('/nodes/n1',index=result.modifiedIndex+1)If you want to time out the read() call, wrap it inasyncio.wait_for:result=awaitasyncio.wait_for(client.read('/nodes/n1',wait=True),timeout=30)Refreshing key TTL(Since etcd 2.3.0) Keys in etcd can be refreshed without notifying current watchers.This can be achieved by setting the refresh to true when updating a TTL.You cannot update the value of a key when refreshing it.client.write('/nodes/n1','value',ttl=30)# sets the ttl to 30 secondsclient.refresh('/nodes/n1',ttl=600)# refresh ttl to 600 seconds, without notifying current watchersLocking module# Initialize the lock object:# NOTE: this does not acquire a lockfromaio_etcd.lockimportLockclient=etcd.Client()# Or you can custom lock prefix, default is '/_locks/' if you are using HEADclient=etcd.Client(lock_prefix='/my_etcd_root/_locks')lock=etcd.Lock(client,'my_lock_name')# Use the lock object:awaitlock.acquire(blocking=True,# will block until the lock is acquiredlock_ttl=None)# lock will live until we release itlock.is_acquired# Trueawaitlock.acquire(lock_ttl=60)# renew a lockawaitlock.release()# release an existing locklock.is_acquired# False# The lock object may also be used as a context manager:asyncwithLock(client,'customer1')asmy_lock:do_stuff()my_lock.is_acquired# Trueawaitmy_lock.acquire(lock_ttl=60)my_lock.is_acquired# FalseGet machines in the clustermachines=awaitclient.machines()Get leader of the clusterleaderinfo=awaitclient.leader()Generate a sequential key in a directoryx=awaitclient.write("/dir/name","value",append=True)print("generated key: "+x.key)# actually the whole pathprint("stored value: "+x.value)List contents of a directory#stick a couple values in the directoryawaitclient.write("/dir/name","value1",append=True)awaitclient.write("/dir/name","value2",append=True)directory=awaitclient.get("/dir/name")# loop through a directory's childrenforresultindirectory.children:print(result.key+": "+result.value)# or just get the first child valueprint(directory.next(children).value)Development setupThe usual setuptools commands are available.$python3setup.pyinstallTo test, you should have etcd available in your system path:$python3setup.pytestto generate documentation,$cddocs$makeRelease HOWTOTo make a releaseUpdate release date/version in NEWS.txt and setup.pyRun ‘python setup.py sdist’Test the generated source distribution in dist/Upload to PyPI: ‘python setup.py sdist register upload’