From 431bd789cb73f1ce6f6a6f5a19a59a3b2e1a9402 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Mon, 15 Aug 2016 13:30:02 +0200 Subject: [PATCH] Do not send project closed event when it's a snapshot restore Ref #602 --- gns3server/controller/project.py | 5 +++-- gns3server/controller/snapshot.py | 3 ++- tests/controller/test_snapshot.py | 7 ++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index 50df8da3..2cf5b519 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -440,12 +440,13 @@ class Project: os.remove(snapshot.path) @asyncio.coroutine - def close(self): + def close(self, ignore_notification=False): for compute in self._project_created_on_compute: yield from compute.post("/projects/{}/close".format(self._id)) self._cleanPictures() self._status = "closed" - self.controller.notification.emit("project.closed", self.__json__()) + if not ignore_notification: + self.controller.notification.emit("project.closed", self.__json__()) def _cleanPictures(self): """ diff --git a/gns3server/controller/snapshot.py b/gns3server/controller/snapshot.py index b6d6a15c..300de15b 100644 --- a/gns3server/controller/snapshot.py +++ b/gns3server/controller/snapshot.py @@ -77,7 +77,8 @@ class Snapshot: """ yield from self._project.delete_on_computes() - yield from self._project.close() + # We don't send close notif to clients because the close / open dance is purely internal + yield from self._project.close(ignore_notification=True) shutil.rmtree(os.path.join(self._project.path, "project-files")) with open(self._path, "rb") as f: project = yield from import_project(self._project.controller, self._project.id, f, location=self._project.path) diff --git a/tests/controller/test_snapshot.py b/tests/controller/test_snapshot.py index 18d98263..f2bc88db 100644 --- a/tests/controller/test_snapshot.py +++ b/tests/controller/test_snapshot.py @@ -17,7 +17,7 @@ import os import pytest -from unittest.mock import patch +from unittest.mock import patch, MagicMock from gns3server.controller.project import Project from gns3server.controller.snapshot import Snapshot @@ -90,9 +90,14 @@ def test_restore(project, controller, async_run): assert os.path.exists(test_file) assert len(project.nodes) == 2 + controller._notification = MagicMock() with patch("gns3server.config.Config.get_section_config", return_value={"local": True}): async_run(snapshot.restore()) + # project.closed notification should not be send when restoring snapshots + assert "project.closed" not in [c[0][0] for c in controller.notification.emit.call_args_list] + + project = controller.get_project(project.id) assert not os.path.exists(test_file) assert len(project.nodes) == 1