]> git.proxmox.com Git - mirror_ifupdown2.git/commitdiff
addons: address: add both v4 and v6 gateways instead of just one.
authorNikhil <nikhil@cumulusnetworks.com>
Wed, 20 Jul 2016 22:23:13 +0000 (15:23 -0700)
committerNikhil <nikhil@cumulusnetworks.com>
Tue, 26 Jul 2016 17:33:46 +0000 (10:33 -0700)
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>
addons/address.py

index 661eae0efa3d2c88575933ffa33d444f7123db9d..3a04ed6be90c92f75c6cebdd568e2a8cda6d067f 100644 (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: