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

addons: dhcp: add vrf awareness

Ticket: CM-10292, CM-10282
Reviewed By: dsa, nikhil, julien
Testing Done: Tested dhcp config on an vrf slave

- Add support for policy module_globals variable
  "vrf-exec-cmd-prefix". It is read into per module
  self.vrf_exec_cmd_prefix variable

- If self.vrf_exec_cmd_prefix is present and interface is a
  vrf slave, use ifupdown2 will call such command in vrf
  context using:
    "%s %s %s" %(<vrf-exec-cmd-prefix>, <vrfname>, <cmd>)

- This also fixes calling of dhcp refresh when a dhcp slave is
  removed from a vrf

Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
This commit is contained in:
Roopa Prabhu
2016-04-05 16:11:41 -07:00
parent f50f16fa71
commit 717cee3187
4 changed files with 64 additions and 28 deletions

View File

@@ -29,7 +29,18 @@ class dhclient(utilsBase):
def is_running6(self, ifacename):
return self._pid_exists('/run/dhclient6.%s.pid' %ifacename)
def stop(self, ifacename):
def _run_dhclient_cmd(self, cmd, cmd_prefix=None):
if not cmd_prefix:
cmd_aslist = []
else:
cmd_aslist = cmd_prefix.split()
if cmd_aslist:
cmd_aslist.extend(cmd)
else:
cmd_aslist = cmd
self.subprocess_check_call(cmd_aslist)
def stop(self, ifacename, cmd_prefix=None):
if os.path.exists('/sbin/dhclient3'):
cmd = ['/sbin/dhclient3', '-x', '-pf',
'/run/dhclient.%s.pid' %ifacename, '-lf',
@@ -40,23 +51,24 @@ class dhclient(utilsBase):
'/run/dhclient.%s.pid' %ifacename,
'-lf', '/var/lib/dhcp/dhclient.%s.leases' %ifacename,
'%s' %ifacename]
self.subprocess_check_call(cmd)
self._run_dhclient_cmd(cmd, cmd_prefix)
def start(self, ifacename, wait=True):
def start(self, ifacename, wait=True, cmd_prefix=None):
if os.path.exists('/sbin/dhclient3'):
cmd = ['/sbin/dhclient3', '-pf',
'/run/dhclient.%s.pid' %ifacename,
'-lf', '/var/lib/dhcp3/dhclient.%s.leases' %ifacename,
'%s' %ifacename]
else:
cmd = ['/sbin/dhclient', '-pf', '/run/dhclient.%s.pid' %ifacename,
'-lf', '/var/lib/dhcp/dhclient.%s.leases' %ifacename,
cmd = ['/sbin/dhclient', '-pf',
'/run/dhclient.%s.pid' %ifacename, '-lf',
'/var/lib/dhcp/dhclient.%s.leases' %ifacename,
'%s' %ifacename]
if not wait:
cmd.append('-nw')
self.subprocess_check_call(cmd)
self._run_dhclient_cmd(cmd, cmd_prefix)
def release(self, ifacename):
def release(self, ifacename, cmd_prefix=None):
if os.path.exists('/sbin/dhclient3'):
cmd = ['/sbin/dhclient3', '-r', '-pf',
'/run/dhclient.%s.pid' %ifacename, '-lf',
@@ -67,25 +79,27 @@ class dhclient(utilsBase):
'/run/dhclient.%s.pid' %ifacename,
'-lf', '/var/lib/dhcp/dhclient.%s.leases' %ifacename,
'%s' %ifacename]
self.subprocess_check_call(cmd)
self._run_dhclient_cmd(cmd, cmd_prefix)
def start6(self, ifacename, wait=True):
cmd = ['dhclient', '-6', '-pf',
def start6(self, ifacename, wait=True, cmd_prefix=None):
cmd = ['/sbin/dhclient', '-6', '-pf',
'/run/dhclient6.%s.pid' %ifacename, '-lf',
'/var/lib/dhcp/dhclient.%s.leases ' %ifacename,
'%s' %ifacename]
if not wait:
cmd.append('-nw')
self.subprocess_check_call(cmd)
self._run_dhclient_cmd(cmd, cmd_prefix)
def stop6(self, ifacename):
self.subprocess_check_call(['dhclient', '-6', '-x', '-pf',
'/run/dhclient.%s.pid' %ifacename, '-lf',
'/var/lib/dhcp/dhclient.%s.leases ' %ifacename,
'%s' %ifacename])
def stop6(self, ifacename, cmd_prefix=None):
cmd = ['/sbin/dhclient', '-6', '-x', '-pf',
'/run/dhclient.%s.pid' %ifacename, '-lf',
'/var/lib/dhcp/dhclient.%s.leases ' %ifacename,
'%s' %ifacename]
self._run_dhclient_cmd(cmd, cmd_prefix)
def release6(self, ifacename):
self.subprocess_check_call(['dhclient', '-6', '-r', '-pf',
'/run/dhclient6.%s.pid' %ifacename, '-lf',
'/var/lib/dhcp/dhclient6.%s.leases' %ifacename,
'%s' %ifacename])
def release6(self, ifacename, cmd_prefix=None):
cmd = ['/sbin/dhclient', '-6', '-r', '-pf',
'/run/dhclient6.%s.pid' %ifacename, '-lf',
'/var/lib/dhcp/dhclient6.%s.leases' %ifacename,
'%s' %ifacename]
self._run_dhclient_cmd(cmd, cmd_prefix)

View File

@@ -15,6 +15,7 @@ import shlex
from ifupdown.utils import utils
from ifupdown.iface import *
import ifupdown.policymanager as policymanager
#from ifupdownaddons.iproute2 import *
#from ifupdownaddons.dhclient import *
#from ifupdownaddons.bridgeutils import *
@@ -38,6 +39,11 @@ class moduleBase(object):
self.CACHE = kargs.get('cache', False)
self.CACHE_FLAGS = kargs.get('cacheflags', 0x0)
# vrfs are a global concept and a vrf context can be applicable
# to all global vrf commands. Get the default vrf-exec-cmd-prefix
# here so that all modules can use it
self.vrf_exec_cmd_prefix = policymanager.policymanager_api.get_module_globals('vrf', attr='vrf-exec-cmd-prefix')
def log_warn(self, str, ifaceobj=None):
""" log a warning if err str is not one of which we should ignore """
if not self.ignore_error(str):