Finish support of VMware based GNS3 VM.

This commit is contained in:
grossmj 2016-08-11 15:58:29 -06:00
parent 45af721164
commit 225e4f7528
3 changed files with 30 additions and 3 deletions

View File

@ -15,10 +15,13 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from .gns3_vm_error import GNS3VMError
import os import os
import sys import sys
import json import json
import asyncio import asyncio
import psutil
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -43,6 +46,16 @@ class BaseGNS3VM:
else: else:
config_path = os.path.join(os.path.expanduser("~"), ".config", "GNS3") config_path = os.path.join(os.path.expanduser("~"), ".config", "GNS3")
self._config_file = os.path.join(config_path, "gns3_vm.conf") self._config_file = os.path.join(config_path, "gns3_vm.conf")
# limit the number of vCPUs to the number of physical cores (hyper thread CPUs are excluded)
# because this is likely to degrade performances.
self._vcpus = psutil.cpu_count(logical=False)
# we want to allocate half of the available physical memory
ram = int(psutil.virtual_memory().total / (1024 * 1024) / 2)
# value must be a multiple of 4 (VMware requirement)
ram -= ram % 4
self._ram = ram
self.load() self.load()
def __json__(self): def __json__(self):

View File

@ -18,6 +18,7 @@
import os import os
import logging import logging
import asyncio import asyncio
import psutil
from gns3server.compute.vmware import ( from gns3server.compute.vmware import (
VMware, VMware,
@ -56,6 +57,18 @@ class VMwareGNS3VM(BaseGNS3VM):
:param ram: amount of RAM :param ram: amount of RAM
""" """
available_ram = int(psutil.virtual_memory().available / (1024 * 1024))
if ram > available_ram:
raise GNS3VMError("You have allocated too much memory for the GNS3 VM! (available memory is {} MB)".format(available_ram))
# memory must be a multiple of 4 (VMware requirement)
if ram % 4 != 0:
raise GNS3VMError("Allocated memory for the GNS3 VM must be a multiple of 4".format(available_ram))
available_vcpus = psutil.cpu_count(logical=False)
if vcpus > available_vcpus:
raise GNS3VMError("You have allocated too many vCPUs for the GNS3 VM! (max available is {} vCPUs)".format(available_vcpus))
try: try:
pairs = VMware.parse_vmware_file(self._vmx_path) pairs = VMware.parse_vmware_file(self._vmx_path)
pairs["numvcpus"] = str(vcpus) pairs["numvcpus"] = str(vcpus)
@ -91,8 +104,8 @@ class VMwareGNS3VM(BaseGNS3VM):
if not os.path.exists(self._vmx_path): if not os.path.exists(self._vmx_path):
raise GNS3VMError("VMware VMX file {} doesn't exist".format(self._vmx_path)) raise GNS3VMError("VMware VMX file {} doesn't exist".format(self._vmx_path))
# set the number of vCPUs and amount of RAM # FIXME # set the number of vCPUs and amount of RAM
# yield from self._set_vcpus_ram(self.vcpus, self.ram) yield from self._set_vcpus_ram(self.vcpus, self.ram)
# start the VM # start the VM
args = [self._vmx_path] args = [self._vmx_path]

View File

@ -31,6 +31,7 @@ log = logging.getLogger(__name__)
from ..compute.error import NodeError, ImageMissingError from ..compute.error import NodeError, ImageMissingError
from ..controller.controller_error import ControllerError from ..controller.controller_error import ControllerError
from ..ubridge.ubridge_error import UbridgeError from ..ubridge.ubridge_error import UbridgeError
from ..controller.gns3_vm_error import GNS3VMError
from .response import Response from .response import Response
from ..crash_report import CrashReport from ..crash_report import CrashReport
from ..config import Config from ..config import Config
@ -205,7 +206,7 @@ class Route(object):
response = Response(request=request, route=route) response = Response(request=request, route=route)
response.set_status(e.status) response.set_status(e.status)
response.json({"message": e.text, "status": e.status}) response.json({"message": e.text, "status": e.status})
except (ControllerError) as e: except (ControllerError, GNS3VMError) as e:
log.error("Controller error detected: {type}".format(type=type(e)), exc_info=1) log.error("Controller error detected: {type}".format(type=type(e)), exc_info=1)
response = Response(request=request, route=route) response = Response(request=request, route=route)
response.set_status(409) response.set_status(409)