summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnn Kamyshnikova <akamyshnikova@mirantis.com>2014-11-10 17:05:54 +0300
committerAdam Gandelman <adamg@ubuntu.com>2014-11-25 10:56:32 -0800
commitc00b4b31276f9ae21fa0a7a213391277bda4cfa7 (patch)
treef33b8081cbe28a3af279255dbe800635e7f948c3
parent463eb73e2a99ad1af2c1f8bba466654b6468af5b (diff)
downloadneutron-c00b4b31276f9ae21fa0a7a213391277bda4cfa7.tar.gz
Convert all incoming protocol numbers to string
PostgreSQL is more sensitive for types than MySQL when it selects something from columns in database. So it fails when it tries to select from string field comparing with integer value. Added unit test to verify conversion of protocol numbers to strings. Closes-bug:#1381379 (cherry picked from commit bc34f26302faea116be7e61051c32f8787530836) Conflicts: neutron/tests/unit/test_extension_security_group.py Change-Id: I0a29595403a07c66888871088d5549705a097f68
-rw-r--r--neutron/db/securitygroups_db.py6
-rw-r--r--neutron/extensions/securitygroup.py5
-rw-r--r--neutron/tests/unit/test_extension_security_group.py3
3 files changed, 12 insertions, 2 deletions
diff --git a/neutron/db/securitygroups_db.py b/neutron/db/securitygroups_db.py
index 23b5c80cb1..9237cf31f2 100644
--- a/neutron/db/securitygroups_db.py
+++ b/neutron/db/securitygroups_db.py
@@ -296,7 +296,11 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
def _get_ip_proto_number(self, protocol):
if protocol is None:
return
- return IP_PROTOCOL_MAP.get(protocol, protocol)
+ # According to bug 1381379, protocol is always set to string to avoid
+ # problems with comparing int and string in PostgreSQL. Here this
+ # string is converted to int to give an opportunity to use it as
+ # before.
+ return int(IP_PROTOCOL_MAP.get(protocol, protocol))
def _validate_port_range(self, rule):
"""Check that port_range is valid."""
diff --git a/neutron/extensions/securitygroup.py b/neutron/extensions/securitygroup.py
index 89b9d8a74b..3524117ee9 100644
--- a/neutron/extensions/securitygroup.py
+++ b/neutron/extensions/securitygroup.py
@@ -116,7 +116,10 @@ def convert_protocol(value):
try:
val = int(value)
if val >= 0 and val <= 255:
- return value
+ # Set value of protocol number to string due to bug 1381379,
+ # PostgreSQL fails when it tries to compare integer with string,
+ # that exists in db.
+ return str(value)
raise SecurityGroupRuleInvalidProtocol(
protocol=value, values=sg_supported_protocols)
except (ValueError, TypeError):
diff --git a/neutron/tests/unit/test_extension_security_group.py b/neutron/tests/unit/test_extension_security_group.py
index 4f52ba0807..07a5cb0b39 100644
--- a/neutron/tests/unit/test_extension_security_group.py
+++ b/neutron/tests/unit/test_extension_security_group.py
@@ -1446,6 +1446,9 @@ class TestConvertProtocol(base.BaseTestCase):
self.assertRaises(ext_sg.SecurityGroupRuleInvalidProtocol,
ext_sg.convert_protocol, val)
+ def test_convert_numeric_protocol_to_string(self):
+ self.assertIsInstance(ext_sg.convert_protocol(2), str)
+
class TestSecurityGroupsXML(TestSecurityGroups):
fmt = 'xml'