Skip to content

Commit a5dcdc7

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Fix UDP pool's member status in LB with additional VIPs"
2 parents 7da273c + 58d0ede commit a5dcdc7

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)