diff options
author | Abhishek Kekane <akekane@redhat.com> | 2019-02-27 17:44:26 +0000 |
---|---|---|
committer | Abhishek Kekane <akekane@redhat.com> | 2019-06-06 07:54:29 +0000 |
commit | 0c73abc6614898eb75663337c05e78fa9cd5b659 (patch) | |
tree | 565f8aa34f7a6b28637fb77e6cbb1143575b778e | |
parent | 54744cc3a39e1df7f24f34dbdc3f72c692199956 (diff) | |
download | glance_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.py | 19 | ||||
-rw-r--r-- | glance_store/tests/unit/test_store_base.py | 49 | ||||
-rw-r--r-- | releasenotes/notes/rethinking-filesystem-access-5ab872fd0c0d27db.yaml | 9 |
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. |