From 0232d1bbfd6b6c46a21a2b7c6ad9d0ebd14b9064 Mon Sep 17 00:00:00 2001 From: Nikhil Date: Wed, 20 Jul 2016 15:23:13 -0700 Subject: [PATCH] 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 --- addons/address.py | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/addons/address.py b/addons/address.py index 661eae0..3a04ed6 100644 --- a/addons/address.py +++ b/addons/address.py @@ -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: