Skip to content

Commit 12bf2be

Browse files
authored
Merge pull request #2972 from grafnu/dynreload
Clone dyn_ port state on reconfigure
2 parents b0283a3 + ec28d01 commit 12bf2be

File tree

4 files changed

+47
-13
lines changed

4 files changed

+47
-13
lines changed

faucet/dp.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,14 @@ def __init__(self, _id, dp_id, conf):
331331
def __str__(self):
332332
return self.name
333333

334+
def clone_dyn_state(self, prev_dp):
335+
self.dyn_running = prev_dp.dyn_running
336+
self.dyn_up_port_nos = set(prev_dp.dyn_up_port_nos)
337+
self.dyn_last_coldstart_time = prev_dp.dyn_last_coldstart_time
338+
for port in prev_dp.ports:
339+
if port in self.ports:
340+
self.ports[port].clone_dyn_state(prev_dp.ports[port])
341+
334342
def check_config(self):
335343
super(DP, self).check_config()
336344
test_config_condition(not isinstance(self.dp_id, int), (

faucet/port.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,18 @@ def set_defaults(self):
189189
self._set_default('description', self.name)
190190
self._set_default('tagged_vlans', [])
191191

192+
def clone_dyn_state(self, old_port):
193+
self.dyn_dot1x_native_vlan = old_port.dyn_dot1x_native_vlan
194+
self.dyn_lacp_up = old_port.dyn_lacp_up
195+
self.dyn_lacp_updated_time = old_port.dyn_lacp_updated_time
196+
self.dyn_last_ban_time = old_port.dyn_last_ban_time
197+
self.dyn_last_lacp_pkt = old_port.dyn_last_lacp_pkt
198+
self.dyn_last_lldp_beacon_time = old_port.dyn_last_lldp_beacon_time
199+
self.dyn_learn_ban_count = old_port.dyn_learn_ban_count
200+
self.dyn_phys_up = old_port.dyn_phys_up
201+
self.dyn_stack_current_state = old_port.dyn_stack_current_state
202+
self.dyn_stack_probe_info = old_port.dyn_stack_probe_info.copy()
203+
192204
def check_config(self):
193205
super(Port, self).check_config()
194206
test_config_condition(not (isinstance(self.number, int) and self.number > 0 and (

faucet/valve.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,12 @@ def close_logs(self):
140140
valve_util.close_logger(self.logger.logger)
141141
valve_util.close_logger(self.ofchannel_logger)
142142

143-
def dp_init(self):
143+
def dp_init(self, new_dp=None):
144144
"""Initialize datapath state at connection/re/config time."""
145+
if new_dp:
146+
new_dp.clone_dyn_state(self.dp)
147+
self.dp = new_dp
148+
145149
self.close_logs()
146150
self.logger = ValveLogger(
147151
logging.getLogger(self.logname + '.valve'), self.dp.dp_id, self.dp.name)
@@ -1406,14 +1410,12 @@ def _apply_config_changes(self, new_dp, changes):
14061410

14071411
if self._pipeline_change():
14081412
self.logger.info('pipeline change')
1409-
self.dp = new_dp
1410-
self.dp_init()
1413+
self.dp_init(new_dp)
14111414
return True, []
14121415

14131416
if all_ports_changed:
14141417
self.logger.info('all ports changed')
1415-
self.dp = new_dp
1416-
self.dp_init()
1418+
self.dp_init(new_dp)
14171419
return True, []
14181420

14191421
all_up_port_nos = [
@@ -1434,8 +1436,7 @@ def _apply_config_changes(self, new_dp, changes):
14341436
self.logger.info('ports changed/added: %s' % changed_ports)
14351437
ofmsgs.extend(self.ports_delete(changed_ports))
14361438

1437-
self.dp = new_dp
1438-
self.dp_init()
1439+
self.dp_init(new_dp)
14391440

14401441
if changed_vlans:
14411442
self.logger.info('VLANs changed/added: %s' % changed_vlans)
@@ -1469,14 +1470,8 @@ def reload_config(self, _now, new_dp):
14691470
Returns:
14701471
ofmsgs (list): OpenFlow messages.
14711472
"""
1472-
dp_running = self.dp.dyn_running
1473-
up_ports = self.dp.dyn_up_port_nos
1474-
coldstart_time = self.dp.dyn_last_coldstart_time
14751473
cold_start, ofmsgs = self._apply_config_changes(
14761474
new_dp, self.dp.get_config_changes(self.logger, new_dp))
1477-
self.dp.dyn_running = dp_running
1478-
self.dp.dyn_up_port_nos = up_ports
1479-
self.dp.dyn_last_coldstart_time = coldstart_time
14801475
restart_type = None
14811476
if cold_start:
14821477
restart_type = 'cold'

tests/integration/mininet_tests.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6854,6 +6854,25 @@ def test_untagged(self):
68546854
self.verify_stack_hosts()
68556855
self.flap_all_switch_ports()
68566856

6857+
def test_dyn_fail(self):
6858+
"""Test lacp fail on reload with dynamic lacp status."""
6859+
6860+
conf = self._get_faucet_conf()
6861+
src_port = self.non_host_ports(self.dpids[0])[0]
6862+
dst_port = self.non_host_ports(self.dpids[0])[1]
6863+
fail_port = self.non_host_ports(self.dpids[1])[0]
6864+
6865+
self.wait_for_lacp_port_up(src_port, self.dpids[0], 'faucet-1')
6866+
self.wait_for_lacp_port_up(dst_port, self.dpids[0], 'faucet-1')
6867+
6868+
conf['dps']['faucet-2']['interfaces'][fail_port]['lacp'] = 0
6869+
conf['dps']['faucet-2']['interfaces'][fail_port]['lacp_active'] = False
6870+
self.reload_conf(conf, self.faucet_config_path, restart=True,
6871+
cold_start=False, change_expected=False)
6872+
6873+
self.wait_for_lacp_port_down(src_port, self.dpids[0], 'faucet-1')
6874+
self.wait_for_lacp_port_up(dst_port, self.dpids[0], 'faucet-1')
6875+
68576876

68586877
class FaucetStackStringOfDPUntaggedTest(FaucetStringOfDPTest):
68596878
"""Test topology of stacked datapaths with untagged hosts."""

0 commit comments

Comments
 (0)