diff --git a/gns3server/handlers/api/qemu_handler.py b/gns3server/handlers/api/qemu_handler.py index 9a8cff10..6d09f5b4 100644 --- a/gns3server/handlers/api/qemu_handler.py +++ b/gns3server/handlers/api/qemu_handler.py @@ -152,7 +152,7 @@ class QEMUHandler: and "-no-kvm" not in vm.options: pm = ProjectManager.instance() if pm.check_hardware_virtualization(vm) is False: - raise HTTPConflict(text="Cannot start VM with KVM enabled because hardware virtualization is already used by another software like VMware or VirtualBox") + raise HTTPConflict(text="Cannot start VM with KVM enabled because hardware virtualization (VT-x/AMD-V) is already used by another software like VMware or VirtualBox") yield from vm.start() response.set_status(204) diff --git a/gns3server/handlers/api/virtualbox_handler.py b/gns3server/handlers/api/virtualbox_handler.py index a66e472d..c5c4e244 100644 --- a/gns3server/handlers/api/virtualbox_handler.py +++ b/gns3server/handlers/api/virtualbox_handler.py @@ -192,10 +192,10 @@ class VirtualBoxHandler: vbox_manager = VirtualBox.instance() vm = vbox_manager.get_vm(request.match_info["vm_id"], project_id=request.match_info["project_id"]) - if sys.platform.startswith("linux") and (yield from vm.check_hw_virtualization()): + if (yield from vm.check_hw_virtualization()): pm = ProjectManager.instance() if pm.check_hardware_virtualization(vm) is False: - raise HTTPConflict(text="Cannot start VM because KVM is being used by a Qemu VM") + raise HTTPConflict(text="Cannot start VM because hardware virtualization (VT-x/AMD-V) is already used by another software like VMware or KVM (on Linux)") yield from vm.start() response.set_status(204) diff --git a/gns3server/handlers/api/vmware_handler.py b/gns3server/handlers/api/vmware_handler.py index c62a0c1f..295ae6fe 100644 --- a/gns3server/handlers/api/vmware_handler.py +++ b/gns3server/handlers/api/vmware_handler.py @@ -160,6 +160,10 @@ class VMwareHandler: vmware_manager = VMware.instance() vm = vmware_manager.get_vm(request.match_info["vm_id"], project_id=request.match_info["project_id"]) + if vm.check_hw_virtualization(): + pm = ProjectManager.instance() + if pm.check_hardware_virtualization(vm) is False: + raise HTTPConflict(text="Cannot start VM because hardware virtualization (VT-x/AMD-V) is already used by another software like VirtualBox or KVM (on Linux)") yield from vm.start() response.set_status(204) diff --git a/gns3server/modules/project_manager.py b/gns3server/modules/project_manager.py index 6d30bc99..7ecf4e54 100644 --- a/gns3server/modules/project_manager.py +++ b/gns3server/modules/project_manager.py @@ -103,19 +103,10 @@ class ProjectManager: :returns: boolean """ - from .qemu import QemuVM - from .virtualbox import VirtualBoxVM - from .vmware import VMwareVM for project in self._projects.values(): for vm in project.vms: if vm == source_vm: continue - if vm.hw_virtualization: - if isinstance(source_vm, QemuVM) and not isinstance(vm, QemuVM): - # A Qemu VM won't start if any other virtualization software uses hardware virtualization - return False - elif isinstance(source_vm, VirtualBoxVM) and not isinstance(vm, VirtualBoxVM) and not isinstance(vm, VMwareVM): - # A VirtualBox VM won't start if KVM is being used - return False - # VMware doesn't seem to be bothered by any other virtualization software. + if vm.hw_virtualization and vm.__class__.__name__ != source_vm.__class__.__name__: + return False return True diff --git a/gns3server/modules/vmware/vmware_vm.py b/gns3server/modules/vmware/vmware_vm.py index 4becdc86..193fc803 100644 --- a/gns3server/modules/vmware/vmware_vm.py +++ b/gns3server/modules/vmware/vmware_vm.py @@ -344,6 +344,22 @@ class VMwareVM(BaseVM): if parse_version(self._ubridge_hypervisor.version) < parse_version('0.9.1'): raise VMwareError("uBridge version must be >= 0.9.1, detected version is {}".format(self._ubridge_hypervisor.version)) + def check_hw_virtualization(self): + """ + Returns either hardware virtualization is activated or not. + + :returns: boolean + """ + + try: + self._vmx_pairs = self.manager.parse_vmware_file(self._vmx_path) + except OSError as e: + raise VMwareError('Could not read VMware VMX file "{}": {}'.format(self._vmx_path, e)) + + if self._get_vmx_setting("vhv.enable", "TRUE"): + return True + return False + @asyncio.coroutine def start(self): """