Exemple #1
0
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)
Exemple #2
0
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")
Exemple #3
0
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)
Exemple #4
0
    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")
Exemple #5
0
    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
Exemple #6
0
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
Exemple #7
0
def unlock(key: bytes):
    url = BASE + "/lock/unlock"
    resp = requests.post(url=url, data=json.dumps({
        "key": e64(key),
    }))
    return json.loads(resp.text)