From: Jacek Swiderski Date: Wed, 6 Aug 2014 09:23:16 +0000 (+0200) Subject: Do not assume order of body and tags elements X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=d5b90315d2ff647179fd91512377a7f21a57ef0a;p=openstack-build%2Fneutron-build.git Do not assume order of body and tags elements This fixes the l2gateway unit test that breaks with a randomized PYTHONHASHSEED (see the bug report). The test assumed that the body dict from self._create_expected_req_body had elements (including contents of tags list) in a particular order. Found with PYTHONHASHSEED=2455351445. The fix ensures that body is in predictable order. Partial-bug: #1348818 Note: There are several other unrelated unit tests that also break with a randomized PYTHONHASHSEED, but they are not addressed here. They will be addressed in separate patches. Change-Id: I423b68aff58486c113d0e5c5f4726f9eabf6920e --- diff --git a/neutron/plugins/vmware/common/utils.py b/neutron/plugins/vmware/common/utils.py index fb21e55e6..fd5f2fc29 100644 --- a/neutron/plugins/vmware/common/utils.py +++ b/neutron/plugins/vmware/common/utils.py @@ -40,7 +40,7 @@ def get_tags(**kwargs): tags = ([dict(tag=value, scope=key) for key, value in kwargs.iteritems()]) tags.append({"tag": NEUTRON_VERSION, "scope": "quantum"}) - return tags + return sorted(tags) def device_id_to_vm_id(device_id, obfuscate=False): diff --git a/neutron/plugins/vmware/nsxlib/l2gateway.py b/neutron/plugins/vmware/nsxlib/l2gateway.py index f5a6e3053..0848ed591 100644 --- a/neutron/plugins/vmware/nsxlib/l2gateway.py +++ b/neutron/plugins/vmware/nsxlib/l2gateway.py @@ -149,7 +149,7 @@ def create_gateway_device(cluster, tenant_id, display_name, neutron_id, try: return nsxlib.do_request( HTTP_POST, nsxlib._build_uri_path(TRANSPORTNODE_RESOURCE), - jsonutils.dumps(body), cluster=cluster) + jsonutils.dumps(body, sort_keys=True), cluster=cluster) except api_exc.InvalidSecurityCertificate: raise nsx_exc.InvalidSecurityCertificate() @@ -166,7 +166,7 @@ def update_gateway_device(cluster, gateway_id, tenant_id, HTTP_PUT, nsxlib._build_uri_path(TRANSPORTNODE_RESOURCE, resource_id=gateway_id), - jsonutils.dumps(body), cluster=cluster) + jsonutils.dumps(body, sort_keys=True), cluster=cluster) except api_exc.InvalidSecurityCertificate: raise nsx_exc.InvalidSecurityCertificate() diff --git a/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py b/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py index e3b92f25f..006ad3864 100644 --- a/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py +++ b/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py @@ -165,6 +165,7 @@ class L2GatewayTestCase(base.NsxlibTestCase): "type": '%sConnector' % connector_type}], "admin_status_enabled": True } + body.get("tags").sort() if client_certificate: body["credential"] = { "client_certificate": { @@ -191,7 +192,7 @@ class L2GatewayTestCase(base.NsxlibTestCase): request_mock.assert_called_once_with( "POST", "/ws.v1/transport-node", - jsonutils.dumps(expected_req_body), + jsonutils.dumps(expected_req_body, sort_keys=True), cluster=self.fake_cluster) def test_update_gw_device(self): @@ -215,7 +216,7 @@ class L2GatewayTestCase(base.NsxlibTestCase): request_mock.assert_called_once_with( "PUT", "/ws.v1/transport-node/whatever", - jsonutils.dumps(expected_req_body), + jsonutils.dumps(expected_req_body, sort_keys=True), cluster=self.fake_cluster) def test_update_gw_device_without_certificate(self): @@ -238,7 +239,7 @@ class L2GatewayTestCase(base.NsxlibTestCase): request_mock.assert_called_once_with( "PUT", "/ws.v1/transport-node/whatever", - jsonutils.dumps(expected_req_body), + jsonutils.dumps(expected_req_body, sort_keys=True), cluster=self.fake_cluster) def test_get_gw_device_status(self):