1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-11-24 17:28:08 +00:00

Support auto stop for the GNS3 VM

Ref https://github.com/GNS3/gns3-gui/issues/1254
This commit is contained in:
Julien Duponchelle 2016-08-25 14:26:01 +02:00
parent fc8b4c3216
commit 9255dc07b7
No known key found for this signature in database
GPG Key ID: CE8B29639E07F5E8
3 changed files with 43 additions and 10 deletions

View File

@ -74,19 +74,21 @@ class Controller:
if self.gns3vm.enable: if self.gns3vm.enable:
yield from self.gns3vm.start() yield from self.gns3vm.start()
self._computes["vm"] = Compute(compute_id="vm", self._computes["vm"] = Compute(compute_id="vm",
name="GNS3 VM", name="GNS3 VM",
controller=self, controller=self,
protocol=self.gns3vm.protocol, protocol=self.gns3vm.protocol,
host=self.gns3vm.ip_address, host=self.gns3vm.ip_address,
port=self.gns3vm.port, port=self.gns3vm.port,
user=self.gns3vm.user, user=self.gns3vm.user,
password=self.gns3vm.password) password=self.gns3vm.password)
@asyncio.coroutine @asyncio.coroutine
def stop(self): def stop(self):
log.info("Stop controller") log.info("Stop controller")
for compute in self._computes.values(): for compute in self._computes.values():
yield from compute.close() yield from compute.close()
if self.gns3vm.enable and self.gns3vm.auto_stop:
yield from self.gns3vm.stop()
self._computes = {} self._computes = {}
self._projects = {} self._projects = {}

View File

@ -36,7 +36,7 @@ class GNS3VM:
self._engines = {} self._engines = {}
self._settings = { self._settings = {
"vmname": None, "vmname": None,
"auto_stop": False, "auto_stop": True,
"headless": False, "headless": False,
"enable": False, "enable": False,
"engine": "vmware" "engine": "vmware"
@ -120,6 +120,13 @@ class GNS3VM:
""" """
return self._settings["enable"] return self._settings["enable"]
@property
def auto_stop(self):
"""
The GNSVM should auto stop
"""
return self._settings["auto_stop"]
@property @property
def settings(self): def settings(self):
return self._settings return self._settings
@ -169,3 +176,12 @@ class GNS3VM:
engine.vmname = self._settings["vmname"] engine.vmname = self._settings["vmname"]
yield from engine.start() yield from engine.start()
@asyncio.coroutine
def stop(self):
"""
Stop the GNS3 VM
"""
engine = self._current_engine()
if not engine.running:
log.info("Stop the GNS3 VM")
yield from engine.stop()

View File

@ -255,7 +255,7 @@ def test_getProject(controller, async_run):
def test_start(controller, async_run): def test_start(controller, async_run):
async_run(controller.start()) async_run(controller.start())
assert len(controller.computes) == 1 # Local compute is created assert len(controller.computes) == 1 # Local compute is created
assert controller.computes["local"].name == socket.gethostname() assert controller.computes["local"].name == socket.gethostname()
@ -270,7 +270,7 @@ def test_start_vm(controller, async_run):
with asyncio_patch("gns3server.controller.gns3vm.vmware_gns3_vm.VMwareGNS3VM.start") as mock: with asyncio_patch("gns3server.controller.gns3vm.vmware_gns3_vm.VMwareGNS3VM.start") as mock:
async_run(controller.start()) async_run(controller.start())
assert mock.called assert mock.called
assert len(controller.computes) == 2 # Local compute and vm are created assert len(controller.computes) == 2 # Local compute and vm are created
assert "local" in controller.computes assert "local" in controller.computes
assert "vm" in controller.computes assert "vm" in controller.computes
@ -282,6 +282,21 @@ def test_stop(controller, async_run):
assert c.connected is False assert c.connected is False
def test_stop_vm(controller, async_run):
"""
Start the controller with a GNS3 VM running
"""
controller.gns3vm.settings = {
"enable": True,
"engine": "vmware",
"auto_stop": True
}
controller.gns3vm.running = True
with asyncio_patch("gns3server.controller.gns3vm.vmware_gns3_vm.VMwareGNS3VM.stop") as mock:
async_run(controller.stop())
assert mock.called
def test_load_project(controller, async_run, tmpdir): def test_load_project(controller, async_run, tmpdir):
data = { data = {
"name": "Experience", "name": "Experience",