From c2a8008af30d045227058e3158e84c9415647760 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Fri, 31 Mar 2017 12:14:43 +0200 Subject: [PATCH 3/4] Remove etcd store --- custodia/store/etcdstore.py | 123 ----------------------------------------- docs/source/plugins/stores.rst | 6 -- setup.py | 9 +-- 3 files changed, 2 insertions(+), 136 deletions(-) delete mode 100644 custodia/store/etcdstore.py diff --git a/custodia/store/etcdstore.py b/custodia/store/etcdstore.py deleted file mode 100644 index 759348b..0000000 --- a/custodia/store/etcdstore.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright (C) 2015 Custodia Project Contributors - see LICENSE file - -from __future__ import print_function - -try: - from etcd import (Client, EtcdException, EtcdNotFile, EtcdAlreadyExist, - EtcdKeyNotFound) -except ImportError: - def Client(*args, **kwargs): - raise RuntimeError("Etcd client is unavailable") - - class EtcdException(Exception): - pass - - class EtcdNotFile(Exception): - pass - - class EtcdKeyNotFound(Exception): - pass - - class EtcdAlreadyExist(Exception): - pass - -from custodia.plugin import CSStore, CSStoreError, CSStoreExists -from custodia.plugin import PluginOption - - -class EtcdStore(CSStore): - etcd_server = PluginOption(str, '127.0.0.1', None) - etcd_port = PluginOption(int, '4001', None) - namespace = PluginOption(str, '/custodia', None) - - def __init__(self, config, section): - super(EtcdStore, self).__init__(config, section) - # Initialize the DB by trying to create the default table - try: - self.etcd = Client(self.etcd_server, self.etcd_port) - self.etcd.write(self.namespace, None, dir=True) - except EtcdNotFile: - # Already exists - pass - except EtcdException: - self.logger.exception("Error creating namespace %s", - self.namespace) - raise CSStoreError('Error occurred while trying to init db') - - def _absolute_key(self, key): - """Get absolute path to key and validate key""" - if '//' in key: - raise ValueError("Invalid empty components in key '%s'" % key) - parts = key.split('/') - if set(parts).intersection({'.', '..'}): - raise ValueError("Invalid relative components in key '%s'" % key) - return '/'.join([self.namespace] + parts).replace('//', '/') - - def get(self, key): - self.logger.debug("Fetching key %s", key) - try: - result = self.etcd.get(self._absolute_key(key)) - except EtcdException: - self.logger.exception("Error fetching key %s", key) - raise CSStoreError('Error occurred while trying to get key') - self.logger.debug("Fetched key %s got result: %r", key, result) - return result.value # pylint: disable=no-member - - def set(self, key, value, replace=False): - self.logger.debug("Setting key %s to value %s (replace=%s)", - key, value, replace) - path = self._absolute_key(key) - try: - self.etcd.write(path, value, prevExist=replace) - except EtcdAlreadyExist as err: - raise CSStoreExists(str(err)) - except EtcdException: - self.logger.exception("Error storing key %s", key) - raise CSStoreError('Error occurred while trying to store key') - - def span(self, key): - path = self._absolute_key(key) - self.logger.debug("Creating directory %s", path) - try: - self.etcd.write(path, None, dir=True, prevExist=False) - except EtcdAlreadyExist as err: - raise CSStoreExists(str(err)) - except EtcdException: - self.logger.exception("Error storing key %s", key) - raise CSStoreError('Error occurred while trying to store key') - - def list(self, keyfilter='/'): - path = self._absolute_key(keyfilter) - if path != '/': - path = path.rstrip('/') - self.logger.debug("Listing keys matching %s", path) - try: - result = self.etcd.read(path, recursive=True) - except EtcdKeyNotFound: - return None - except EtcdException: - self.logger.exception("Error listing %s", keyfilter) - raise CSStoreError('Error occurred while trying to list keys') - self.logger.debug("Searched for %s got result: %r", path, result) - value = set() - for entry in result.get_subtree(): - if entry.key == path: - continue - name = entry.key[len(path):] - if entry.dir and not name.endswith('/'): - name += '/' - value.add(name.lstrip('/')) - return sorted(value) - - def cut(self, key): - self.logger.debug("Removing key %s", key) - try: - self.etcd.delete(self._absolute_key(key)) - except EtcdKeyNotFound: - self.logger.debug("Key %s not found", key) - return False - except EtcdException: - self.logger.exception("Error removing key %s", key) - raise CSStoreError('Error occurred while trying to cut key') - self.logger.debug("Key %s removed", key) - return True diff --git a/docs/source/plugins/stores.rst b/docs/source/plugins/stores.rst index ed921ba..d715f31 100644 --- a/docs/source/plugins/stores.rst +++ b/docs/source/plugins/stores.rst @@ -5,7 +5,6 @@ Stores :nosignatures: custodia.store.sqlite.SqliteStore - custodia.store.etcdstore.EtcdStore custodia.store.encgen.EncryptedOverlay .. autoclass:: custodia.store.sqlite.SqliteStore @@ -13,11 +12,6 @@ Stores :undoc-members: :show-inheritance: -.. autoclass:: custodia.store.etcdstore.EtcdStore - :members: - :undoc-members: - :show-inheritance: - .. autoclass:: custodia.store.encgen.EncryptedOverlay :members: :undoc-members: diff --git a/setup.py b/setup.py index a7c398a..c8f270d 100755 --- a/setup.py +++ b/setup.py @@ -15,16 +15,12 @@ requirements = [ 'requests' ] -# extra requirements -etcd_requires = ['python-etcd'] - # test requirements -test_requires = ['coverage', 'pytest'] + etcd_requires +test_requires = ['coverage', 'pytest'] extras_require = { - 'etcd_store': etcd_requires, 'test': test_requires, - 'test_docs': ['docutils', 'markdown'] + etcd_requires, + 'test_docs': ['docutils', 'markdown'], 'test_pep8': ['flake8', 'flake8-import-order', 'pep8-naming'], 'test_pylint': ['pylint'] + test_requires, } @@ -70,7 +66,6 @@ custodia_consumers = [ custodia_stores = [ 'EncryptedOverlay = custodia.store.encgen:EncryptedOverlay', 'EncryptedStore = custodia.store.enclite:EncryptedStore', - 'EtcdStore = custodia.store.etcdstore:EtcdStore', 'SqliteStore = custodia.store.sqlite:SqliteStore', ] -- 2.9.3