diff --git a/gns3server/controller/gns3vm/vmware_gns3_vm.py b/gns3server/controller/gns3vm/vmware_gns3_vm.py index efdacf21..d3f0c6d2 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/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 = ( + ("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' +