Merge "Add support for groupby in statistics for API v2"
This commit is contained in:
@@ -20,6 +20,7 @@ base_url = '/v2/meters/instance/statistics'
|
||||
qry = ('q.field=resource_id&q.field=source&q.op=&q.op='
|
||||
'&q.type=&q.type=&q.value=foo&q.value=bar')
|
||||
period = '&period=60'
|
||||
groupby = '&groupby=resource_id'
|
||||
samples = [
|
||||
{u'count': 135,
|
||||
u'duration_start': u'2013-02-04T10:51:42',
|
||||
@@ -31,6 +32,30 @@ samples = [
|
||||
u'avg': 1.0,
|
||||
u'sum': 135.0},
|
||||
]
|
||||
groupby_samples = [
|
||||
{u'count': 135,
|
||||
u'duration_start': u'2013-02-04T10:51:42',
|
||||
u'min': 1.0,
|
||||
u'max': 1.0,
|
||||
u'duration_end':
|
||||
u'2013-02-05T15:46:09',
|
||||
u'duration': 1734.0,
|
||||
u'avg': 1.0,
|
||||
u'sum': 135.0,
|
||||
u'groupby': {u'resource_id': u'foo'}
|
||||
},
|
||||
{u'count': 12,
|
||||
u'duration_start': u'2013-02-04T10:51:42',
|
||||
u'min': 1.0,
|
||||
u'max': 1.0,
|
||||
u'duration_end':
|
||||
u'2013-02-05T15:46:09',
|
||||
u'duration': 1734.0,
|
||||
u'avg': 1.0,
|
||||
u'sum': 12.0,
|
||||
u'groupby': {u'resource_id': u'bar'}
|
||||
},
|
||||
]
|
||||
fixtures = {
|
||||
base_url:
|
||||
{
|
||||
@@ -53,6 +78,13 @@ fixtures = {
|
||||
samples
|
||||
),
|
||||
},
|
||||
'%s?%s%s' % (base_url, qry, groupby):
|
||||
{
|
||||
'GET': (
|
||||
{},
|
||||
groupby_samples
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -104,3 +136,23 @@ class StatisticsManagerTest(utils.BaseTestCase):
|
||||
self.assertEqual(self.api.calls, expect)
|
||||
self.assertEqual(len(stats), 1)
|
||||
self.assertEqual(stats[0].count, 135)
|
||||
|
||||
def test_list_by_meter_name_with_groupby(self):
|
||||
stats = list(self.mgr.list(meter_name='instance',
|
||||
q=[
|
||||
{"field": "resource_id",
|
||||
"value": "foo"},
|
||||
{"field": "source",
|
||||
"value": "bar"},
|
||||
],
|
||||
groupby=['resource_id']))
|
||||
expect = [
|
||||
('GET',
|
||||
'%s?%s%s' % (base_url, qry, groupby), {}, None),
|
||||
]
|
||||
self.assertEqual(self.api.calls, expect)
|
||||
self.assertEqual(len(stats), 2)
|
||||
self.assertEqual(stats[0].count, 135)
|
||||
self.assertEqual(stats[1].count, 12)
|
||||
self.assertEqual(stats[0].groupby.get('resource_id'), 'foo')
|
||||
self.assertEqual(stats[1].groupby.get('resource_id'), 'bar')
|
||||
|
||||
@@ -42,11 +42,14 @@ OPERATORS_STRING = dict(gt='>', ge='>=',
|
||||
help='Name of meter to show samples for.')
|
||||
@utils.arg('-p', '--period', metavar='<PERIOD>',
|
||||
help='Period in seconds over which to group samples.')
|
||||
@utils.arg('-g', '--groupby', metavar='<FIELD>', action='append',
|
||||
help='Field for group aggregation.')
|
||||
def do_statistics(cc, args):
|
||||
'''List the statistics for a meter.'''
|
||||
fields = {'meter_name': args.meter,
|
||||
'q': options.cli_to_array(args.query),
|
||||
'period': args.period}
|
||||
'period': args.period,
|
||||
'groupby': args.groupby}
|
||||
try:
|
||||
statistics = cc.statistics.list(**fields)
|
||||
except exc.HTTPNotFound:
|
||||
@@ -58,6 +61,9 @@ def do_statistics(cc, args):
|
||||
fields = ['period', 'period_start', 'period_end',
|
||||
'count', 'min', 'max', 'sum', 'avg',
|
||||
'duration', 'duration_start', 'duration_end']
|
||||
if args.groupby:
|
||||
field_labels.append('Group By')
|
||||
fields.append('groupby')
|
||||
utils.print_list(statistics, fields, field_labels)
|
||||
|
||||
|
||||
|
||||
@@ -23,8 +23,9 @@ class Statistics(base.Resource):
|
||||
class StatisticsManager(base.Manager):
|
||||
resource_class = Statistics
|
||||
|
||||
def list(self, meter_name, q=None, period=None):
|
||||
p = ['period=%s' % period] if period else None
|
||||
def list(self, meter_name, q=None, period=None, groupby=[]):
|
||||
p = ['period=%s' % period] if period else []
|
||||
p.extend(['groupby=%s' % g for g in groupby] if groupby else [])
|
||||
return self._list(options.build_url(
|
||||
'/v2/meters/' + meter_name + '/statistics',
|
||||
q, p))
|
||||
|
||||
Reference in New Issue
Block a user