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:
parent
54744cc3a3
commit
0c73abc661
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue