def get_all(self, q=None, meter=None, groupby=None, period=None, aggregate=None): """Retrieve all statistics for all meters :param q: Filter rules for the statistics to be returned. """ rbac.enforce('compute_statistics', pecan.request) q = q or [] meter = meter or [] groupby = groupby or [] aggregate = aggregate or [] if period and period < 0: raise base.ClientSideError(_("Period must be positive.")) g = meters._validate_groupby_fields(groupby) # TO DO: break out the meter names and invoke multiple calls kwargs = v2_utils.query_to_kwargs(q, storage.SampleFilter.__init__) aggregate = utils.uniq(aggregate, ['func', 'param']) # Find the original timestamp in the query to use for clamping # the duration returned in the statistics. start = end = None for i in q: if i.field == 'timestamp' and i.op in ('lt', 'le'): end = timeutils.parse_isotime(i.value).replace(tzinfo=None) elif i.field == 'timestamp' and i.op in ('gt', 'ge'): start = timeutils.parse_isotime(i.value).replace(tzinfo=None) ret = [] kwargs['meter'] = meter f = storage.SampleFilter(**kwargs) try: computed = pecan.request.storage_conn.get_meter_statistics( f, period, g, aggregate) dbStats = [ ScopedStatistics(start_timestamp=start, end_timestamp=end, **c.as_dict()) for c in computed ] ret += dbStats except OverflowError: LOG.exception("Problem processing meters %s" % meter) return ret
def test_duplicate_fields(self): result = set( meters._validate_groupby_fields(['user_id', 'source', 'user_id'])) self.assertEqual(set(['user_id', 'source']), result)
def test_valid_fields_multiple(self): result = set( meters._validate_groupby_fields( ['user_id', 'project_id', 'source'])) self.assertEqual(set(['user_id', 'project_id', 'source']), result)
def test_valid_field(self): result = meters._validate_groupby_fields(['user_id']) self.assertEqual(['user_id'], result)
def test_duplicate_fields(self): result = set( meters._validate_groupby_fields(['user_id', 'source', 'user_id']) ) self.assertEqual(set(['user_id', 'source']), result)
def test_valid_fields_multiple(self): result = set(meters._validate_groupby_fields( ['user_id', 'project_id', 'source'])) self.assertEqual(set(['user_id', 'project_id', 'source']), result)
def test_duplicate_fields(self): result = set(meters._validate_groupby_fields(["user_id", "source", "user_id"])) self.assertEqual(set(["user_id", "source"]), result)