Skip to content

Commit

Permalink
Set vhv.enable before run for VMWare 14. Fixes #1184
Browse files Browse the repository at this point in the history
  • Loading branch information
ziajka committed Oct 18, 2017
1 parent 4cae6b6 commit 44efab1
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 0 deletions.
25 changes: 25 additions & 0 deletions gns3server/controller/gns3vm/vmware_gns3_vm.py
Expand Up @@ -85,6 +85,30 @@ def _set_vcpus_ram(self, vcpus, ram):
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):
"""
Expand Down Expand Up @@ -126,6 +150,7 @@ def start(self):
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]
Expand Down
57 changes: 57 additions & 0 deletions 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 <http://www.gnu.org/licenses/>.

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'

0 comments on commit 44efab1

Please sign in to comment.