Refactored Create New VM for more readability
This commit is contained in:
		
							parent
							
								
									f0a8241e0d
								
							
						
					
					
						commit
						2ae92dffc0
					
				| @ -41,6 +41,7 @@ class CreateVMThread(QtCore.QThread): | ||||
|     def __init__(self, app, vmclass, name, label, template, properties, | ||||
|                  pool): | ||||
|         QtCore.QThread.__init__(self) | ||||
|         print(vmclass, name, label, template, properties, pool) | ||||
|         self.app = app | ||||
|         self.vmclass = vmclass | ||||
|         self.name = name | ||||
| @ -100,46 +101,38 @@ class NewVmDlg(QtWidgets.QDialog, Ui_NewVMDlg): | ||||
|         self.thread = None | ||||
|         self.progress = None | ||||
| 
 | ||||
|         # Theoretically we should be locking for writing here and unlock | ||||
|         # only after the VM creation finished. But the code would be | ||||
|         # more messy... | ||||
|         # Instead we lock for writing in the actual worker thread | ||||
|         self.label_list, self.label_idx = utils.prepare_label_choice( | ||||
|             self.label, | ||||
|             self.app, None, | ||||
|             None, | ||||
|             allow_default=False) | ||||
|         utils.initialize_widget_with_labels( | ||||
|             widget=self.label, | ||||
|             qubes_app=self.app) | ||||
| 
 | ||||
|         self.template_list, self.template_idx = utils.prepare_vm_choice( | ||||
|             self.template_vm, | ||||
|             self.app, None, | ||||
|             self.app.default_template, | ||||
|             (lambda vm: vm.klass == 'TemplateVM'), | ||||
|             allow_internal=False, allow_default=True, allow_none=False) | ||||
|         utils.initialize_widget_with_default( | ||||
|             widget=self.template_vm, | ||||
|             item_list=self.app.domains, | ||||
|             filter_function=(lambda vm: not utils.is_internal(vm) and vm.klass == 'TemplateVM'), | ||||
|             mark_existing_as_default=True, | ||||
|             default_value=self.app.default_template) | ||||
| 
 | ||||
|         self.netvm_list, self.netvm_idx = utils.prepare_vm_choice( | ||||
|             self.netvm, | ||||
|             self.app, None, | ||||
|             self.app.default_netvm, | ||||
|             (lambda vm: vm.provides_network), | ||||
|             allow_internal=False, allow_default=True, allow_none=True) | ||||
|         utils.initialize_widget_with_default( | ||||
|             widget=self.netvm, | ||||
|             item_list=self.app.domains, | ||||
|             filter_function=(lambda vm: not utils.is_internal(vm) and vm.provides_network), | ||||
|             add_none=True, | ||||
|             add_qubes_default=True, | ||||
|             default_value=self.app.default_netvm) | ||||
| 
 | ||||
|         self.pool_list, self.pool_idx = utils.prepare_choice( | ||||
|         utils.initialize_widget_with_default( | ||||
|             widget=self.storage_pool, | ||||
|             holder=None, | ||||
|             propname=None, | ||||
|             choice=self.app.pools.values(), | ||||
|             default=self.app.default_pool, | ||||
|             allow_default=True, | ||||
|             allow_none=False | ||||
|         ) | ||||
|             item_list=self.app.pools.values(), | ||||
|             add_qubes_default=True, | ||||
|             mark_existing_as_default=True, | ||||
|             default_value=self.app.default_pool) | ||||
| 
 | ||||
|         self.name.setValidator(QtGui.QRegExpValidator( | ||||
|             QtCore.QRegExp("[a-zA-Z0-9_-]*", QtCore.Qt.CaseInsensitive), None)) | ||||
|         self.name.selectAll() | ||||
|         self.name.setFocus() | ||||
| 
 | ||||
|         if not self.template_list: | ||||
|         if self.template_vm.count() < 1: | ||||
|             QtWidgets.QMessageBox.warning( | ||||
|                 self, | ||||
|                 self.tr('No template available!'), | ||||
| @ -147,10 +140,16 @@ class NewVmDlg(QtWidgets.QDialog, Ui_NewVMDlg): | ||||
| 
 | ||||
|         # Order of types is important and used elsewhere; if it's changed | ||||
|         # check for changes needed in self.type_change | ||||
|         type_list = [self.tr("Qube based on a template (AppVM)"), | ||||
|                      self.tr("Standalone qube copied from a template"), | ||||
|                      self.tr("Empty standalone qube (install your own OS)")] | ||||
|         self.vm_type.addItems(type_list) | ||||
|         type_list = [ | ||||
|             (self.tr("Qube based on a template (AppVM)"), 'AppVM'), | ||||
|             (self.tr("Standalone qube copied from a template"), | ||||
|              'StandaloneVM-copy'), | ||||
|             (self.tr("Empty standalone qube (install your own OS)"), | ||||
|              'StandaloneVM-empty')] | ||||
|         utils.initialize_widget(widget=self.vm_type, | ||||
|                                 choices=type_list, | ||||
|                                 selected_value='AppVM', | ||||
|                                 add_current_label=False) | ||||
| 
 | ||||
|         self.vm_type.currentIndexChanged.connect(self.type_change) | ||||
| 
 | ||||
| @ -161,8 +160,8 @@ class NewVmDlg(QtWidgets.QDialog, Ui_NewVMDlg): | ||||
|         self.done(0) | ||||
| 
 | ||||
|     def accept(self): | ||||
|         vmclass = ('AppVM' if self.vm_type.currentIndex() == 0 | ||||
|                    else 'StandaloneVM') | ||||
|         selected_type = self.vm_type.currentData() | ||||
|         vmclass = selected_type.split('-')[0] | ||||
| 
 | ||||
|         name = str(self.name.text()) | ||||
| 
 | ||||
| @ -174,25 +173,21 @@ class NewVmDlg(QtWidgets.QDialog, Ui_NewVMDlg): | ||||
|                         'system!').format(name)) | ||||
|             return | ||||
| 
 | ||||
|         label = self.label_list[self.label.currentIndex()] | ||||
|         label = self.label.currentData() | ||||
| 
 | ||||
|         if self.template_vm.currentIndex() == -1: | ||||
|             template = None | ||||
|         else: | ||||
|             template = self.template_list[self.template_vm.currentIndex()] | ||||
|         template = self.template_vm.currentData() | ||||
| 
 | ||||
|         properties = {'provides_network': self.provides_network.isChecked()} | ||||
|         if self.netvm.currentIndex() != 0: | ||||
|             properties['netvm'] = self.netvm_list[self.netvm.currentIndex()] | ||||
|             properties['netvm'] = self.netvm.currentData() | ||||
| 
 | ||||
|         # Standalone - not based on a template | ||||
|         if self.vm_type.currentIndex() == 2: | ||||
|         if selected_type == 'StandaloneVM-empty': | ||||
|             properties['virt_mode'] = 'hvm' | ||||
|             properties['kernel'] = None | ||||
| 
 | ||||
|         if self.pool_list[self.storage_pool.currentIndex()] is not \ | ||||
|                 qubesadmin.DEFAULT: | ||||
|             pool = self.pool_list[self.storage_pool.currentIndex()] | ||||
|         if self.storage_pool.currentData() is not qubesadmin.DEFAULT: | ||||
|             pool = self.storage_pool.currentData() | ||||
|         else: | ||||
|             pool = None | ||||
| 
 | ||||
| @ -230,24 +225,21 @@ class NewVmDlg(QtWidgets.QDialog, Ui_NewVMDlg): | ||||
|                     ['qubes-vm-boot-from-device', str(self.name.text())]) | ||||
| 
 | ||||
|     def type_change(self): | ||||
|         # AppVM | ||||
|         if self.vm_type.currentIndex() == 0: | ||||
|         if self.vm_type.currentData() == 'AppVM': | ||||
|             self.template_vm.setEnabled(True) | ||||
|             if self.template_vm.currentIndex() == -1: | ||||
|                 self.template_vm.setCurrentIndex(0) | ||||
|             self.install_system.setEnabled(False) | ||||
|             self.install_system.setChecked(False) | ||||
| 
 | ||||
|         # Standalone - based on a template | ||||
|         if self.vm_type.currentIndex() == 1: | ||||
|         if self.vm_type.currentData() == 'Standalone-copy': | ||||
|             self.template_vm.setEnabled(True) | ||||
|             if self.template_vm.currentIndex() == -1: | ||||
|                 self.template_vm.setCurrentIndex(0) | ||||
|             self.install_system.setEnabled(False) | ||||
|             self.install_system.setChecked(False) | ||||
| 
 | ||||
|         # Standalone - not based on a template | ||||
|         if self.vm_type.currentIndex() == 2: | ||||
|         if self.vm_type.currentData() == 'Standalone-empty': | ||||
|             self.template_vm.setEnabled(False) | ||||
|             self.template_vm.setCurrentIndex(-1) | ||||
|             self.install_system.setEnabled(True) | ||||
|  | ||||
| @ -92,7 +92,7 @@ def did_widget_selection_change(widget): | ||||
|     return not translate(" (current)") in widget.currentText() | ||||
| 
 | ||||
| 
 | ||||
| def initialize_widget(widget, choices, selected_value=None, icon_getter=None): | ||||
| def initialize_widget(widget, choices, selected_value=None, icon_getter=None, add_current_label=True): | ||||
|     """ | ||||
|     populates widget (ListBox or ComboBox) with items. Previous widget contents | ||||
|     are erased. | ||||
| @ -120,13 +120,14 @@ def initialize_widget(widget, choices, selected_value=None, icon_getter=None): | ||||
|         widget.addItem(str(selected_value), selected_value) | ||||
|         widget.setCurrentIndex(widget.findText(str(selected_value))) | ||||
| 
 | ||||
|     if add_current_label: | ||||
|         widget.setItemText(widget.currentIndex(), | ||||
|                            widget.currentText() + translate(" (current)")) | ||||
| 
 | ||||
| 
 | ||||
| def initialize_widget_for_property( | ||||
|         widget, choices, holder, property_name, allow_default=False, | ||||
|         icon_getter=None): | ||||
|         icon_getter=None, add_current_label=True): | ||||
|     # potentially add default | ||||
|     if allow_default: | ||||
|         default_property = holder.property_get_default(property_name) | ||||
| @ -145,7 +146,8 @@ def initialize_widget_for_property( | ||||
|     initialize_widget(widget, | ||||
|                       choices, | ||||
|                       selected_value=current_value, | ||||
|                       icon_getter=icon_getter) | ||||
|                       icon_getter=icon_getter, | ||||
|                       add_current_label=add_current_label) | ||||
| 
 | ||||
| 
 | ||||
| # TODO: add use icons here | ||||
| @ -174,6 +176,44 @@ def initialize_widget_with_vms(widget, | ||||
|         property_name=property_name, allow_default=allow_default) | ||||
| 
 | ||||
| 
 | ||||
| def initialize_widget_with_default(widget, | ||||
|                                    item_list, | ||||
|                                    filter_function=(lambda x: True), | ||||
|                                    add_none=False, | ||||
|                                    add_qubes_default=False,  # refers to qubesdamin.default | ||||
|                                    mark_existing_as_default=False, # needed because the default value can be none | ||||
|                                    default_value=None): | ||||
|     choices = [] | ||||
| 
 | ||||
|     for item in item_list: | ||||
|         if not filter_function(item): | ||||
|             continue | ||||
|         if mark_existing_as_default and item == default_value: | ||||
|             choices.append((translate("default ({})").format(item), item)) | ||||
|         else: | ||||
|             choices.append((str(item), item)) | ||||
| 
 | ||||
|     if add_qubes_default: | ||||
|         choices.insert(0, (translate("default ({})").format(default_value), | ||||
|                            qubesadmin.DEFAULT)) | ||||
| 
 | ||||
|     if add_none: | ||||
|         if mark_existing_as_default and default_value is None: | ||||
|             choices.append((translate("default (none)"), None)) | ||||
|         else: | ||||
|             choices.append((translate("(none)"), None)) | ||||
| 
 | ||||
|     if add_qubes_default: | ||||
|         selected_value = qubesadmin.DEFAULT | ||||
|     elif mark_existing_as_default: | ||||
|         selected_value = default_value | ||||
|     else: | ||||
|         selected_value = choices[0][1] | ||||
| 
 | ||||
|     initialize_widget( | ||||
|         widget=widget, choices=choices, selected_value=selected_value, add_current_label=False) | ||||
| 
 | ||||
| 
 | ||||
| def initialize_widget_with_kernels(widget, | ||||
|                                    qubes_app, | ||||
|                                    allow_none=False, | ||||
| @ -201,13 +241,23 @@ def initialize_widget_with_labels(widget, | ||||
|     labels = sorted(qubes_app.labels.values(), key=lambda l: l.index) | ||||
|     choices = [(label.name, label) for label in labels] | ||||
| 
 | ||||
|     icon_getter = (lambda label: | ||||
|                    QtGui.QIcon.fromTheme(label.icon)) | ||||
| 
 | ||||
|     if holder: | ||||
|         initialize_widget_for_property( | ||||
|             widget=widget, | ||||
|             choices=choices, | ||||
|             holder=holder, | ||||
|             property_name=property_name, | ||||
|         icon_getter=(lambda label: | ||||
|                      QtGui.QIcon.fromTheme(label.icon))) | ||||
|             icon_getter=icon_getter) | ||||
|     else: | ||||
|         initialize_widget(widget=widget, | ||||
|                           choices=choices, | ||||
|                           selected_value=labels[0], | ||||
|                           icon_getter=icon_getter, | ||||
|                           add_current_label=False) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| def prepare_choice(widget, holder, propname, choice, default, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marta Marczykowska-Górecka
						Marta Marczykowska-Górecka