From ac57114c2d7dc43eb5004967a5a8b9e20398b352 Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Sun, 21 Jun 2015 03:15:26 -0700 Subject: [PATCH] Verify that version in 'prepare' is valid Raise an exception if a caller passes a something for the version that cannot be parsed as a version. Change-Id: I167849b1bc6c4d946de42c6459b3577a361e9606 Related-Bug: #1467087 --- oslo_messaging/rpc/client.py | 8 ++++++++ oslo_messaging/tests/rpc/test_client.py | 23 ++++++++++++++++------- tests/rpc/test_client.py | 14 +++++++------- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/oslo_messaging/rpc/client.py b/oslo_messaging/rpc/client.py index 3ea703456..e7490ebe5 100644 --- a/oslo_messaging/rpc/client.py +++ b/oslo_messaging/rpc/client.py @@ -164,6 +164,14 @@ class _CallContext(object): version=_marker, server=_marker, fanout=_marker, timeout=_marker, version_cap=_marker, retry=_marker): """Prepare a method invocation context. See RPCClient.prepare().""" + if version is not None and version is not cls._marker: + # quick sanity check to make sure parsable version numbers are used + try: + utils.version_is_compatible(version, version) + except (IndexError, ValueError): + raise exceptions.MessagingException( + "Version must contain a major and minor integer. Got %s" + % version) kwargs = dict( exchange=exchange, topic=topic, diff --git a/oslo_messaging/tests/rpc/test_client.py b/oslo_messaging/tests/rpc/test_client.py index e163a9297..c5b7364d8 100644 --- a/oslo_messaging/tests/rpc/test_client.py +++ b/oslo_messaging/tests/rpc/test_client.py @@ -122,21 +122,21 @@ class TestCastToTarget(test_utils.BaseTestCase): prepare=dict(namespace='testnamespace'), expect=dict(namespace='testnamespace'))), ('ctor_version', - dict(ctor=dict(version='testversion'), + dict(ctor=dict(version='1.1'), prepare={}, - expect=dict(version='testversion'))), + expect=dict(version='1.1'))), ('prepare_version', dict(ctor={}, - prepare=dict(version='testversion'), - expect=dict(version='testversion'))), + prepare=dict(version='1.1'), + expect=dict(version='1.1'))), ('prepare_version_none', - dict(ctor=dict(version='testversion'), + dict(ctor=dict(version='1.1'), prepare=dict(version=None), expect={})), ('both_version', dict(ctor=dict(version='ctorversion'), - prepare=dict(version='testversion'), - expect=dict(version='testversion'))), + prepare=dict(version='1.1'), + expect=dict(version='1.1'))), ('ctor_server', dict(ctor=dict(server='testserver'), prepare={}, @@ -517,3 +517,12 @@ class TestCanSendVersion(test_utils.BaseTestCase): can_send = client.can_send_version() self.assertEqual(self.can_send, can_send) + + def test_invalid_version_type(self): + target = oslo_messaging.Target(topic='sometopic') + transport = _FakeTransport(self.conf) + client = oslo_messaging.RPCClient(transport, target) + self.assertRaises(exceptions.MessagingException, + client.prepare, version='5') + self.assertRaises(exceptions.MessagingException, + client.prepare, version='5.a') diff --git a/tests/rpc/test_client.py b/tests/rpc/test_client.py index 5f138925e..bb772d4dd 100644 --- a/tests/rpc/test_client.py +++ b/tests/rpc/test_client.py @@ -122,21 +122,21 @@ class TestCastToTarget(test_utils.BaseTestCase): prepare=dict(namespace='testnamespace'), expect=dict(namespace='testnamespace'))), ('ctor_version', - dict(ctor=dict(version='testversion'), + dict(ctor=dict(version='1.1'), prepare={}, - expect=dict(version='testversion'))), + expect=dict(version='1.1'))), ('prepare_version', dict(ctor={}, - prepare=dict(version='testversion'), - expect=dict(version='testversion'))), + prepare=dict(version='1.1'), + expect=dict(version='1.1'))), ('prepare_version_none', - dict(ctor=dict(version='testversion'), + dict(ctor=dict(version='1.1'), prepare=dict(version=None), expect={})), ('both_version', dict(ctor=dict(version='ctorversion'), - prepare=dict(version='testversion'), - expect=dict(version='testversion'))), + prepare=dict(version='1.1'), + expect=dict(version='1.1'))), ('ctor_server', dict(ctor=dict(server='testserver'), prepare={},