]> git.proxmox.com Git - mirror_ifupdown2.git/commitdiff
addons: vrf: be more friendly to older iproute2 versions
authorRoopa Prabhu <roopa@cumulusnetworks.com>
Fri, 2 Sep 2016 22:10:24 +0000 (15:10 -0700)
committerRoopa Prabhu <roopa@cumulusnetworks.com>
Fri, 2 Sep 2016 22:10:24 +0000 (15:10 -0700)
Ticket: CM-12049
Reviewed By: dsa, julien, nikhil
Testing Done: tested with and without /etc/iproute2/rt_tables.d/

OS does not have /etc/iproute2/rt_tables.d, on errors just info:
$ifreload -a -v
info: unable to save iproute2 vrf to table map ([Errno 2] No such file
or directory: '/etc/iproute2/rt_tables.d/ifupdown2_vrf_map.conf')

info: cannot find /etc/iproute2/rt_tables.d. pls check if your iproute2
version supports rt_tables.d

OS has /etc/iproute2/rt_tables.d, on errors warn:
$ifreload -a
warn: unable to save iproute2 vrf to table map ([Errno 2] No such file

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

index 59d62c7590b8486f6196494e9e3684e7113a9ac3..f353ed52359a8596fe337aa78523595721df2e5c 100644 (file)
@@ -124,6 +124,8 @@ class vrf(moduleBase):
         self.vrf_count = 0
         self.vrf_helper = policymanager.policymanager_api.get_module_globals(module_name=self.__class__.__name__, attr='vrf-helper')
 
+        self.warn_on_vrf_map_write_err = True
+
     def _iproute2_vrf_map_initialize(self, writetodisk=True):
         if self._iproute2_vrf_map_initialized:
             return
@@ -189,18 +191,35 @@ class vrf(moduleBase):
         self._iproute2_vrf_map_initialized = True
         self.vrf_count = len(self.iproute2_vrf_map)
 
+    def _iproute2_map_warn(self, errstr):
+        if self.warn_on_vrf_map_write_err:
+            if not os.path.exists('/etc/iproute2/rt_tables.d/'):
+                self.logger.info('unable to save iproute2 vrf to table ' +
+                                 'map (%s)\n' %errstr)
+                self.logger.info('cannot find /etc/iproute2/rt_tables.d.' +
+                                 ' pls check if your iproute2 version' +
+                                 ' supports rt_tables.d')
+            else:
+                self.logger.warn('unable to open iproute2 vrf to table ' +
+                                 'map (%s)\n' %errstr)
+            self.warn_on_vrf_map_write_err = False
+
     def _iproute2_vrf_map_sync_to_disk(self):
         if (ifupdownflags.flags.DRYRUN or
             not self.iproute2_vrf_map_sync_to_disk):
             return
         self.logger.info('vrf: syncing table map to %s'
                          %self.iproute2_vrf_filename)
-        with open(self.iproute2_vrf_filename, 'w') as f:
-            f.write(self.iproute2_vrf_filehdr %(self.vrf_table_id_start,
-                    self.vrf_table_id_end))
-            for t, v in self.iproute2_vrf_map.iteritems():
-                f.write('%s %s\n' %(t, v))
-            f.flush()
+        try:
+            with open(self.iproute2_vrf_filename, 'w') as f:
+                f.write(self.iproute2_vrf_filehdr %(self.vrf_table_id_start,
+                        self.vrf_table_id_end))
+                for t, v in self.iproute2_vrf_map.iteritems():
+                    f.write('%s %s\n' %(t, v))
+                f.flush()
+        except Exception, e:
+            self._iproute2_map_warn(str(e))
+            pass
 
     def _iproute2_vrf_map_open(self, sync_vrfs=False, append=False):
         self.logger.info('vrf: syncing table map to %s'
@@ -213,8 +232,7 @@ class vrf(moduleBase):
                                          '%s' %fmode)
             fcntl.fcntl(self.iproute2_vrf_map_fd, fcntl.F_SETFD, fcntl.FD_CLOEXEC)
         except Exception, e:
-            self.log_warn('vrf: error opening %s (%s)'
-                          %(self.iproute2_vrf_filename, str(e)))
+            self._iproute2_map_warn(str(e))
             return
 
         if not append: