Merge "ImagePollster record duplicate counter during one poll"
This commit is contained in:
commit
315fb82af1
@ -45,11 +45,30 @@ class _Base(plugin.PollsterBase):
|
||||
client = self.get_glance_client(ksclient)
|
||||
#TODO(eglynn): use pagination to protect against unbounded
|
||||
# memory usage
|
||||
return itertools.chain(
|
||||
rawImageList = list(itertools.chain(
|
||||
client.images.list(filters={"is_public": True}),
|
||||
#TODO(eglynn): extend glance API with all_tenants logic to
|
||||
# avoid second call to retrieve private images
|
||||
client.images.list(filters={"is_public": False}))
|
||||
client.images.list(filters={"is_public": False})))
|
||||
|
||||
# When retrieving images from glance, glance will check
|
||||
# whether the user is of 'admin_role' which is
|
||||
# configured in glance-api.conf. If the user is of
|
||||
# admin_role, and is querying public images(which means
|
||||
# that the 'is_public' param is set to be True),
|
||||
# glance will ignore 'is_public' parameter and returns
|
||||
# all the public images together with private images.
|
||||
# As a result, if the user/tenant has an admin role
|
||||
# for ceilometer to collect image list,
|
||||
# the _Base.iter_images method will return a image list
|
||||
# which contains duplicate images. Add the following
|
||||
# code to avoid recording down duplicate image events.
|
||||
imageIdSet = set(image.id for image in rawImageList)
|
||||
|
||||
for image in rawImageList:
|
||||
if image.id in imageIdSet:
|
||||
imageIdSet -= set([image.id])
|
||||
yield image
|
||||
|
||||
@staticmethod
|
||||
def extract_image_metadata(image):
|
||||
|
@ -82,9 +82,33 @@ IMAGE_LIST = [
|
||||
u'deleted_at': None,
|
||||
u'min_ram': 0,
|
||||
u'size': 1024}),
|
||||
# Make one duplicate private image to test the iter_images method.
|
||||
type('Image', (object,),
|
||||
{u'status': u'queued',
|
||||
u'name': "some name",
|
||||
u'deleted': False,
|
||||
u'container_format': None,
|
||||
u'created_at': u'2012-09-18T16:29:46',
|
||||
u'disk_format': None,
|
||||
u'updated_at': u'2012-09-18T16:29:46',
|
||||
u'properties': {},
|
||||
u'min_disk': 0,
|
||||
u'protected': False,
|
||||
u'id': u'1d21a8d0-25f4-4e0a-b4ec-85f40237676b',
|
||||
u'location': None,
|
||||
u'checksum': None,
|
||||
u'owner': u'4c8364fc20184ed7971b76602aa96184',
|
||||
u'is_public': True,
|
||||
u'deleted_at': None,
|
||||
u'min_ram': 0,
|
||||
u'size': 2048}),
|
||||
]
|
||||
|
||||
|
||||
class _BaseObject(object):
|
||||
pass
|
||||
|
||||
|
||||
class TestManager(manager.AgentManager):
|
||||
|
||||
def __init__(self):
|
||||
@ -94,17 +118,26 @@ class TestManager(manager.AgentManager):
|
||||
|
||||
class TestImagePollster(base.TestCase):
|
||||
|
||||
@staticmethod
|
||||
def fake_glance_iter_images(self, ksclient):
|
||||
return iter(IMAGE_LIST)
|
||||
def fake_get_glance_client(self, ksclient):
|
||||
glanceclient = _BaseObject()
|
||||
setattr(glanceclient, "images", _BaseObject())
|
||||
setattr(glanceclient.images,
|
||||
"list", lambda *args, **kwargs: iter(IMAGE_LIST))
|
||||
return glanceclient
|
||||
|
||||
@mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())
|
||||
def setUp(self):
|
||||
super(TestImagePollster, self).setUp()
|
||||
self.context = context.get_admin_context()
|
||||
self.manager = TestManager()
|
||||
self.stubs.Set(glance._Base, 'iter_images',
|
||||
self.fake_glance_iter_images)
|
||||
self.stubs.Set(glance._Base, 'get_glance_client',
|
||||
self.fake_get_glance_client)
|
||||
|
||||
# Tests whether the iter_images method returns an unique image list.
|
||||
def test_iter_images(self):
|
||||
images = list(glance.ImagePollster().
|
||||
iter_images(self.manager.keystone))
|
||||
self.assertEqual(len(images), len(set(image.id for image in images)))
|
||||
|
||||
def test_glance_image_counter(self):
|
||||
counters = list(glance.ImagePollster().get_counters(self.manager))
|
||||
|
Loading…
x
Reference in New Issue
Block a user