Override get() method of ConfigParser
authorDimitris Aragiorgis <dimara@grnet.gr>
Thu, 13 Feb 2014 14:46:59 +0000 (16:46 +0200)
committerMichele Tartara <mtartara@google.com>
Thu, 20 Feb 2014 14:45:34 +0000 (15:45 +0100)
During backup import/export SafeConfigParser() is used to
save/restore instance's configuration. There is a possibility if an
export is done with a different Ganeti version, a specific value not
to be saved during export (e.g. the NIC/Disk name) but still
requested during import.

With this patch we override the get() method of SafeConfigParser()
and catch NoOptionError if raised and return None. Additionally we
translate "None" values read from .ini file into None.

Signed-off-by: Dimitris Aragiorgis <dimara@grnet.gr>
Signed-off-by: Michele Tartara <mtartara@google.com>
Reviewed-by: Michele Tartara <mtartara@google.com>

lib/objects.py

index 358f108..8b38e81 100644 (file)
@@ -2159,7 +2159,8 @@ class Network(TaggableObject):
     return obj
 
 
-class SerializableConfigParser(ConfigParser.SafeConfigParser):
+# need to inherit object in order to use super()
+class SerializableConfigParser(ConfigParser.SafeConfigParser, object):
   """Simple wrapper over ConfigParse that allows serialization.
 
   This class is basically ConfigParser.SafeConfigParser with two
@@ -2181,6 +2182,23 @@ class SerializableConfigParser(ConfigParser.SafeConfigParser):
     cfp.readfp(buf)
     return cfp
 
+  def get(self, section, option, **kwargs):
+    value = None
+    try:
+      value = super(SerializableConfigParser, self).get(section, option,
+                                                        **kwargs)
+      if value.lower() == constants.VALUE_NONE:
+        value = None
+    except ConfigParser.NoOptionError:
+      r = re.compile(r"(disk|nic)\d+_name")
+      match = r.match(option)
+      if match:
+        pass
+      else:
+        raise
+
+    return value
+
 
 class LvmPvInfo(ConfigObject):
   """Information about an LVM physical volume (PV).