+def add_property(session):
+ d = session['dialog']
+
+ while 1:
+ (code, answer) = d.inputbox("Please provide a name for a new image"
+ " property:", width=INPUTBOX_WIDTH)
+ if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
+ return False
+
+ name = answer.strip()
+ if len(name) == 0:
+ d.msgbox("A property name cannot be empty", width=MSGBOX_WIDTH)
+ continue
+
+ break
+
+ while 1:
+ (code, answer) = d.inputbox("Please provide a value for image "
+ "property %s" % name, width=INPUTBOX_WIDTH)
+ if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
+ return False
+
+ value = answer.strip()
+ if len(value) == 0:
+ d.msgbox("Value cannot be empty", width=MSGBOX_WIDTH)
+ continue
+
+ break
+
+ session['metadata'][name] = value
+
+ return True
+
+
+def modify_properties(session):
+ d = session['dialog']
+
+ while 1:
+ choices = []
+ for (key, val) in session['metadata'].items():
+ choices.append((str(key), str(val)))
+
+ (code, choice) = d.menu(
+ "In this menu you can edit existing image properties or add new "
+ "ones. Be carefull! Most properties have special meaning and "
+ "alter the image deployment behaviour. Press <HELP> to see more "
+ "information about image properties. Press <BACK> when done.",
+ height=18,
+ width=MENU_WIDTH,
+ choices=choices, menu_height=10,
+ ok_label="EDIT", extra_button=1, extra_label="ADD", cancel="BACK",
+ help_button=1, help_label="HELP", title="Image Metadata")
+
+ if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
+ break
+ # Edit button
+ elif code == d.DIALOG_OK:
+ (code, answer) = d.inputbox("Please provide a new value for "
+ "the image property with name `%s':" % choice,
+ init=session['metadata'][choice], width=INPUTBOX_WIDTH)
+ if code not in (d.DIALOG_CANCEL, d.DIALOG_ESC):
+ value = answer.strip()
+ if len(value) == 0:
+ d.msgbox("Value cannot be empty!")
+ continue
+ else:
+ session['metadata'][choice] = value
+ # ADD button
+ elif code == d.DIALOG_EXTRA:
+ add_property(session)
+
+
+def delete_properties(session):
+ d = session['dialog']
+
+ choices = []
+ for (key, val) in session['metadata'].items():
+ choices.append((key, "%s" % val, 0))
+
+ (code, to_delete) = d.checklist("Choose which properties to delete:",
+ choices=choices)
+ count = len(to_delete)
+ # If the user exits with ESC or CANCEL, the returned tag list is empty.
+ for i in to_delete:
+ del session['metadata'][i]
+
+ if count > 0:
+ d.msgbox("%d image properties were deleted.", width=MSGBOX_WIDTH)
+
+
+def exclude_task(session):
+ d = session['dialog']
+
+ choices = []
+ for (key, val) in session['metadata'].items():
+ choices.append((key, "%s" % val, 0))
+
+ (code, to_delete) = d.checklist("Choose which properties to delete:",
+ choices=choices)
+ count = len(to_delete)
+ # If the user exits with ESC or CANCEL, the returned tag list is empty.
+ for i in to_delete:
+ del session['metadata'][i]
+
+ if count > 0:
+ d.msgbox("%d image properties were deleted.", width=MSGBOX_WIDTH)
+
+
+def deploy_menu(session):
+ d = session['dialog']
+
+ default_item = "View/Modify"
+ actions = {"View/Modify": modify_properties, "Delete": delete_properties}
+ while 1:
+ (code, choice) = d.menu(
+ "Choose one of the following or press <Back> to exit.",
+ width=MENU_WIDTH,
+ choices=[("View/Modify", "View/Modify image properties"),
+ ("Delete", "Delete image properties"),
+ ("Exclude", "Exclude configuration tasks from running")],
+ cancel="Back",
+ default_item=default_item,
+ title="Image Deployment Menu")
+
+ if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
+ break
+ elif choice in actions:
+ default_item = choice
+ actions[choice](session)
+
+