]> git.proxmox.com Git - mirror_ifupdown2.git/commitdiff
addons: vrf: close sockets when vrf interface goes down
authorRoopa Prabhu <roopa@cumulusnetworks.com>
Thu, 15 Sep 2016 17:10:39 +0000 (10:10 -0700)
committerRoopa Prabhu <roopa@cumulusnetworks.com>
Thu, 15 Sep 2016 17:51:49 +0000 (10:51 -0700)
Ticket: CM-11393
Reviewed By: dsa, julien, nikhil
Testing Done: tested up and down of a vrf interface

$ifdown -v blue
..snip ..
info: executing /usr/lib/vrf/vrf-helper delete blue 1030
info: executing ip link del blue
info: executing /bin/ss -aK "dev == 54"
info: vrf: syncing table map to
/etc/iproute2/rt_tables.d/ifupdown2_vrf_map.conf

Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
addons/vrf.py
ifupdownaddons/iproute2.py

index 541e729e15c5b081b6a7bdcd63a5a408b3fc2406..8c07346f0fb2966644ccc8803ed37b3def174ea5 100644 (file)
@@ -123,7 +123,7 @@ class vrf(moduleBase):
         self.vrf_fix_local_table = True
         self.vrf_count = 0
         self.vrf_helper = policymanager.policymanager_api.get_module_globals(module_name=self.__class__.__name__, attr='vrf-helper')
-
+        self.vrf_close_socks_on_down = policymanager.policymanager_api.get_module_globals(module_name=self.__class__.__name__, attr='vrf-close-socks-on-down')
         self.warn_on_vrf_map_write_err = True
 
     def _iproute2_vrf_map_initialize(self, writetodisk=True):
@@ -805,8 +805,23 @@ class vrf(moduleBase):
                                 vrf_table,
                                 mode))
 
+    def _close_sockets(self, ifaceobj, ifindex):
+        if not self.vrf_close_socks_on_down:
+            return
+
+        try:
+            utils.exec_command('/bin/ss -aK \"dev == %s\"'
+                               %ifindex)
+        except Exception, e:
+            self.logger.info('%s: closing socks using ss'
+                             ' failed (%s)\n' %(ifaceobj.name, str(e)))
+            pass
+
     def _down_vrf_dev(self, ifaceobj, vrf_table, ifaceobj_getfunc=None):
 
+        if not self.ipcmd.link_exists(ifaceobj.name):
+            return
+
         if vrf_table == 'auto':
             vrf_table = self._get_iproute2_vrf_table(ifaceobj.name)
 
@@ -841,12 +856,16 @@ class vrf(moduleBase):
             self.logger.info('%s: %s' %(ifaceobj.name, str(e)))
             pass
 
+        ifindex = self.ipcmd.link_get_ifindex(ifaceobj.name)
+
         try:
             self.ipcmd.link_delete(ifaceobj.name)
         except Exception, e:
             self.logger.info('%s: %s' %(ifaceobj.name, str(e)))
             pass
 
+        self._close_sockets(ifaceobj, ifindex)
+
         try:
             self._iproute2_vrf_table_entry_del(vrf_table)
         except Exception, e:
index 624849c84910775a36507eed5774786f0d30f680..157fcd69932070da8d3d7c19b88ef41fcc845036 100644 (file)
@@ -628,6 +628,11 @@ class iproute2(utilsBase):
             return True
         return os.path.exists('/sys/class/net/%s' %ifacename)
 
+    def link_get_ifindex(self, ifacename):
+        if ifupdownflags.flags.DRYRUN:
+            return True
+        return self.read_file_oneline('/sys/class/net/%s/ifindex' %ifacename)
+
     def is_vlan_device_by_name(self, ifacename):
         if re.search(r'\.', ifacename):
             return True