From: Nikos Skalkotos Date: Fri, 26 Jul 2013 16:17:10 +0000 (+0300) Subject: Add decorators defining sysprep params X-Git-Tag: 0.5~1^2~13^2~5 X-Git-Url: https://code.grnet.gr/git/snf-image-creator/commitdiff_plain/f59ad9138b4413e6ec3b6256dade32cba1828507 Add decorators defining sysprep params --- diff --git a/image_creator/dialog_menu.py b/image_creator/dialog_menu.py index 9bc5c40..0513f3d 100644 --- a/image_creator/dialog_menu.py +++ b/image_creator/dialog_menu.py @@ -625,15 +625,17 @@ def sysprep_params(session): 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 = [] - 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), @@ -644,8 +646,9 @@ def sysprep_params(session): 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) diff --git a/image_creator/dialog_wizard.py b/image_creator/dialog_wizard.py index e5a39f8..b79d2b1 100644 --- a/image_creator/dialog_wizard.py +++ b/image_creator/dialog_wizard.py @@ -334,25 +334,26 @@ def start_wizard(session): 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 - 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)): - 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'" % - needed[i].name) + param_names[i]) raise WizardReloadPage return params diff --git a/image_creator/os_type/__init__.py b/image_creator/os_type/__init__.py index 3ac92be..7e6c452 100644 --- a/image_creator/os_type/__init__.py +++ b/image_creator/os_type/__init__.py @@ -70,7 +70,7 @@ def add_prefix(target): 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 @@ -79,21 +79,57 @@ def sysprep(message, enabled=True, **kwargs): 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) - 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""" - SysprepParam = namedtuple('SysprepParam', - 'name description length validator') + SysprepParam = namedtuple('SysprepParam', 'description maxlen validator') def __init__(self, image, **kargs): self.image = image @@ -121,12 +157,6 @@ class OSBase(object): 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) diff --git a/image_creator/os_type/windows.py b/image_creator/os_type/windows.py index ad2d202..b93e539 100644 --- a/image_creator/os_type/windows.py +++ b/image_creator/os_type/windows.py @@ -36,7 +36,7 @@ """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 @@ -107,6 +107,8 @@ KMS_CLIENT_SETUP_KEYS = { 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) @@ -126,15 +128,6 @@ class Windows(OSBase): 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""" @@ -280,9 +273,9 @@ class Windows(OSBase): 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: