Namespace caching per cloud

In places where we have multiple clouds, such as nodepool, if we want
to use shared or persistent caching, we need to include cloud name in
the cache so that we don't try to return rackspace flavors to hp clouds.

Change-Id: I65a7b1bf6818f6b40b42bd2fa4b560f127c5589b
This commit is contained in:
Monty Taylor 2015-03-28 14:59:58 -04:00
parent c713eb3288
commit 1c756b8a57

View File

@ -221,7 +221,9 @@ class OpenStackCloud(object):
(self.verify, self.cert) = _ssl_args(verify, cacert, cert, key)
self._cache = cache.make_region().configure(
self._cache = cache.make_region(
function_key_generator=self._make_cache_key
).configure(
cache_class, expiration_time=cache_interval,
arguments=cache_arguments)
self._container_cache = dict()
@ -247,6 +249,23 @@ class OpenStackCloud(object):
self.log.setLevel(log_level)
self.log.addHandler(logging.StreamHandler())
def _make_cache_key(self, namespace, fn):
fname = fn.__name__
if namespace is None:
name_key = self.name
else:
name_key = '%s:%s' % (self.name, namespace)
def generate_key(*args, **kwargs):
arg_key = ','.join(args)
kwargs_keys = kwargs.keys()
kwargs_keys.sort()
kwargs_key = ','.join(
['%s:%s' % (k, kwargs[k]) for k in kwargs_keys])
return "_".join(
[name_key, fname, arg_key, kwargs_key])
return generate_key
def get_service_type(self, service):
return self.service_types.get(service, service)
@ -595,10 +614,10 @@ class OpenStackCloud(object):
@property
def flavor_cache(self):
@self._cache.cache_on_arguments()
def _flavor_cache():
def _flavor_cache(cloud):
return {flavor.id: flavor for flavor in
self.nova_client.flavors.list()}
return _flavor_cache()
return _flavor_cache(self.name)
def get_flavor_name(self, flavor_id):
flavor = self.flavor_cache.get(flavor_id, None)