diff --git a/etcd3gw/client.py b/etcd3gw/client.py index 84506b6..6a88ba1 100644 --- a/etcd3gw/client.py +++ b/etcd3gw/client.py @@ -231,12 +231,11 @@ class Etcd3Client(object): if metadata: def value_with_metadata(item): item['key'] = _decode(item['key']) - value = _decode(item.pop('value')) + value = _decode(item.pop('value', '')) return value, item - return [value_with_metadata(item) for item in result['kvs']] - else: - return [_decode(item['value']) for item in result['kvs']] + + return [_decode(item.get('value', '')) for item in result['kvs']] def get_all(self, sort_order=None, sort_target='key'): """Get all keys currently stored in etcd. diff --git a/etcd3gw/tests/test_etcd3gw.py b/etcd3gw/tests/test_etcd3gw.py index d85d0b0..175157f 100644 --- a/etcd3gw/tests/test_etcd3gw.py +++ b/etcd3gw/tests/test_etcd3gw.py @@ -31,6 +31,7 @@ import urllib3 from etcd3gw.client import Etcd3Client from etcd3gw import exceptions from etcd3gw.tests import base +from etcd3gw import utils try: # Python 3.8 : time.clock was deprecated and removed. @@ -448,3 +449,44 @@ class TestEtcd3Gateway(base.TestCase): self.fail("watch timed out when server responded with unicode") self.assertEqual(res, {'kv': {'key': b'value'}}) + + def _post_key(self, key_name, provide_value=True): + payload = {"key": utils._encode(key_name)} + if provide_value: + payload["value"] = utils._encode(key_name) + self.client.post(self.client.get_url("/kv/put"), json=payload) + + @unittest.skipUnless( + _is_etcd3_running(), "etcd3 is not available") + def test_client_keys_with_metadata_and_value(self): + test_key_value = b"some_key" + self._post_key(test_key_value) + result = self.client.get(test_key_value, metadata=True) + self.assertTrue( + len(result) > 0, + str(test_key_value) + " key is not found in etcd" + ) + value, metadata = result[0] + self.assertEqual( + value, + test_key_value, + "unable to get value for " + str(test_key_value) + ) + + @unittest.skipUnless( + _is_etcd3_running(), "etcd3 is not available") + def test_client_keys_with_metadata_and_no_value(self): + value_is_not_set_default = b"" + test_key = b"some_key" + self._post_key(test_key, provide_value=False) + result = self.client.get(test_key, metadata=True) + self.assertTrue( + len(result) > 0, + str(test_key) + " key is not found in etcd" + ) + value, metadata = result[0] + self.assertEqual( + value, + value_is_not_set_default, + "unable to get value for " + str(test_key) + ) diff --git a/releasenotes/notes/bug-1967674-102b70275b1627cd.yaml b/releasenotes/notes/bug-1967674-102b70275b1627cd.yaml new file mode 100644 index 0000000..a7f9790 --- /dev/null +++ b/releasenotes/notes/bug-1967674-102b70275b1627cd.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + Add compatibility with another etcd clients, that may have not provide value while posting a key