From 76db98a14994ce91216ae8dbf71422052aac96ff Mon Sep 17 00:00:00 2001 From: Aaron-DH Date: Thu, 24 Dec 2015 17:30:31 +0800 Subject: [PATCH] Improve default error handling on collector More details see: https://bugs.launchpad.net/cloudkitty/+bug/1529034 Change-Id: I20ba915175bce5dcda72fbfd449770c72b91fce0 Closes-Bug: #1529034 --- cloudkitty/collector/__init__.py | 5 ++++- cloudkitty/collector/meta.py | 4 ++++ cloudkitty/orchestrator.py | 9 ++++----- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/cloudkitty/collector/__init__.py b/cloudkitty/collector/__init__.py index 3b35fd11..bef54867 100644 --- a/cloudkitty/collector/__init__.py +++ b/cloudkitty/collector/__init__.py @@ -73,6 +73,7 @@ class NoDataCollected(Exception): @six.add_metaclass(abc.ABCMeta) class BaseCollector(object): + collector_name = None dependencies = [] def __init__(self, transformers, **kwargs): @@ -111,6 +112,8 @@ class BaseCollector(object): trans_resource = 'get_' trans_resource += resource.replace('.', '_') if not hasattr(self, trans_resource): - return None + raise NotImplementedError( + "No method found in collector '%s' for resource '%s'." + % (self.collector_name, resource)) func = getattr(self, trans_resource) return func(start, end, project_id, q_filter) diff --git a/cloudkitty/collector/meta.py b/cloudkitty/collector/meta.py index 50d9f754..4a7ff44e 100644 --- a/cloudkitty/collector/meta.py +++ b/cloudkitty/collector/meta.py @@ -82,3 +82,7 @@ class MetaCollector(collector.BaseCollector): func = self.map_retrieve(trans_resource, res_collector) if func is not None: return func(start, end, project_id, q_filter) + raise NotImplementedError( + "No method found in collector '%s' for resource '%s'." + % (res_collector.collector_name if res_collector else '', + resource)) diff --git a/cloudkitty/orchestrator.py b/cloudkitty/orchestrator.py index d5680673..fee39604 100644 --- a/cloudkitty/orchestrator.py +++ b/cloudkitty/orchestrator.py @@ -156,11 +156,10 @@ class Worker(BaseWorker): start_timestamp, next_timestamp, self._tenant_id) - - timed_data = [{'period': {'begin': start_timestamp, - 'end': next_timestamp}, - 'usage': raw_data}] - return timed_data + if raw_data: + return [{'period': {'begin': start_timestamp, + 'end': next_timestamp}, + 'usage': raw_data}] def check_state(self): timestamp = self._storage.get_state(self._tenant_id)