From 44efab109eadecf2b95eda683759c7f5d4e055df Mon Sep 17 00:00:00 2001 From: ziajka Date: Wed, 18 Oct 2017 10:32:56 +0200 Subject: [PATCH 1/2] Set vhv.enable before run for VMWare 14. Fixes #1184 --- .../controller/gns3vm/vmware_gns3_vm.py | 25 ++++++++ .../controller/gns3vm/test_vmware_gns3_vm.py | 57 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 tests/controller/gns3vm/test_vmware_gns3_vm.py diff --git a/gns3server/controller/gns3vm/vmware_gns3_vm.py b/gns3server/controller/gns3vm/vmware_gns3_vm.py index efdacf21..0b658edb 100644 --- a/gns3server/controller/gns3vm/vmware_gns3_vm.py +++ b/gns3server/controller/gns3vm/vmware_gns3_vm.py @@ -85,6 +85,30 @@ class VMwareGNS3VM(BaseGNS3VM): except OSError as e: raise GNS3VMError('Could not read/write VMware VMX file "{}": {}'.format(self._vmx_path, e)) + @asyncio.coroutine + def _set_extra_options(self): + try: + """ + Due to bug/chang in VMWare 14 we're not able to pass Hardware Virtualization in GNS3VM. + We only enable this when it's not present in current configuration and user hasn't deactivated that. + """ + extra_config = ( + ("vhv.enable", "TRUE"), + ) + pairs = VMware.parse_vmware_file(self._vmx_path) + updated = False + for key, value in extra_config: + if key not in pairs.keys(): + pairs[key] = value + updated = True + log.info("GNS3 VM VMX `{}` set to `{}`".format(key, value)) + + if updated: + VMware.write_vmx_file(self._vmx_path, pairs) + log.info("GNS3 VM VMX has been updated.") + except OSError as e: + raise GNS3VMError('Could not read/write VMware VMX file "{}": {}'.format(self._vmx_path, e)) + @asyncio.coroutine def list(self): """ @@ -126,6 +150,7 @@ class VMwareGNS3VM(BaseGNS3VM): log.info("Update GNS3 VM settings") # set the number of vCPUs and amount of RAM yield from self._set_vcpus_ram(self.vcpus, self.ram) + yield from self._set_extra_options() # start the VM args = [self._vmx_path] diff --git a/tests/controller/gns3vm/test_vmware_gns3_vm.py b/tests/controller/gns3vm/test_vmware_gns3_vm.py new file mode 100644 index 00000000..cafbeb2b --- /dev/null +++ b/tests/controller/gns3vm/test_vmware_gns3_vm.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# +# Copyright (C) 2017 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import pytest + +from tests.utils import asyncio_patch + +from gns3server.controller.gns3vm.vmware_gns3_vm import VMwareGNS3VM + + +@pytest.fixture +def gns3vm(controller): + vm = VMwareGNS3VM(controller) + vm.vmname = "GNS3 VM" + return vm + + +@pytest.fixture +def tmx_path(tmpdir): + return str(tmpdir / "vmware.tmx") + + +def test_set_extra_options(gns3vm, async_run, tmx_path): + gns3vm._vmx_path = tmx_path + + # when there is not an entry, we modify it + with open(tmx_path, 'w') as f: + f.write("") + + async_run(gns3vm._set_extra_options()) + + with open(tmx_path, 'r') as f: + assert f.read() == 'vhv.enable = "TRUE"\n' + + # when there is an entry, we don't modify it + with open(tmx_path, 'w') as f: + f.write('vhv.enable = "FALSE"\n') + + async_run(gns3vm._set_extra_options()) + + with open(tmx_path, 'r') as f: + assert f.read() == 'vhv.enable = "FALSE"\n' + From c7015435c9103afd8ac0f4a338e297e45c2c3fc0 Mon Sep 17 00:00:00 2001 From: Jeremy Grossmann Date: Wed, 18 Oct 2017 15:53:37 +0700 Subject: [PATCH 2/2] Update vmware_gns3_vm.py --- gns3server/controller/gns3vm/vmware_gns3_vm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gns3server/controller/gns3vm/vmware_gns3_vm.py b/gns3server/controller/gns3vm/vmware_gns3_vm.py index 0b658edb..d3f0c6d2 100644 --- a/gns3server/controller/gns3vm/vmware_gns3_vm.py +++ b/gns3server/controller/gns3vm/vmware_gns3_vm.py @@ -89,7 +89,7 @@ class VMwareGNS3VM(BaseGNS3VM): def _set_extra_options(self): try: """ - Due to bug/chang in VMWare 14 we're not able to pass Hardware Virtualization in GNS3VM. + Due to bug/change in VMWare 14 we're not able to pass Hardware Virtualization in GNS3VM. We only enable this when it's not present in current configuration and user hasn't deactivated that. """ extra_config = (