From 79f82e4d23889d9e423e257a8932def3c833953f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Marczykowska-G=C3=B3recka?= Date: Wed, 13 Sep 2017 20:17:24 +0200 Subject: [PATCH] Create new VM Create new VM window. Window slightly redesigned for more logical flow. --- qubesmanager/create_new_vm.py | 80 +++++++++++++++++++--- ui/newappvmdlg.ui | 122 +++++++++++++++++++--------------- 2 files changed, 140 insertions(+), 62 deletions(-) diff --git a/qubesmanager/create_new_vm.py b/qubesmanager/create_new_vm.py index 95051eb..856bc4b 100644 --- a/qubesmanager/create_new_vm.py +++ b/qubesmanager/create_new_vm.py @@ -26,6 +26,7 @@ import os import sys import threading import time +import subprocess from PyQt4.QtCore import * from PyQt4.QtGui import * @@ -52,7 +53,6 @@ class NewVmDlg(QDialog, Ui_NewVMDlg): # 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, @@ -83,11 +83,23 @@ class NewVmDlg(QDialog, Ui_NewVMDlg): self.tr('No template available!'), self.tr('Cannot create a qube when no template exists.')) + # Order of types is important and used elsewhere; if it's changed + # check for changes needed in self.type_change and TODO + type_list = [self.tr("AppVM"), + self.tr("Standalone VM based on a template"), + self.tr("Standalone VM not based on a template")] + self.vm_type.addItems(type_list) + + self.vm_type.currentIndexChanged.connect(self.type_change) + + self.launch_settings.stateChanged.connect(self.settings_change) + self.install_system.stateChanged.connect(self.install_change) + def reject(self): self.done(0) def accept(self): - vmclass = ('StandaloneVM' if self.standalone.isChecked() else 'AppVM') + vmclass = ('AppVM' if self.vm_type.currentIndex() == 0 else 'StandaloneVM') name = str(self.name.text()) try: @@ -102,11 +114,15 @@ class NewVmDlg(QDialog, Ui_NewVMDlg): return label = self.label_list[self.label.currentIndex()] - template = self.template_list[self.template_vm.currentIndex()] + + if self.template_vm.currentIndex() == -1: + template = None + else: + template = self.template_list[self.template_vm.currentIndex()] properties = {} properties['provides_network'] = self.provides_network.isChecked() - properties['virt_mode'] = 'hvm' if self.hvm.isChecked() else 'pv' + properties['virt_mode'] = 'hvm' properties['netvm'] = self.netvm_list[self.netvm.currentIndex()] thread_monitor = ThreadMonitor() @@ -135,20 +151,68 @@ class NewVmDlg(QDialog, Ui_NewVMDlg): self.done(0) + if thread_monitor.success: + if self.launch_settings.isChecked(): + subprocess.check_call(['qubes-vm-settings', name]) + if self.install_system.isChecked(): + subprocess.check_call( + ['qubes-vm-boot-from-device', name]) + @staticmethod def do_create_vm(app, vmclass, name, label, template, properties, thread_monitor): try: - vm = app.add_new_vm(vmclass, - name=name, label=label, template=template) - for k, v in properties.items(): - setattr(vm, k, v) + if vmclass == 'StandaloneVM' and template is not None: + if template is qubesadmin.DEFAULT: + src_vm = app.default_template + else: + src_vm = template + vm = app.clone_vm(src_vm, name, vmclass) + vm.label = label + for k, v in properties.items(): + setattr(vm, k, v) + else: + vm = app.add_new_vm(vmclass, + name=name, label=label, template=template) + for k, v in properties.items(): + setattr(vm, k, v) except Exception as ex: thread_monitor.set_error_msg(str(ex)) thread_monitor.set_finished() + def type_change(self): + + # AppVM + if self.vm_type.currentIndex() == 0: + self.template_vm.setEnabled(True) + 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: + self.template_vm.setEnabled(True) + 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: + self.template_vm.setEnabled(False) + self.template_vm.setCurrentIndex(-1) + self.install_system.setEnabled(True) + self.install_system.setChecked(True) + + def install_change(self): + if self.install_system.isChecked(): + self.launch_settings.setChecked(False) + + def settings_change(self): + if self.launch_settings.isChecked() and self.install_system.isEnabled(): + self.install_system.setChecked(False) + parser = qubesadmin.tools.QubesArgumentParser() def main(args=None): diff --git a/ui/newappvmdlg.ui b/ui/newappvmdlg.ui index a444a71..8bd4d0f 100644 --- a/ui/newappvmdlg.ui +++ b/ui/newappvmdlg.ui @@ -6,8 +6,8 @@ 0 0 - 618 - 214 + 616 + 300 @@ -21,8 +21,8 @@ - 330 - 180 + 450 + 260 160 27 @@ -39,22 +39,55 @@ 0 10 - 596 - 175 + 611 + 241 - - - - true + + + + Template: + + + template_vm - - + + - my-new-vm + Networking: + + + template_vm + + + + + + + false + + + install system from device (also available from settings) + + + + + + + launch settings after creation + + + + + + + + + + provides network @@ -68,56 +101,37 @@ - - - - - - - Use this template: - - - template_vm - - - - - - - - - - Network: - - - template_vm - - - - - - - HVM - - + + + true - - + + - Provides network + Advanced - - - - false - + + + + + - Standalone + my-new-vm + + + + + + + + + + Type: