diff --git a/gns3server/compute/port_manager.py b/gns3server/compute/port_manager.py index 07ed0f9b..9db76a4d 100644 --- a/gns3server/compute/port_manager.py +++ b/gns3server/compute/port_manager.py @@ -67,6 +67,13 @@ class PortManager: cls._instance = cls() return cls._instance + def __json__(self): + + return {"console_port_range": self._console_port_range, + "console_ports": list(self._used_tcp_ports), + "udp_port_range": self._udp_port_range, + "udp_ports": list(self._used_udp_ports)} + @property def console_host(self): diff --git a/gns3server/controller/__init__.py b/gns3server/controller/__init__.py index c9afa28c..f2acb27e 100644 --- a/gns3server/controller/__init__.py +++ b/gns3server/controller/__init__.py @@ -769,3 +769,15 @@ class Controller: yield from project.delete() self.remove_project(project) return res + + @asyncio.coroutine + def compute_ports(self, compute_id): + """ + Get the ports used by a compute. + + :param compute_id: ID of the compute + """ + + compute = self.get_compute(compute_id) + response = yield from compute.get("/network/ports") + return response.json diff --git a/gns3server/handlers/api/compute/network_handler.py b/gns3server/handlers/api/compute/network_handler.py index dc2de232..d99cc212 100644 --- a/gns3server/handlers/api/compute/network_handler.py +++ b/gns3server/handlers/api/compute/network_handler.py @@ -49,3 +49,11 @@ class NetworkHandler: network_interfaces = interfaces() response.json(network_interfaces) + + @Route.get( + r"/network/ports", + description="List all the ports used by the server") + def network_ports(request, response): + + m = PortManager.instance() + response.json(m) diff --git a/gns3server/handlers/api/controller/compute_handler.py b/gns3server/handlers/api/controller/compute_handler.py index d8c4d0f3..dbc013f2 100644 --- a/gns3server/handlers/api/controller/compute_handler.py +++ b/gns3server/handlers/api/controller/compute_handler.py @@ -22,7 +22,8 @@ from gns3server.schemas.compute import ( COMPUTE_CREATE_SCHEMA, COMPUTE_OBJECT_SCHEMA, COMPUTE_UPDATE_SCHEMA, - COMPUTE_ENDPOINT_OUTPUT_OBJECT_SCHEMA + COMPUTE_ENDPOINT_OUTPUT_OBJECT_SCHEMA, + COMPUTE_PORTS_OBJECT_SCHEMA ) import logging @@ -214,4 +215,19 @@ class ComputeHandler: controller = Controller.instance() res = yield from controller.autoidlepc(request.match_info["compute_id"], request.json["platform"], request.json["image"], request.json["ram"]) response.json(res) - response.set_status(200) + + @Route.get( + r"/computes/{compute_id}/ports", + parameters={ + "compute_id": "Compute UUID" + }, + status_codes={ + 200: "Ports information returned", + }, + description="Get ports used by a compute", + output=COMPUTE_PORTS_OBJECT_SCHEMA) + def ports(request, response): + controller = Controller.instance() + res = yield from controller.compute_ports(request.match_info["compute_id"]) + response.json(res) + diff --git a/gns3server/schemas/compute.py b/gns3server/schemas/compute.py index c1ea3362..d4a74ba6 100644 --- a/gns3server/schemas/compute.py +++ b/gns3server/schemas/compute.py @@ -127,3 +127,56 @@ COMPUTE_ENDPOINT_OUTPUT_OBJECT_SCHEMA = { "additionalProperties": False, } +COMPUTE_PORTS_OBJECT_SCHEMA = { + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "Output schema for open ports on a compute", + "type": "object", + "properties": { + "console_port_range": { + "description": "Console port range", + "type": "array", + "uniqueItems": True, + "minItems": 2, + "maxItems": 2, + "items": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + } + }, + "console_ports": { + "description": "Console ports used by the compute", + "type": "array", + "uniqueItems": True, + "items": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + } + }, + "udp_port_range": { + "description": "UDP port range", + "type": "array", + "uniqueItems": True, + "minItems": 2, + "maxItems": 2, + "items": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + } + }, + "udp_ports": { + "description": "UDP ports used by the compute", + "type": "array", + "uniqueItems": True, + "items": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + } + }, + }, + "additionalProperties": False, +} +