Skip to content

Commit 6c3497a

Browse files
authored
Merge pull request kragniz#1569 from mtraynham/bug/get_params
Add missing assignments for some of the get parameters
2 parents c65e212 + fe6acbf commit 6c3497a

2 files changed

Lines changed: 101 additions & 27 deletions

File tree

etcd3/client.py

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -208,50 +208,64 @@ def _build_get_range_request(self, key,
208208
sort_target='key',
209209
serializable=False,
210210
keys_only=False,
211-
count_only=None,
211+
count_only=False,
212212
min_mod_revision=None,
213213
max_mod_revision=None,
214214
min_create_revision=None,
215215
max_create_revision=None):
216216
range_request = etcdrpc.RangeRequest()
217217
range_request.key = utils.to_bytes(key)
218218
range_request.keys_only = keys_only
219+
range_request.count_only = count_only
220+
range_request.serializable = serializable
221+
219222
if range_end is not None:
220223
range_request.range_end = utils.to_bytes(range_end)
221-
222-
if sort_order is None:
223-
range_request.sort_order = etcdrpc.RangeRequest.NONE
224-
elif sort_order == 'ascend':
225-
range_request.sort_order = etcdrpc.RangeRequest.ASCEND
226-
elif sort_order == 'descend':
227-
range_request.sort_order = etcdrpc.RangeRequest.DESCEND
228-
else:
224+
if limit is not None:
225+
range_request.limit = limit
226+
if revision is not None:
227+
range_request.revision = revision
228+
if min_mod_revision is not None:
229+
range_request.min_mod_revision = min_mod_revision
230+
if max_mod_revision is not None:
231+
range_request.max_mod_revision = max_mod_revision
232+
if min_create_revision is not None:
233+
range_request.min_mod_revision = min_create_revision
234+
if max_create_revision is not None:
235+
range_request.min_mod_revision = max_create_revision
236+
237+
sort_orders = {
238+
None: etcdrpc.RangeRequest.NONE,
239+
'ascend': etcdrpc.RangeRequest.ASCEND,
240+
'descend': etcdrpc.RangeRequest.DESCEND,
241+
}
242+
request_sort_order = sort_orders.get(sort_order)
243+
if request_sort_order is None:
229244
raise ValueError('unknown sort order: "{}"'.format(sort_order))
230-
231-
if sort_target is None or sort_target == 'key':
232-
range_request.sort_target = etcdrpc.RangeRequest.KEY
233-
elif sort_target == 'version':
234-
range_request.sort_target = etcdrpc.RangeRequest.VERSION
235-
elif sort_target == 'create':
236-
range_request.sort_target = etcdrpc.RangeRequest.CREATE
237-
elif sort_target == 'mod':
238-
range_request.sort_target = etcdrpc.RangeRequest.MOD
239-
elif sort_target == 'value':
240-
range_request.sort_target = etcdrpc.RangeRequest.VALUE
241-
else:
245+
range_request.sort_order = request_sort_order
246+
247+
sort_targets = {
248+
None: etcdrpc.RangeRequest.KEY,
249+
'key': etcdrpc.RangeRequest.KEY,
250+
'version': etcdrpc.RangeRequest.VERSION,
251+
'create': etcdrpc.RangeRequest.CREATE,
252+
'mod': etcdrpc.RangeRequest.MOD,
253+
'value': etcdrpc.RangeRequest.VALUE,
254+
}
255+
request_sort_target = sort_targets.get(sort_target)
256+
if request_sort_target is None:
242257
raise ValueError('sort_target must be one of "key", '
243258
'"version", "create", "mod" or "value"')
244-
245-
range_request.serializable = serializable
259+
range_request.sort_target = request_sort_target
246260

247261
return range_request
248262

249263
@_handle_errors
250-
def get_response(self, key, serializable=False):
264+
def get_response(self, key, **kwargs):
251265
"""Get the value of a key from etcd."""
252266
range_request = self._build_get_range_request(
253267
key,
254-
serializable=serializable
268+
**kwargs
255269
)
256270

257271
return self.kvstub.Range(
@@ -275,8 +289,6 @@ def get(self, key, **kwargs):
275289
'hello world'
276290
277291
:param key: key in etcd to get
278-
:param serializable: whether to allow serializable reads. This can
279-
result in stale reads
280292
:returns: value of key and metadata
281293
:rtype: bytes, ``KVMetadata``
282294
"""

tests/test_etcd3.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,68 @@ def test_get_all_keys_only(self, etcd):
704704
assert meta.key.startswith(b"/doot/")
705705
assert not value
706706

707+
def test_get_count_only(self, etcd):
708+
for i in range(20):
709+
etcdctl('put', '/doot/count{}'.format(i), 'i am in all')
710+
resp = etcd.get_prefix_response(
711+
key_prefix='/doot/count',
712+
count_only=True
713+
)
714+
assert len(resp.kvs) == 0
715+
assert resp.count == 20
716+
717+
def test_get_limit(self, etcd):
718+
for i in range(20):
719+
etcdctl('put', '/doot/limit{}'.format(i), 'i am in all')
720+
for i in range(20):
721+
resp = etcd.get_prefix_response(key_prefix='/doot/limit', limit=i)
722+
assert resp.count == 20
723+
if i == 0 or i == 20:
724+
assert len(resp.kvs) == 20
725+
assert resp.more is False
726+
else:
727+
assert len(resp.kvs) == i
728+
assert resp.more is True
729+
730+
def test_get_revision(self, etcd):
731+
revisions = []
732+
for i in range(20):
733+
resp = etcdctl('put', '/doot/revision{}'.format(i), 'i am in all')
734+
revisions.append(resp['header']['revision'])
735+
for i, revision in enumerate(revisions):
736+
resp = etcd.get_prefix_response(
737+
key_prefix='/doot/revision',
738+
revision=revision
739+
)
740+
assert resp.count == min(len(revisions), i + 1)
741+
742+
def test_get_min_mod_revision(self, etcd):
743+
revisions = []
744+
for i in range(5):
745+
resp = etcdctl('put', '/doot/revision', str(i))
746+
revisions.append(resp['header']['revision'])
747+
for revision in revisions:
748+
resp = etcd.get_response(
749+
key='/doot/revision',
750+
min_mod_revision=revision
751+
)
752+
assert len(resp.kvs) == 1
753+
754+
def test_get_max_mod_revision(self, etcd):
755+
revisions = []
756+
for i in range(5):
757+
resp = etcdctl('put', '/doot/revision', str(i))
758+
revisions.append(resp['header']['revision'])
759+
for revision in revisions:
760+
resp = etcd.get_response(
761+
key='/doot/revision',
762+
max_mod_revision=revision
763+
)
764+
if revision == revisions[-1]:
765+
assert len(resp.kvs) == 1
766+
else:
767+
assert len(resp.kvs) == 0
768+
707769
def test_sort_order(self, etcd):
708770
def remove_prefix(string, prefix):
709771
return string[len(prefix):]

0 commit comments

Comments
 (0)