Improve configmgr
authorGui Chen <gui.chen@intel.com>
Thu, 18 Aug 2011 02:38:21 +0000 (10:38 +0800)
committerGui Chen <gui.chen@intel.com>
Thu, 18 Aug 2011 02:38:21 +0000 (10:38 +0800)
Signed-off-by: Gui Chen <gui.chen@intel.com>
mic/configmgr.py
mic/utils/errors.py

index 579174e..7892591 100644 (file)
@@ -19,7 +19,9 @@
 
 import os, sys
 import logging
+import ConfigParser
 import mic.utils as utils
+import mic.utils.errors as errors
 
 DEFAULT_GSITECONF='/etc/mic/mic.conf'
 
@@ -27,36 +29,65 @@ DEFAULT_OUTDIR='.'
 DEFAULT_TMPDIR='/var/tmp'
 DEFAULT_CACHEDIR='/var/cache'
 
+DEFAULT_CREATE = {
+    "tmpdir": DEFAULT_TMPDIR,
+    "cachedir": DEFAULT_CACHEDIR,
+    "outdir": DEFAULT_OUTDIR,
+    "arch": "i586",
+    "pkgmgr": "zypp",
+    "name": "output",
+    "ksfile": None,
+    "ks": None,
+    "repomd": None,
+}
+
 class ConfigMgr(object):
-    def __init__(self, siteconf=None, ksconf=None):
+    def __init__(self, ksconf=None, siteconf=None):
         self.common = {}
         self.create = {}
         self.convert = {}
         self.chroot = {}
+        self.ksconf = None
+        self.siteconf = None
 
-        self.siteconf = siteconf
-        self.ksconf = ksconf
+        # initial create
+        for key in DEFAULT_CREATE.keys():
+            self.create[key] = DEFAULT_CREATE[key]
 
-        self.create["tmpdir"] = DEFAULT_TMPDIR
-        self.create["cachedir"] = DEFAULT_CACHEDIR
-        self.create["outdir"] = DEFAULT_OUTDIR
+        # initial options from siteconf
+        self._siteconf = siteconf
+        if not self.siteconf:
+            self._siteconf = DEFAULT_GSITECONF
+        
+        self._ksconf = ksconf
 
-        self.init_siteconf(self.siteconf)
-        self.init_kickstart(self.ksconf)
+    def __set_siteconf(self, siteconf):
+        try:
+            self.siteconf = siteconf
+            self.parse_siteconf(siteconf)
+        except ConfigParser.Error, error:
+            raise errors.ConfigError("%s" % error)
+    def __get_siteconf(self):
+        return self.siteconf
+    _siteconf = property(__get_siteconf, __set_siteconf)
+
+    def __set_ksconf(self, ksconf):
+        self.ksconf = ksconf
+        self.parse_kickstart(ksconf)
+        pass
+    def __get_ksconf(self):
+        return self.ksconf
+    _ksconf = property(__get_ksconf, __set_ksconf)
+
+    def parse_siteconf(self, siteconf = None):
+        if not siteconf:
+            return
 
-    def init_siteconf(self, siteconf = None):
         from ConfigParser import SafeConfigParser
         siteconf_parser = SafeConfigParser()
-        siteconf_files = [DEFAULT_GSITECONF]
-
-        if not os.path.exists(DEFAULT_GSITECONF):
-            logging.debug("No default config file: %s" % DEFAULT_GSITECONF)
-            return
-
-        if siteconf:
-            self.siteconf = siteconf
-            siteconf_files = [self.siteconf]
-        siteconf_parser.read(siteconf_files)
+        if not os.path.exists(siteconf):
+            raise errors.ConfigError("Failed to find config file: %s" % siteconf)
+        siteconf_parser.read(siteconf)
 
         for option in siteconf_parser.options('common'):
             value = siteconf_parser.get('common', option)
@@ -74,38 +105,33 @@ class ConfigMgr(object):
             value = siteconf_parser.get('chroot', option)
             self.chroot[option] = value
 
-    def init_kickstart(self, ksconf=None):
+    def parse_kickstart(self, ksconf=None):
         if not ksconf:
-            self.create['ks'] = None
-            self.create['repomd'] = None
             return
 
-        self.ksconf = ksconf
         try:
-            self.kickstart = utils.kickstart.read_kickstart(self.ksconf)
-            self.ksrepos = utils.misc.get_repostrs_from_ks(self.kickstart)
-            print "Retrieving repo metadata:"
-            self.repometadata = utils.misc.get_metadata_from_repos(self.ksrepos, self.create['cachedir'])
-            print
-            self.create['ks'] = self.kickstart
-            self.create['repomd'] = self.repometadata
+            kickstart = utils.kickstart.read_kickstart(ksconf)
+            ksrepos = utils.misc.get_repostrs_from_ks(kickstart)
+            repometadata = utils.misc.get_metadata_from_repos(ksrepos, self.create['cachedir'])
+            sys.stdout.write("Retrieving repo metadata:\n")
+            sys.stdout.write("%s" % repometadata)
+            sys.stdout.flush()
+            self.create['ks'] = kickstart
+            self.create['repomd'] = repometadata
             self.create['name'] = os.path.splitext(os.path.basename(ksconf))[0]
-
-        except OSError, e:
-            raise Exception("Failed to create image: %s" % e)
         except Exception, e:
-            raise Exception("Unable to load kickstart file '%s': %s" % (self.ksconf, e))
+            raise errors.KickstartError("Unable to load kickstart file '%s': %s" % (ksconf, e))
 
     def setProperty(self, key, value):
         if not hasattr(self, key):
-            return None
+            return False
 
         if key == 'ksconf':
-            self.init_kickstart(value)
+            self._ksconf = value
             return True
 
         if key == 'siteconf':
-            self.init_siteconf(value)
+            self._siteconf = value
             return True
 
         return setattr(self, key, value)
@@ -118,29 +144,29 @@ class ConfigMgr(object):
 
     def setCategoryProperty(self, category, key, value):
         if not hasattr(self, category):
-            raise Exception("Error to parse %s", category)
+            raise errors.ConfigError("Error to parse %s", category)
         categ = getattr(self, category)
         categ[key] = value
 
     def getCategoryProperty(self, category, key):
         if not hasattr(self, category):
-            raise Exception("Error to parse %s", category)
+            raise errors.ConfigError("Error to parse %s", category)
         categ = getattr(self, category)
         return categ[key]
 
     def getCreateOption(self, key):
         if not self.create.has_key(key):
-            raise Exception("Attribute Error: not such attribe %s" % key)
+            raise errors.ConfigError("Attribute Error: not such attribe %s" % key)
         return self.create[key]
 
     def getConvertOption(self, key):
         if not self.convert.has_key(key):
-            raise Exception("Attribute Error: not such attribe %s" % key)
+            raise errors.ConfigError("Attribute Error: not such attribe %s" % key)
         return self.convert[key]
 
     def getChrootOption(self, key):
         if not self.chroot.has_key(key):
-            raise Exception("Attribute Error: not such attribe %s" % key)
+            raise errors.ConfigError("Attribute Error: not such attribe %s" % key)
         return self.chroot[key]
 
     def dumpAllConfig(self):
index 3ce37f2..7d7c69d 100644 (file)
@@ -20,6 +20,10 @@ class Usage(Exception):
     def __init__(self, msg=None):
         Exception.__init__(self, msg)
 
+class ConfigError(Exception):
+    def __init__(self, msg=None):
+        Exception.__init__(self, msg)
+
 class CreatorError(Exception):
     """An exception base class for all imgcreate errors."""
     def __init__(self, msg):