Comment 1 for bug 1623026

Revision history for this message
Andrea Franceschini (afranceschini) wrote :

Hello,

I have also this issue, and I believe the problem is in these parts of the code:

glance_store/backend.py:

def verify_default_store():
    scheme_name = CONF.glance_store.default_store

...

def add_to_backend(conf, image_id, data, size, scheme=None, context=None,
                   verifier=None):
    if scheme is None:
        scheme = conf['glance_store']['default_store']

Both seem to assume that there's an identity between store name and scheme, which is no longer true for vmware datastore.

In fact datastore name is expected to be vmware while SCHEME is vsphere.

To workaround this I've written (based on get_store_from_scheme) a new function that get datastore form its name.

+def get_store_from_name(store_name):
+ store = None
+ for scheme, store_value in location.SCHEME_TO_CLS_MAP.items():
+ if store_value['store_entry'] == store_name:
+ store = store_value['store']
+ if not store.is_capable(capabilities.BitMasks.DRIVER_REUSABLE):
+ # Driver instance isn't stateless so it can't
+ # be reused safely and need recreation.
+ store_entry = store_value['store_entry']
+ store = _load_store(store.conf, store_entry, invoke_load=True)
+ store.configure()
+ try:
+ scheme_map = {}
+ loc_cls = store.get_store_location_class()
+ for scheme in store.get_schemes():
+ scheme_map[scheme] = {
+ 'store': store,
+ 'location_class': loc_cls,
+ 'store_entry': store_entry
+ }
+ location.register_scheme_map(scheme_map)
+ except NotImplementedError:
+ store_value['store'] = store
+ if store is None:
+ raise exceptions.UnknownStore(store_name=store_name)
+ return store

and changed the above functions to use this new one:

def add_to_backend(conf, image_id, data, size, scheme=None, context=None,
                   verifier=None):
    if scheme is None:
        store_name = conf['glance_store']['default_store']
        store = get_store_from_name(store_name)
    else:
        store = get_store_from_scheme(scheme)
    return store_add_to_backend(image_id, data, size, store, context,
                                verifier)

def verify_default_store():
    store_name = CONF.glance_store.default_store
    try:
        get_store_from_name(store_name)
    except exceptions.UnknownStore:
        msg = _("Store named %s not found") % store_name
        raise RuntimeError(msg)

glance_store/exceptions.py:

+class UnknownStore(GlanceStoreException):
+ message = _("Unknown scheme '%(scheme)s' found in URI")

This way everything works, at least for me.

Hope it helps.