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

addons: vrf: release any dhcp leases before vrf slave enslavement

Ticket: CM-9929
Reviewed By:
Testing Done: Tested vrf dhcp slave enslavement on ifreload

algo:
- when a vrf slave enslavement changes, before performing the
  new master enslavement,
- check if vrf slave has dhcp configured
- if yes, release dhclient running on the vrf slave
This commit is contained in:
Roopa Prabhu
2016-03-17 16:18:14 -07:00
parent 05ca6f0140
commit 122ef35bf9
2 changed files with 46 additions and 6 deletions

View File

@@ -13,6 +13,7 @@ import ifupdown.rtnetlink_api as rtnetlink_api
from ifupdownaddons.modulebase import moduleBase
from ifupdownaddons.bondutil import bondutil
from ifupdownaddons.iproute2 import iproute2
from ifupdownaddons.dhclient import dhclient
class vrfPrivFlags:
PROCESSED = 0x1
@@ -44,7 +45,19 @@ class vrf(moduleBase):
ifupdownaddons.modulebase.moduleBase.__init__(self, *args, **kargs)
self.ipcmd = None
self.bondcmd = None
self.dhclientcmd = None
self.name = self.__class__.__name__
if self.PERFMODE:
# if perf mode is set, remove vrf map file.
# start afresh. PERFMODE is set at boot
if os.path.exists(self.iproute2_vrf_filename):
try:
self.logger.info('vrf: removing file %s'
%self.iproute2_vrf_filename)
os.remove(self.iproute2_vrf_filename)
except Exception, e:
self.logger.debug('vrf: removing file failed (%s)'
%str(e))
try:
ip_rules = self.exec_command('/sbin/ip rule show').splitlines()
self.ip_rule_cache = [' '.join(r.split()) for r in ip_rules]
@@ -190,16 +203,20 @@ class vrf(moduleBase):
%(table_id, str(e)))
pass
def _is_dhcp_slave(self, ifaceobj):
if (not ifaceobj.addr_method or
(ifaceobj.addr_method != 'dhcp' and
ifaceobj.addr_method != 'dhcp6')):
return False
return True
def _handle_dhcp_slaves(self, ifacename, vrfname, ifaceobj,
ifaceobj_getfunc):
""" If we have a vrf slave that has dhcp configured, bring up the
vrf master now. This is needed because vrf has special handling
in dhclient hook which requires the vrf master to be present """
if (not ifaceobj.addr_method or
(ifaceobj.addr_method != 'dhcp' and
ifaceobj.addr_method != 'dhcp6')):
return
if not self._is_dhcp_slave(ifaceobj):
return False
vrf_master = ifaceobj.upperifaces[0]
if not vrf_master:
self.logger.warn('%s: vrf master not found' %ifacename)
@@ -226,14 +243,26 @@ class vrf(moduleBase):
%(mobj.name, vrf_table))
self._up_vrf_dev(mobj, vrf_table, False)
break
self._down_dhcp_slave(ifaceobj)
self.ipcmd.link_set(ifacename, 'master', vrfname)
return
def _down_dhcp_slave(self, ifaceobj):
try:
self.dhclientcmd.release(ifaceobj.name)
except:
# ignore any dhclient release errors
pass
def _up_vrf_slave(self, ifacename, vrfname, ifaceobj=None,
ifaceobj_getfunc=None):
try:
if self.ipcmd.link_exists(vrfname):
self.ipcmd.link_set(ifacename, 'master', vrfname)
upper = self.ipcmd.link_get_upper(vrfname)
if upper and upper != vrfname:
if self._is_dhcp_slave(ifaceobj):
self._down_dhcp_slave(ifaceobj)
self.ipcmd.link_set(ifacename, 'master', vrfname)
elif ifaceobj:
self._handle_dhcp_slaves(ifacename, vrfname, ifaceobj,
ifaceobj_getfunc)
@@ -590,6 +619,8 @@ class vrf(moduleBase):
self.ipcmd = iproute2(**flags)
if not self.bondcmd:
self.bondcmd = bondutil(**flags)
if not self.dhclientcmd:
self.dhclientcmd = dhclient(**flags)
def run(self, ifaceobj, operation, query_ifaceobj=None,
ifaceobj_getfunc=None, **extra_args):