summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbhishek Kekane <akekane@redhat.com>2019-02-27 17:44:26 +0000
committerAbhishek Kekane <akekane@redhat.com>2019-06-06 07:54:29 +0000
commit0c73abc6614898eb75663337c05e78fa9cd5b659 (patch)
tree565f8aa34f7a6b28637fb77e6cbb1143575b778e
parent54744cc3a39e1df7f24f34dbdc3f72c692199956 (diff)
downloadglance_store-0c73abc6614898eb75663337c05e78fa9cd5b659.tar.gz
Rethinking file system access
Made provision to load reserved_stores if it is specified in glance. Added keywrod argument to 'register_store_opts' and 'create_multi_stores' method. Change-Id: I965df1883639bfd5c900d2902884153d48988f6e Partial-Implements: blueprint rethinking-filesystem-access
-rw-r--r--glance_store/multi_backend.py19
-rw-r--r--glance_store/tests/unit/test_store_base.py49
-rw-r--r--releasenotes/notes/rethinking-filesystem-access-5ab872fd0c0d27db.yaml9
3 files changed, 73 insertions, 4 deletions
diff --git a/glance_store/multi_backend.py b/glance_store/multi_backend.py
index 8c78f85..9852c6f 100644
--- a/glance_store/multi_backend.py
+++ b/glance_store/multi_backend.py
@@ -46,6 +46,7 @@ Related Options:
]
_STORE_CFG_GROUP = 'glance_store'
+_RESERVED_STORES = {}
def _list_config_opts():
@@ -88,12 +89,15 @@ def _list_driver_opts():
return driver_opts
-def register_store_opts(conf):
+def register_store_opts(conf, reserved_stores=None):
LOG.debug("Registering options for group %s", _STORE_CFG_GROUP)
conf.register_opts(_STORE_OPTS, group=_STORE_CFG_GROUP)
driver_opts = _list_driver_opts()
enabled_backends = conf.enabled_backends
+ if reserved_stores:
+ enabled_backends.update(reserved_stores)
+
for backend in enabled_backends:
for opt_list in driver_opts:
if enabled_backends[backend] not in opt_list:
@@ -122,8 +126,12 @@ def _load_multi_store(conf, store_entry,
"driver will be disabled", dict(driver=str([driver, e])))
-def _load_multi_stores(conf):
+def _load_multi_stores(conf, reserved_stores=None):
enabled_backends = conf.enabled_backends
+ if reserved_stores:
+ enabled_backends.update(reserved_stores)
+ _RESERVED_STORES.update(reserved_stores)
+
for backend, store_entry in enabled_backends.items():
try:
# FIXME(flaper87): Don't hide BadStoreConfiguration
@@ -141,12 +149,13 @@ def _load_multi_stores(conf):
continue
-def create_multi_stores(conf=CONF):
+def create_multi_stores(conf=CONF, reserved_stores=None):
"""Registers all store modules and all schemes from the given config."""
store_count = 0
scheme_map = {}
for (store_entry, store_instance,
- store_identifier) in _load_multi_stores(conf):
+ store_identifier) in _load_multi_stores(
+ conf, reserved_stores=reserved_stores):
try:
schemes = store_instance.get_schemes()
store_instance.configure(re_raise_bsc=False)
@@ -197,6 +206,8 @@ def get_store_from_store_identifier(store_identifier):
"""
scheme_map = {}
enabled_backends = CONF.enabled_backends
+ enabled_backends.update(_RESERVED_STORES)
+
try:
scheme = enabled_backends[store_identifier]
except KeyError:
diff --git a/glance_store/tests/unit/test_store_base.py b/glance_store/tests/unit/test_store_base.py
index 6a33d0b..2f8e53f 100644
--- a/glance_store/tests/unit/test_store_base.py
+++ b/glance_store/tests/unit/test_store_base.py
@@ -15,8 +15,12 @@
import mock
+from oslo_config import cfg
+
import glance_store as store
from glance_store import backend
+from glance_store import location
+from glance_store import multi_backend
from glance_store.tests import base
@@ -38,3 +42,48 @@ class TestStoreBase(base.StoreBaseTest):
"could not be configured correctly. Reason: Specify "
"at least 'filesystem_store_datadir' or "
"'filesystem_store_datadirs' option Disabling add method.")
+
+
+class TestMultiStoreBase(base.MultiStoreBaseTest):
+ _CONF = multi_backend.CONF
+
+ def setUp(self):
+ super(TestMultiStoreBase, self).setUp()
+ enabled_backends = {
+ "fast": "file",
+ "cheap": "file",
+ }
+
+ self.reserved_stores = {
+ 'consuming_service_reserved_store': 'file'
+ }
+
+ self.conf = self._CONF
+ self.conf(args=[])
+ self.conf.register_opt(cfg.DictOpt('enabled_backends'))
+ self.config(enabled_backends=enabled_backends)
+
+ store.register_store_opts(self.conf,
+ reserved_stores=self.reserved_stores)
+ self.config(default_backend='file1', group='glance_store')
+
+ # Ensure stores + locations cleared
+ location.SCHEME_TO_CLS_BACKEND_MAP = {}
+
+ store.create_multi_stores(self.conf,
+ reserved_stores=self.reserved_stores)
+ self.addCleanup(setattr, location, 'SCHEME_TO_CLS_BACKEND_MAP',
+ dict())
+ self.addCleanup(self.conf.reset)
+
+ def test_reserved_stores_loaded(self):
+ # assert global map has reserved stores registered
+ store = multi_backend.get_store_from_store_identifier(
+ 'consuming_service_reserved_store')
+
+ self.assertIsNotNone(store)
+ self.assertEqual(self.reserved_stores, multi_backend._RESERVED_STORES)
+ # verify that store config group in conf file is same as
+ # reserved store name
+ self.assertEqual('consuming_service_reserved_store',
+ store.backend_group)
diff --git a/releasenotes/notes/rethinking-filesystem-access-5ab872fd0c0d27db.yaml b/releasenotes/notes/rethinking-filesystem-access-5ab872fd0c0d27db.yaml
new file mode 100644
index 0000000..f37cfd6
--- /dev/null
+++ b/releasenotes/notes/rethinking-filesystem-access-5ab872fd0c0d27db.yaml
@@ -0,0 +1,9 @@
+---
+features:
+ - |
+ Added keyword argument to ``register_store_opts`` and
+ ``create_multi_stores`` calls to configure reserved stores by the consuming
+ service. This feature will allow a mix of operator-configured stores via
+ enabled_backends configuration option set in the [glance_store] section
+ of the consuming service's configuration file, and stores that are
+ reserved for use by the consuming service.