Skip to content

Commit 58d0ede

Browse files
committed
Fix UDP pool's member status in LB with additional VIPs
With UDP LBs with additional VIPs, the status of the members included only the IPv4 (or IPv6) members, but not both. The members were marked as DOWN. Partial-Bug: #2028751 Change-Id: Idccb8734c1acf9f05cca1ec5f184410e98b819c1
1 parent 72f59a3 commit 58d0ede

File tree

3 files changed

+73
-14
lines changed

3 files changed

+73
-14
lines changed

octavia/amphorae/backends/utils/keepalivedlvs_query.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,10 @@ def get_listener_realserver_mapping(ns_name, listener_ip_ports,
9494
if 'RemoteAddress:Port' in line:
9595
result_keys = re.split(r'\s+',
9696
LVS_KEY_REGEX.findall(line)[0].strip())
97-
elif ((line.startswith(constants.PROTOCOL_UDP) or
98-
line.startswith(lib_consts.PROTOCOL_SCTP)) and
99-
find_target_block):
100-
break
101-
elif re.match(r'^(UDP|SCTP)\s+%s\s+\w+' % idex,
102-
line):
103-
find_target_block = True
97+
elif (line.startswith(constants.PROTOCOL_UDP) or
98+
line.startswith(lib_consts.PROTOCOL_SCTP)):
99+
find_target_block = re.match(r'^(UDP|SCTP)\s+%s\s+\w+' % idex,
100+
line) is not None
104101
elif find_target_block and line:
105102
rs_is_ipv4 = True
106103
all_values = V4_RS_VALUE_REGEX.findall(line)
@@ -136,7 +133,7 @@ def get_listener_realserver_mapping(ns_name, listener_ip_ports,
136133
result_keys[index]] = result_values[index]
137134
continue
138135

139-
return find_target_block, actual_member_result
136+
return actual_member_result
140137

141138

142139
def get_lvs_listener_resource_ipports_nsname(listener_id):
@@ -267,7 +264,7 @@ def get_lvs_listener_pool_status(listener_id):
267264
cfg = f.read()
268265
hm_enabled = len(CHECKER_REGEX.findall(cfg)) > 0
269266

270-
_, realserver_result = get_listener_realserver_mapping(
267+
realserver_result = get_listener_realserver_mapping(
271268
ns_name, resource_ipport_mapping['Listener']['ipports'],
272269
hm_enabled)
273270
pool_status = constants.UP

octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,24 @@
5252
" -> [fd79:35e2::8f3f]:115C "
5353
"Masq 2 0 0")
5454

55+
KERNEL_FILE_SAMPLE_MIXED = (
56+
"IP Virtual Server version 1.2.1 (size=4096)\n"
57+
"Prot LocalAddress:Port Scheduler Flags\n"
58+
" -> RemoteAddress:Port Forward Weight ActiveConn InActConn\n"
59+
"UDP [fd79:35e2:9963:0000:f816:3eff:fe6d:7a2a]:1E61 rr\n"
60+
" -> [fd79:35e2:9963:0000:f816:3eff:feca:b7bf]:08AE "
61+
"Masq 3 0 0\n"
62+
" -> [fd79:35e2:9963:0000:f816:3eff:fe9d:94df]:0D05 "
63+
"Masq 2 0 0\n"
64+
" -> [fd79:35e2::8f3f]:115C "
65+
"Masq 2 0 0\n"
66+
"UDP 0A000025:1E61 rr\n"
67+
" -> 0A000023:0D05 Masq 2 0 0\n"
68+
" -> 0A000019:08AE Masq 3 0 0\n"
69+
"UDP 0A000025:FF12 rr\n"
70+
" -> 0A000023:12AB Masq 2 0 0\n"
71+
" -> 0A000019:BF2E Masq 3 0 0")
72+
5573
CFG_FILE_TEMPLATE_v4 = (
5674
"# Configuration for Listener %(listener_id)s\n\n"
5775
"net_namespace %(ns_name)s\n\n"
@@ -345,7 +363,7 @@ def test_get_listener_realserver_mapping(self, mock_check_output):
345363
'Weight': '2',
346364
'ActiveConn': '0',
347365
'InActConn': '0'}}
348-
self.assertEqual((True, expected), result)
366+
self.assertEqual(expected, result)
349367

350368
# Ipv6 resolver
351369
input_listener_ip_port = [
@@ -372,15 +390,53 @@ def test_get_listener_realserver_mapping(self, mock_check_output):
372390
'Weight': '2',
373391
'ActiveConn': '0',
374392
'InActConn': '0'}}
375-
self.assertEqual((True, expected), result)
393+
self.assertEqual(expected, result)
394+
395+
# mixed resolver
396+
input_listener_ip_port = [
397+
'[fd79:35e2:9963:0:f816:3eff:fe6d:7a2a]:7777',
398+
'10.0.0.37:7777']
399+
mock_check_output.return_value = KERNEL_FILE_SAMPLE_MIXED
400+
result = lvs_query.get_listener_realserver_mapping(
401+
target_ns, input_listener_ip_port,
402+
health_monitor_enabled=True)
403+
expected = {'[fd79:35e2:9963:0:f816:3eff:feca:b7bf]:2222':
404+
{'status': constants.UP,
405+
'Forward': 'Masq',
406+
'Weight': '3',
407+
'ActiveConn': '0',
408+
'InActConn': '0'},
409+
'[fd79:35e2:9963:0:f816:3eff:fe9d:94df]:3333':
410+
{'status': constants.UP,
411+
'Forward': 'Masq',
412+
'Weight': '2',
413+
'ActiveConn': '0',
414+
'InActConn': '0'},
415+
'[fd79:35e2::8f3f]:4444':
416+
{'status': constants.UP,
417+
'Forward': 'Masq',
418+
'Weight': '2',
419+
'ActiveConn': '0',
420+
'InActConn': '0'},
421+
'10.0.0.25:2222': {'status': 'UP',
422+
'Forward': 'Masq',
423+
'Weight': '3',
424+
'ActiveConn': '0',
425+
'InActConn': '0'},
426+
'10.0.0.35:3333': {'status': 'UP',
427+
'Forward': 'Masq',
428+
'Weight': '2',
429+
'ActiveConn': '0',
430+
'InActConn': '0'}}
431+
self.assertEqual(expected, result)
376432

377433
# negetive cases
378434
mock_check_output.return_value = KERNAL_FILE_SAMPLE_V4
379435
for listener_ip_port in ['10.0.0.37:7776', '10.0.0.31:7777']:
380436
result = lvs_query.get_listener_realserver_mapping(
381437
target_ns, [listener_ip_port],
382438
health_monitor_enabled=True)
383-
self.assertEqual((False, {}), result)
439+
self.assertEqual({}, result)
384440

385441
mock_check_output.return_value = KERNAL_FILE_SAMPLE_V6
386442
for listener_ip_port in [
@@ -389,7 +445,7 @@ def test_get_listener_realserver_mapping(self, mock_check_output):
389445
result = lvs_query.get_listener_realserver_mapping(
390446
target_ns, [listener_ip_port],
391447
health_monitor_enabled=True)
392-
self.assertEqual((False, {}), result)
448+
self.assertEqual({}, result)
393449

394450
def test_get_lvs_listener_resource_ipports_nsname(self):
395451
# ipv4
@@ -571,7 +627,7 @@ def test_get_lvs_listener_pool_status_when_not_get_realserver_result(
571627
mock.Mock(st_mtime=1234),
572628
mock.Mock(st_mtime=1234),
573629
)
574-
mock_get_mapping.return_value = (False, {})
630+
mock_get_mapping.return_value = {}
575631
res = lvs_query.get_lvs_listener_pool_status(self.listener_id_v4)
576632
expected = {
577633
'lvs':
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
fixes:
3+
- |
4+
Fixed a bug with the status of the members of UDP pools in load balancer
5+
with IPv4 and IPv6 VIPs. Some members may have been incorrectly reported as
6+
DOWN by the Amphora.

0 commit comments

Comments
 (0)