mirror of
https://github.com/CumulusNetworks/ifupdown2.git
synced 2024-05-06 15:54:50 +00:00
misc bug fixes for svi address propagation, svi query etc
Ticket: CM-3346 Reviewed By: Testing Done: Tested new format with new bridge driver - add/del vlan aware bridge svi mac addresses from bridge - shorten macvlan interface names to <bridge>-<vid>-v<n> - fix query check for address-virtual interfaces - fix query check for vlan interfaces
This commit is contained in:
@@ -56,6 +56,20 @@ class address(moduleBase):
|
||||
moduleBase.__init__(self, *args, **kargs)
|
||||
self.ipcmd = None
|
||||
|
||||
def _add_address_to_bridge(self, ifaceobj, hwaddress):
|
||||
if '.' in ifaceobj.name:
|
||||
(bridgename, vlan) = ifaceobj.name.split('.')
|
||||
if self.ipcmd.bridge_is_vlan_aware(bridgename):
|
||||
self.ipcmd.bridge_fdb_add(bridgename, hwaddress,
|
||||
vlan)
|
||||
|
||||
def _remove_address_from_bridge(self, ifaceobj, hwaddress):
|
||||
if '.' in ifaceobj.name:
|
||||
(bridgename, vlan) = ifaceobj.name.split('.')
|
||||
if self.ipcmd.bridge_is_vlan_aware(bridgename):
|
||||
self.ipcmd.bridge_fdb_del(bridgename, hwaddress,
|
||||
vlan)
|
||||
|
||||
def _inet_address_config(self, ifaceobj):
|
||||
newaddrs = []
|
||||
addrs = ifaceobj.get_attr_value('address')
|
||||
@@ -126,13 +140,19 @@ class address(moduleBase):
|
||||
mtu = ifaceobj.get_attr_value_first('mtu')
|
||||
if mtu:
|
||||
self.ipcmd.link_set(ifaceobj.name, 'mtu', mtu)
|
||||
hwaddress = ifaceobj.get_attr_value_first('hwaddress')
|
||||
if hwaddress:
|
||||
self.ipcmd.link_set(ifaceobj.name, 'address', hwaddress)
|
||||
alias = ifaceobj.get_attr_value_first('alias')
|
||||
if alias:
|
||||
self.ipcmd.link_set_alias(ifaceobj.name, alias)
|
||||
hwaddress = ifaceobj.get_attr_value_first('hwaddress')
|
||||
if hwaddress:
|
||||
self.ipcmd.link_set(ifaceobj.name, 'address', hwaddress)
|
||||
self.ipcmd.batch_commit()
|
||||
|
||||
# After all adds are successful, also add the hw address
|
||||
# to the bridge if required
|
||||
if hwaddress:
|
||||
self._add_address_to_bridge(ifaceobj, hwaddress)
|
||||
|
||||
self.ipcmd.route_add_gateway(ifaceobj.name,
|
||||
ifaceobj.get_attr_value_first('gateway'))
|
||||
|
||||
@@ -151,6 +171,10 @@ class address(moduleBase):
|
||||
alias = ifaceobj.get_attr_value_first('alias')
|
||||
if alias:
|
||||
self.ipcmd.link_set(ifaceobj.name, 'alias', "\'\'")
|
||||
hwaddress = ifaceobj.get_attr_value_first('hwaddress')
|
||||
if hwaddress:
|
||||
# XXX Dont know what to reset the address to
|
||||
self._remove_address_from_bridge(ifaceobj, hwaddress)
|
||||
except Exception, e:
|
||||
self.log_warn(str(e))
|
||||
|
||||
|
@@ -53,7 +53,7 @@ class addressvirtual(moduleBase):
|
||||
hwaddress = []
|
||||
self.ipcmd.batch_start()
|
||||
av_idx = 0
|
||||
macvlan_prefix = '%s-virt' %ifaceobj.name.replace('.', '-')
|
||||
macvlan_prefix = '%s-v' %ifaceobj.name.replace('.', '-')
|
||||
for av in address_virtual_list:
|
||||
av_attrs = av.split()
|
||||
if len(av_attrs) < 2:
|
||||
@@ -64,7 +64,7 @@ class addressvirtual(moduleBase):
|
||||
|
||||
# Create a macvlan device on this device and set the virtual
|
||||
# router mac and ip on it
|
||||
macvlan_ifacename = '%s-%d' %(macvlan_prefix, av_idx)
|
||||
macvlan_ifacename = '%s%d' %(macvlan_prefix, av_idx)
|
||||
if not self.ipcmd.link_exists(macvlan_ifacename):
|
||||
rtnetlink_api.rtnl_api.create_macvlan(macvlan_ifacename,
|
||||
ifaceobj.name)
|
||||
@@ -85,7 +85,7 @@ class addressvirtual(moduleBase):
|
||||
return
|
||||
hwaddress = []
|
||||
self.ipcmd.batch_start()
|
||||
macvlan_prefix = '%s-virt' %ifaceobj.name.replace('.', '-')
|
||||
macvlan_prefix = '%s-v' %ifaceobj.name.replace('.', '-')
|
||||
for macvlan_ifacename in glob.glob("/sys/class/net/%s-*" %macvlan_prefix):
|
||||
macvlan_ifacename = os.path.basename(macvlan_ifacename)
|
||||
if not self.ipcmd.link_exists(macvlan_ifacename):
|
||||
@@ -108,7 +108,7 @@ class addressvirtual(moduleBase):
|
||||
hwaddress = []
|
||||
self.ipcmd.batch_start()
|
||||
av_idx = 0
|
||||
macvlan_prefix = '%s-virt' %ifaceobj.name.replace('.', '-')
|
||||
macvlan_prefix = '%s-v' %ifaceobj.name.replace('.', '-')
|
||||
for av in address_virtual_list:
|
||||
av_attrs = av.split()
|
||||
if len(av_attrs) < 2:
|
||||
@@ -118,7 +118,7 @@ class addressvirtual(moduleBase):
|
||||
continue
|
||||
|
||||
# Delete the macvlan device on this device
|
||||
macvlan_ifacename = '%s-%d' %(macvlan_prefix, av_idx)
|
||||
macvlan_ifacename = '%s%d' %(macvlan_prefix, av_idx)
|
||||
self.ipcmd.link_delete(os.path.basename(macvlan_ifacename))
|
||||
if av_attrs[0] != 'None':
|
||||
hwaddress.append(av_attrs[0])
|
||||
@@ -142,7 +142,8 @@ class addressvirtual(moduleBase):
|
||||
|
||||
def _down(self, ifaceobj):
|
||||
try:
|
||||
self._remove_address_config(ifaceobj, ifaceobj.get_attr_value('address-virtual'))
|
||||
self._remove_address_config(ifaceobj,
|
||||
ifaceobj.get_attr_value('address-virtual'))
|
||||
except Exception, e:
|
||||
self.log_warn(str(e))
|
||||
|
||||
@@ -150,8 +151,10 @@ class addressvirtual(moduleBase):
|
||||
address_virtual_list = ifaceobj.get_attr_value('address-virtual')
|
||||
if not address_virtual_list:
|
||||
return
|
||||
if not self.ipcmd.link_exists(ifaceobj.name):
|
||||
return
|
||||
av_idx = 0
|
||||
macvlan_prefix = '%s-virt' %ifaceobj.name.replace('.', '-')
|
||||
macvlan_prefix = '%s-v' %ifaceobj.name.replace('.', '-')
|
||||
for address_virtual in address_virtual_list:
|
||||
av_attrs = address_virtual.split()
|
||||
if len(av_attrs) < 2:
|
||||
@@ -161,11 +164,23 @@ class addressvirtual(moduleBase):
|
||||
continue
|
||||
|
||||
# Check if the macvlan device on this interface
|
||||
macvlan_ifacename = '%s-%d' %(macvlan_prefix, av_idx)
|
||||
if self.ipcmd.link_exists(macvlan_ifacename):
|
||||
# XXX Check mac and ip address
|
||||
macvlan_ifacename = '%s%d' %(macvlan_prefix, av_idx)
|
||||
if not self.ipcmd.link_exists(macvlan_ifacename):
|
||||
ifaceobjcurr.update_config_with_status('address-virtual',
|
||||
'', 1)
|
||||
av_idx += 1
|
||||
continue
|
||||
# Check mac and ip address
|
||||
rhwaddress = self.ipcmd.link_get_hwaddress(macvlan_ifacename)
|
||||
raddrs = self.ipcmd.addr_get(macvlan_ifacename)
|
||||
if not raddrs or not rhwaddress:
|
||||
ifaceobjcurr.update_config_with_status('address-virtual', '', 1)
|
||||
av_idx += 1
|
||||
continue
|
||||
|
||||
raddrs = raddrs.keys()
|
||||
self.logger.info(rhwaddress)
|
||||
self.logger.info(raddrs)
|
||||
if rhwaddress == av_attrs[0] and raddrs == av_attrs[1:]:
|
||||
ifaceobjcurr.update_config_with_status('address-virtual',
|
||||
address_virtual, 0)
|
||||
|
@@ -441,6 +441,9 @@ class iface():
|
||||
outbuf = ''
|
||||
if self.auto:
|
||||
outbuf += 'auto %s\n' %self.name
|
||||
if self.type == ifaceType.BRIDGE_VLAN:
|
||||
outbuf += 'vlan %s' %self.name
|
||||
else:
|
||||
outbuf += 'iface %s' %self.name
|
||||
if self.addr_family:
|
||||
outbuf += ' %s' %self.addr_family
|
||||
|
@@ -224,8 +224,7 @@ class ifupdownMain(ifupdownBase):
|
||||
# to indicate if we should follow upperifaces
|
||||
#
|
||||
ifaceobj = self.get_ifaceobj_first(ifacename)
|
||||
if (ifaceobj.type == ifaceType.BRIDGE or
|
||||
ifaceobj.type == ifaceType.BRIDGE_VLAN):
|
||||
if ifaceobj.type == ifaceType.BRIDGE_VLAN:
|
||||
return False
|
||||
return True
|
||||
|
||||
@@ -247,6 +246,7 @@ class ifupdownMain(ifupdownBase):
|
||||
"""
|
||||
ifaceobjcurr = iface()
|
||||
ifaceobjcurr.name = ifaceobj.name
|
||||
ifaceobjcurr.type = ifaceobj.type
|
||||
ifaceobjcurr.lowerifaces = ifaceobj.lowerifaces
|
||||
ifaceobjcurr.priv_flags = ifaceobj.priv_flags
|
||||
ifaceobjcurr.auto = ifaceobj.auto
|
||||
|
Reference in New Issue
Block a user