Provide complete set of Glance metrics

Returning retrieved values and provide defaults (0s)
for all combinations of (visibility x status) for
Glance snapshots and images

Change-Id: I08e3e7d219f326a186f16b37773da50d1c9686b7
diff --git a/collectd/files/plugin/openstack_glance.py b/collectd/files/plugin/openstack_glance.py
index efb94be..efd4f72 100644
--- a/collectd/files/plugin/openstack_glance.py
+++ b/collectd/files/plugin/openstack_glance.py
@@ -23,6 +23,10 @@
 
 PLUGIN_NAME = 'openstack_glance'
 INTERVAL = openstack.INTERVAL
+image_types = ('snapshots', 'images')
+visibilities = ('public', 'private', 'community', 'shared')
+statuses = ('active', 'queued', 'saving', 'killed', 'deleted',
+            'deactivated', 'pending_delete')
 
 
 class GlanceStatsPlugin(openstack.CollectdPlugin):
@@ -38,20 +42,19 @@
         self.interval = INTERVAL
         self.pagination_limit = 25
 
-    def itermetrics(self):
+    @staticmethod
+    def gen_metric(name, nb, visibility, state):
+        return {
+            'plugin_instance': name,
+            'values': nb,
+            'meta': {
+                'visibility': visibility,
+                'state': state,
+                'discard_hostname': True,
+            }
+        }
 
-        def default_metrics(suffix=''):
-            ret = {}
-            for name in ('snapshots', 'images'):
-                for visibility in ('public', 'private',
-                                   'community', 'shared'):
-                    for status in ('active', 'queued', 'saving',
-                                   'killed', 'deleted', 'deactivated',
-                                   'pending_delete'):
-                        key = '%s%s.%s.%s' % (name, suffix,
-                                              visibility, status)
-                        ret[key] = 0
-            return ret
+    def itermetrics(self):
 
         def is_snap(d):
             return d.get('image_type') == 'snapshot'
@@ -67,18 +70,19 @@
                                           api_version='v2',
                                           params={},
                                           detail=False)
-        status = self.count_objects_group_by(images_details,
-                                             group_by_func=groupby)
-        if len(status) == 0:
-            status = default_metrics()
-        for s, nb in status.iteritems():
-            (name, visibility, state) = s.split('.')
-            yield {
-                'plugin_instance': name,
-                'values': nb,
-                'meta': {'visibility': visibility, 'state': state,
-                         'discard_hostname': True}
-            }
+        img_status = self.count_objects_group_by(images_details,
+                                                 group_by_func=groupby)
+        for name in image_types:
+            for visibility in visibilities:
+                for status in statuses:
+                    nb = img_status.get('{}.{}.{}'.format(name,
+                                                          visibility,
+                                                          status),
+                                        0)
+                    yield GlanceStatsPlugin.gen_metric(name,
+                                                       nb,
+                                                       visibility,
+                                                       status)
 
         # sizes
         def count_size_bytes(d):
@@ -91,19 +95,21 @@
                 return 'snapshots_size.%s.%s' % (p, status)
             return 'images_size.%s.%s' % (p, status)
 
-        sizes = self.count_objects_group_by(images_details,
-                                            group_by_func=groupby_size,
-                                            count_func=count_size_bytes)
-        if len(sizes) == 0:
-            sizes = default_metrics('_size')
-        for s, nb in sizes.iteritems():
-            (name, visibility, state) = s.split('.')
-            yield {
-                'plugin_instance': name,
-                'values': nb,
-                'meta': {'visibility': visibility, 'state': state,
-                         'discard_hostname': True},
-            }
+        img_sizes = self.count_objects_group_by(images_details,
+                                                group_by_func=groupby_size,
+                                                count_func=count_size_bytes)
+        for name in image_types:
+            for visibility in visibilities:
+                for status in statuses:
+                    nb = img_sizes.get('{}_size.{}.{}'.format(name,
+                                                              visibility,
+                                                              status),
+                                       0)
+                    yield GlanceStatsPlugin.gen_metric('{}_size'.format(name),
+                                                       nb,
+                                                       visibility,
+                                                       status)
+
 
 plugin = GlanceStatsPlugin(collectd, PLUGIN_NAME, disable_check_metric=True)
 
@@ -119,6 +125,7 @@
 def read_callback():
     plugin.conditional_read_callback()
 
+
 if __name__ == '__main__':
     import time
     collectd.load_configuration(plugin)