mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-03 14:01:15 +02:00
Windows support (freezing).
Client notification support. Hypervisor manager changes. IOU reload support. Switch to non-dynamic module loading because of a multiprocessing problem on Windows.
This commit is contained in:
1 parent
3df5cdb76f
commit
41a1d16e92
15 files changed
+192
-45
No files matched your search
@@ -102,6 +102,7 @@ class Dynamips(IModule):
|
||||
IModule.__init__(self, name, *args, **kwargs)
|
||||
|
||||
self._hypervisor_manager = None
|
||||
self._hypervisor_manager_settings = {}
|
||||
self._remote_server = False
|
||||
self._routers = {}
|
||||
self._ethernet_switches = {}
|
||||
@@ -110,6 +111,8 @@ class Dynamips(IModule):
|
||||
self._ethernet_hubs = {}
|
||||
self._projects_dir = kwargs["projects_dir"]
|
||||
self._tempdir = kwargs["temp_dir"]
|
||||
self._working_dir = self._projects_dir
|
||||
self._dynamips = ""
|
||||
|
||||
#self._callback = self.add_periodic_callback(self.test, 1000)
|
||||
#self._callback.start()
|
||||
@@ -161,6 +164,34 @@ class Dynamips(IModule):
|
||||
self._remote_server = False
|
||||
log.info("dynamips module has been reset")
|
||||
|
||||
def start_hypervisor_manager(self):
|
||||
"""
|
||||
Starts the hypervisor manager.
|
||||
"""
|
||||
|
||||
# check if Dynamips path exists
|
||||
if not os.path.exists(self._dynamips):
|
||||
raise DynamipsError("Dynamips executable {} doesn't exist".format(self._dynamips))
|
||||
|
||||
# check if Dynamips is executable
|
||||
if not os.access(self._dynamips, os.X_OK):
|
||||
raise DynamipsError("Dynamips {} is not executable".format(self._dynamips))
|
||||
|
||||
# check if the working directory exists
|
||||
if not os.path.exists(self._working_dir):
|
||||
raise DynamipsError("Working directory {} doesn't exist".format(self._working_dir))
|
||||
|
||||
# check if the working directory is writable
|
||||
if not os.access(self._working_dir, os.W_OK):
|
||||
raise DynamipsError("Cannot write to working directory {}".format(self._working_dir))
|
||||
|
||||
log.info("starting the hypervisor manager with Dynamips working directory set to '{}'".format(self._working_dir))
|
||||
self._hypervisor_manager = HypervisorManager(self._dynamips, self._working_dir)
|
||||
|
||||
for name, value in self._hypervisor_manager_settings.items():
|
||||
if hasattr(self._hypervisor_manager, name) and getattr(self._hypervisor_manager, name) != value:
|
||||
setattr(self._hypervisor_manager, name, value)
|
||||
|
||||
@IModule.route("dynamips.settings")
|
||||
def settings(self, request):
|
||||
"""
|
||||
@@ -184,31 +215,23 @@ class Dynamips(IModule):
|
||||
#TODO: JSON schema validation
|
||||
# starts the hypervisor manager if it hasn't been started yet
|
||||
if not self._hypervisor_manager:
|
||||
dynamips_path = request["path"]
|
||||
self._dynamips = request.pop("path")
|
||||
|
||||
if "working_dir" in request:
|
||||
working_dir = request["working_dir"]
|
||||
self._working_dir = request.pop("working_dir")
|
||||
log.info("this server is local")
|
||||
else:
|
||||
self._remote_server = True
|
||||
log.info("this server is remote")
|
||||
working_dir = self._projects_dir
|
||||
self._working_dir = self._projects_dir
|
||||
|
||||
#TODO: check if executable
|
||||
if not os.path.exists(dynamips_path):
|
||||
raise DynamipsError("Dynamips executable {} doesn't exist".format(working_dir))
|
||||
self._hypervisor_manager_settings = request
|
||||
|
||||
#TODO: check if writable
|
||||
if not os.path.exists(working_dir):
|
||||
raise DynamipsError("Working directory {} doesn't exist".format(working_dir))
|
||||
|
||||
log.info("starting the hypervisor manager with Dynamips working directory set to '{}'".format(working_dir))
|
||||
self._hypervisor_manager = HypervisorManager(dynamips_path, working_dir)
|
||||
|
||||
# apply settings to the hypervisor manager
|
||||
for name, value in request.items():
|
||||
if hasattr(self._hypervisor_manager, name) and getattr(self._hypervisor_manager, name) != value:
|
||||
setattr(self._hypervisor_manager, name, value)
|
||||
else:
|
||||
# apply settings to the hypervisor manager
|
||||
for name, value in request.items():
|
||||
if hasattr(self._hypervisor_manager, name) and getattr(self._hypervisor_manager, name) != value:
|
||||
setattr(self._hypervisor_manager, name, value)
|
||||
|
||||
@IModule.route("dynamips.echo")
|
||||
def echo(self, request):
|
||||
|
||||
@@ -47,6 +47,9 @@ class ATMSW(object):
|
||||
name = request["name"]
|
||||
|
||||
try:
|
||||
if not self._hypervisor_manager:
|
||||
self.start_hypervisor_manager()
|
||||
|
||||
hypervisor = self._hypervisor_manager.allocate_hypervisor_for_simulated_device()
|
||||
atmsw = ATMSwitch(hypervisor, name)
|
||||
except DynamipsError as e:
|
||||
|
||||
@@ -46,6 +46,9 @@ class ETHHUB(object):
|
||||
name = request["name"]
|
||||
|
||||
try:
|
||||
if not self._hypervisor_manager:
|
||||
self.start_hypervisor_manager()
|
||||
|
||||
hypervisor = self._hypervisor_manager.allocate_hypervisor_for_simulated_device()
|
||||
ethhub = Hub(hypervisor, name)
|
||||
except DynamipsError as e:
|
||||
|
||||
@@ -46,6 +46,9 @@ class ETHSW(object):
|
||||
name = request["name"]
|
||||
|
||||
try:
|
||||
if not self._hypervisor_manager:
|
||||
self.start_hypervisor_manager()
|
||||
|
||||
hypervisor = self._hypervisor_manager.allocate_hypervisor_for_simulated_device()
|
||||
ethsw = EthernetSwitch(hypervisor, name)
|
||||
except DynamipsError as e:
|
||||
|
||||
@@ -46,6 +46,9 @@ class FRSW(object):
|
||||
name = request["name"]
|
||||
|
||||
try:
|
||||
if not self._hypervisor_manager:
|
||||
self.start_hypervisor_manager()
|
||||
|
||||
hypervisor = self._hypervisor_manager.allocate_hypervisor_for_simulated_device()
|
||||
frsw = FrameRelaySwitch(hypervisor, name)
|
||||
except DynamipsError as e:
|
||||
|
||||
@@ -127,7 +127,7 @@ class VM(object):
|
||||
try:
|
||||
|
||||
if not self._hypervisor_manager:
|
||||
raise DynamipsError("Dynamips manager is not started")
|
||||
self.start_hypervisor_manager()
|
||||
|
||||
hypervisor = self._hypervisor_manager.allocate_hypervisor_for_router(image, ram)
|
||||
|
||||
|
||||
@@ -67,9 +67,9 @@ class C7200(Router):
|
||||
|
||||
# first slot is a mandatory Input/Output controller (based on NPE type)
|
||||
if npe == "npe-g2":
|
||||
self._slots[0] = C7200_IO_GE_E()
|
||||
self.slot_add_binding(0, C7200_IO_GE_E())
|
||||
else:
|
||||
self._slots[0] = C7200_IO_2FE()
|
||||
self.slot_add_binding(0, C7200_IO_2FE())
|
||||
|
||||
def defaults(self):
|
||||
"""
|
||||
|
||||
@@ -1205,7 +1205,8 @@ class Router(object):
|
||||
slot_id=slot_id))
|
||||
|
||||
if adapter == None:
|
||||
return
|
||||
raise DynamipsError("No adapter in slot {slot_id} on router {name}".format(name=self._name,
|
||||
slot_id=slot_id))
|
||||
|
||||
#FIXME: check if adapter can be removed!
|
||||
|
||||
|
||||
Reference in new issue
Block a user