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 Change-Id: I0a29595403a07c66888871088d5549705a097f68
This commit is contained in:
parent
a67d68e862
commit
532e2d2012
@ -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."""
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user