1
0
mirror of https://github.com/CumulusNetworks/ifupdown2.git synced 2024-05-06 15:54:50 +00:00

addons: bridge: support multiple bridge-port configuration lines

Reviewed-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Reviewed-by: Sam Tannous <stannous@cumulusnetworks.com>
Signed-off-by: Julien Fortin <julien@cumulusnetworks.com>
This commit is contained in:
Julien Fortin
2018-06-12 17:50:22 +02:00
parent 05a4955081
commit d1265fd548

View File

@@ -812,16 +812,14 @@ class bridge(moduleBase):
ifaceobj.get_attr_value_first('bridge-ports') or
ifaceobj.get_attr_value_first('bridge-vlan-aware'))
def _get_ifaceobj_bridge_ports(self, ifaceobj, warn=True):
ports = ifaceobj.get_attr_value('bridge-ports')
if warn and ports and len(ports) > 1:
self.log_warn('%s: ignoring duplicate bridge-ports lines: %s'
%(ifaceobj.name, ports[1:]))
if ports:
if 'none' in ports[0]:
return []
return ports[0]
return None
def _get_ifaceobj_bridge_ports(self, ifaceobj):
bridge_ports = []
for brport in ifaceobj.get_attr_value('bridge-ports') or []:
if brport != 'none':
bridge_ports.extend(brport.split())
return ' '.join(bridge_ports)
def _is_bridge_port(self, ifaceobj):
if self.brctlcmd.is_bridge_port(ifaceobj.name):
@@ -2531,6 +2529,10 @@ class bridge(moduleBase):
diff.remove('bridge-l2protocol-tunnel')
# bridge-l2protocol-tunnel requires separate handling
if 'bridge-ports' in diff:
self.query_check_bridge_ports(ifaceobj, ifaceobjcurr, runningattrs.get('ports').keys(), ifaceobj_getfunc)
diff.remove('bridge-ports')
for k in diff:
# get the corresponding ifaceobj attr
v = ifaceobj.get_attr_value_first(k)
@@ -2565,38 +2567,6 @@ class bridge(moduleBase):
else:
ifaceobjcurr.update_config_with_status('bridge-stp',
rv, 1)
elif k == 'bridge-ports':
# special case ports because it can contain regex or glob
running_port_list = rv.keys() if rv else []
bridge_port_list = self._get_bridge_port_list(ifaceobj)
if not running_port_list and not bridge_port_list:
continue
portliststatus = 1
if running_port_list and bridge_port_list:
difference = set(running_port_list
).symmetric_difference(bridge_port_list)
if not difference:
portliststatus = 0
try:
port_list = self._get_ifaceobj_bridge_ports(ifaceobj,
warn=False).split()
# we want to display the same bridge-ports list as provided
# in the interfaces file but if this list contains regexes or
# globs, for now, we won't try to change it.
if 'regex' in port_list or 'glob' in port_list:
port_list = running_port_list
else:
ordered = []
for i in range(0, len(port_list)):
if port_list[i] in running_port_list:
ordered.append(port_list[i])
port_list = ordered
except:
port_list = running_port_list
ifaceobjcurr.update_config_with_status('bridge-ports',
(' '.join(port_list)
if port_list else ''),
portliststatus)
elif k in ['bridge-pathcosts',
'bridge-portprios',
'bridge-portmcrouter',
@@ -2678,6 +2648,33 @@ class bridge(moduleBase):
self._query_check_mcqv4src(ifaceobj, ifaceobjcurr)
self._query_check_l2protocol_tunnel_on_bridge(ifaceobj, ifaceobjcurr, runningattrs)
def query_check_bridge_ports(self, ifaceobj, ifaceobjcurr, running_port_list, ifaceobj_getfunc):
bridge_all_ports = []
for obj in ifaceobj_getfunc(ifaceobj.name) or []:
bridge_all_ports.extend(self._get_bridge_port_list(obj))
if not running_port_list and not bridge_all_ports:
return
ports_list_status = 0 if not set(running_port_list).symmetric_difference(bridge_all_ports) else 1
try:
port_list = self._get_ifaceobj_bridge_ports(ifaceobj).split()
# we want to display the same bridge-ports list as provided
# in the interfaces file but if this list contains regexes or
# globs, for now, we won't try to change it.
if 'regex' in port_list or 'glob' in port_list:
port_list = running_port_list
else:
ordered = []
for i in range(0, len(port_list)):
if port_list[i] in running_port_list:
ordered.append(port_list[i])
port_list = ordered
except:
port_list = running_port_list
ifaceobjcurr.update_config_with_status('bridge-ports', (' '.join(port_list) if port_list else ''), ports_list_status)
def get_ifaceobj_bridge_vids(self, ifaceobj):
vids = ('bridge-vids', ifaceobj.get_attr_value_first('bridge-vids'))
if not vids[1]:
@@ -2921,7 +2918,7 @@ class bridge(moduleBase):
def _query_check(self, ifaceobj, ifaceobjcurr, ifaceobj_getfunc=None):
if self._is_bridge(ifaceobj):
self._query_check_bridge(ifaceobj, ifaceobjcurr)
self._query_check_bridge(ifaceobj, ifaceobjcurr, ifaceobj_getfunc)
else:
self._query_check_bridge_port(ifaceobj, ifaceobjcurr,
ifaceobj_getfunc)