2014-10-09 16:02:46 -07:00
|
|
|
#!/usr/bin/python
|
|
|
|
#
|
2018-12-13 11:43:32 -08:00
|
|
|
# Copyright 2014-2017 Cumulus Networks, Inc. All rights reserved.
|
2014-10-09 16:02:46 -07:00
|
|
|
# Author: Roopa Prabhu, roopa@cumulusnetworks.com
|
|
|
|
#
|
|
|
|
|
|
|
|
import os
|
|
|
|
import glob
|
|
|
|
|
2018-12-13 11:43:32 -08:00
|
|
|
from ipaddr import IPNetwork, IPv6Network
|
|
|
|
|
|
|
|
try:
|
|
|
|
from ifupdown2.ifupdown.iface import *
|
|
|
|
from ifupdown2.ifupdown.netlink import netlink
|
|
|
|
|
|
|
|
from ifupdown2.ifupdownaddons.LinkUtils import LinkUtils
|
|
|
|
from ifupdown2.ifupdownaddons.modulebase import moduleBase
|
|
|
|
|
|
|
|
import ifupdown2.ifupdown.statemanager as statemanager
|
|
|
|
import ifupdown2.ifupdown.ifupdownflags as ifupdownflags
|
|
|
|
import ifupdown2.ifupdown.ifupdownconfig as ifupdownconfig
|
|
|
|
except ImportError:
|
|
|
|
from ifupdown.iface import *
|
|
|
|
from ifupdown.netlink import netlink
|
|
|
|
|
|
|
|
from ifupdownaddons.LinkUtils import LinkUtils
|
|
|
|
from ifupdownaddons.modulebase import moduleBase
|
|
|
|
|
|
|
|
import ifupdown.statemanager as statemanager
|
|
|
|
import ifupdown.ifupdownflags as ifupdownflags
|
|
|
|
import ifupdown.ifupdownconfig as ifupdownconfig
|
|
|
|
|
|
|
|
|
2014-10-09 16:02:46 -07:00
|
|
|
class addressvirtual(moduleBase):
|
|
|
|
""" ifupdown2 addon module to configure virtual addresses """
|
|
|
|
|
|
|
|
_modinfo = {'mhelp' : 'address module configures virtual addresses for ' +
|
|
|
|
'interfaces. It creates a macvlan interface for ' +
|
|
|
|
'every mac ip address-virtual line',
|
|
|
|
'attrs' : {
|
|
|
|
'address-virtual' :
|
2016-08-01 09:19:31 +02:00
|
|
|
{ 'help' : 'bridge router virtual mac and ips',
|
2016-12-29 16:29:20 +00:00
|
|
|
'multivalue' : True,
|
2016-08-01 17:20:44 +02:00
|
|
|
'validvals' : ['<mac-ip/prefixlen-list>',],
|
2016-05-31 13:12:21 -07:00
|
|
|
'example' : ['address-virtual 00:11:22:33:44:01 11.0.1.1/24 11.0.1.2/24']}
|
2014-10-09 16:02:46 -07:00
|
|
|
}}
|
|
|
|
|
2014-11-03 17:55:51 -08:00
|
|
|
|
2014-10-09 16:02:46 -07:00
|
|
|
def __init__(self, *args, **kargs):
|
|
|
|
moduleBase.__init__(self, *args, **kargs)
|
|
|
|
self.ipcmd = None
|
2014-11-03 17:55:51 -08:00
|
|
|
self._bridge_fdb_query_cache = {}
|
2014-10-09 16:02:46 -07:00
|
|
|
|
[PATCH ifupdown2] addons: addressvirtual: fixup macvlan device enslavements for vrfs
Ticket: CM-12988
Reviewed By: julien, nikhil, dsa
Testing Done: tested ifup and ifdown of vrf devices with address virtual
slaves
This patch fixes up macvlan device enslavements when vrf device
or vrf slave is brought down and up. address virtual macvlan
devices on vrf slaves need to enslaved to the vrf. This
patch checks and fixes up those vrf enslavements for the following
cases:
ifdown <vrf_device> && ifup <vrf_device>
ifdown <vrf_slave> && ifup <vrf_slave>
starting state:
------------
$ip -br link show
myvrf UP 46:c6:44:db:37:60 <NOARP,MASTER,UP,LOWER_UP>
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
$ifdown myvrf
$ip -br link show
bridge.901@bridge DOWN 44:38:39:00:77:88 <BROADCAST,MULTICAST>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST,M-DOWN>
before patch (macvlan device bridge-901-v0 did not come up:
----------------------------------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
after patch:
------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
2016-10-19 10:43:45 -07:00
|
|
|
def get_dependent_ifacenames(self, ifaceobj, ifacenames_all=None):
|
|
|
|
if ifaceobj.get_attr_value('address-virtual'):
|
|
|
|
ifaceobj.link_privflags |= ifaceLinkPrivFlags.ADDRESS_VIRTUAL_SLAVE
|
2014-10-09 16:02:46 -07:00
|
|
|
|
2014-11-08 06:29:26 -08:00
|
|
|
def _get_macvlan_prefix(self, ifaceobj):
|
|
|
|
return '%s-v' %ifaceobj.name[0:13].replace('.', '-')
|
|
|
|
|
2014-10-28 16:10:00 -07:00
|
|
|
def _add_addresses_to_bridge(self, ifaceobj, hwaddress):
|
2014-11-03 17:55:51 -08:00
|
|
|
# XXX: batch the addresses
|
2018-12-13 11:43:32 -08:00
|
|
|
if ifaceobj.link_kind & ifaceLinkKind.VLAN:
|
|
|
|
bridgename = ifaceobj.lowerifaces[0]
|
|
|
|
vlan = self._get_vlan_id(ifaceobj)
|
2014-10-28 16:10:00 -07:00
|
|
|
if self.ipcmd.bridge_is_vlan_aware(bridgename):
|
|
|
|
[self.ipcmd.bridge_fdb_add(bridgename, addr,
|
|
|
|
vlan) for addr in hwaddress]
|
2014-11-03 17:55:51 -08:00
|
|
|
elif self.ipcmd.is_bridge(ifaceobj.name):
|
|
|
|
[self.ipcmd.bridge_fdb_add(ifaceobj.name, addr)
|
|
|
|
for addr in hwaddress]
|
2014-10-28 16:10:00 -07:00
|
|
|
|
|
|
|
def _remove_addresses_from_bridge(self, ifaceobj, hwaddress):
|
2014-11-03 17:55:51 -08:00
|
|
|
# XXX: batch the addresses
|
2018-12-13 11:43:32 -08:00
|
|
|
if ifaceobj.link_kind & ifaceLinkKind.VLAN:
|
|
|
|
bridgename = ifaceobj.lowerifaces[0]
|
|
|
|
vlan = self._get_vlan_id(ifaceobj)
|
2014-10-28 16:10:00 -07:00
|
|
|
if self.ipcmd.bridge_is_vlan_aware(bridgename):
|
2015-07-23 15:43:45 -04:00
|
|
|
for addr in hwaddress:
|
|
|
|
try:
|
|
|
|
self.ipcmd.bridge_fdb_del(bridgename, addr, vlan)
|
|
|
|
except Exception, e:
|
|
|
|
self.logger.debug("%s: %s" %(ifaceobj.name, str(e)))
|
|
|
|
pass
|
2014-11-03 17:55:51 -08:00
|
|
|
elif self.ipcmd.is_bridge(ifaceobj.name):
|
2015-07-23 15:43:45 -04:00
|
|
|
for addr in hwaddress:
|
|
|
|
try:
|
|
|
|
self.ipcmd.bridge_fdb_del(ifaceobj.name, addr)
|
|
|
|
except Exception, e:
|
|
|
|
self.logger.debug("%s: %s" %(ifaceobj.name, str(e)))
|
|
|
|
pass
|
2014-11-03 17:55:51 -08:00
|
|
|
|
|
|
|
def _get_bridge_fdbs(self, bridgename, vlan):
|
|
|
|
fdbs = self._bridge_fdb_query_cache.get(bridgename)
|
|
|
|
if not fdbs:
|
|
|
|
fdbs = self.ipcmd.bridge_fdb_show_dev(bridgename)
|
|
|
|
if not fdbs:
|
|
|
|
return
|
|
|
|
self._bridge_fdb_query_cache[bridgename] = fdbs
|
|
|
|
return fdbs.get(vlan)
|
|
|
|
|
|
|
|
def _check_addresses_in_bridge(self, ifaceobj, hwaddress):
|
|
|
|
""" If the device is a bridge, make sure the addresses
|
|
|
|
are in the bridge """
|
2018-12-13 11:43:32 -08:00
|
|
|
if ifaceobj.link_kind & ifaceLinkKind.VLAN:
|
|
|
|
bridgename = ifaceobj.lowerifaces[0]
|
|
|
|
vlan = self._get_vlan_id(ifaceobj)
|
2014-11-03 17:55:51 -08:00
|
|
|
if self.ipcmd.bridge_is_vlan_aware(bridgename):
|
2018-12-13 11:43:32 -08:00
|
|
|
fdb_addrs = self._get_bridge_fdbs(bridgename, str(vlan))
|
2014-11-03 17:55:51 -08:00
|
|
|
if not fdb_addrs or hwaddress not in fdb_addrs:
|
|
|
|
return False
|
|
|
|
return True
|
2014-10-28 16:10:00 -07:00
|
|
|
|
2014-12-31 23:43:27 -08:00
|
|
|
def _fix_connected_route(self, ifaceobj, vifacename, addr):
|
|
|
|
#
|
2018-12-13 11:43:32 -08:00
|
|
|
# XXX: Hack to make sure the primary address
|
2014-12-31 23:43:27 -08:00
|
|
|
# is the first in the routing table.
|
|
|
|
#
|
|
|
|
# We use `ip route get` on the vrr network to see which
|
|
|
|
# device the kernel returns. if it is the mac vlan device,
|
|
|
|
# flap the macvlan device to adjust the routing table entry.
|
2018-12-13 11:43:32 -08:00
|
|
|
#
|
2014-12-31 23:43:27 -08:00
|
|
|
# flapping the macvlan device makes sure the macvlan
|
|
|
|
# connected route goes through delete + add, hence adjusting
|
|
|
|
# the order in the routing table.
|
|
|
|
#
|
|
|
|
try:
|
|
|
|
self.logger.info('%s: checking route entry ...' %ifaceobj.name)
|
|
|
|
ip = IPNetwork(addr)
|
2018-12-13 11:43:32 -08:00
|
|
|
|
|
|
|
# we don't support ip6 route fix yet
|
|
|
|
if type(ip) == IPv6Network:
|
|
|
|
return
|
|
|
|
|
2014-12-31 23:43:27 -08:00
|
|
|
route_prefix = '%s/%d' %(ip.network, ip.prefixlen)
|
|
|
|
|
|
|
|
dev = self.ipcmd.ip_route_get_dev(route_prefix)
|
2018-12-13 11:43:32 -08:00
|
|
|
if dev and dev != ifaceobj.name:
|
2014-12-31 23:43:27 -08:00
|
|
|
self.logger.info('%s: preferred routing entry ' %ifaceobj.name +
|
|
|
|
'seems to be of the macvlan dev %s'
|
|
|
|
%vifacename +
|
|
|
|
' .. flapping macvlan dev to fix entry.')
|
|
|
|
self.ipcmd.link_down(vifacename)
|
|
|
|
self.ipcmd.link_up(vifacename)
|
|
|
|
except Exception, e:
|
|
|
|
self.logger.debug('%s: fixing route entry failed (%s)'
|
2018-12-13 11:43:32 -08:00
|
|
|
% (ifaceobj.name, str(e)))
|
2014-12-31 23:43:27 -08:00
|
|
|
pass
|
|
|
|
|
2016-07-17 22:50:26 -07:00
|
|
|
def _handle_vrf_slaves(self, macvlan_ifacename, ifaceobj):
|
|
|
|
vrfname = self.ipcmd.link_get_master(ifaceobj.name)
|
|
|
|
if vrfname:
|
2018-12-13 11:43:32 -08:00
|
|
|
self.ipcmd.link_set(macvlan_ifacename, 'master', vrfname)
|
2016-07-17 22:50:26 -07:00
|
|
|
|
2015-07-23 15:43:45 -04:00
|
|
|
def _get_macs_from_old_config(self, ifaceobj=None):
|
|
|
|
""" This method returns a list of the mac addresses
|
|
|
|
in the address-virtual attribute for the bridge. """
|
|
|
|
maclist = []
|
|
|
|
saved_ifaceobjs = statemanager.statemanager_api.get_ifaceobjs(ifaceobj.name)
|
|
|
|
if not saved_ifaceobjs:
|
|
|
|
return maclist
|
|
|
|
# we need the old saved configs from the statemanager
|
|
|
|
for oldifaceobj in saved_ifaceobjs:
|
|
|
|
if not oldifaceobj.get_attr_value('address-virtual'):
|
|
|
|
continue
|
|
|
|
for av in oldifaceobj.get_attr_value('address-virtual'):
|
|
|
|
macip = av.split()
|
|
|
|
if len(macip) < 2:
|
|
|
|
self.logger.debug("%s: incorrect old address-virtual attrs '%s'"
|
|
|
|
%(oldifaceobj.name, av))
|
|
|
|
continue
|
|
|
|
maclist.append(macip[0])
|
|
|
|
return maclist
|
|
|
|
|
2014-10-28 16:10:00 -07:00
|
|
|
def _apply_address_config(self, ifaceobj, address_virtual_list):
|
2016-04-14 14:45:47 -07:00
|
|
|
purge_existing = False if ifupdownflags.flags.PERFMODE else True
|
2014-10-09 16:02:46 -07:00
|
|
|
|
2016-04-29 21:19:42 +02:00
|
|
|
lower_iface_mtu = update_mtu = None
|
2018-12-13 11:43:32 -08:00
|
|
|
if ifupdownconfig.config.get('adjust_logical_dev_mtu', '1') != '0':
|
2016-04-29 21:19:42 +02:00
|
|
|
if ifaceobj.lowerifaces and address_virtual_list:
|
|
|
|
update_mtu = True
|
|
|
|
|
2014-10-28 16:10:00 -07:00
|
|
|
hwaddress = []
|
2014-10-09 16:02:46 -07:00
|
|
|
self.ipcmd.batch_start()
|
|
|
|
av_idx = 0
|
2014-11-08 06:29:26 -08:00
|
|
|
macvlan_prefix = self._get_macvlan_prefix(ifaceobj)
|
2014-10-09 16:02:46 -07:00
|
|
|
for av in address_virtual_list:
|
|
|
|
av_attrs = av.split()
|
|
|
|
if len(av_attrs) < 2:
|
2016-05-15 13:28:10 -07:00
|
|
|
self.log_error("%s: incorrect address-virtual attrs '%s'"
|
|
|
|
%(ifaceobj.name, av), ifaceobj,
|
|
|
|
raise_error=False)
|
2014-10-09 16:02:46 -07:00
|
|
|
av_idx += 1
|
|
|
|
continue
|
|
|
|
|
2016-03-17 13:01:26 -07:00
|
|
|
mac = av_attrs[0]
|
|
|
|
if not self.check_mac_address(ifaceobj, mac):
|
|
|
|
continue
|
2014-10-09 16:02:46 -07:00
|
|
|
# Create a macvlan device on this device and set the virtual
|
|
|
|
# router mac and ip on it
|
2014-12-31 23:43:27 -08:00
|
|
|
link_created = False
|
2014-10-28 23:04:40 -07:00
|
|
|
macvlan_ifacename = '%s%d' %(macvlan_prefix, av_idx)
|
2014-10-12 13:50:05 -07:00
|
|
|
if not self.ipcmd.link_exists(macvlan_ifacename):
|
2018-12-13 11:43:32 -08:00
|
|
|
try:
|
|
|
|
netlink.link_add_macvlan(ifaceobj.name, macvlan_ifacename)
|
|
|
|
except:
|
|
|
|
self.ipcmd.link_add_macvlan(ifaceobj.name, macvlan_ifacename)
|
2014-12-31 23:43:27 -08:00
|
|
|
link_created = True
|
2018-12-13 11:43:32 -08:00
|
|
|
|
|
|
|
# first thing we need to handle vrf enslavement
|
|
|
|
if (ifaceobj.link_privflags & ifaceLinkPrivFlags.VRF_SLAVE):
|
|
|
|
self._handle_vrf_slaves(macvlan_ifacename, ifaceobj)
|
|
|
|
|
2015-11-16 23:43:39 -05:00
|
|
|
ips = av_attrs[1:]
|
|
|
|
if mac != 'None':
|
|
|
|
mac = mac.lower()
|
|
|
|
# customer could have used UPPERCASE for MAC
|
|
|
|
self.ipcmd.link_set_hwaddress(macvlan_ifacename, mac)
|
|
|
|
hwaddress.append(mac)
|
2018-12-13 11:43:32 -08:00
|
|
|
self.ipcmd.addr_add_multiple(ifaceobj, macvlan_ifacename, ips,
|
2014-10-09 16:02:46 -07:00
|
|
|
purge_existing)
|
2016-04-29 21:19:42 +02:00
|
|
|
|
2014-12-31 23:43:27 -08:00
|
|
|
# If link existed before, flap the link
|
|
|
|
if not link_created:
|
|
|
|
self._fix_connected_route(ifaceobj, macvlan_ifacename,
|
2015-11-16 23:43:39 -05:00
|
|
|
ips[0])
|
2016-04-29 21:19:42 +02:00
|
|
|
if update_mtu:
|
addons: addressvirtual: adjusting macvlan mtu based on the lower device
Ticket: CM-11214
Reviewed By: Roopa
Testing Done:
Previously we were adjusting the macvlan mtu based on the wrong device.
We used to do, using the config example bellow:
get_mtu(ifaceobj.lowerifaces[0])
get_mtu("bridge")
instead of doing get_mtu(bridge.20)
$ cat /etc/network/interfaces
auto tap0
iface tap0
#mtu 9000
mtu 1500
auto bridge
iface bridge
bridge-ports tap0
auto bridge.20
iface bridge.20
address 10.7.192.194/27
address-virtual 44:38:39:ff:00:20 10.7.192.193
$ ifreload -a
$ ip link show
bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
bridge.20@bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
bridge-20-v0@bridge.20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
$ #change mtu to 9000
$ ifreload -a
$ ip link show
bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP mode DEFAULT group default
bridge.20@bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP mode DEFAULT group default
bridge-20-v0@bridge.20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP mode DEFAULT group default
$
Signed-off-by: Julien Fortin <julien@cumulusnetworks.com>
2016-09-14 17:15:36 -07:00
|
|
|
lower_iface_mtu = self.ipcmd.link_get_mtu(ifaceobj.name, refresh=True)
|
2016-04-29 21:19:42 +02:00
|
|
|
update_mtu = False
|
|
|
|
|
2018-12-13 11:43:32 -08:00
|
|
|
if lower_iface_mtu and lower_iface_mtu != self.ipcmd.link_get_mtu(macvlan_ifacename, refresh=True):
|
addons: addressvirtual: adjusting macvlan mtu based on the lower device
Ticket: CM-11214
Reviewed By: Roopa
Testing Done:
Previously we were adjusting the macvlan mtu based on the wrong device.
We used to do, using the config example bellow:
get_mtu(ifaceobj.lowerifaces[0])
get_mtu("bridge")
instead of doing get_mtu(bridge.20)
$ cat /etc/network/interfaces
auto tap0
iface tap0
#mtu 9000
mtu 1500
auto bridge
iface bridge
bridge-ports tap0
auto bridge.20
iface bridge.20
address 10.7.192.194/27
address-virtual 44:38:39:ff:00:20 10.7.192.193
$ ifreload -a
$ ip link show
bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
bridge.20@bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
bridge-20-v0@bridge.20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
$ #change mtu to 9000
$ ifreload -a
$ ip link show
bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP mode DEFAULT group default
bridge.20@bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP mode DEFAULT group default
bridge-20-v0@bridge.20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP mode DEFAULT group default
$
Signed-off-by: Julien Fortin <julien@cumulusnetworks.com>
2016-09-14 17:15:36 -07:00
|
|
|
try:
|
|
|
|
self.ipcmd.link_set_mtu(macvlan_ifacename,
|
|
|
|
lower_iface_mtu)
|
|
|
|
except Exception as e:
|
|
|
|
self.logger.info('%s: failed to set mtu %s: %s' %
|
|
|
|
(macvlan_ifacename, lower_iface_mtu, e))
|
2016-04-29 21:19:42 +02:00
|
|
|
|
2016-09-14 11:19:57 -07:00
|
|
|
# set macvlan device to up in anycase.
|
|
|
|
# since we auto create them here..we are responsible
|
|
|
|
# to bring them up here in the case they were brought down
|
|
|
|
# by some other entity in the system.
|
|
|
|
netlink.link_set_updown(macvlan_ifacename, "up")
|
2018-12-13 11:43:32 -08:00
|
|
|
else:
|
|
|
|
try:
|
|
|
|
self.ipcmd.fix_ipv6_route_metric(ifaceobj, macvlan_ifacename, ips)
|
|
|
|
except Exception as e:
|
|
|
|
self.logger.debug('fix_vrf_slave_ipv6_route_metric: failed: %s' % e)
|
2016-07-17 22:50:26 -07:00
|
|
|
|
2016-06-23 14:58:14 -07:00
|
|
|
# Disable IPv6 duplicate address detection on VRR interfaces
|
|
|
|
for key, sysval in { 'accept_dad' : '0', 'dad_transmits' : '0' }.iteritems():
|
|
|
|
syskey = 'net.ipv6.conf.%s.%s' % (macvlan_ifacename, key)
|
|
|
|
if self.sysctl_get(syskey) != sysval:
|
|
|
|
self.sysctl_set(syskey, sysval)
|
|
|
|
|
2014-10-09 16:02:46 -07:00
|
|
|
av_idx += 1
|
|
|
|
self.ipcmd.batch_commit()
|
|
|
|
|
2015-07-23 15:43:45 -04:00
|
|
|
# check the statemanager for old configs.
|
|
|
|
# We need to remove only the previously configured FDB entries
|
|
|
|
oldmacs = self._get_macs_from_old_config(ifaceobj)
|
|
|
|
# get a list of fdbs in old that are not in new config meaning they should
|
|
|
|
# be removed since they are gone from the config
|
2015-11-16 23:43:39 -05:00
|
|
|
removed_macs = [mac for mac in oldmacs if mac.lower() not in hwaddress]
|
2015-07-23 15:43:45 -04:00
|
|
|
self._remove_addresses_from_bridge(ifaceobj, removed_macs)
|
2014-10-28 16:10:00 -07:00
|
|
|
# if ifaceobj is a bridge and bridge is a vlan aware bridge
|
|
|
|
# add the vid to the bridge
|
|
|
|
self._add_addresses_to_bridge(ifaceobj, hwaddress)
|
|
|
|
|
|
|
|
def _remove_running_address_config(self, ifaceobj):
|
|
|
|
if not self.ipcmd.link_exists(ifaceobj.name):
|
2014-10-09 16:02:46 -07:00
|
|
|
return
|
2014-10-28 16:10:00 -07:00
|
|
|
hwaddress = []
|
2014-10-09 16:02:46 -07:00
|
|
|
self.ipcmd.batch_start()
|
2014-11-08 06:29:26 -08:00
|
|
|
macvlan_prefix = self._get_macvlan_prefix(ifaceobj)
|
2015-07-23 15:43:45 -04:00
|
|
|
for macvlan_ifacename in glob.glob("/sys/class/net/%s*" %macvlan_prefix):
|
2014-10-28 16:10:00 -07:00
|
|
|
macvlan_ifacename = os.path.basename(macvlan_ifacename)
|
|
|
|
if not self.ipcmd.link_exists(macvlan_ifacename):
|
|
|
|
continue
|
|
|
|
hwaddress.append(self.ipcmd.link_get_hwaddress(macvlan_ifacename))
|
2014-10-09 16:02:46 -07:00
|
|
|
self.ipcmd.link_delete(os.path.basename(macvlan_ifacename))
|
2014-10-28 16:10:00 -07:00
|
|
|
# XXX: Also delete any fdb addresses. This requires, checking mac address
|
|
|
|
# on individual macvlan interfaces and deleting the vlan from that.
|
2014-10-09 16:02:46 -07:00
|
|
|
self.ipcmd.batch_commit()
|
2014-10-28 16:10:00 -07:00
|
|
|
if any(hwaddress):
|
|
|
|
self._remove_addresses_from_bridge(ifaceobj, hwaddress)
|
2014-10-09 16:02:46 -07:00
|
|
|
|
2014-10-28 16:10:00 -07:00
|
|
|
def _remove_address_config(self, ifaceobj, address_virtual_list=None):
|
|
|
|
if not address_virtual_list:
|
|
|
|
self._remove_running_address_config(ifaceobj)
|
|
|
|
return
|
|
|
|
|
|
|
|
if not self.ipcmd.link_exists(ifaceobj.name):
|
|
|
|
return
|
|
|
|
hwaddress = []
|
|
|
|
self.ipcmd.batch_start()
|
|
|
|
av_idx = 0
|
2014-11-08 06:29:26 -08:00
|
|
|
macvlan_prefix = self._get_macvlan_prefix(ifaceobj)
|
2014-10-28 16:10:00 -07:00
|
|
|
for av in address_virtual_list:
|
|
|
|
av_attrs = av.split()
|
|
|
|
if len(av_attrs) < 2:
|
2016-05-15 13:28:10 -07:00
|
|
|
self.log_error("%s: incorrect address-virtual attrs '%s'"
|
|
|
|
%(ifaceobj.name, av), ifaceobj,
|
|
|
|
raise_error=False)
|
2014-10-28 16:10:00 -07:00
|
|
|
av_idx += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
# Delete the macvlan device on this device
|
2014-10-28 23:04:40 -07:00
|
|
|
macvlan_ifacename = '%s%d' %(macvlan_prefix, av_idx)
|
2014-10-28 16:10:00 -07:00
|
|
|
self.ipcmd.link_delete(os.path.basename(macvlan_ifacename))
|
|
|
|
if av_attrs[0] != 'None':
|
|
|
|
hwaddress.append(av_attrs[0])
|
|
|
|
av_idx += 1
|
|
|
|
self.ipcmd.batch_commit()
|
|
|
|
self._remove_addresses_from_bridge(ifaceobj, hwaddress)
|
2014-10-09 16:02:46 -07:00
|
|
|
|
2016-03-17 13:01:26 -07:00
|
|
|
def check_mac_address(self, ifaceobj, mac):
|
|
|
|
if mac == 'None':
|
2018-12-13 11:43:32 -08:00
|
|
|
return True
|
2016-03-17 13:01:26 -07:00
|
|
|
mac = mac.lower()
|
|
|
|
try:
|
2016-03-30 16:56:37 -07:00
|
|
|
if int(mac.split(":")[0], 16) & 1 :
|
2016-03-17 13:01:26 -07:00
|
|
|
self.logger.error("%s: Multicast bit is set in the virtual mac address '%s'" %(ifaceobj.name, mac))
|
|
|
|
return False
|
|
|
|
return True
|
[PATCH ifupdown2] addons: addressvirtual: fixup macvlan device enslavements for vrfs
Ticket: CM-12988
Reviewed By: julien, nikhil, dsa
Testing Done: tested ifup and ifdown of vrf devices with address virtual
slaves
This patch fixes up macvlan device enslavements when vrf device
or vrf slave is brought down and up. address virtual macvlan
devices on vrf slaves need to enslaved to the vrf. This
patch checks and fixes up those vrf enslavements for the following
cases:
ifdown <vrf_device> && ifup <vrf_device>
ifdown <vrf_slave> && ifup <vrf_slave>
starting state:
------------
$ip -br link show
myvrf UP 46:c6:44:db:37:60 <NOARP,MASTER,UP,LOWER_UP>
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
$ifdown myvrf
$ip -br link show
bridge.901@bridge DOWN 44:38:39:00:77:88 <BROADCAST,MULTICAST>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST,M-DOWN>
before patch (macvlan device bridge-901-v0 did not come up:
----------------------------------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
after patch:
------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
2016-10-19 10:43:45 -07:00
|
|
|
except Exception:
|
2016-03-17 13:01:26 -07:00
|
|
|
return False
|
|
|
|
|
[PATCH ifupdown2] addons: addressvirtual: fixup macvlan device enslavements for vrfs
Ticket: CM-12988
Reviewed By: julien, nikhil, dsa
Testing Done: tested ifup and ifdown of vrf devices with address virtual
slaves
This patch fixes up macvlan device enslavements when vrf device
or vrf slave is brought down and up. address virtual macvlan
devices on vrf slaves need to enslaved to the vrf. This
patch checks and fixes up those vrf enslavements for the following
cases:
ifdown <vrf_device> && ifup <vrf_device>
ifdown <vrf_slave> && ifup <vrf_slave>
starting state:
------------
$ip -br link show
myvrf UP 46:c6:44:db:37:60 <NOARP,MASTER,UP,LOWER_UP>
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
$ifdown myvrf
$ip -br link show
bridge.901@bridge DOWN 44:38:39:00:77:88 <BROADCAST,MULTICAST>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST,M-DOWN>
before patch (macvlan device bridge-901-v0 did not come up:
----------------------------------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
after patch:
------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
2016-10-19 10:43:45 -07:00
|
|
|
def _fixup_vrf_enslavements(self, ifaceobj, ifaceobj_getfunc=None):
|
|
|
|
""" This function fixes up address virtual interfaces
|
|
|
|
(macvlans) on vrf slaves. Since this fixup is an overhead,
|
|
|
|
this must be called only in cases when ifupdown2 is
|
|
|
|
called on the vrf device or its slave and not when
|
|
|
|
ifupdown2 is called for all devices. When all
|
|
|
|
interfaces are brought up, the expectation is that
|
|
|
|
the normal path will fix up a vrf device or its slaves"""
|
|
|
|
|
|
|
|
if not ifaceobj_getfunc:
|
|
|
|
return
|
|
|
|
if ((ifaceobj.link_kind & ifaceLinkKind.VRF) and
|
|
|
|
self.ipcmd.link_exists(ifaceobj.name)):
|
|
|
|
# if I am a vrf device and I have slaves
|
|
|
|
# that have address virtual config,
|
|
|
|
# enslave the slaves 'address virtual
|
|
|
|
# interfaces (macvlans)' to myself:
|
|
|
|
running_slaves = self.ipcmd.link_get_lowers(ifaceobj.name)
|
|
|
|
if running_slaves:
|
|
|
|
# pick up any existing slaves of a vrf device and
|
|
|
|
# look for their upperdevices and enslave them to the
|
|
|
|
# vrf device:
|
|
|
|
for s in running_slaves:
|
|
|
|
sobjs = ifaceobj_getfunc(s)
|
|
|
|
if (sobjs and
|
|
|
|
(sobjs[0].link_privflags & ifaceLinkPrivFlags.ADDRESS_VIRTUAL_SLAVE)):
|
|
|
|
# enslave all its upper devices to
|
|
|
|
# the vrf device
|
|
|
|
upperdevs = self.ipcmd.link_get_uppers(sobjs[0].name)
|
|
|
|
if not upperdevs:
|
|
|
|
continue
|
|
|
|
for u in upperdevs:
|
|
|
|
# skip vrf device which
|
|
|
|
# will also show up in the
|
|
|
|
# upper device list
|
|
|
|
if u == ifaceobj.name:
|
|
|
|
continue
|
2018-12-13 11:43:32 -08:00
|
|
|
self.ipcmd.link_set(u, 'master', ifaceobj.name,
|
|
|
|
state='up')
|
[PATCH ifupdown2] addons: addressvirtual: fixup macvlan device enslavements for vrfs
Ticket: CM-12988
Reviewed By: julien, nikhil, dsa
Testing Done: tested ifup and ifdown of vrf devices with address virtual
slaves
This patch fixes up macvlan device enslavements when vrf device
or vrf slave is brought down and up. address virtual macvlan
devices on vrf slaves need to enslaved to the vrf. This
patch checks and fixes up those vrf enslavements for the following
cases:
ifdown <vrf_device> && ifup <vrf_device>
ifdown <vrf_slave> && ifup <vrf_slave>
starting state:
------------
$ip -br link show
myvrf UP 46:c6:44:db:37:60 <NOARP,MASTER,UP,LOWER_UP>
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
$ifdown myvrf
$ip -br link show
bridge.901@bridge DOWN 44:38:39:00:77:88 <BROADCAST,MULTICAST>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST,M-DOWN>
before patch (macvlan device bridge-901-v0 did not come up:
----------------------------------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
after patch:
------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
2016-10-19 10:43:45 -07:00
|
|
|
elif ((ifaceobj.link_privflags & ifaceLinkPrivFlags.ADDRESS_VIRTUAL_SLAVE) and
|
|
|
|
(ifaceobj.link_privflags & ifaceLinkPrivFlags.VRF_SLAVE) and
|
|
|
|
self.ipcmd.link_exists(ifaceobj.name)):
|
|
|
|
# If I am a vrf slave and I have 'address virtual'
|
|
|
|
# config, make sure my addrress virtual interfaces
|
|
|
|
# (macvlans) are also enslaved to the vrf device
|
|
|
|
vrfname = ifaceobj.get_attr_value_first('vrf')
|
|
|
|
if not vrfname or not self.ipcmd.link_exists(vrfname):
|
|
|
|
return
|
|
|
|
running_uppers = self.ipcmd.link_get_uppers(ifaceobj.name)
|
|
|
|
if not running_uppers:
|
|
|
|
return
|
|
|
|
macvlan_prefix = self._get_macvlan_prefix(ifaceobj)
|
|
|
|
if not macvlan_prefix:
|
|
|
|
return
|
|
|
|
for u in running_uppers:
|
|
|
|
if u == vrfname:
|
|
|
|
continue
|
|
|
|
if u.startswith(macvlan_prefix):
|
2018-12-13 11:43:32 -08:00
|
|
|
self.ipcmd.link_set(u, 'master', vrfname,
|
|
|
|
state='up')
|
[PATCH ifupdown2] addons: addressvirtual: fixup macvlan device enslavements for vrfs
Ticket: CM-12988
Reviewed By: julien, nikhil, dsa
Testing Done: tested ifup and ifdown of vrf devices with address virtual
slaves
This patch fixes up macvlan device enslavements when vrf device
or vrf slave is brought down and up. address virtual macvlan
devices on vrf slaves need to enslaved to the vrf. This
patch checks and fixes up those vrf enslavements for the following
cases:
ifdown <vrf_device> && ifup <vrf_device>
ifdown <vrf_slave> && ifup <vrf_slave>
starting state:
------------
$ip -br link show
myvrf UP 46:c6:44:db:37:60 <NOARP,MASTER,UP,LOWER_UP>
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
$ifdown myvrf
$ip -br link show
bridge.901@bridge DOWN 44:38:39:00:77:88 <BROADCAST,MULTICAST>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST,M-DOWN>
before patch (macvlan device bridge-901-v0 did not come up:
----------------------------------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
after patch:
------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
2016-10-19 10:43:45 -07:00
|
|
|
|
|
|
|
def _up(self, ifaceobj, ifaceobj_getfunc=None):
|
|
|
|
if not ifupdownflags.flags.ALL:
|
|
|
|
self._fixup_vrf_enslavements(ifaceobj, ifaceobj_getfunc)
|
2014-10-09 16:02:46 -07:00
|
|
|
address_virtual_list = ifaceobj.get_attr_value('address-virtual')
|
|
|
|
if not address_virtual_list:
|
|
|
|
# XXX: address virtual is not present. In which case,
|
2014-12-31 23:43:27 -08:00
|
|
|
# delete stale macvlan devices.
|
2014-10-28 16:10:00 -07:00
|
|
|
self._remove_address_config(ifaceobj, address_virtual_list)
|
2014-10-09 16:02:46 -07:00
|
|
|
return
|
|
|
|
|
2016-07-17 22:50:26 -07:00
|
|
|
if (ifaceobj.upperifaces and
|
|
|
|
not ifaceobj.link_privflags & ifaceLinkPrivFlags.VRF_SLAVE):
|
2016-04-25 17:39:57 +02:00
|
|
|
self.log_error('%s: invalid placement of address-virtual lines (must be configured under an interface with no upper interfaces or parent interfaces)'
|
|
|
|
% (ifaceobj.name), ifaceobj)
|
|
|
|
return
|
|
|
|
|
2014-10-28 16:10:00 -07:00
|
|
|
if not self.ipcmd.link_exists(ifaceobj.name):
|
2014-10-09 16:02:46 -07:00
|
|
|
return
|
2014-10-28 16:10:00 -07:00
|
|
|
self._apply_address_config(ifaceobj, address_virtual_list)
|
2014-10-09 16:02:46 -07:00
|
|
|
|
[PATCH ifupdown2] addons: addressvirtual: fixup macvlan device enslavements for vrfs
Ticket: CM-12988
Reviewed By: julien, nikhil, dsa
Testing Done: tested ifup and ifdown of vrf devices with address virtual
slaves
This patch fixes up macvlan device enslavements when vrf device
or vrf slave is brought down and up. address virtual macvlan
devices on vrf slaves need to enslaved to the vrf. This
patch checks and fixes up those vrf enslavements for the following
cases:
ifdown <vrf_device> && ifup <vrf_device>
ifdown <vrf_slave> && ifup <vrf_slave>
starting state:
------------
$ip -br link show
myvrf UP 46:c6:44:db:37:60 <NOARP,MASTER,UP,LOWER_UP>
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
$ifdown myvrf
$ip -br link show
bridge.901@bridge DOWN 44:38:39:00:77:88 <BROADCAST,MULTICAST>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST,M-DOWN>
before patch (macvlan device bridge-901-v0 did not come up:
----------------------------------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
after patch:
------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
2016-10-19 10:43:45 -07:00
|
|
|
def _down(self, ifaceobj, ifaceobj_getfunc=None):
|
2014-10-09 16:02:46 -07:00
|
|
|
try:
|
2014-10-28 23:04:40 -07:00
|
|
|
self._remove_address_config(ifaceobj,
|
|
|
|
ifaceobj.get_attr_value('address-virtual'))
|
2014-10-09 16:02:46 -07:00
|
|
|
except Exception, e:
|
|
|
|
self.log_warn(str(e))
|
|
|
|
|
|
|
|
def _query_check(self, ifaceobj, ifaceobjcurr):
|
|
|
|
address_virtual_list = ifaceobj.get_attr_value('address-virtual')
|
|
|
|
if not address_virtual_list:
|
|
|
|
return
|
2014-10-28 23:04:40 -07:00
|
|
|
if not self.ipcmd.link_exists(ifaceobj.name):
|
|
|
|
return
|
2014-10-09 16:02:46 -07:00
|
|
|
av_idx = 0
|
2014-11-08 06:29:26 -08:00
|
|
|
macvlan_prefix = self._get_macvlan_prefix(ifaceobj)
|
2014-10-09 16:02:46 -07:00
|
|
|
for address_virtual in address_virtual_list:
|
|
|
|
av_attrs = address_virtual.split()
|
|
|
|
if len(av_attrs) < 2:
|
|
|
|
self.logger.warn("%s: incorrect address-virtual attrs '%s'"
|
|
|
|
%(ifaceobj.name, address_virtual))
|
|
|
|
av_idx += 1
|
|
|
|
continue
|
|
|
|
|
|
|
|
# Check if the macvlan device on this interface
|
2014-10-28 23:04:40 -07:00
|
|
|
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)
|
2018-12-13 11:43:32 -08:00
|
|
|
raddrs = self.ipcmd.get_running_addrs(
|
|
|
|
ifname=macvlan_ifacename,
|
|
|
|
details=False,
|
|
|
|
addr_virtual_ifaceobj=ifaceobj
|
|
|
|
)
|
2014-10-28 23:04:40 -07:00
|
|
|
if not raddrs or not rhwaddress:
|
|
|
|
ifaceobjcurr.update_config_with_status('address-virtual', '', 1)
|
|
|
|
av_idx += 1
|
|
|
|
continue
|
2016-05-10 17:23:28 +02:00
|
|
|
try:
|
|
|
|
av_attrs[0] = ':'.join([i if len(i) == 2 else '0%s' % i
|
|
|
|
for i in av_attrs[0].split(':')])
|
|
|
|
except:
|
|
|
|
self.logger.info('%s: %s: invalid value for address-virtual (%s)'
|
|
|
|
% (ifaceobj.name,
|
|
|
|
macvlan_ifacename,
|
|
|
|
' '.join(av_attrs)))
|
2016-10-19 00:41:02 +02:00
|
|
|
try:
|
2018-12-13 11:43:32 -08:00
|
|
|
if (rhwaddress == av_attrs[0].lower() and
|
|
|
|
self.ipcmd.compare_user_config_vs_running_state(raddrs, av_attrs[1:]) and
|
|
|
|
self._check_addresses_in_bridge(ifaceobj, av_attrs[0].lower())):
|
2016-10-19 00:41:02 +02:00
|
|
|
ifaceobjcurr.update_config_with_status('address-virtual',
|
|
|
|
address_virtual, 0)
|
|
|
|
else:
|
|
|
|
raddress_virtual = '%s %s' % (rhwaddress, ' '.join(raddrs))
|
|
|
|
ifaceobjcurr.update_config_with_status('address-virtual',
|
|
|
|
raddress_virtual, 1)
|
|
|
|
except:
|
|
|
|
raddress_virtual = '%s %s' % (rhwaddress, ' '.join(raddrs))
|
|
|
|
ifaceobjcurr.update_config_with_status('address-virtual',
|
|
|
|
raddress_virtual, 1)
|
2014-10-09 16:02:46 -07:00
|
|
|
av_idx += 1
|
|
|
|
return
|
|
|
|
|
[PATCH ifupdown2] addons: addressvirtual: fixup macvlan device enslavements for vrfs
Ticket: CM-12988
Reviewed By: julien, nikhil, dsa
Testing Done: tested ifup and ifdown of vrf devices with address virtual
slaves
This patch fixes up macvlan device enslavements when vrf device
or vrf slave is brought down and up. address virtual macvlan
devices on vrf slaves need to enslaved to the vrf. This
patch checks and fixes up those vrf enslavements for the following
cases:
ifdown <vrf_device> && ifup <vrf_device>
ifdown <vrf_slave> && ifup <vrf_slave>
starting state:
------------
$ip -br link show
myvrf UP 46:c6:44:db:37:60 <NOARP,MASTER,UP,LOWER_UP>
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
$ifdown myvrf
$ip -br link show
bridge.901@bridge DOWN 44:38:39:00:77:88 <BROADCAST,MULTICAST>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST,M-DOWN>
before patch (macvlan device bridge-901-v0 did not come up:
----------------------------------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
after patch:
------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
2016-10-19 10:43:45 -07:00
|
|
|
def _query_running(self, ifaceobjrunning, ifaceobj_getfunc=None):
|
2014-11-08 06:29:26 -08:00
|
|
|
macvlan_prefix = self._get_macvlan_prefix(ifaceobjrunning)
|
2014-11-03 17:55:51 -08:00
|
|
|
address_virtuals = glob.glob("/sys/class/net/%s*" %macvlan_prefix)
|
|
|
|
for av in address_virtuals:
|
|
|
|
macvlan_ifacename = os.path.basename(av)
|
|
|
|
rhwaddress = self.ipcmd.link_get_hwaddress(macvlan_ifacename)
|
2018-12-13 11:43:32 -08:00
|
|
|
raddress = self.ipcmd.get_running_addrs(None, macvlan_ifacename)
|
2014-11-03 17:55:51 -08:00
|
|
|
if not raddress:
|
|
|
|
self.logger.warn('%s: no running addresses'
|
|
|
|
%ifaceobjrunning.name)
|
|
|
|
raddress = []
|
|
|
|
ifaceobjrunning.update_config('address-virtual',
|
|
|
|
'%s %s' %(rhwaddress, ''.join(raddress)))
|
2014-10-09 16:02:46 -07:00
|
|
|
return
|
|
|
|
|
|
|
|
_run_ops = {'up' : _up,
|
|
|
|
'down' : _down,
|
|
|
|
'query-checkcurr' : _query_check,
|
|
|
|
'query-running' : _query_running}
|
|
|
|
|
|
|
|
def get_ops(self):
|
|
|
|
""" returns list of ops supported by this module """
|
|
|
|
return self._run_ops.keys()
|
|
|
|
|
|
|
|
def _init_command_handlers(self):
|
|
|
|
if not self.ipcmd:
|
2018-12-13 11:43:32 -08:00
|
|
|
self.ipcmd = LinkUtils()
|
2014-10-09 16:02:46 -07:00
|
|
|
|
[PATCH ifupdown2] addons: addressvirtual: fixup macvlan device enslavements for vrfs
Ticket: CM-12988
Reviewed By: julien, nikhil, dsa
Testing Done: tested ifup and ifdown of vrf devices with address virtual
slaves
This patch fixes up macvlan device enslavements when vrf device
or vrf slave is brought down and up. address virtual macvlan
devices on vrf slaves need to enslaved to the vrf. This
patch checks and fixes up those vrf enslavements for the following
cases:
ifdown <vrf_device> && ifup <vrf_device>
ifdown <vrf_slave> && ifup <vrf_slave>
starting state:
------------
$ip -br link show
myvrf UP 46:c6:44:db:37:60 <NOARP,MASTER,UP,LOWER_UP>
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
$ifdown myvrf
$ip -br link show
bridge.901@bridge DOWN 44:38:39:00:77:88 <BROADCAST,MULTICAST>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST,M-DOWN>
before patch (macvlan device bridge-901-v0 did not come up:
----------------------------------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
after patch:
------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
2016-10-19 10:43:45 -07:00
|
|
|
def run(self, ifaceobj, operation, query_ifaceobj=None,
|
|
|
|
ifaceobj_getfunc=None, **extra_args):
|
2014-10-09 16:02:46 -07:00
|
|
|
""" run vlan configuration on the interface object passed as argument
|
|
|
|
|
|
|
|
Args:
|
|
|
|
**ifaceobj** (object): iface object
|
|
|
|
|
|
|
|
**operation** (str): any of 'pre-up', 'post-down', 'query-checkcurr',
|
|
|
|
'query-running'
|
|
|
|
Kwargs:
|
|
|
|
**query_ifaceobj** (object): query check ifaceobject. This is only
|
|
|
|
valid when op is 'query-checkcurr'. It is an object same as
|
|
|
|
ifaceobj, but contains running attribute values and its config
|
|
|
|
status. The modules can use it to return queried running state
|
|
|
|
of interfaces. status is success if the running state is same
|
|
|
|
as user required state in ifaceobj. error otherwise.
|
|
|
|
"""
|
2014-10-24 10:11:07 -07:00
|
|
|
if ifaceobj.type == ifaceType.BRIDGE_VLAN:
|
|
|
|
return
|
2014-10-09 16:02:46 -07:00
|
|
|
op_handler = self._run_ops.get(operation)
|
|
|
|
if not op_handler:
|
|
|
|
return
|
|
|
|
self._init_command_handlers()
|
|
|
|
if operation == 'query-checkcurr':
|
|
|
|
op_handler(self, ifaceobj, query_ifaceobj)
|
|
|
|
else:
|
[PATCH ifupdown2] addons: addressvirtual: fixup macvlan device enslavements for vrfs
Ticket: CM-12988
Reviewed By: julien, nikhil, dsa
Testing Done: tested ifup and ifdown of vrf devices with address virtual
slaves
This patch fixes up macvlan device enslavements when vrf device
or vrf slave is brought down and up. address virtual macvlan
devices on vrf slaves need to enslaved to the vrf. This
patch checks and fixes up those vrf enslavements for the following
cases:
ifdown <vrf_device> && ifup <vrf_device>
ifdown <vrf_slave> && ifup <vrf_slave>
starting state:
------------
$ip -br link show
myvrf UP 46:c6:44:db:37:60 <NOARP,MASTER,UP,LOWER_UP>
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
$ifdown myvrf
$ip -br link show
bridge.901@bridge DOWN 44:38:39:00:77:88 <BROADCAST,MULTICAST>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST,M-DOWN>
before patch (macvlan device bridge-901-v0 did not come up:
----------------------------------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 DOWN 00:00:5e:00:01:81 <BROADCAST,MULTICAST>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
after patch:
------------
$ifup myvrf
$ip -br link show
bridge.901@bridge UP 44:38:39:00:77:88 <UP,BROADCAST,MULTICAST,UP>
bridge-901-v0@bridge.901 UP 00:00:5e:00:01:81 <UP,BROADCAST,MULTICAST,UP>
myvrf UP ce:a6:e1:85:75:73 <NOARP,MASTER,UP,LOWER_UP>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
2016-10-19 10:43:45 -07:00
|
|
|
op_handler(self, ifaceobj, ifaceobj_getfunc=ifaceobj_getfunc)
|