From 7e4ac5ba72d5833410c0185afa83d9b42f5b662d Mon Sep 17 00:00:00 2001 From: Adam Harwell Date: Wed, 26 Oct 2016 17:06:29 +0200 Subject: [PATCH] UDPStatusGetter socket bind fix for ipv6 Change-Id: I8b34d2212e46c9e4f2ceef040c5eeb03d29172b8 Co-Authored-By: Dustin Lundquist --- .../amphorae/drivers/health/heartbeat_udp.py | 2 +- .../drivers/health/test_heartbeat_udp.py | 23 +++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/octavia/amphorae/drivers/health/heartbeat_udp.py b/octavia/amphorae/drivers/health/heartbeat_udp.py index 2f89c9281c..9d9c6bee3a 100644 --- a/octavia/amphorae/drivers/health/heartbeat_udp.py +++ b/octavia/amphorae/drivers/health/heartbeat_udp.py @@ -65,7 +65,7 @@ class UDPStatusGetter(object): if self.sock is not None: self.sock.close() self.sock = socket.socket(ai_family, socket.SOCK_DGRAM) - self.sock.bind((ip, port)) + self.sock.bind(self.sockaddr) if cfg.CONF.health_manager.sock_rlimit > 0: rlimit = cfg.CONF.health_manager.sock_rlimit LOG.info(_LI("setting sock rlimit to %s"), rlimit) diff --git a/octavia/tests/unit/amphorae/drivers/health/test_heartbeat_udp.py b/octavia/tests/unit/amphorae/drivers/health/test_heartbeat_udp.py index 86c78bc8d4..3a849b3c52 100644 --- a/octavia/tests/unit/amphorae/drivers/health/test_heartbeat_udp.py +++ b/octavia/tests/unit/amphorae/drivers/health/test_heartbeat_udp.py @@ -31,6 +31,13 @@ KEY = 'TEST' IP = '192.0.2.10' PORT = random.randrange(1, 9000) RLIMIT = random.randrange(1, 100) +FAKE_ADDRINFO = ( + socket.AF_INET, + socket.SOCK_DGRAM, + socket.IPPROTO_UDP, + '', + (IP, PORT) +) class TestHeartbeatUDP(base.TestCase): @@ -51,20 +58,19 @@ class TestHeartbeatUDP(base.TestCase): def test_update(self, mock_socket, mock_getaddrinfo): socket_mock = mock.MagicMock() mock_socket.return_value = socket_mock - mock_getaddrinfo.return_value = [range(1, 6)] + mock_getaddrinfo.return_value = [FAKE_ADDRINFO] bind_mock = mock.MagicMock() socket_mock.bind = bind_mock - getter = heartbeat_udp.UDPStatusGetter( - None, None) + getter = heartbeat_udp.UDPStatusGetter(None, None) - mock_getaddrinfo.assert_called_with(IP, PORT, 0, 2) - self.assertEqual(5, getter.sockaddr) - mock_socket.assert_called_with(1, socket.SOCK_DGRAM) + mock_getaddrinfo.assert_called_with(IP, PORT, 0, socket.SOCK_DGRAM) + self.assertEqual((IP, PORT), getter.sockaddr) + mock_socket.assert_called_with(socket.AF_INET, socket.SOCK_DGRAM) bind_mock.assert_called_once_with((IP, PORT)) self.conf.config(group="health_manager", sock_rlimit=RLIMIT) - mock_getaddrinfo.return_value = [range(1, 6), range(1, 6)] + mock_getaddrinfo.return_value = [FAKE_ADDRINFO, FAKE_ADDRINFO] getter.update(KEY, IP, PORT) @mock.patch('socket.getaddrinfo') @@ -76,8 +82,7 @@ class TestHeartbeatUDP(base.TestCase): recvfrom = mock.MagicMock() socket_mock.recvfrom = recvfrom - getter = heartbeat_udp.UDPStatusGetter( - None, None) + getter = heartbeat_udp.UDPStatusGetter(None, None) # key = 'TEST' msg = {"testkey": "TEST"} sample_msg = ('78daab562a492d2ec94ead54b252500a710d0e5'