Prevent router to be duplicated when running and add tests

This commit is contained in:
grossmj 2026-03-17 12:49:38 +08:00
parent 95bd76a212
commit 0aa6566e50
No known key found for this signature in database
GPG Key ID: 1E7DD6DBB53FF3D7
4 changed files with 11 additions and 2 deletions

View File

@ -35,7 +35,6 @@ from gns3server.utils.interfaces import is_interface_up
from uuid import UUID, uuid4 from uuid import UUID, uuid4
from typing import Type from typing import Type
from ..config import Config from ..config import Config
from ..utils.asyncio import wait_run_in_executor
from ..utils import force_unix_path from ..utils import force_unix_path
from .project_manager import ProjectManager from .project_manager import ProjectManager
from .port_manager import PortManager from .port_manager import PortManager

View File

@ -32,7 +32,7 @@ import re
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
from gns3server.utils.interfaces import interfaces, is_interface_up from gns3server.utils.interfaces import is_interface_up
from gns3server.utils.asyncio import wait_run_in_executor, subprocess_check_output from gns3server.utils.asyncio import wait_run_in_executor, subprocess_check_output
from gns3server.utils import parse_version from gns3server.utils import parse_version
from uuid import uuid4 from uuid import uuid4
@ -644,6 +644,9 @@ class Dynamips(BaseManager):
if not hasattr(source_node, "startup_config_path"): if not hasattr(source_node, "startup_config_path"):
return await super().duplicate_node(source_node_id, destination_node_id) return await super().duplicate_node(source_node_id, destination_node_id)
if hasattr(source_node, "status") and source_node.status != "stopped":
raise DynamipsError("Cannot duplicate router data while the route is running")
try: try:
with open(source_node.startup_config_path) as f: with open(source_node.startup_config_path) as f:
startup_config = f.read() startup_config = f.read()

View File

@ -128,3 +128,6 @@ async def test_duplicate_node(manager, compute_project):
with open(destination_node.startup_config_path) as f: with open(destination_node.startup_config_path) as f:
content = f.read() content = f.read()
assert content == '!\nhostname R2\necho TEST' assert content == '!\nhostname R2\necho TEST'
with pytest.raises(DynamipsError):
source_node.status = "started"
await manager.duplicate_node(source_node.id, destination_node.id)

View File

@ -26,6 +26,7 @@ from gns3server.compute.vpcs import VPCS
from gns3server.compute.dynamips import Dynamips from gns3server.compute.dynamips import Dynamips
from gns3server.compute.qemu import Qemu from gns3server.compute.qemu import Qemu
from gns3server.compute.error import NodeError, ImageMissingError from gns3server.compute.error import NodeError, ImageMissingError
from gns3server.compute.compute_error import ComputeError
from gns3server.utils import force_unix_path from gns3server.utils import force_unix_path
@ -290,6 +291,9 @@ async def test_duplicate_vpcs(vpcs, compute_project):
with open(os.path.join(destination_node.working_dir, "startup.vpc")) as f: with open(os.path.join(destination_node.working_dir, "startup.vpc")) as f:
startup = f.read().strip() startup = f.read().strip()
assert startup == "set pcname PC-2\nip dhcp\n".strip() assert startup == "set pcname PC-2\nip dhcp\n".strip()
with pytest.raises(ComputeError):
source_node.status = "started"
await vpcs.duplicate_node(source_node_id, destination_node_id)
@pytest.mark.asyncio @pytest.mark.asyncio