From 3a939cb962cf7e26e650ba359bcc9f6e48a99c5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Albert?= Date: Fri, 14 Nov 2014 10:34:39 +0100 Subject: [PATCH] Fixed OSRF format writer to support Decimal Change-Id: Ib554a1fe529ab7182e5a35ad061f1341c30acb47 --- cloudkitty/writer/__init__.py | 4 ++-- cloudkitty/writer/osrf.py | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/cloudkitty/writer/__init__.py b/cloudkitty/writer/__init__.py index 09cf9fad..872b6ceb 100644 --- a/cloudkitty/writer/__init__.py +++ b/cloudkitty/writer/__init__.py @@ -81,8 +81,8 @@ class BaseReportWriter(object): timeframe = self._sm.get_state() self.usage_start = timeframe self.usage_start_dt = datetime.datetime.fromtimestamp(timeframe) - end_frame = timeframe + self._period - self.usage_end = datetime.datetime.fromtimestamp(end_frame) + self.usage_end = timeframe + self._period + self.usage_end_dt = datetime.datetime.fromtimestamp(self.usage_end) metadata = self._sm.get_metadata() self.total = metadata.get('total', 0) diff --git a/cloudkitty/writer/osrf.py b/cloudkitty/writer/osrf.py index 161a57f9..815cf88f 100644 --- a/cloudkitty/writer/osrf.py +++ b/cloudkitty/writer/osrf.py @@ -15,12 +15,20 @@ # # @author: Stéphane Albert # +import decimal import json import os from cloudkitty import writer +class DecimalEncoder(json.JSONEncoder): + def default(self, o): + if isinstance(o, decimal.Decimal): + return float(o) + return super(DecimalEncoder, self).default(o) + + class OSRFBackend(writer.BaseReportWriter): """OpenStack Report Format Writer: @@ -51,7 +59,7 @@ class OSRFBackend(writer.BaseReportWriter): def _write_total(self): total = {'total': self.total} - self._report.write(json.dumps(total)) + self._report.write(json.dumps(total, cls=DecimalEncoder)) self._report.write(']') self._report.flush() @@ -88,6 +96,6 @@ class OSRFBackend(writer.BaseReportWriter): 'end': self.usage_end_dt.isoformat()} data['usage'] = self._usage_data - self._report.write(json.dumps(data)) + self._report.write(json.dumps(data, cls=DecimalEncoder)) self._report.write(', ') self._report.flush()