Add {enable, disable}_guestfs methods in image cls
[snf-image-creator] / image_creator / dialog_menu.py
index d14925f..351f0b9 100644 (file)
@@ -70,6 +70,7 @@ CONFIGURATION_TASKS = [
 
 SYSPREP_PARAM_MAXLEN = 20
 
+
 class MetadataMonitor(object):
     """Monitors image metadata chages"""
     def __init__(self, session, meta):
@@ -627,38 +628,64 @@ def sysprep_params(session):
 
     available = image.os.sysprep_params
     needed = image.os.needed_sysprep_params
-    names = needed.keys()
 
     if len(needed) == 0:
         return True
 
-    fields = []
-    for name in names:
-        param = needed[name]
-        default = available[name] if name in available else ""
-        fields.append(("%s: " % param.description, default,
-                       SYSPREP_PARAM_MAXLEN))
+    def print_form(names, extra_button=False):
+        """print the dialog form providing sysprep_params"""
+        fields = []
+        for name in names:
+            param = needed[name]
+            default = str(available[name]) if name in available else ""
+            fields.append(("%s: " % param.description, default,
+                           SYSPREP_PARAM_MAXLEN))
+
+        kwargs = {}
+        if extra_button:
+            kwargs['extra_button'] = 1
+            kwargs['extra_label'] = "Advanced"
+
+        txt = "Please provide the following system preparation parameters:"
+        return d.form(txt, height=13, width=WIDTH, form_height=len(fields),
+                      fields=fields, **kwargs)
+
+    def check_params(names, values):
+        """check if the provided sysprep parameters have leagal values"""
+        for i in range(len(names)):
+            param = needed[names[i]]
+            try:
+                normalized = param.type(values[i])
+                if param.validate(normalized):
+                    image.os.sysprep_params[names[i]] = normalized
+                    continue
+            except ValueError:
+                pass
 
-    txt = "Please provide the following system preparation parameters:"
-    code, output = d.form(txt, height=13, width=WIDTH, form_height=len(fields),
-                          fields=fields)
+            d.msgbox("Invalid value for parameter: `%s'" % names[i],
+                     width=SMALL_WIDTH)
+            return False
+        return True
 
-    if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
-        return False
+    simple_names = [k for k, v in needed.items() if v.default is None]
+    advanced_names = [k for k, v in needed.items() if v.default is not None]
 
-    for i in range(len(fields)):
-        param = needed[names[i]]
-        try:
-            value = param.type(output[i])
-            if param.validate(value):
-                image.os.sysprep_params[names[i]] = value
-                continue
-        except ValueError:
-            pass
+    while 1:
+        code, output = print_form(simple_names, extra_button=True)
 
-        d.msgbox("The value you provided for parameter: `%s' is not valid" %
-                 names[i], width=SMALL_WIDTH)
-        return False
+        if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
+            return False
+        if code == d.DIALOG_EXTRA:
+            while 1:
+                code, output = print_form(advanced_names)
+                if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
+                    break
+                if check_params(advanced_names, output):
+                    break
+            continue
+
+        if check_params(simple_names, output):
+            break
 
     return True