Skip to content

Commit

Permalink
Support limit and sorting in range get
Browse files Browse the repository at this point in the history
  • Loading branch information
horkhe committed Nov 9, 2018
1 parent f4693ed commit 445bfae
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 3 deletions.
23 changes: 21 additions & 2 deletions etcd3/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import grpc
import six
from enum import Enum

from etcd3 import _utils
from etcd3._grpc_stubs.rpc_pb2 import (AuthStub, AuthenticateRequest,
Expand All @@ -24,6 +25,20 @@
_log = logging.getLogger(__name__)


class SortOrder(Enum):
NONE = 0
ASCEND = 1
DESCEND =2


class SortTarget(Enum):
KEY = 0
VERSION = 1
CREATE_REVISION = 2
MOD_REVISION = 3
VALUE = 4


def _reconnect(f):

def wrapper(*args, **kwargs):
Expand Down Expand Up @@ -79,8 +94,12 @@ def current_endpoint(self):
return self._endpoint_balancer.current_endpoint

@_reconnect
def get(self, key, is_prefix=False):
rq = RangeRequest(key=_utils.to_bytes(key))
def get(self, key, is_prefix=False, limit=0,
sort_order=SortOrder.NONE, sort_target=SortTarget.KEY):
rq = RangeRequest(key=_utils.to_bytes(key),
limit=limit,
sort_order=sort_order.value,
sort_target=sort_target.value)
if is_prefix:
rq.range_end = _utils.range_end(rq.key)

Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from setuptools import setup, find_packages

setup(name='etcd3-slim',
version='0.1.11',
version='0.2.0',
description='Thin Etcd3 client',
long_description=open('README.md').read(),
classifiers=[
Expand All @@ -30,6 +30,7 @@
'requests'
],
install_requires=[
'enum34',
'grpcio',
'protobuf',
'six'
Expand Down
64 changes: 64 additions & 0 deletions tests/etcd3/client_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from nose.tools import assert_not_equal, assert_raises_regexp, eq_, with_setup

from etcd3 import Client, _utils
from etcd3._client import SortOrder, SortTarget
from tests.etcd3 import _fixture


Expand Down Expand Up @@ -117,11 +118,74 @@ def test_get_prefix():

# Then
eq_(3, rs.count)
eq_(3, len(rs.kvs))
eq_(b'bar2', rs.kvs[0].value)
eq_(b'bar3', rs.kvs[1].value)
eq_(b'bar4', rs.kvs[2].value)


@with_setup(_fixture.setup, _fixture.teardown)
def test_get_prefix_limit():
proxied_clt = _fixture.proxied_clt()

proxied_clt.put('/test/foo1', 'bar5')
proxied_clt.put('/test/foo2', 'bar4')
proxied_clt.put('/test/foo21', 'bar3')
proxied_clt.put('/test/foo212', 'bar2')
proxied_clt.put('/test/foo3', 'bar1')

# When
rs = proxied_clt.get('/test/foo', is_prefix=True, limit=2)

# Then
eq_(5, rs.count)
eq_(2, len(rs.kvs))


@with_setup(_fixture.setup, _fixture.teardown)
def test_get_prefix_sort():
proxied_clt = _fixture.proxied_clt()

proxied_clt.put('/test/foo212', 'bar4')
proxied_clt.put('/test/foo2', 'bar2')
proxied_clt.put('/test/foo3', 'bar1')
proxied_clt.put('/test/foo1', 'bar5')
proxied_clt.put('/test/foo21', 'bar3')

for i, tc in enumerate([{
'order': SortOrder.ASCEND,
'target': SortTarget.KEY,
'out': [b'bar5', b'bar2', b'bar3', b'bar4', b'bar1'],
}, {
'order': SortOrder.ASCEND,
'target': SortTarget.VALUE,
'out': [b'bar1', b'bar2', b'bar3', b'bar4', b'bar5'],
}, {
'order': SortOrder.ASCEND,
'target': SortTarget.CREATE_REVISION,
'out': [b'bar4', b'bar2', b'bar1', b'bar5', b'bar3'],
}, {
'order': SortOrder.DESCEND,
'target': SortTarget.KEY,
'out': [b'bar1', b'bar4', b'bar3', b'bar2', b'bar5'],
}, {
'order': SortOrder.DESCEND,
'target': SortTarget.VALUE,
'out': [b'bar5', b'bar4', b'bar3', b'bar2', b'bar1'],
}, {
'order': SortOrder.DESCEND,
'target': SortTarget.CREATE_REVISION,
'out': [b'bar3', b'bar5', b'bar1', b'bar2', b'bar4'],
}]):
print('Test case #%d: %s/%s', i, tc['order'], tc['target'])

# When
rs = proxied_clt.get('/test/foo', is_prefix=True,
sort_order=tc['order'], sort_target=tc['target'])
# Then
eq_(tc['out'], [kv.value for kv in rs.kvs])


@with_setup(_fixture.setup, _fixture.teardown)
def test_endpoint_discovery():
direct_clt = _fixture.direct_clt()
Expand Down

0 comments on commit 445bfae

Please sign in to comment.