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

addons: vrf: fix a few vrf enslavement and table id allocation corner cases

Ticket: CM-9957
Reviewed By: dsa, julien, nikhil
Testing Done: Tested vrf enslave/deslave + ifreload

This patch fixes a few corner cases:
- release dhcp on all new enslavement or change of enslavement
- fix a NoneType error on ifreload when a vrf enslavement was removed
- handle a corner case with auto table ids

Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
This commit is contained in:
Roopa Prabhu
2016-03-18 21:25:09 -07:00
parent 2009513fa2
commit 4d2c979814

View File

@@ -259,7 +259,7 @@ class vrf(moduleBase):
try:
if self.ipcmd.link_exists(vrfname):
upper = self.ipcmd.link_get_upper(vrfname)
if upper and upper != vrfname:
if not upper or upper != vrfname:
if self._is_dhcp_slave(ifaceobj):
self._down_dhcp_slave(ifaceobj)
self.ipcmd.link_set(ifacename, 'master', vrfname)
@@ -336,11 +336,14 @@ class vrf(moduleBase):
vrf_table)
self.exec_command(rule_cmd)
def _add_vrf_slaves(self, ifaceobj):
def _add_vrf_slaves(self, ifaceobj, ifaceobj_getfunc=None):
running_slaves = self.ipcmd.link_get_lowers(ifaceobj.name)
config_slaves = ifaceobj.lowerifaces
if not config_slaves and not running_slaves:
return
if not config_slaves: config_slaves = []
if not running_slaves: running_slaves = []
add_slaves = set(config_slaves).difference(set(running_slaves))
del_slaves = set(running_slaves).difference(set(config_slaves))
if add_slaves:
@@ -353,6 +356,11 @@ class vrf(moduleBase):
if del_slaves:
for s in del_slaves:
try:
if ifaceobj_getfunc:
sobj = ifaceobj_getfunc(s)
# if dhcp slave, release the dhcp lease
if sobj and self._is_dhcp_slave(sobj[0]):
self._down_dhcp_slave(sobj[0])
self._down_vrf_slave(s, ifaceobj.name)
except Exception, e:
self.logger.info('%s: %s' %(ifaceobj.name, str(e)))
@@ -422,6 +430,7 @@ class vrf(moduleBase):
self.log_error('%s: create failed (%s)\n'
%(ifaceobj.name, str(e)))
else:
if vrf_table == 'auto':
vrf_table = self._get_iproute2_vrf_table(ifaceobj.name)
if not vrf_table:
self.log_error('%s: unable to get vrf table id'
@@ -437,6 +446,8 @@ class vrf(moduleBase):
if vrf_table != 'auto':
self._iproute2_vrf_table_entry_add(ifaceobj.name, vrf_table)
return vrf_table
def _add_vrf_default_route(self, ifaceobj, vrf_table):
vrf_default_route = ifaceobj.get_attr_value_first('vrf-default-route')
if not vrf_default_route:
@@ -462,19 +473,20 @@ class vrf(moduleBase):
raise
pass
def _up_vrf_dev(self, ifaceobj, vrf_table, add_slaves=True):
def _up_vrf_dev(self, ifaceobj, vrf_table, add_slaves=True,
ifaceobj_getfunc=None):
# if vrf dev is already processed return. This can happen
# if we had a dhcp slave. See self._handle_dhcp_slaves
if self._check_vrf_dev_processed_flag(ifaceobj):
return True
self._create_vrf_dev(ifaceobj, vrf_table)
vrf_table = self._create_vrf_dev(ifaceobj, vrf_table)
try:
self._add_vrf_rules(ifaceobj.name, vrf_table)
self._create_cgroup(ifaceobj)
if add_slaves:
self._add_vrf_slaves(ifaceobj)
self._add_vrf_slaves(ifaceobj, ifaceobj_getfunc)
self._add_vrf_default_route(ifaceobj, vrf_table)
self._set_vrf_dev_processed_flag(ifaceobj)
except Exception, e:
@@ -488,7 +500,7 @@ class vrf(moduleBase):
self.log_error('%s: max vrf count %d hit...not '
'creating vrf' %(ifaceobj.name,
self.vrf_count))
self._up_vrf_dev(ifaceobj, vrf_table)
self._up_vrf_dev(ifaceobj, vrf_table, True, ifaceobj_getfunc)
else:
vrf = ifaceobj.get_attr_value_first('vrf')
if vrf: