Merge "Add support for groupby in statistics for API v2"

This commit is contained in:
Jenkins
2014-01-24 08:55:53 +00:00
committed by Gerrit Code Review
3 changed files with 62 additions and 3 deletions

View File

@@ -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')

View File

@@ -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)

View File

@@ -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))