mirror of
https://github.com/GNS3/gns3-server
synced 2024-11-28 11:18:11 +00:00
Fixes bug with VMware VM connections + moves some uBridge code to BaseVM.
This commit is contained in:
parent
0ee31361c0
commit
65fa4036c6
@ -22,9 +22,12 @@ import shutil
|
|||||||
import asyncio
|
import asyncio
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
|
from pkg_resources import parse_version
|
||||||
from ..utils.asyncio import wait_run_in_executor
|
from ..utils.asyncio import wait_run_in_executor
|
||||||
|
from ..ubridge.hypervisor import Hypervisor
|
||||||
from .vm_error import VMError
|
from .vm_error import VMError
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ -50,6 +53,7 @@ class BaseVM:
|
|||||||
self._console_type = console_type
|
self._console_type = console_type
|
||||||
self._temporary_directory = None
|
self._temporary_directory = None
|
||||||
self._hw_virtualization = False
|
self._hw_virtualization = False
|
||||||
|
self._ubridge_hypervisor = None
|
||||||
self._vm_status = "stopped"
|
self._vm_status = "stopped"
|
||||||
|
|
||||||
if self._console is not None:
|
if self._console is not None:
|
||||||
@ -264,6 +268,36 @@ class BaseVM:
|
|||||||
id=self.id,
|
id=self.id,
|
||||||
console_type=console_type))
|
console_type=console_type))
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ubridge_path(self):
|
||||||
|
"""
|
||||||
|
Returns the uBridge executable path.
|
||||||
|
|
||||||
|
:returns: path to uBridge
|
||||||
|
"""
|
||||||
|
|
||||||
|
path = self._manager.config.get_section_config("Server").get("ubridge_path", "ubridge")
|
||||||
|
if path == "ubridge":
|
||||||
|
path = shutil.which("ubridge")
|
||||||
|
return path
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def _start_ubridge(self):
|
||||||
|
"""
|
||||||
|
Starts uBridge (handles connections to and from this VMware VM).
|
||||||
|
"""
|
||||||
|
|
||||||
|
server_config = self._manager.config.get_section_config("Server")
|
||||||
|
server_host = server_config.get("host")
|
||||||
|
self._ubridge_hypervisor = Hypervisor(self._project, self.ubridge_path, self.working_dir, server_host)
|
||||||
|
|
||||||
|
log.info("Starting new uBridge hypervisor {}:{}".format(self._ubridge_hypervisor.host, self._ubridge_hypervisor.port))
|
||||||
|
yield from self._ubridge_hypervisor.start()
|
||||||
|
log.info("Hypervisor {}:{} has successfully started".format(self._ubridge_hypervisor.host, self._ubridge_hypervisor.port))
|
||||||
|
yield from self._ubridge_hypervisor.connect()
|
||||||
|
if parse_version(self._ubridge_hypervisor.version) < parse_version('0.9.2'):
|
||||||
|
raise VMError("uBridge version must be >= 0.9.2, detected version is {}".format(self._ubridge_hypervisor.version))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def hw_virtualization(self):
|
def hw_virtualization(self):
|
||||||
"""
|
"""
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
Base interface for NIOs.
|
Base interface for NIOs.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
class NIO(object):
|
class NIO(object):
|
||||||
|
|
||||||
@ -28,6 +30,8 @@ class NIO(object):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
||||||
|
# create an unique name
|
||||||
|
self._name = 'nio-{}'.format(uuid.uuid4())
|
||||||
self._capturing = False
|
self._capturing = False
|
||||||
self._pcap_output_file = ""
|
self._pcap_output_file = ""
|
||||||
self._pcap_data_link_type = ""
|
self._pcap_data_link_type = ""
|
||||||
@ -74,3 +78,23 @@ class NIO(object):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
return self._pcap_data_link_type
|
return self._pcap_data_link_type
|
||||||
|
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
"""
|
||||||
|
NIO string representation.
|
||||||
|
|
||||||
|
:returns: NIO name
|
||||||
|
"""
|
||||||
|
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
"""
|
||||||
|
Returns the NIO name.
|
||||||
|
|
||||||
|
:returns: NIO name
|
||||||
|
"""
|
||||||
|
|
||||||
|
return self._name
|
||||||
|
@ -22,12 +22,9 @@ VMware VM instance.
|
|||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
import shutil
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
from pkg_resources import parse_version
|
|
||||||
from gns3server.ubridge.hypervisor import Hypervisor
|
|
||||||
from gns3server.utils.telnet_server import TelnetServer
|
from gns3server.utils.telnet_server import TelnetServer
|
||||||
from gns3server.utils.interfaces import get_windows_interfaces
|
from gns3server.utils.interfaces import get_windows_interfaces
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
@ -57,7 +54,6 @@ class VMwareVM(BaseVM):
|
|||||||
|
|
||||||
self._linked_clone = linked_clone
|
self._linked_clone = linked_clone
|
||||||
self._vmx_pairs = OrderedDict()
|
self._vmx_pairs = OrderedDict()
|
||||||
self._ubridge_hypervisor = None
|
|
||||||
self._telnet_server_thread = None
|
self._telnet_server_thread = None
|
||||||
self._serial_pipe = None
|
self._serial_pipe = None
|
||||||
self._vmnets = []
|
self._vmnets = []
|
||||||
@ -283,6 +279,11 @@ class VMwareVM(BaseVM):
|
|||||||
if not vmnet in self._vmnets:
|
if not vmnet in self._vmnets:
|
||||||
self._vmnets.append(vmnet)
|
self._vmnets.append(vmnet)
|
||||||
self._vmx_pairs["ethernet{}.vnet".format(adapter_number)] = vmnet
|
self._vmx_pairs["ethernet{}.vnet".format(adapter_number)] = vmnet
|
||||||
|
else:
|
||||||
|
# not connected to anything...
|
||||||
|
vnet = "ethernet{}.vnet".format(adapter_number)
|
||||||
|
if vnet not in self._vmx_pairs:
|
||||||
|
self._vmx_pairs["ethernet{}.startconnected".format(adapter_number)] = "FALSE"
|
||||||
|
|
||||||
# disable remaining network adapters
|
# disable remaining network adapters
|
||||||
for adapter_number in range(self._adapters, self._maximum_adapters):
|
for adapter_number in range(self._adapters, self._maximum_adapters):
|
||||||
@ -380,36 +381,6 @@ class VMwareVM(BaseVM):
|
|||||||
raise VMwareError("vnet {} not in VMX file".format(vnet))
|
raise VMwareError("vnet {} not in VMX file".format(vnet))
|
||||||
yield from self._ubridge_hypervisor.send("bridge stop_capture {name}".format(name=vnet))
|
yield from self._ubridge_hypervisor.send("bridge stop_capture {name}".format(name=vnet))
|
||||||
|
|
||||||
@property
|
|
||||||
def ubridge_path(self):
|
|
||||||
"""
|
|
||||||
Returns the uBridge executable path.
|
|
||||||
|
|
||||||
:returns: path to uBridge
|
|
||||||
"""
|
|
||||||
|
|
||||||
path = self._manager.config.get_section_config("Server").get("ubridge_path", "ubridge")
|
|
||||||
if path == "ubridge":
|
|
||||||
path = shutil.which("ubridge")
|
|
||||||
return path
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
|
||||||
def _start_ubridge(self):
|
|
||||||
"""
|
|
||||||
Starts uBridge (handles connections to and from this VMware VM).
|
|
||||||
"""
|
|
||||||
|
|
||||||
server_config = self._manager.config.get_section_config("Server")
|
|
||||||
server_host = server_config.get("host")
|
|
||||||
self._ubridge_hypervisor = Hypervisor(self._project, self.ubridge_path, self.working_dir, server_host)
|
|
||||||
|
|
||||||
log.info("Starting new uBridge hypervisor {}:{}".format(self._ubridge_hypervisor.host, self._ubridge_hypervisor.port))
|
|
||||||
yield from self._ubridge_hypervisor.start()
|
|
||||||
log.info("Hypervisor {}:{} has successfully started".format(self._ubridge_hypervisor.host, self._ubridge_hypervisor.port))
|
|
||||||
yield from self._ubridge_hypervisor.connect()
|
|
||||||
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):
|
def check_hw_virtualization(self):
|
||||||
"""
|
"""
|
||||||
Returns either hardware virtualization is activated or not.
|
Returns either hardware virtualization is activated or not.
|
||||||
|
Loading…
Reference in New Issue
Block a user