Move the generation of the list of ports to the server

Ref #676
This commit is contained in:
Julien Duponchelle committed 2016-09-14 15:21:37 +02:00
1 parent f06c00fdb8
commit 2f0e2260ab
50 files changed
+1347 -240

No files matched your search

+67 -5
View File
@@ -23,6 +23,7 @@ import os
from .compute import ComputeConflict
from .ports.port_factory import PortFactory, StandardPortFactory, DynamipsPortFactory
from ..utils.images import images_directories
from ..utils.qt import qt_font_to_style
@@ -33,7 +34,8 @@ log = logging.getLogger(__name__)
class Node:
# This properties are used only on controller and are not forwarded to the compute
CONTROLLER_ONLY_PROPERTIES = ["x", "y", "z", "width", "height", "symbol", "label", "console_host"]
CONTROLLER_ONLY_PROPERTIES = ["x", "y", "z", "width", "height", "symbol", "label", "console_host",
"port_name_format", "first_port_name", "port_segment_size", "ports"]
def __init__(self, project, compute, name, node_id=None, node_type=None, **kwargs):
"""
@@ -69,12 +71,20 @@ class Node:
self._y = 0
self._z = 0
self._symbol = None
# Update node properties with additional elements
if node_type == "iou":
self._port_name_format = "Ethernet{segment0}/{port0}"
self._port_by_adapter = 4
self.port_segment_size = 4
else:
self._port_name_format = "Ethernet{0}"
self._port_by_adapter = 1
self._port_segment_size = 0
self._first_port_name = None
# This properties will be recompute
ignore_properties = ("width", "height")
# Update node properties with additional elements
for prop in kwargs:
if prop not in ignore_properties:
try:
@@ -220,6 +230,30 @@ class Node:
val["text"] = self._name
self._label = val
@property
def port_name_format(self):
return self._port_name_format
@port_name_format.setter
def port_name_format(self, val):
self._port_name_format = val
@property
def port_segment_size(self):
return self._port_segment_size
@port_segment_size.setter
def port_segment_size(self, val):
self._port_segment_size = val
@property
def first_port_name(self):
return self._first_port_name
@first_port_name.setter
def first_port_name(self, val):
self._first_port_name = val
@asyncio.coroutine
def create(self):
"""
@@ -423,6 +457,27 @@ class Node:
"""
return (yield from self._compute.get("/projects/{}/{}/nodes/{}/idlepc_proposals".format(self._project.id, self._node_type, self._id), timeout=240)).json
def _list_ports(self):
"""
Generate the list of port display in the client
if the compute has sent a list we return it (use by
node where you can not personnalize the port naming).
"""
ports = []
# Some special cases
if self._node_type == "atm_switch":
for adapter_number in range(0, len(self.properties["mappings"])):
ports.append(PortFactory("ATM{}".format(adapter_number), adapter_number, adapter_number, 0, "atm"))
return ports
elif self._node_type == "frame_relay_switch":
for adapter_number in range(0, len(self.properties["mappings"])):
ports.append(PortFactory("FrameRelay{}".format(adapter_number), adapter_number, adapter_number, 0, "frame_relay"))
return ports
elif self._node_type == "dynamips":
return DynamipsPortFactory(self.properties)
else:
return StandardPortFactory(self.properties, self._port_by_adapter, self._first_port_name, self._port_name_format, self._port_segment_size)
def __repr__(self):
return "<gns3server.controller.Node {} {}>".format(self._node_type, self._name)
@@ -450,7 +505,10 @@ class Node:
"z": self._z,
"width": self._width,
"height": self._height,
"symbol": self._symbol
"symbol": self._symbol,
"port_name_format": self._port_name_format,
"port_segment_size": self._port_segment_size,
"first_port_name": self._first_port_name
}
return {
"compute_id": str(self._compute.id),
@@ -471,5 +529,9 @@ class Node:
"z": self._z,
"width": self._width,
"height": self._height,
"symbol": self._symbol
"symbol": self._symbol,
"port_name_format": self._port_name_format,
"port_segment_size": self._port_segment_size,
"first_port_name": self._first_port_name,
"ports": [port.__json__() for port in self._list_ports()]
}