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:
grossmj committed 2014-03-15 21:41:04 -06:00
1 parent 3df5cdb76f
commit 41a1d16e92
15 files changed
+192 -45

No files matched your search

+40 -17
View File
@@ -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:
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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):
"""
+2 -1
View File
@@ -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!