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

addons: address: add both v4 and v6 gateways instead of just one.

Ticket: CM-8596, CM-5118
Reviewed By: roopa, julien
Testing Done: used same config mentioned in bug

Previously, only first configured gateway is set as default route.
This patch sets all the configured gateways as default routes.

This patch also removes default route on ifup
after removing 'gateway' from the interface

Signed-off-by: Nikhil <nikhil@cumulusnetworks.com>
This commit is contained in:
Nikhil
2016-07-20 15:23:13 -07:00
parent b653111a27
commit 0232d1bbfd

View File

@@ -17,6 +17,7 @@ try:
from ifupdown.netlink import netlink
import ifupdown.ifupdownconfig as ifupdownConfig
import ifupdown.ifupdownflags as ifupdownflags
import ifupdown.statemanager as statemanager
except ImportError, e:
raise ImportError (str(e) + "- required module not found")
@@ -260,6 +261,30 @@ class address(moduleBase):
return
self._inet_address_list_config(ifaceobj, newaddrs, newaddr_attrs)
def _add_delete_gateway(self, ifaceobj, gateways=[], prev_gw=[]):
vrf = ifaceobj.get_attr_value_first('vrf')
metric = ifaceobj.get_attr_value_first('metric')
for del_gw in list(set(prev_gw) - set(gateways)):
try:
self.ipcmd.route_del_gateway(ifaceobj.name, del_gw, vrf, metric)
except:
pass
for add_gw in list(set(gateways) - set(prev_gw)):
try:
self.ipcmd.route_add_gateway(ifaceobj.name, add_gw, vrf)
except:
pass
def _get_prev_gateway(self, ifaceobj, gateways):
ipv = []
saved_ifaceobjs = statemanager.statemanager_api.get_ifaceobjs(ifaceobj.name)
if not saved_ifaceobjs:
return ipv
prev_gateways = saved_ifaceobjs[0].get_attr_value('gateway')
if not prev_gateways:
return ipv
return prev_gateways
def _up(self, ifaceobj, ifaceobj_getfunc=None):
if not self.ipcmd.link_exists(ifaceobj.name):
return
@@ -340,9 +365,12 @@ class address(moduleBase):
pass
if addr_method != "dhcp":
self.ipcmd.route_add_gateway(ifaceobj.name,
ifaceobj.get_attr_value_first('gateway'),
ifaceobj.get_attr_value_first('vrf'))
gateways = ifaceobj.get_attr_value('gateway')
if not gateways:
gateways = []
prev_gw = self._get_prev_gateway(ifaceobj, gateways)
self._add_delete_gateway(ifaceobj, gateways, prev_gw)
return
def _down(self, ifaceobj, ifaceobj_getfunc=None):
try:
@@ -350,10 +378,6 @@ class address(moduleBase):
return
addr_method = ifaceobj.addr_method
if addr_method != "dhcp":
self.ipcmd.route_del_gateway(ifaceobj.name,
ifaceobj.get_attr_value_first('gateway'),
ifaceobj.get_attr_value_first('vrf'),
ifaceobj.get_attr_value_first('metric'))
if ifaceobj.get_attr_value_first('address-purge')=='no':
addrlist = ifaceobj.get_attr_value('address')
for addr in addrlist: