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
This commit is contained in:
Abhishek Kekane 2019-02-27 17:44:26 +00:00
parent 54744cc3a3
commit 0c73abc661
3 changed files with 73 additions and 4 deletions

View File

@ -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:

View File

@ -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)

View File

@ -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.