1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-11-28 11:18:11 +00:00
This commit is contained in:
grossmj 2020-07-24 21:48:49 +09:30
parent cbcdaabcce
commit f97d346c34
4 changed files with 51 additions and 2 deletions

View File

@ -305,6 +305,13 @@ class Link:
n["port"].link = None n["port"].link = None
n["node"].remove_link(self) n["node"].remove_link(self)
async def reset(self):
"""
Reset a link
"""
raise NotImplementedError
async def start_capture(self, data_link_type="DLT_EN10MB", capture_file_name=None): async def start_capture(self, data_link_type="DLT_EN10MB", capture_file_name=None):
""" """
Start capture on the link Start capture on the link

View File

@ -141,7 +141,7 @@ class UDPLink(Link):
return return
try: try:
await node1.delete("/adapters/{adapter_number}/ports/{port_number}/nio".format(adapter_number=adapter_number1, port_number=port_number1), timeout=120) await node1.delete("/adapters/{adapter_number}/ports/{port_number}/nio".format(adapter_number=adapter_number1, port_number=port_number1), timeout=120)
# If the node is already delete (user selected multiple element and delete all in the same time) # If the node is already deleted (user selected multiple element and delete all in the same time)
except aiohttp.web.HTTPNotFound: except aiohttp.web.HTTPNotFound:
pass pass
@ -153,11 +153,20 @@ class UDPLink(Link):
return return
try: try:
await node2.delete("/adapters/{adapter_number}/ports/{port_number}/nio".format(adapter_number=adapter_number2, port_number=port_number2), timeout=120) await node2.delete("/adapters/{adapter_number}/ports/{port_number}/nio".format(adapter_number=adapter_number2, port_number=port_number2), timeout=120)
# If the node is already delete (user selected multiple element and delete all in the same time) # If the node is already deleted (user selected multiple element and delete all in the same time)
except aiohttp.web.HTTPNotFound: except aiohttp.web.HTTPNotFound:
pass pass
await super().delete() await super().delete()
async def reset(self):
"""
Reset the link.
"""
# recreate the link on the compute
await self.delete()
await self.create()
async def start_capture(self, data_link_type="DLT_EN10MB", capture_file_name=None): async def start_capture(self, data_link_type="DLT_EN10MB", capture_file_name=None):
""" """
Start capture on a link Start capture on a link

View File

@ -200,6 +200,26 @@ class LinkHandler:
await project.delete_link(request.match_info["link_id"]) await project.delete_link(request.match_info["link_id"])
response.set_status(204) response.set_status(204)
@Route.post(
r"/projects/{project_id}/links/{link_id}/reset",
parameters={
"project_id": "Project UUID",
"link_id": "Link UUID"
},
status_codes={
201: "Link reset",
400: "Invalid request"
},
description="Reset link instance",
output=LINK_OBJECT_SCHEMA)
async def reset(request, response):
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
link = project.get_link(request.match_info["link_id"])
await link.reset()
response.set_status(201)
response.json(link)
@Route.get( @Route.get(
r"/projects/{project_id}/links/{link_id}/pcap", r"/projects/{project_id}/links/{link_id}/pcap",
parameters={ parameters={

View File

@ -22,6 +22,7 @@ from tests.utils import asyncio_patch, AsyncioMagicMock
from gns3server.controller.ports.ethernet_port import EthernetPort from gns3server.controller.ports.ethernet_port import EthernetPort
from gns3server.controller.link import Link, FILTERS from gns3server.controller.link import Link, FILTERS
from gns3server.controller.udp_link import UDPLink
@pytest.fixture @pytest.fixture
@ -295,6 +296,18 @@ async def test_list_link(controller_api, project, nodes):
assert response.json[0]["filters"] == filters assert response.json[0]["filters"] == filters
async def test_reset_link(controller_api, project):
link = UDPLink(project)
project._links = {link.id: link}
with asyncio_patch("gns3server.controller.udp_link.UDPLink.delete") as delete_mock:
with asyncio_patch("gns3server.controller.udp_link.UDPLink.create") as create_mock:
response = await controller_api.post("/projects/{}/links/{}/reset".format(project.id, link.id))
assert delete_mock.called
assert create_mock.called
assert response.status == 201
async def test_start_capture(controller_api, project): async def test_start_capture(controller_api, project):
link = Link(project) link = Link(project)