Add decorators defining sysprep params
authorNikos Skalkotos <skalkoto@grnet.gr>
Fri, 26 Jul 2013 16:17:10 +0000 (19:17 +0300)
committerNikos Skalkotos <skalkoto@grnet.gr>
Tue, 30 Jul 2013 13:43:59 +0000 (16:43 +0300)
image_creator/dialog_menu.py
image_creator/dialog_wizard.py
image_creator/os_type/__init__.py
image_creator/os_type/windows.py

index 9bc5c40..0513f3d 100644 (file)
@@ -625,15 +625,17 @@ def sysprep_params(session):
     image = session['image']
 
     available = image.os.sysprep_params
     image = session['image']
 
     available = image.os.sysprep_params
-    needed = image.os.needed_sysprep_params()
+    needed = image.os.needed_sysprep_params
+    names = needed.keys()
 
     if len(needed) == 0:
         return True
 
     fields = []
 
     if len(needed) == 0:
         return True
 
     fields = []
-    for param in needed:
-        default = available[param.name] if param.name in available else ""
-        fields.append(("%s: " % param.description, default, param.length))
+    for name in names:
+        param = needed[name]
+        default = available[name] if name in available else ""
+        fields.append(("%s: " % param.description, default, param.maxlen))
 
     txt = "Please provide the following system preparation parameters:"
     code, output = d.form(txt, height=13, width=WIDTH, form_height=len(fields),
 
     txt = "Please provide the following system preparation parameters:"
     code, output = d.form(txt, height=13, width=WIDTH, form_height=len(fields),
@@ -644,8 +646,9 @@ def sysprep_params(session):
 
     sysprep_params = {}
     for i in range(len(fields)):
 
     sysprep_params = {}
     for i in range(len(fields)):
-        if needed[i].validator(output[i]):
-            image.os.sysprep_params[needed[i].name] = output[i]
+        param = needed[names[i]]
+        if param.validator(output[i]):
+            image.os.sysprep_params[names[i]] = output[i]
         else:
             d.msgbox("The value you provided for parameter: %s is not valid" %
                      name, width=SMALL_WIDTH)
         else:
             d.msgbox("The value you provided for parameter: %s is not valid" %
                      name, width=SMALL_WIDTH)
index e5a39f8..b79d2b1 100644 (file)
@@ -334,25 +334,26 @@ def start_wizard(session):
         if 'DESCRIPTION' in session['metadata'] else '')
 
     # Create Sysprep Params Wizard Page
         if 'DESCRIPTION' in session['metadata'] else '')
 
     # Create Sysprep Params Wizard Page
-    needed = image.os.needed_sysprep_params()
+    needed = image.os.needed_sysprep_params
+    param_names = needed.keys()
 
     def sysprep_params_fields():
         fields = []
         available = image.os.sysprep_params
 
     def sysprep_params_fields():
         fields = []
         available = image.os.sysprep_params
-        for param in needed:
-            text = param.description
-            default = available[param.name] if param.name in available else ""
-            fields.append(("%s: " % text, default, param.length))
+        for name in param_names:
+            text = needed[name].description
+            default = available[name] if name in available else ""
+            fields.append(("%s: " % text, default, needed[name].maxlen))
         return fields
 
     def sysprep_params_validate(answer):
         params = {}
         for i in range(len(answer)):
         return fields
 
     def sysprep_params_validate(answer):
         params = {}
         for i in range(len(answer)):
-            if needed[i].validator(answer):
-                params[needed[i].name] = answer[i]
+            if needed[param_names[i]].validator(answer):
+                params[param_names[i]] = answer[i]
             else:
                 session['dialog'].msgbox("Invalid value for parameter `%s'" %
             else:
                 session['dialog'].msgbox("Invalid value for parameter `%s'" %
-                                         needed[i].name)
+                                         param_names[i])
                 raise WizardReloadPage
         return params
 
                 raise WizardReloadPage
         return params
 
index 3ac92be..7e6c452 100644 (file)
@@ -70,7 +70,7 @@ def add_prefix(target):
 
 def sysprep(message, enabled=True, **kwargs):
     """Decorator for system preparation tasks"""
 
 def sysprep(message, enabled=True, **kwargs):
     """Decorator for system preparation tasks"""
-    def wrapper1(func):
+    def wrapper(func):
         func.sysprep = True
         func.enabled = enabled
         func.executed = False
         func.sysprep = True
         func.enabled = enabled
         func.executed = False
@@ -79,21 +79,57 @@ def sysprep(message, enabled=True, **kwargs):
             setattr(func, key, val)
 
         @wraps(func)
             setattr(func, key, val)
 
         @wraps(func)
-        def wrapper2(self, print_message=True):
+        def inner(self, print_message=True):
             if print_message:
                 self.out.output(message)
             return func(self)
 
             if print_message:
                 self.out.output(message)
             return func(self)
 
-        return wrapper2
+        return inner
 
 
-    return wrapper1
+    return wrapper
+
+
+def add_sysprep_param(name, descr, maxlen, default=None,
+                      validator=lambda x: True):
+    """Decorator for init that adds the definition for a system preparation
+    parameter
+    """
+    def wrapper(func):
+
+        @wraps(func)
+        def inner(self, *args, **kwargs):
+
+            func(self, *args, **kwargs)
+
+            if not hasattr(self, 'needed_sysprep_params'):
+                self.needed_sysprep_params = {}
+            getattr(self, 'needed_sysprep_params')[name] = \
+                self.SysprepParam(descr, maxlen, validator)
+        return inner
+
+    return wrapper
+
+
+def del_sysprep_param(name):
+    """Decorator for init that deletes a previously added sysprep parameter
+    definition .
+    """
+    def wrapper(func):
+
+        @wraps(func)
+        def inner(self, *args, **kwargs):
+            del self.needed_sysprep_params[nam]
+            func(self, *args, **kwargs)
+
+        return inner
+
+    return wrapper
 
 
 class OSBase(object):
     """Basic operating system class"""
 
 
 
 class OSBase(object):
     """Basic operating system class"""
 
-    SysprepParam = namedtuple('SysprepParam',
-                              'name description length validator')
+    SysprepParam = namedtuple('SysprepParam', 'description maxlen validator')
 
     def __init__(self, image, **kargs):
         self.image = image
 
     def __init__(self, image, **kargs):
         self.image = image
@@ -121,12 +157,6 @@ class OSBase(object):
 
         self.out.output()
 
 
         self.out.output()
 
-    def needed_sysprep_params(self):
-        """Returns a list of needed sysprep parameters. Each element in the
-        list is a SysprepParam object.
-        """
-        return []
-
     def list_syspreps(self):
         """Returns a list of sysprep objects"""
         objs = [getattr(self, name) for name in dir(self)
     def list_syspreps(self):
         """Returns a list of sysprep objects"""
         objs = [getattr(self, name) for name in dir(self)
index ad2d202..b93e539 100644 (file)
@@ -36,7 +36,7 @@
 """This module hosts OS-specific code common for the various Microsoft
 Windows OSs."""
 
 """This module hosts OS-specific code common for the various Microsoft
 Windows OSs."""
 
-from image_creator.os_type import OSBase, sysprep
+from image_creator.os_type import OSBase, sysprep, add_sysprep_param
 from image_creator.util import FatalError, check_guestfs_version, get_command
 from image_creator.winexe import WinEXE, WinexeTimeout
 
 from image_creator.util import FatalError, check_guestfs_version, get_command
 from image_creator.winexe import WinEXE, WinexeTimeout
 
@@ -107,6 +107,8 @@ KMS_CLIENT_SETUP_KEYS = {
 
 class Windows(OSBase):
     """OS class for Windows"""
 
 class Windows(OSBase):
     """OS class for Windows"""
+
+    @add_sysprep_param('password', 'Image Administrator Password', 20)
     def __init__(self, image, **kargs):
         super(Windows, self).__init__(image, **kargs)
 
     def __init__(self, image, **kargs):
         super(Windows, self).__init__(image, **kargs)
 
@@ -126,15 +128,6 @@ class Windows(OSBase):
 
         self.product_name = self.g.inspect_get_product_name(self.root)
 
 
         self.product_name = self.g.inspect_get_product_name(self.root)
 
-    def needed_sysprep_params(self):
-        """Returns a list of needed sysprep parameters. Each element in the
-        list is a SysprepParam object.
-        """
-        password = self.SysprepParam(
-            'password', 'Image Administrator Password', 20, lambda x: True)
-
-        return [password]
-
     @sysprep('Disabling IPv6 privacy extensions')
     def disable_ipv6_privacy_extensions(self):
         """Disable IPv6 privacy extensions"""
     @sysprep('Disabling IPv6 privacy extensions')
     def disable_ipv6_privacy_extensions(self):
         """Disable IPv6 privacy extensions"""
@@ -280,9 +273,9 @@ class Windows(OSBase):
             raise FatalError("Image is already syspreped!")
 
         txt = "System preparation parameter: `%s' is needed but missing!"
             raise FatalError("Image is already syspreped!")
 
         txt = "System preparation parameter: `%s' is needed but missing!"
-        for param in self.needed_sysprep_params():
-            if param[0] not in self.sysprep_params:
-                raise FatalError(txt % param[0])
+        for param in self.needed_sysprep_params:
+            if param not in self.sysprep_params:
+                raise FatalError(txt % param)
 
         self.mount(readonly=False)
         try:
 
         self.mount(readonly=False)
         try: