Merge branch 'develop' into feature/pygui-multi-canvas

This commit is contained in:
Blake Harnden 2020-12-16 13:29:50 -08:00
commit 8eada3d754
4 changed files with 29 additions and 17 deletions

View file

@ -2029,7 +2029,7 @@ class CoreUdpHandler(CoreHandler):
for session_id in sessions:
session = self.server.mainserver.coreemu.sessions.get(session_id)
if session:
logging.debug("session handling message: %s", session.session_id)
logging.debug("session handling message: %s", session.id)
self.session = session
self.handle_message(message)
self.broadcast(message)

View file

@ -13,7 +13,7 @@ import tempfile
import threading
import time
from pathlib import Path
from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Type, TypeVar
from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Type, TypeVar, Union
from core import constants, utils
from core.configservice.manager import ConfigServiceManager
@ -571,11 +571,11 @@ class Session:
if isinstance(node, WlanNode):
self.mobility.set_model_config(_id, BasicRangeModel.name)
# boot nodes after runtime, CoreNodes, Physical, and RJ45 are all nodes
is_boot_node = isinstance(node, CoreNodeBase) and not isinstance(node, Rj45Node)
# boot nodes after runtime CoreNodes and PhysicalNodes
is_boot_node = isinstance(node, (CoreNode, PhysicalNode))
if self.state == EventTypes.RUNTIME_STATE and is_boot_node:
self.write_nodes()
self.add_remove_control_iface(node=node, remove=False)
self.add_remove_control_iface(node, remove=False)
self.services.boot_services(node)
self.sdt.add_node(node)
@ -1310,7 +1310,6 @@ class Session:
:return: nothing
"""
logging.info("booting node(%s): %s", node.name, [x.name for x in node.services])
self.add_remove_control_iface(node=node, remove=False)
self.services.boot_services(node)
node.start_config_services()
@ -1325,11 +1324,10 @@ class Session:
with self.nodes_lock:
funcs = []
start = time.monotonic()
for _id in self.nodes:
node = self.nodes[_id]
if isinstance(node, CoreNodeBase) and not isinstance(node, Rj45Node):
args = (node,)
funcs.append((self.boot_node, args, {}))
for node in self.nodes.values():
if isinstance(node, (CoreNode, PhysicalNode)):
self.add_remove_control_iface(node, remove=False)
funcs.append((self.boot_node, (node,), {}))
results, exceptions = utils.threadpool(funcs)
total = time.monotonic() - start
logging.debug("boot run time: %s", total)
@ -1477,7 +1475,7 @@ class Session:
def add_remove_control_iface(
self,
node: CoreNode,
node: Union[CoreNode, PhysicalNode],
net_index: int = 0,
remove: bool = False,
conf_required: bool = True,

View file

@ -837,7 +837,12 @@ class CoreNode(CoreNodeBase):
if net.has_custom_iface:
return net.custom_iface(self, iface_data)
else:
iface_id = self.newveth(iface_data.id, iface_data.name)
iface_id = iface_data.id
if iface_id is not None and iface_id in self.ifaces:
raise CoreError(
f"node({self.name}) already has interface({iface_id})"
)
iface_id = self.newveth(iface_id, iface_data.name)
self.attachnet(iface_id, net)
if iface_data.mac:
self.set_mac(iface_id, iface_data.mac)

View file

@ -266,7 +266,9 @@ class Rj45Node(CoreNodeBase):
will run on, default is None for localhost
"""
super().__init__(session, _id, name, server)
self.iface = CoreInterface(session, self, name, name, mtu, server)
self.iface: CoreInterface = CoreInterface(
session, self, name, name, mtu, server
)
self.iface.transport_type = TransportType.RAW
self.lock: threading.RLock = threading.RLock()
self.iface_id: Optional[int] = None
@ -335,11 +337,12 @@ class Rj45Node(CoreNodeBase):
if iface_id is None:
iface_id = 0
if self.iface.net is not None:
raise CoreError("RJ45 nodes support at most 1 network interface")
raise CoreError(
f"RJ45({self.name}) nodes support at most 1 network interface"
)
self.ifaces[iface_id] = self.iface
self.iface_id = iface_id
if net is not None:
self.iface.attachnet(net)
self.iface.attachnet(net)
for ip in iface_data.get_ips():
self.add_ip(ip)
return self.iface
@ -353,6 +356,12 @@ class Rj45Node(CoreNodeBase):
"""
self.get_iface(iface_id)
self.ifaces.pop(iface_id)
if self.iface.net is None:
raise CoreError(
f"RJ45({self.name}) is not currently connected to a network"
)
self.iface.detachnet()
self.iface.net = None
self.shutdown()
def get_iface(self, iface_id: int) -> CoreInterface: