Skip to content

Commit 6c73bc2

Browse files
authored
Merge pull request #3591 from anurag6/port_flush
Flush ports post datapath disconnect.
2 parents a890974 + d8ce89a commit 6c73bc2

File tree

4 files changed

+43
-8
lines changed

4 files changed

+43
-8
lines changed

clib/valve_test_lib.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,10 @@ def connect_dp(self, dp_id=None):
796796
self.assertTrue(valve.dp.to_conf())
797797
return connect_msgs
798798

799+
def disconnect_dp(self):
800+
valve = self.valves_manager.valves[self.DP_ID]
801+
valve.datapath_disconnect(time.time())
802+
799803
def cold_start(self, dp_id=None):
800804
"""
801805
Cold start a DP
@@ -807,7 +811,7 @@ def cold_start(self, dp_id=None):
807811
if dp_id is None:
808812
dp_id = self.DP_ID
809813
valve = self.valves_manager.valves[dp_id]
810-
valve.datapath_disconnect()
814+
valve.datapath_disconnect(time.time())
811815
return self.connect_dp(dp_id)
812816

813817
def get_prom(self, var, labels=None, bare=False, dp_id=None):
@@ -1289,7 +1293,7 @@ def test_disconnect(self):
12891293
"""Test disconnection of DP from controller."""
12901294
valve = self.valves_manager.valves[self.DP_ID]
12911295
self.assertEqual(1, int(self.get_prom('dp_status')))
1292-
self.prom_inc(partial(valve.datapath_disconnect), 'of_dp_disconnections_total')
1296+
self.prom_inc(partial(valve.datapath_disconnect, time.time()), 'of_dp_disconnections_total')
12931297
self.assertEqual(0, int(self.get_prom('dp_status')))
12941298

12951299
def test_unexpected_port(self):
@@ -2134,6 +2138,14 @@ def test_get_config_dict(self):
21342138
self.assertTrue(valve.get_config_dict())
21352139
self.assertTrue(valve.dp.get_tables())
21362140

2141+
def test_dp_disconnect_cleanup(self):
2142+
"""Test port varz cleanup post dp disconnect"""
2143+
valve = self.valves_manager.valves[self.DP_ID]
2144+
port_num = list(valve.dp.ports.keys())[0]
2145+
self.port_expected_status(port_num, 1)
2146+
self.disconnect_dp()
2147+
self.port_expected_status(port_num, 0)
2148+
21372149

21382150
class ValveTestStackedRouting(ValveTestNetwork):
21392151
"""Test inter-vlan routing with stacking capabilities in an IPV4 network"""

faucet/faucet.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ def _send_flow_msgs(self, valve, flow_msgs, ryu_dp=None):
180180
if not ryu_dp:
181181
valve.logger.error('send_flow_msgs: DP not up')
182182
return
183-
valve.send_flows(ryu_dp, flow_msgs)
183+
valve.send_flows(ryu_dp, flow_msgs, time.time())
184184

185185
def _get_valve(self, ryu_event, require_running=False):
186186
"""Get Valve instance to response to an event.
@@ -299,7 +299,7 @@ def _datapath_disconnect(self, ryu_event):
299299
valve, _, _ = self._get_valve(ryu_event)
300300
if valve is None:
301301
return
302-
valve.datapath_disconnect()
302+
valve.datapath_disconnect(time.time())
303303

304304
@set_ev_cls(ofp_event.EventOFPDescStatsReply, MAIN_DISPATCHER) # pylint: disable=no-member
305305
@kill_on_exception(exc_logname)

faucet/valve.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,7 @@ def datapath_connect(self, now, discovered_up_ports):
674674
self._reset_dp_status()
675675
return ofmsgs
676676

677-
def datapath_disconnect(self):
677+
def datapath_disconnect(self, now):
678678
"""Handle Ryu datapath disconnection event."""
679679
self.logger.warning('datapath down')
680680
self.notify(
@@ -683,6 +683,7 @@ def datapath_disconnect(self):
683683
self.dp.dyn_running = False
684684
self._inc_var('of_dp_disconnections')
685685
self._reset_dp_status()
686+
self.ports_delete(self.dp.ports.keys(), now=now)
686687

687688
def _port_delete_manager_state(self, port):
688689
ofmsgs = []
@@ -763,7 +764,7 @@ def port_add(self, port_num):
763764
"""
764765
return self.ports_add([port_num])
765766

766-
def ports_delete(self, port_nums, log_msg='down', keep_cache=False, other_valves=None):
767+
def ports_delete(self, port_nums, log_msg='down', keep_cache=False, other_valves=None, now=None):
767768
"""Handle the deletion of ports.
768769
769770
Args:
@@ -781,6 +782,10 @@ def ports_delete(self, port_nums, log_msg='down', keep_cache=False, other_valves
781782
port.dyn_phys_up = False
782783
self.logger.info('%s (%s) %s' % (port, port.description, log_msg))
783784

785+
# now is set to a time value only when ports_delete is called to flush
786+
if now:
787+
self._set_port_status(port_num, False, now)
788+
784789
if port.output_only:
785790
continue
786791

@@ -1816,7 +1821,7 @@ def prepare_send_flows(self, flow_msgs):
18161821
self.recent_ofmsgs.extend(reordered_flow_msgs)
18171822
return reordered_flow_msgs
18181823

1819-
def send_flows(self, ryu_dp, flow_msgs):
1824+
def send_flows(self, ryu_dp, flow_msgs, now):
18201825
"""Send flows to datapath (or disconnect an OF session).
18211826
18221827
Args:
@@ -1830,7 +1835,7 @@ def ryu_send_flows(local_flow_msgs):
18301835
ryu_dp.send_msg(flow_msg)
18311836

18321837
if flow_msgs is None:
1833-
self.datapath_disconnect()
1838+
self.datapath_disconnect(now)
18341839
ryu_dp.close()
18351840
else:
18361841
ryu_send_flows(flow_msgs)

tests/unit/faucet/test_valve.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,24 @@ def test_lacp_timeout(self):
453453
self.assertFalse(
454454
valve.dp.ports[1].non_stack_forwarding())
455455

456+
def test_dp_disconnect(self):
457+
"""Test LACP state when disconnects."""
458+
test_port = 1
459+
labels = self.port_labels(test_port)
460+
self.assertEqual(
461+
1, int(self.get_prom('port_lacp_state', labels=labels)))
462+
self.rcv_packet(test_port, 0, {
463+
'actor_system': '0e:00:00:00:00:02',
464+
'partner_system': FAUCET_MAC,
465+
'eth_dst': slow.SLOW_PROTOCOL_MULTICAST,
466+
'eth_src': '0e:00:00:00:00:02',
467+
'actor_state_synchronization': 1})
468+
self.assertEqual(
469+
3, int(self.get_prom('port_lacp_state', labels=labels)))
470+
self.disconnect_dp()
471+
self.assertEqual(
472+
0, int(self.get_prom('port_lacp_state', labels=labels)))
473+
456474

457475
class ValveTFMSizeOverride(ValveTestBases.ValveTestNetwork):
458476
"""Test TFM size override."""

0 commit comments

Comments
 (0)