From f57433929a9d51fd7927ed43a639a1d8917695a4 Mon Sep 17 00:00:00 2001 From: Clint Byrum Date: Tue, 26 May 2015 11:48:21 -0700 Subject: [PATCH] Make caching work when cloud name is None All of the other keys are coerced to strings through some method but a cloud name of None with no namespace produces a TypeError because sequence 0 is not a string when joined. Change-Id: I78d0e6daedfe3cf1a0db5f606c21af803450f018 --- shade/__init__.py | 2 +- shade/tests/unit/test_caching.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/shade/__init__.py b/shade/__init__.py index 4aca45099..5427a6c21 100644 --- a/shade/__init__.py +++ b/shade/__init__.py @@ -295,7 +295,7 @@ class OpenStackCloud(object): kwargs_key = ','.join( ['%s:%s' % (k, kwargs[k]) for k in kw_keys if k != 'cache']) ans = "_".join( - [name_key, fname, arg_key, kwargs_key]) + [str(name_key), fname, arg_key, kwargs_key]) return ans return generate_key diff --git a/shade/tests/unit/test_caching.py b/shade/tests/unit/test_caching.py index c652bfb58..9c65ced13 100644 --- a/shade/tests/unit/test_caching.py +++ b/shade/tests/unit/test_caching.py @@ -361,3 +361,24 @@ class TestMemoryCache(base.TestCase): glance_mock.images.update.assert_called_with(**args) fake_image_dict = meta.obj_to_dict(fake_image) self.assertEqual([fake_image_dict], self.cloud.list_images()) + + @mock.patch.object(shade.OpenStackCloud, 'glance_client') + def test_cache_no_cloud_name(self, glance_mock): + class FakeImage(dict): + id = 1 + status = 'active' + name = 'None Test Image' + fi = FakeImage(id=FakeImage.id, status=FakeImage.status, + name=FakeImage.name) + glance_mock.images.list.return_value = [fi] + self.cloud.name = None + self.assertEqual([fi], [dict(x) for x in self.cloud.list_images()]) + # Now test that the list was cached + fi2 = FakeImage(id=2, status=FakeImage.status, name=FakeImage.name) + fi2.id = 2 + glance_mock.images.list.return_value = [fi, fi2] + self.assertEqual([fi], [dict(x) for x in self.cloud.list_images()]) + # Invalidation too + self.cloud.list_images.invalidate(self.cloud) + self.assertEqual( + [fi, fi2], [dict(x) for x in self.cloud.list_images()])