summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ceilometerclient/common/utils.py2
-rw-r--r--ceilometerclient/tests/v2/test_alarms.py14
-rw-r--r--ceilometerclient/tests/v2/test_options.py6
-rw-r--r--ceilometerclient/tests/v2/test_resources.py4
-rw-r--r--ceilometerclient/tests/v2/test_samples.py2
-rw-r--r--ceilometerclient/tests/v2/test_statistics.py2
-rw-r--r--ceilometerclient/v2/options.py5
7 files changed, 19 insertions, 16 deletions
diff --git a/ceilometerclient/common/utils.py b/ceilometerclient/common/utils.py
index 3f2fa91..fe21378 100644
--- a/ceilometerclient/common/utils.py
+++ b/ceilometerclient/common/utils.py
@@ -68,7 +68,7 @@ def print_dict(d, dict_property="Property", wrap=0):
pt = prettytable.PrettyTable([dict_property, 'Value'],
caching=False, print_empty=False)
pt.align = 'l'
- for k, v in six.iteritems(d):
+ for k, v in sorted(six.iteritems(d)):
# convert dict to str to check length
if isinstance(v, dict):
v = str(v)
diff --git a/ceilometerclient/tests/v2/test_alarms.py b/ceilometerclient/tests/v2/test_alarms.py
index eae8521..bc04714 100644
--- a/ceilometerclient/tests/v2/test_alarms.py
+++ b/ceilometerclient/tests/v2/test_alarms.py
@@ -187,8 +187,8 @@ fixtures = {
),
},
- '/v2/alarms?q.op=&q.op=&q.value=project-id&q.value=SwiftObjectAlarm'
- '&q.field=project_id&q.field=name':
+ '/v2/alarms?q.field=project_id&q.field=name&q.op=&q.op='
+ '&q.value=project-id&q.value=SwiftObjectAlarm':
{
'GET': (
{},
@@ -209,7 +209,7 @@ fixtures = {
ALARM_HISTORY,
),
},
- '/v2/alarms/alarm-id/history?q.op=&q.value=NOW&q.field=timestamp':
+ '/v2/alarms/alarm-id/history?q.field=timestamp&q.op=&q.value=NOW':
{
'GET': (
{},
@@ -244,8 +244,8 @@ class AlarmManagerTest(testtools.TestCase):
]))
expect = [
('GET',
- '/v2/alarms?q.op=&q.op=&q.value=project-id&q.value='
- 'SwiftObjectAlarm&q.field=project_id&q.field=name',
+ '/v2/alarms?q.field=project_id&q.field=name&q.op=&q.op='
+ '&q.value=project-id&q.value=SwiftObjectAlarm',
{}, None),
]
self.assertEqual(self.api.calls, expect)
@@ -334,8 +334,8 @@ class AlarmManagerTest(testtools.TestCase):
def test_get_constrained_history(self):
q = [dict(field='timestamp', value='NOW')]
- url = ('/v2/alarms/alarm-id/history'
- '?q.op=&q.value=NOW&q.field=timestamp')
+ url = ('/v2/alarms/alarm-id/history?q.field=timestamp'
+ '&q.op=&q.value=NOW')
self._do_test_get_history(q, url)
diff --git a/ceilometerclient/tests/v2/test_options.py b/ceilometerclient/tests/v2/test_options.py
index 27f9020..b771ec6 100644
--- a/ceilometerclient/tests/v2/test_options.py
+++ b/ceilometerclient/tests/v2/test_options.py
@@ -21,7 +21,7 @@ class BuildUrlTest(utils.BaseTestCase):
url = options.build_url('/', [{'field': 'this',
'op': 'gt',
'value': 43}])
- self.assertEqual(url, '/?q.op=gt&q.value=43&q.field=this')
+ self.assertEqual(url, '/?q.field=this&q.op=gt&q.value=43')
def test_two(self):
url = options.build_url('/', [{'field': 'this',
@@ -33,12 +33,12 @@ class BuildUrlTest(utils.BaseTestCase):
ops = 'q.op=gt&q.op=lt'
vals = 'q.value=43&q.value=88'
fields = 'q.field=this&q.field=that'
- self.assertEqual(url, '/?%s&%s&%s' % (ops, vals, fields))
+ self.assertEqual(url, '/?%s&%s&%s' % (fields, ops, vals))
def test_default_op(self):
url = options.build_url('/', [{'field': 'this',
'value': 43}])
- self.assertEqual(url, '/?q.op=&q.value=43&q.field=this')
+ self.assertEqual(url, '/?q.field=this&q.op=&q.value=43')
def test_one_param(self):
url = options.build_url('/', None, ['period=60'])
diff --git a/ceilometerclient/tests/v2/test_resources.py b/ceilometerclient/tests/v2/test_resources.py
index 8c0632e..0ddccb0 100644
--- a/ceilometerclient/tests/v2/test_resources.py
+++ b/ceilometerclient/tests/v2/test_resources.py
@@ -37,7 +37,7 @@ fixtures = {
]
),
},
- '/v2/resources?q.op=&q.value=a&q.field=resource_id':
+ '/v2/resources?q.field=resource_id&q.op=&q.value=a':
{
'GET': (
{},
@@ -97,7 +97,7 @@ class ResourceManagerTest(utils.BaseTestCase):
"value": "a"},
]))
expect = [
- ('GET', '/v2/resources?q.op=&q.value=a&q.field=resource_id',
+ ('GET', '/v2/resources?q.field=resource_id&q.op=&q.value=a',
{}, None),
]
self.assertEqual(self.api.calls, expect)
diff --git a/ceilometerclient/tests/v2/test_samples.py b/ceilometerclient/tests/v2/test_samples.py
index 32084c9..a6eff4f 100644
--- a/ceilometerclient/tests/v2/test_samples.py
+++ b/ceilometerclient/tests/v2/test_samples.py
@@ -35,7 +35,7 @@ del CREATE_SAMPLE['message_id']
del CREATE_SAMPLE['source']
base_url = '/v2/meters/instance'
-args = 'q.op=&q.op=&q.value=foo&q.value=bar&q.field=resource_id&q.field=source'
+args = 'q.field=resource_id&q.field=source&q.op=&q.op=&q.value=foo&q.value=bar'
fixtures = {
base_url:
{
diff --git a/ceilometerclient/tests/v2/test_statistics.py b/ceilometerclient/tests/v2/test_statistics.py
index a233b23..ba3fe7a 100644
--- a/ceilometerclient/tests/v2/test_statistics.py
+++ b/ceilometerclient/tests/v2/test_statistics.py
@@ -17,7 +17,7 @@ from ceilometerclient.tests import utils
import ceilometerclient.v2.statistics
base_url = '/v2/meters/instance/statistics'
-qry = 'q.op=&q.op=&q.value=foo&q.value=bar&q.field=resource_id&q.field=source'
+qry = 'q.field=resource_id&q.field=source&q.op=&q.op=&q.value=foo&q.value=bar'
period = '&period=60'
samples = [{
u'count': 135,
diff --git a/ceilometerclient/v2/options.py b/ceilometerclient/v2/options.py
index b3a6f3e..349e04c 100644
--- a/ceilometerclient/v2/options.py
+++ b/ceilometerclient/v2/options.py
@@ -34,7 +34,10 @@ def build_url(path, q, params=None):
for name in ['field', 'op', 'value']:
query_params['q.%s' % name].append(query.get(name, ''))
- path += "?" + urlutils.urlencode(query_params, doseq=True)
+ # Transform the dict to a sequence of two-element tuples in fixed
+ # order, then the encoded string will be consistent in Python 2&3.
+ new_qparams = sorted(query_params.items(), key=lambda x: x[0])
+ path += "?" + urlutils.urlencode(new_qparams, doseq=True)
if params:
for p in params: