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()])