diff --git a/cloudkitty/api/v1/controllers/storage.py b/cloudkitty/api/v1/controllers/storage.py index b7b69f17..e6a6c94a 100644 --- a/cloudkitty/api/v1/controllers/storage.py +++ b/cloudkitty/api/v1/controllers/storage.py @@ -28,10 +28,10 @@ from cloudkitty import storage as ck_storage from cloudkitty import utils as ck_utils -class StorageController(rest.RestController): +class DataFramesController(rest.RestController): """REST Controller to access stored data frames.""" - @wsme_pecan.wsexpose([storage_models.DataFrame], + @wsme_pecan.wsexpose(storage_models.DataFrameCollection, datetime.datetime, datetime.datetime, wtypes.text, @@ -43,7 +43,7 @@ class StorageController(rest.RestController): :param end: End of the period :param tenant_id: UUID of the tenant to filter on. :param resource_type: Type of the resource to filter on. - :return: List of DataFrame objects. + :return: Collection of DataFrame objects. """ begin_ts = ck_utils.dt2ts(begin) @@ -56,7 +56,7 @@ class StorageController(rest.RestController): except ck_storage.NoTimeFrame: return [] - ret = [] + dataframes = [] for frame in frames: for service, data_list in frame['usage'].items(): resources = [] @@ -69,10 +69,16 @@ class StorageController(rest.RestController): volume=data['vol']['qty'], rating=price) resources.append(resource) - data_frame = storage_models.DataFrame( + dataframe = storage_models.DataFrame( begin=ck_utils.iso2dt(frame['period']['begin']), end=ck_utils.iso2dt(frame['period']['end']), tenant_id=tenant_id, # FIXME resources=resources) - ret.append(data_frame) - return ret + dataframes.append(dataframe) + return storage_models.DataFrameCollection(dataframes=dataframes) + + +class StorageController(rest.RestController): + """REST Controller to access stored data.""" + + dataframes = DataFramesController() diff --git a/cloudkitty/api/v1/datamodels/storage.py b/cloudkitty/api/v1/datamodels/storage.py index 37be3936..b887922d 100644 --- a/cloudkitty/api/v1/datamodels/storage.py +++ b/cloudkitty/api/v1/datamodels/storage.py @@ -33,9 +33,17 @@ class RatedResource(rating_resources.CloudkittyResource): res_dict['rating'] = self.rating return res_dict + @classmethod + def sample(cls): + sample = cls(volume=decimal.Decimal('1.0'), + service='compute', + rating=decimal.Decimal('1.0'), + desc={'flavor': 'm1.tiny', 'vcpus': '1'}) + return sample + class DataFrame(wtypes.Base): - """Type describing a stored dataframe.""" + """Type describing a stored data frame.""" begin = datetime.datetime """Begin date for the sample.""" @@ -54,3 +62,23 @@ class DataFrame(wtypes.Base): 'end': self.end, 'tenant_id': self.tenant_id, 'resources': self.resources} + + @classmethod + def sample(cls): + res_sample = RatedResource.sample() + sample = cls(tenant_id='69d12143688f413cbf5c3cfe03ed0a12', + begin=datetime.datetime(2015, 4, 22, 7), + end=datetime.datetime(2015, 4, 22, 8), + resources=[res_sample]) + return sample + + +class DataFrameCollection(wtypes.Base): + """A list of stored data frames.""" + + dataframes = [DataFrame] + + @classmethod + def sample(cls): + sample = DataFrame.sample() + return cls(dataframes=[sample]) diff --git a/doc/source/webapi/v1.rst b/doc/source/webapi/v1.rst index 06fc9830..e753fc73 100644 --- a/doc/source/webapi/v1.rst +++ b/doc/source/webapi/v1.rst @@ -47,8 +47,14 @@ Storage .. rest-controller:: cloudkitty.api.v1.controllers.storage:StorageController :webprefix: /v1/storage -.. autotype:: cloudkitty.api.v1.datamodels.storage.DataFrame - :members: +.. rest-controller:: cloudkitty.api.v1.controllers.storage:DataFramesController + :webprefix: /v1/storage/dataframes .. autotype:: cloudkitty.api.v1.datamodels.storage.RatedResource :members: + +.. autotype:: cloudkitty.api.v1.datamodels.storage.DataFrame + :members: + +.. autotype:: cloudkitty.api.v1.datamodels.storage.DataFrameCollection + :members: