mirror of
https://github.com/CumulusNetworks/ifupdown2.git
synced 2024-05-06 15:54:50 +00:00
addons: vrf: multiple fixes to vrf enslavement and auto handling
Ticket: CM-10005 Reviewed By: Testing Done: Tested boot and ifreload after changes - fix access to addr_method on an object which had no address method defined. This was a recently introduced regression that caused vrf enslavement to end per-matuarely. - few fixes around vrf_table conversion between string and integer
This commit is contained in:
@@ -102,7 +102,7 @@ class vrf(moduleBase):
|
|||||||
iproute2_vrf_map_pruned = {}
|
iproute2_vrf_map_pruned = {}
|
||||||
for t, v in self.iproute2_vrf_map.iteritems():
|
for t, v in self.iproute2_vrf_map.iteritems():
|
||||||
if os.path.exists('/sys/class/net/%s' %v):
|
if os.path.exists('/sys/class/net/%s' %v):
|
||||||
iproute2_vrf_map_pruned[t] = v
|
iproute2_vrf_map_pruned[int(t)] = v
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
# cleanup rules
|
# cleanup rules
|
||||||
@@ -126,6 +126,7 @@ class vrf(moduleBase):
|
|||||||
break
|
break
|
||||||
last_used_vrf_table = t
|
last_used_vrf_table = t
|
||||||
self.last_used_vrf_table = last_used_vrf_table
|
self.last_used_vrf_table = last_used_vrf_table
|
||||||
|
|
||||||
self.iproute2_write_vrf_map = False
|
self.iproute2_write_vrf_map = False
|
||||||
atexit.register(self.iproute2_vrf_map_write)
|
atexit.register(self.iproute2_vrf_map_write)
|
||||||
self.vrf_fix_local_table = True
|
self.vrf_fix_local_table = True
|
||||||
@@ -175,7 +176,7 @@ class vrf(moduleBase):
|
|||||||
def _get_iproute2_vrf_table(self, vrf_dev_name):
|
def _get_iproute2_vrf_table(self, vrf_dev_name):
|
||||||
for t, v in self.iproute2_vrf_map.iteritems():
|
for t, v in self.iproute2_vrf_map.iteritems():
|
||||||
if v == vrf_dev_name:
|
if v == vrf_dev_name:
|
||||||
return t
|
return str(t)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _get_avail_vrf_table_id(self):
|
def _get_avail_vrf_table_id(self):
|
||||||
@@ -191,12 +192,12 @@ class vrf(moduleBase):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def _iproute2_vrf_table_entry_add(self, vrf_dev_name, table_id):
|
def _iproute2_vrf_table_entry_add(self, vrf_dev_name, table_id):
|
||||||
self.iproute2_vrf_map[table_id] = vrf_dev_name
|
self.iproute2_vrf_map[int(table_id)] = vrf_dev_name
|
||||||
self.iproute2_write_vrf_map = True
|
self.iproute2_write_vrf_map = True
|
||||||
|
|
||||||
def _iproute2_vrf_table_entry_del(self, table_id):
|
def _iproute2_vrf_table_entry_del(self, table_id):
|
||||||
try:
|
try:
|
||||||
del self.iproute2_vrf_map[table_id]
|
del self.iproute2_vrf_map[int(table_id)]
|
||||||
self.iproute2_write_vrf_map = True
|
self.iproute2_write_vrf_map = True
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
self.logger.info('vrf: iproute2 vrf map del failed for %d (%s)'
|
self.logger.info('vrf: iproute2 vrf map del failed for %d (%s)'
|
||||||
@@ -255,12 +256,12 @@ class vrf(moduleBase):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def _up_vrf_slave(self, ifacename, vrfname, ifaceobj=None,
|
def _up_vrf_slave(self, ifacename, vrfname, ifaceobj=None,
|
||||||
ifaceobj_getfunc=None):
|
ifaceobj_getfunc=None, vrf_exists=False):
|
||||||
try:
|
try:
|
||||||
if self.ipcmd.link_exists(vrfname):
|
if vrf_exists or self.ipcmd.link_exists(vrfname):
|
||||||
upper = self.ipcmd.link_get_upper(vrfname)
|
upper = self.ipcmd.link_get_upper(ifacename)
|
||||||
if not upper or upper != vrfname:
|
if not upper or upper != vrfname:
|
||||||
if self._is_dhcp_slave(ifaceobj):
|
if ifaceobj and self._is_dhcp_slave(ifaceobj):
|
||||||
self._down_dhcp_slave(ifaceobj)
|
self._down_dhcp_slave(ifaceobj)
|
||||||
self.ipcmd.link_set(ifacename, 'master', vrfname)
|
self.ipcmd.link_set(ifacename, 'master', vrfname)
|
||||||
elif ifaceobj:
|
elif ifaceobj:
|
||||||
@@ -356,7 +357,12 @@ class vrf(moduleBase):
|
|||||||
if add_slaves:
|
if add_slaves:
|
||||||
for s in add_slaves:
|
for s in add_slaves:
|
||||||
try:
|
try:
|
||||||
self._up_vrf_slave(s, ifaceobj.name)
|
sobj = None
|
||||||
|
if ifaceobj_getfunc:
|
||||||
|
sobj = ifaceobj_getfunc(s)
|
||||||
|
self._up_vrf_slave(s, ifaceobj.name,
|
||||||
|
sobj[0] if sobj else None,
|
||||||
|
ifaceobj_getfunc, True)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
self.logger.info('%s: %s' %(ifaceobj.name, str(e)))
|
self.logger.info('%s: %s' %(ifaceobj.name, str(e)))
|
||||||
|
|
||||||
@@ -503,6 +509,7 @@ class vrf(moduleBase):
|
|||||||
try:
|
try:
|
||||||
vrf_table = ifaceobj.get_attr_value_first('vrf-table')
|
vrf_table = ifaceobj.get_attr_value_first('vrf-table')
|
||||||
if vrf_table:
|
if vrf_table:
|
||||||
|
# This is a vrf device
|
||||||
if self.vrf_count == self.vrf_max_count:
|
if self.vrf_count == self.vrf_max_count:
|
||||||
self.log_error('%s: max vrf count %d hit...not '
|
self.log_error('%s: max vrf count %d hit...not '
|
||||||
'creating vrf' %(ifaceobj.name,
|
'creating vrf' %(ifaceobj.name,
|
||||||
@@ -511,6 +518,7 @@ class vrf(moduleBase):
|
|||||||
else:
|
else:
|
||||||
vrf = ifaceobj.get_attr_value_first('vrf')
|
vrf = ifaceobj.get_attr_value_first('vrf')
|
||||||
if vrf:
|
if vrf:
|
||||||
|
# This is a vrf slave
|
||||||
self._up_vrf_slave(ifaceobj.name, vrf, ifaceobj,
|
self._up_vrf_slave(ifaceobj.name, vrf, ifaceobj,
|
||||||
ifaceobj_getfunc)
|
ifaceobj_getfunc)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
|
Reference in New Issue
Block a user