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.
Files changed (63) hide show
  1. {cgse_core-0.17.2 → cgse_core-0.17.4}/PKG-INFO +1 -1
  2. {cgse_core-0.17.2 → cgse_core-0.17.4}/pyproject.toml +1 -1
  3. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/_stop.py +1 -2
  4. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/control.py +2 -1
  5. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/dummy.py +17 -8
  6. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/procman/procman_cs.py +1 -1
  7. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/procman/procman_ui.py +5 -2
  8. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/registry/client.py +8 -4
  9. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/registry/server.py +2 -2
  10. cgse_core-0.17.2/src/egse/async_control.py +0 -1085
  11. cgse_core-0.17.2/src/egse/async_control_claude.py +0 -807
  12. cgse_core-0.17.2/src/egse/confman/confman_acs.py +0 -35
  13. cgse_core-0.17.2/src/egse/metricshub/__init__.py +0 -0
  14. cgse_core-0.17.2/src/egse/metricshub/server.py +0 -271
  15. cgse_core-0.17.2/src/egse/notifyhub/test.py +0 -303
  16. {cgse_core-0.17.2 → cgse_core-0.17.4}/.gitignore +0 -0
  17. {cgse_core-0.17.2 → cgse_core-0.17.4}/README.md +0 -0
  18. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/__init__.py +0 -0
  19. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/_start.py +0 -0
  20. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/_status.py +0 -0
  21. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/cgse_explore.py +0 -0
  22. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/services.py +0 -0
  23. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/cgse_core/settings.yaml +0 -0
  24. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/_setup_core.py +0 -0
  25. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/command.py +0 -0
  26. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/confman/__init__.py +0 -0
  27. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/confman/__main__.py +0 -0
  28. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/confman/confman.yaml +0 -0
  29. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/confman/confman_cs.py +0 -0
  30. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/connect.py +0 -0
  31. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/busy.svg +0 -0
  32. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/operational-mode.svg +0 -0
  33. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/pm_ui.svg +0 -0
  34. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/simulator-mode.svg +0 -0
  35. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/start-process-button.svg +0 -0
  36. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/stop-process-button.svg +0 -0
  37. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/icons/user-interface.svg +0 -0
  38. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/listener.py +0 -0
  39. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/logger/__init__.py +0 -0
  40. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/logger/__main__.py +0 -0
  41. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/logger/log_cs.py +0 -0
  42. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/mixin.py +0 -0
  43. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/monitoring.py +0 -0
  44. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/notifyhub/__init__.py +0 -0
  45. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/notifyhub/client.py +0 -0
  46. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/notifyhub/event.py +0 -0
  47. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/notifyhub/server.py +0 -0
  48. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/notifyhub/services.py +0 -0
  49. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/procman/__init__.py +0 -0
  50. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/procman/procman.yaml +0 -0
  51. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/procman/procman_protocol.py +0 -0
  52. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/protocol.py +0 -0
  53. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/proxy.py +0 -0
  54. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/registry/__init__.py +0 -0
  55. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/registry/backend.py +0 -0
  56. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/registry/service.py +0 -0
  57. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/services.py +0 -0
  58. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/services.yaml +0 -0
  59. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/storage/__init__.py +0 -0
  60. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/storage/__main__.py +0 -0
  61. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/storage/persistence.py +0 -0
  62. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/storage/storage.yaml +0 -0
  63. {cgse_core-0.17.2 → cgse_core-0.17.4}/src/egse/storage/storage_cs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cgse-core
3
- Version: 0.17.2
3
+ Version: 0.17.4
4
4
  Summary: Core services for the CGSE framework
5
5
  Author: IvS KU Leuven
6
6
  Maintainer-email: Rik Huygen <rik.huygen@kuleuven.be>, Sara Regibo <sara.regibo@kuleuven.be>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-core"
3
- version = "0.17.2"
3
+ version = "0.17.4"
4
4
  description = "Core services for the CGSE framework"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -1,9 +1,8 @@
1
1
  import logging
2
2
  import subprocess
3
- import sys
4
- from pathlib import Path
5
3
 
6
4
  import rich
5
+ import sys
7
6
 
8
7
  from egse.log import logger
9
8
  from egse.process import is_process_running
@@ -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
- self.store_housekeeping_information(hk_dict)
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 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'.
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.close()
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.close()
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
- action and action()
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(settings.SERVICE_TYPE)
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("cgse.service"), key=lambda x: x.name):
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("gui_scripts"), key=lambda x: x.name):
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 and self.logger.debug("Couldn't stop heartbeat, heartbeat_task is None")
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 and self.logger.debug("Couldn't stop event_listener, event_listener_task is None")
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
- # self.context.term()
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.info("Waiting for a request with 1s timeout...")
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: