def lock(name: bytes, lease: Optional[int] = 0): url = BASE + "/v3alpha/lock/lock" data = json.dumps({ "name": e64(name), "lease": lease, }) resp = requests.post(url=url, data=data) return json.loads(resp.text)
def get(key: bytes): url = BASE + "/v3beta/kv/range" resp = requests.post(url=url, data=json.dumps({ "key": e64(key), "range_end": e64(key + b"\x00"), })) assert resp.status_code == 200 msg = json.loads(resp.text) kvs = msg.get('kvs', []) if len(kvs) == 0: return None elif len(kvs) == 1: return kvs[0] else: raise RuntimeError("Unexpected number of results")
async def lock(etcd_endpoint: str, name: str, lease: Optional[int] = 0): url = etcd_endpoint + "/v3alpha/lock/lock" data = json.dumps({ "name": e64(name.encode()), "lease": lease, }) print("getting lock at", name) _, resp = await post(url, data) return json.loads(resp)
async def get(self, key: bytes): url = self.etcd_endpoint + "/v3beta/kv/range" data = json.dumps({ "key": e64(key), "range_end": e64(key + b"\x00"), }) _, resp = await post(url, data) msg = json.loads(resp) kvs = msg.get('kvs', []) if len(kvs) == 0: return None elif len(kvs) == 1: return kvs[0] else: raise RuntimeError("Unexpected number of results")
async def get_prefix(self, key: bytes) -> Dict[bytes, bytes]: url = self.etcd_endpoint + "/v3beta/kv/range" end_key = key[:-1] + bytes([key[-1] + 1]) # TODO: handle overflow case data = json.dumps({ "key": e64(key), "range_end": e64(end_key), }) _, resp = await post(url, data) msg = json.loads(resp) kvs = msg.get('kvs', []) result = {} for a in kvs: key = d64(a['key']) val = d64(a['value']) result[key] = val return result
def txn(lock_key: bytes, msg_success: bytes, msg_failure: bytes, log=null_logger): test = [{ "key": e64(lock_key), "range_end": e64(lock_key + b"\x00"), "create_revision": 0, "target": "CREATE", "result": "GREATER", }] success = [{ "request_put": { "key": e64(b"abc-success"), "value": e64(msg_success), } }] failure = [{ "request_put": { "key": e64(b"abc-failure"), "value": e64(msg_failure), } }] url = BASE + "/v3beta/kv/txn" req = json.dumps({ "compare": test, "success": success, "failure": failure, }) log(req) resp = requests.post(url=url, data=req) log(resp.status_code) log(resp.text) assert resp.status_code == 200 # TODO msg = json.loads(resp.text) err = msg.get('error') if err is not None: raise EtcdServerError(err) return msg
def unlock(key: bytes): url = BASE + "/lock/unlock" resp = requests.post(url=url, data=json.dumps({ "key": e64(key), })) return json.loads(resp.text)