Python client for etcd v3 (Using gRPC-JSON-Gateway)
Project description
Python client for etcd v3 (Using gRPC-JSON-Gateway)
Free software: Apache Software License 2.0
Source Code: https://github.com/Revolution1/etcd3-py
Documentation: https://etcd3-py.readthedocs.io.
Notice: The authentication header through gRPC-JSON-Gateway only supported in etcd v3.3+
Features
[x] Support python2.7 and python3.5+
[x] Sync client based on requests
[x] Async client based on aiohttp
[x] Support etcd3 gRPC-JSON-Gateway including stream
[x] Response modelizing based on etcd3’s swagger spec
[x] Generate code from swagger spec
[ ] TLS Connection
[x] support APIs
[x] Auth
[x] KV
[x] Watch
[x] Cluster
[x] Lease
[x] Maintenance
[x] Extra APIs
[x] stateful utilities
[x] Watch
[x] Lease
[x] Transaction
[x] Lock
Quick Start
Install
$ pip install etcd3-py
Sync Client
>>> from etcd3 import Client
>>> client = Client('127.0.0.1', 2379)
>>> client.version()
EtcdVersion(etcdserver='3.3.0-rc.4', etcdcluster='3.3.0')
>>> client.put('foo', 'bar')
etcdserverpbPutResponse(header=etcdserverpbResponseHeader(cluster_id=11588568905070377092, member_id=128088275939295631, revision=15433, raft_term=4))
>>> client.range('foo').kvs
[mvccpbKeyValue(key=b'foo', create_revision=15429, mod_revision=15433, version=5, value=b'bar')]
Async Client (Python3.5+)
>>> import asyncio
>>> from etcd3 import AioClient
>>> client = AioClient('127.0.0.1', 2379)
>>> async def getFoo():
... await client.put('foo', 'bar')
... r = await client.range('foo')
... print('key:', r.kvs[0].key, 'value:', r.kvs[0].value)
>>> loop = asyncio.get_event_loop()
>>> loop.run_until_complete(getFoo())
key: b'foo' value: b'bar'
Transaction Util
>>> from etcd3 import Client
>>> txn = Client().Txn()
>>> txn.compare(txn.key('foo').value == 'bar')
>>> txn.success(txn.put('foo', 'bra'))
>>> txn.commit()
etcdserverpbTxnResponse(header=etcdserverpbResponseHeader(cluster_id=11588568905070377092, member_id=128088275939295631, revision=15656, raft_term=4), succeeded=True, responses=[etcdserverpbResponseOp(response_put=etcdserverpbPutResponse(header=etcdserverpbResponseHeader(revision=15656)))])
Lease Util
>>> from etcd3 import Client
>>> client = Client()
>>> with client.Lease(ttl=5) as lease:
... client.put('foo', 'bar', lease=lease.ID)
... client.put('fizz', 'buzz', lease=lease.ID)
... r = lease.time_to_live(keys=True)
... assert set(r.keys) == {b'foo', b'fizz'}
... assert lease.alive()
Watch Util
>>> from etcd3 import Client
>>> client = Client()
>>> watcher = c.Watcher(all=True, progress_notify=True, prev_kv=True)
>>> w.onEvent('f.*', lambda e: print(e.key, e.value))
>>> w.runDaemon()
>>> # etcdctl put foo bar
>>> # etcdctl put foz bar
b'foo' b'bar'
b'foz' b'bar'
>>> w.stop()
Lock Util
>>> import time
>>> from threading import Thread
>>> from etcd3 import Client
>>> client = Client()
>>> name = 'lock_name'
>>> def user1():
... with client.Lock(name, lock_ttl=5):
... print('user1 got the lock')
... time.sleep(5)
... print('user1 releasing the lock')
>>> def user2():
... with client.Lock(name, lock_ttl=5):
... print('user2 got the lock')
... time.sleep(5)
... print('user2 releasing the lock')
>>> t1 = Thread(target=user1, daemon=True)
>>> t2 = Thread(target=user2, daemon=True)
>>> t1.start()
>>> t2.start()
>>> t1.join()
>>> t2.join()
user1 got the lock
user1 releasing the lock
user2 got the lock
user2 releasing the lock
TODO
[ ] benchmark
[ ] python-etcd(etcd v2) compatible client
[ ] etcd browser
History
0.0.1 (2018-01-26)
First release on PyPI.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for etcd3_py-0.1.3-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 42e3635c53385bbadc2aa8df5e4ecc7babd1251f7992599ba0cf4a515befb033 |
|
MD5 | 68b3567d6044334c68c3ae20d8de16bb |
|
BLAKE2b-256 | 3d47b38a7ed4a737c5776780786b1d2ba8e2d432acb65a7489401c2121cfb841 |