]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Convert all incoming protocol numbers to string
authorAnn Kamyshnikova <akamyshnikova@mirantis.com>
Mon, 10 Nov 2014 14:05:54 +0000 (17:05 +0300)
committerAnn Kamyshnikova <akamyshnikova@mirantis.com>
Tue, 18 Nov 2014 15:51:00 +0000 (18:51 +0300)
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

Change-Id: I0a29595403a07c66888871088d5549705a097f68

neutron/db/securitygroups_db.py
neutron/extensions/securitygroup.py
neutron/tests/unit/test_extension_security_group.py

index 6fc0d870ec7d2e9d67a082ace9df2c9499c1a50d..b64fe3869cd86661beea01fab9d0c72f6a611b20 100644 (file)
@@ -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."""
index 89b9d8a74bb4fb6e1b8f092f32bc0ceea4c35e61..3524117ee9e928ebb244b7630ac990ec52dbab7b 100644 (file)
@@ -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):
index 8643240f7a81af23cbe66f3e0e6d8f12b90dfd9a..e0061940b0310e6400e6244c15fde5316b0483cf 100644 (file)
@@ -1441,3 +1441,6 @@ class TestConvertProtocol(base.BaseTestCase):
         for val in ['bad', '256', '-1']:
             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)