cgse-core 0.17.2__tar.gz → 0.17.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cgse_core-0.17.2 → cgse_core-0.17.4}/PKG-INFO +1 -1
- {cgse_core-0.17.2 → cgse_core-0.17.4}/pyproject.toml +1 -1
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/_stop.py +1 -2
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/control.py +2 -1
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/dummy.py +17 -8
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/procman/procman_cs.py +1 -1
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/procman/procman_ui.py +5 -2
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/registry/client.py +8 -4
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/registry/server.py +2 -2
- cgse_core-0.17.2/src/egse/async_control.py +0 -1085
- cgse_core-0.17.2/src/egse/async_control_claude.py +0 -807
- cgse_core-0.17.2/src/egse/confman/confman_acs.py +0 -35
- cgse_core-0.17.2/src/egse/metricshub/__init__.py +0 -0
- cgse_core-0.17.2/src/egse/metricshub/server.py +0 -271
- cgse_core-0.17.2/src/egse/notifyhub/test.py +0 -303
- {cgse_core-0.17.2 → cgse_core-0.17.4}/.gitignore +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/README.md +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/__init__.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/_start.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/_status.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/cgse_explore.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/services.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/settings.yaml +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/_setup_core.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/command.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/confman/__init__.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/confman/__main__.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/confman/confman.yaml +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/confman/confman_cs.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/connect.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/busy.svg +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/operational-mode.svg +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/pm_ui.svg +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/simulator-mode.svg +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/start-process-button.svg +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/stop-process-button.svg +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/user-interface.svg +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/listener.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/logger/__init__.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/logger/__main__.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/logger/log_cs.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/mixin.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/monitoring.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/notifyhub/__init__.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/notifyhub/client.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/notifyhub/event.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/notifyhub/server.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/notifyhub/services.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/procman/__init__.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/procman/procman.yaml +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/procman/procman_protocol.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/protocol.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/proxy.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/registry/__init__.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/registry/backend.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/registry/service.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/services.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/services.yaml +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/storage/__init__.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/storage/__main__.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/storage/persistence.py +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/storage/storage.yaml +0 -0
- {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/storage/storage_cs.py +0 -0
|
@@ -558,7 +558,8 @@ class ControlServer(metaclass=abc.ABCMeta):
|
|
|
558
558
|
try:
|
|
559
559
|
hk_dict = save_average_execution_time(self.device_protocol.get_housekeeping)
|
|
560
560
|
|
|
561
|
-
|
|
561
|
+
if storage_manager:
|
|
562
|
+
self.store_housekeeping_information(hk_dict)
|
|
562
563
|
self.propagate_metrics(hk_dict)
|
|
563
564
|
except Exception as exc:
|
|
564
565
|
logger.error(
|
|
@@ -18,9 +18,9 @@ and stop the server with:
|
|
|
18
18
|
|
|
19
19
|
Commands that can be used with the proxy:
|
|
20
20
|
|
|
21
|
-
* info
|
|
22
|
-
* get_value
|
|
23
|
-
* division
|
|
21
|
+
* info - returns an info message from the dummy device, e.g. "Dummy Device <__version__>"
|
|
22
|
+
* get_value - returns a random float between 0.0 and 1.0
|
|
23
|
+
* division - returns the result of the division between arguments 'a' and 'b'.
|
|
24
24
|
This can be used also to induce a ZeroDivisionError that should return a Failure
|
|
25
25
|
object.
|
|
26
26
|
|
|
@@ -318,11 +318,10 @@ class DummyDeviceEthernetInterface(DeviceConnectionInterface, DeviceTransport):
|
|
|
318
318
|
Args:
|
|
319
319
|
hostname (str): the IP address or fully qualified hostname of the Dummy Device
|
|
320
320
|
controller.
|
|
321
|
-
|
|
322
321
|
port (int): the IP port number to connect to.
|
|
323
322
|
"""
|
|
324
323
|
|
|
325
|
-
def __init__(self, hostname: str = None, port: int = None):
|
|
324
|
+
def __init__(self, hostname: str | None = None, port: int | None = None):
|
|
326
325
|
super().__init__()
|
|
327
326
|
|
|
328
327
|
# Basic connection settings, loaded from the configuration YAML file
|
|
@@ -359,7 +358,8 @@ class DummyDeviceEthernetInterface(DeviceConnectionInterface, DeviceTransport):
|
|
|
359
358
|
try:
|
|
360
359
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
361
360
|
except socket.error as exc:
|
|
362
|
-
self.sock
|
|
361
|
+
if self.sock is not None:
|
|
362
|
+
self.sock.close()
|
|
363
363
|
raise DeviceConnectionError("Dummy Device", "Failed to create socket.") from exc
|
|
364
364
|
|
|
365
365
|
# Attempt to establish a connection to the remote host
|
|
@@ -412,7 +412,8 @@ class DummyDeviceEthernetInterface(DeviceConnectionInterface, DeviceTransport):
|
|
|
412
412
|
"""
|
|
413
413
|
try:
|
|
414
414
|
logger.debug(f"Disconnecting from {self.hostname}")
|
|
415
|
-
self.sock
|
|
415
|
+
if self.sock is not None:
|
|
416
|
+
self.sock.close()
|
|
416
417
|
self.is_connection_open = False
|
|
417
418
|
except Exception as exc:
|
|
418
419
|
raise DeviceConnectionError(DEV_NAME, f"Could not close socket to {self.hostname}") from exc
|
|
@@ -448,6 +449,8 @@ class DummyDeviceEthernetInterface(DeviceConnectionInterface, DeviceTransport):
|
|
|
448
449
|
buf_size = 1024 * 10
|
|
449
450
|
response = bytes()
|
|
450
451
|
|
|
452
|
+
assert self.sock is not None
|
|
453
|
+
|
|
451
454
|
# Set a timeout of READ_TIMEOUT to the socket.recv
|
|
452
455
|
|
|
453
456
|
saved_timeout = self.sock.gettimeout()
|
|
@@ -487,6 +490,8 @@ class DummyDeviceEthernetInterface(DeviceConnectionInterface, DeviceTransport):
|
|
|
487
490
|
there was a socket related error.
|
|
488
491
|
"""
|
|
489
492
|
|
|
493
|
+
assert self.sock is not None
|
|
494
|
+
|
|
490
495
|
# logger.debug(f"{command.encode() = }")
|
|
491
496
|
|
|
492
497
|
try:
|
|
@@ -514,6 +519,9 @@ class DummyDeviceEthernetInterface(DeviceConnectionInterface, DeviceTransport):
|
|
|
514
519
|
DeviceTimeoutError: when the sendall() timed out, and a DeviceConnectionError if
|
|
515
520
|
there was a socket related error.
|
|
516
521
|
"""
|
|
522
|
+
|
|
523
|
+
assert self.sock is not None
|
|
524
|
+
|
|
517
525
|
# logger.debug(f"{command.encode() = }")
|
|
518
526
|
|
|
519
527
|
try:
|
|
@@ -657,7 +665,8 @@ def process_command(command_string: str) -> str | None:
|
|
|
657
665
|
|
|
658
666
|
try:
|
|
659
667
|
action, response = COMMAND_ACTIONS_RESPONSES[command_string]
|
|
660
|
-
|
|
668
|
+
if action:
|
|
669
|
+
action()
|
|
661
670
|
if error_msg:
|
|
662
671
|
return error_msg
|
|
663
672
|
else:
|
|
@@ -154,7 +154,7 @@ def stop():
|
|
|
154
154
|
|
|
155
155
|
if COMMANDING_PORT == 0:
|
|
156
156
|
with RegistryClient() as reg:
|
|
157
|
-
service = reg.discover_service(
|
|
157
|
+
service = reg.discover_service(SERVICE_TYPE)
|
|
158
158
|
rich.print("service = ", service)
|
|
159
159
|
if service:
|
|
160
160
|
hostname = service["host"]
|
|
@@ -44,6 +44,9 @@ from egse.zmq_ser import set_address_port
|
|
|
44
44
|
|
|
45
45
|
MAX_SLEEP = 10
|
|
46
46
|
|
|
47
|
+
DEVICE_CMD_ENTRY_POINT = "cgse.service.device_command"
|
|
48
|
+
GUI_SCRIPTS_ENTRY_POINT = "gui_scripts"
|
|
49
|
+
|
|
47
50
|
|
|
48
51
|
class ControlServerStatus(Enum):
|
|
49
52
|
"""Status of the Control Server of a device."""
|
|
@@ -78,7 +81,7 @@ def get_cgse_cmd(device_proxy: str) -> str:
|
|
|
78
81
|
|
|
79
82
|
module_name = device_proxy[7:].rsplit(".", 1)[0]
|
|
80
83
|
entry_point_values = []
|
|
81
|
-
for ep in sorted(entry_points(
|
|
84
|
+
for ep in sorted(entry_points(DEVICE_CMD_ENTRY_POINT), key=lambda x: x.name):
|
|
82
85
|
entry_point_values.append(ep.value)
|
|
83
86
|
|
|
84
87
|
similarity_scores = [
|
|
@@ -108,7 +111,7 @@ def get_cgse_ui(device_proxy: str) -> Union[str, None]:
|
|
|
108
111
|
|
|
109
112
|
module_name = device_proxy[7:].rsplit(".", 1)[0]
|
|
110
113
|
entry_point_values = []
|
|
111
|
-
for ep in sorted(entry_points(
|
|
114
|
+
for ep in sorted(entry_points(GUI_SCRIPTS_ENTRY_POINT), key=lambda x: x.name):
|
|
112
115
|
entry_point_values.append(ep.name)
|
|
113
116
|
|
|
114
117
|
similarity_scores = [
|
|
@@ -898,7 +898,8 @@ class AsyncRegistryClient:
|
|
|
898
898
|
"""Stop the running heartbeat task."""
|
|
899
899
|
|
|
900
900
|
if self._heartbeat_task is None:
|
|
901
|
-
VERBOSE_DEBUG
|
|
901
|
+
if VERBOSE_DEBUG:
|
|
902
|
+
self.logger.debug("Couldn't stop heartbeat, heartbeat_task is None")
|
|
902
903
|
return
|
|
903
904
|
|
|
904
905
|
self._heartbeat_task.cancel()
|
|
@@ -915,7 +916,8 @@ class AsyncRegistryClient:
|
|
|
915
916
|
"""Stop the running event listener task."""
|
|
916
917
|
|
|
917
918
|
if self._event_listener_task is None:
|
|
918
|
-
VERBOSE_DEBUG
|
|
919
|
+
if VERBOSE_DEBUG:
|
|
920
|
+
self.logger.debug("Couldn't stop event_listener, event_listener_task is None")
|
|
919
921
|
return
|
|
920
922
|
|
|
921
923
|
self._event_listener_task.cancel()
|
|
@@ -1148,12 +1150,14 @@ class AsyncRegistryClient:
|
|
|
1148
1150
|
self.sub_socket.close()
|
|
1149
1151
|
|
|
1150
1152
|
# We can not terminate the context, because we use a global instance, i.e. a singleton context.
|
|
1151
|
-
# When we try to terminate it, even after checking if it was closed,
|
|
1153
|
+
# When we try to terminate it, even after checking if it was closed, it raises an exception.
|
|
1152
1154
|
if hasattr(self, "context") and self.context:
|
|
1153
1155
|
self.logger.info(f"{self.context = !r}")
|
|
1154
1156
|
self.logger.info(f"{self.context._sockets = !r}")
|
|
1157
|
+
# The zmq context instance is the global singleton instance.
|
|
1158
|
+
# Terminating it here would affect other parts of the application using zmq.
|
|
1155
1159
|
# if not self.context.closed:
|
|
1156
|
-
#
|
|
1160
|
+
# self.context.term()
|
|
1157
1161
|
except Exception as exc:
|
|
1158
1162
|
self.logger.error(f"Error during cleanup: {exc}")
|
|
1159
1163
|
|
|
@@ -226,10 +226,10 @@ class AsyncRegistryServer:
|
|
|
226
226
|
try:
|
|
227
227
|
# Wait for a request with timeout to allow checking if still running
|
|
228
228
|
try:
|
|
229
|
-
self.logger.
|
|
229
|
+
# self.logger.debug("Waiting for a request with 1s timeout...")
|
|
230
230
|
message_parts = await asyncio.wait_for(self.req_socket.recv_multipart(), timeout=1.0)
|
|
231
231
|
except asyncio.TimeoutError:
|
|
232
|
-
self.logger.debug("waiting for command request...")
|
|
232
|
+
# self.logger.debug("waiting for command request...")
|
|
233
233
|
continue
|
|
234
234
|
|
|
235
235
|
if len(message_parts) >= 3:
|