Skip to content

Commit c44dc52

Browse files
authored
Merge pull request #767 from coreemu/develop
CORE 9.0.2
2 parents ecf380c + 04e778e commit c44dc52

35 files changed

+1037
-670
lines changed

CHANGELOG.md

+20
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
## 2023-03-02 CORE 9.0.2
2+
3+
* Installation
4+
* updated python dependencies, including invoke to resolve python 3.10+ issues
5+
* improved example dockerfiles to use less space for built images
6+
* Documentation
7+
* updated emane install instructions
8+
* added Docker related issues to install instructions
9+
* core-daemon
10+
* fixed issue using invalid device name in sysctl commands
11+
* updated PTP nodes to properly disable mac learning for their linux bridge
12+
* fixed issue for LXC nodes to properly use a configured image name and write it to XML
13+
* \#742 - fixed issue with bad wlan node id being used
14+
* \#744 - fixed issue not properly setting broadcast address
15+
16+
## core-gui
17+
* fixed sample1.xml to remove SSH service
18+
* fixed emane demo examples
19+
* fixed issue displaying emane configs generally configured for a node
20+
121
## 2022-11-28 CORE 9.0.1
222

323
* Installation

configure.ac

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Process this file with autoconf to produce a configure script.
33

44
# this defines the CORE version number, must be static for AC_INIT
5-
AC_INIT(core, 9.0.1)
5+
AC_INIT(core, 9.0.2)
66

77
# autoconf and automake initialization
88
AC_CONFIG_SRCDIR([netns/version.h.in])

daemon/core/api/grpc/client.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,12 @@ def throughput_listener(
160160
stream: Any, handler: Callable[[wrappers.ThroughputsEvent], None]
161161
) -> None:
162162
"""
163-
Listen for throughput events and provide them to the handler.
163+
Listen for throughput events and provide them to the handler.
164164
165-
:param stream: grpc stream that will provide events
166-
:param handler: function that handles an event
167-
:return: nothing
168-
"""
165+
:param stream: grpc stream that will provide events
166+
:param handler: function that handles an event
167+
:return: nothing
168+
"""
169169
try:
170170
for event_proto in stream:
171171
event = wrappers.ThroughputsEvent.from_proto(event_proto)

daemon/core/api/grpc/events.py

+7-17
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from queue import Empty, Queue
33
from typing import Iterable, Optional
44

5-
from core.api.grpc import core_pb2
5+
from core.api.grpc import core_pb2, grpcutils
66
from core.api.grpc.grpcutils import convert_link_data
77
from core.emulator.data import (
88
ConfigData,
@@ -17,28 +17,18 @@
1717
logger = logging.getLogger(__name__)
1818

1919

20-
def handle_node_event(node_data: NodeData) -> core_pb2.Event:
20+
def handle_node_event(session: Session, node_data: NodeData) -> core_pb2.Event:
2121
"""
2222
Handle node event when there is a node event
2323
24+
:param session: session node is from
2425
:param node_data: node data
2526
:return: node event that contains node id, name, model, position, and services
2627
"""
2728
node = node_data.node
28-
x, y, _ = node.position.get()
29-
position = core_pb2.Position(x=x, y=y)
30-
lon, lat, alt = node.position.get_geo()
31-
geo = core_pb2.Geo(lon=lon, lat=lat, alt=alt)
32-
services = [x.name for x in node.services]
33-
node_proto = core_pb2.Node(
34-
id=node.id,
35-
name=node.name,
36-
model=node.model,
37-
icon=node.icon,
38-
position=position,
39-
geo=geo,
40-
services=services,
41-
)
29+
emane_configs = grpcutils.get_emane_model_configs_dict(session)
30+
node_emane_configs = emane_configs.get(node.id, [])
31+
node_proto = grpcutils.get_node_proto(session, node, node_emane_configs)
4232
message_type = node_data.message_type.value
4333
node_event = core_pb2.NodeEvent(message_type=message_type, node=node_proto)
4434
return core_pb2.Event(node_event=node_event, source=node_data.source)
@@ -189,7 +179,7 @@ def process(self) -> Optional[core_pb2.Event]:
189179
try:
190180
data = self.queue.get(timeout=1)
191181
if isinstance(data, NodeData):
192-
event = handle_node_event(data)
182+
event = handle_node_event(self.session, data)
193183
elif isinstance(data, LinkData):
194184
event = handle_link_event(data)
195185
elif isinstance(data, EventData):

daemon/core/api/grpc/grpcutils.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
)
3535
from core.nodes.docker import DockerNode, DockerOptions
3636
from core.nodes.interface import CoreInterface
37-
from core.nodes.lxd import LxcNode
37+
from core.nodes.lxd import LxcNode, LxcOptions
3838
from core.nodes.network import CoreNetwork, CtrlNet, PtpNet, WlanNode
3939
from core.nodes.wireless import WirelessNode
4040
from core.services.coreservices import CoreService
@@ -81,7 +81,7 @@ def add_node_data(
8181
options.config_services = node_proto.config_services
8282
if isinstance(options, EmaneOptions):
8383
options.emane_model = node_proto.emane
84-
if isinstance(options, DockerOptions):
84+
if isinstance(options, (DockerOptions, LxcOptions)):
8585
options.image = node_proto.image
8686
position = Position()
8787
position.set(node_proto.position.x, node_proto.position.y)
@@ -117,7 +117,7 @@ def link_iface(iface_proto: core_pb2.Interface) -> InterfaceData:
117117

118118

119119
def add_link_data(
120-
link_proto: core_pb2.Link
120+
link_proto: core_pb2.Link,
121121
) -> Tuple[InterfaceData, InterfaceData, LinkOptions]:
122122
"""
123123
Convert link proto to link interfaces and options data.

daemon/core/emulator/session.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ def add_node(
518518
self.set_node_pos(node, position.x, position.y)
519519
# setup default wlan
520520
if isinstance(node, WlanNode):
521-
self.mobility.set_model_config(self.id, BasicRangeModel.name)
521+
self.mobility.set_model_config(node.id, BasicRangeModel.name)
522522
# boot core nodes after runtime
523523
is_runtime = self.state == EventTypes.RUNTIME_STATE
524524
if is_runtime and isinstance(node, CoreNode):
@@ -1113,7 +1113,12 @@ def boot_node(self, node: CoreNode) -> None:
11131113
:param node: node to boot
11141114
:return: nothing
11151115
"""
1116-
logger.info("booting node(%s): %s", node.name, [x.name for x in node.services])
1116+
logger.info(
1117+
"booting node(%s): config services(%s) services(%s)",
1118+
node.name,
1119+
", ".join(node.config_services.keys()),
1120+
", ".join(x.name for x in node.services),
1121+
)
11171122
self.services.boot_services(node)
11181123
node.start_config_services()
11191124

daemon/core/gui/coreclient.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -753,7 +753,7 @@ def get_config_service_rendered(self, node_id: int, name: str) -> Dict[str, str]
753753
return self.client.get_config_service_rendered(self.session.id, node_id, name)
754754

755755
def get_config_service_configs_proto(
756-
self
756+
self,
757757
) -> List[configservices_pb2.ConfigServiceConfig]:
758758
config_service_protos = []
759759
for node in self.session.nodes.values():

0 commit comments

Comments
 (0)