From 1c756b8a570e09db6d0e35da8f4b6387dda84b77 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Sat, 28 Mar 2015 14:59:58 -0400 Subject: [PATCH] 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 --- shade/__init__.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/shade/__init__.py b/shade/__init__.py index 56def0e89..b80f09bab 100644 --- a/shade/__init__.py +++ b/shade/__init__.py @@ -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)