cgse 0.16.8__tar.gz → 0.16.10__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-0.16.8 → cgse-0.16.10}/PKG-INFO +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/docs/libs/cgse-common/settings.md +4 -4
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/cgse_core/settings.yaml +2 -2
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/logger/__init__.py +2 -1
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/logger/log_cs.py +2 -2
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/registry/client.py +20 -130
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/registry/server.py +27 -20
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/storage/storage_cs.py +2 -7
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/script_test_registry_client_server.py +3 -9
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_registry_service.py +0 -67
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/cgse-tools/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/projects/plato/plato-fits/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/projects/plato/plato-hdf5/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/projects/plato/plato-spw/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/pyproject.toml +1 -1
- {cgse-0.16.8 → cgse-0.16.10}/service_registry.db +0 -0
- cgse-0.16.8/service_registry.db-shm +0 -0
- cgse-0.16.8/service_registry.db-wal +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/.github/workflows/ruff-format-check.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/.gitignore +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/buffer_vat.log +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/buffer_vat.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/bump.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/conftest.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/bits.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/calibration.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/command.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/config.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/control.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/counter.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/decorators.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/device.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/dicts.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/dummy.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/env.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/exceptions.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/heartbeat.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/hk.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/index.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/listener.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/metrics.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/mixin.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/monitoring.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/observer.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/obsid.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/persistence.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/plugin.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/process.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/reload.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/settings.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/setup.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/api/system.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/custom_theme/main.html +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/coding_style.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/docs.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/index.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/installation.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/monitoring.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/monorepo.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/nox.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/plugins.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/project-configuration.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/unit_testing.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/uv.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/dev_guide/versioning.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/getting_started.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/help.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/images/cli-cgse.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/images/github-fork-clone-dark.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/images/github-fork-clone.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/images/grafana-queries.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/images/icons/cgse-logo-blue.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/images/icons/cgse-logo.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/index.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/initialize.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/libs/cgse-common/images/load_methods.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/libs/cgse-common/index.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/libs/cgse-common/setup.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/libs/cgse-coordinates/index.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/libs/cgse-core/index.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/libs/cgse-core/notifyhub.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/libs/cgse-core/registry.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/libs/cgse-gui/index.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/libs/index.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/package_list.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/projects/cgse-tools.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/projects/index.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/projects/symetrie-hexapod.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/roadmap.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/stylesheets/custom.css +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/stylesheets/extra.css +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/tutorial.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/user_guide/cli.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/docs/user_guide/index.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/duckdb_metrics.db +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/duckdb_metrics.db.wal +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/identifier.sqlite +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/justfile +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/justfile +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/noxfile.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/service_registry.db +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/cgse_common/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/cgse_common/cgse.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/bits.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/calibration.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/config.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/counter.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/decorators.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/device.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/dicts.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/env.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/exceptions.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/heartbeat.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/hk.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/log.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/metrics.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/observer.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/obsid.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/persistence.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/plugin.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/plugins/metrics/duckdb.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/plugins/metrics/influxdb.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/plugins/metrics/timescaledb.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/process.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/py.typed +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/randomwalk.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/ratelimit.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/reload.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/resource.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/response.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/scpi.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/settings.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/settings.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/setup.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/signal.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/socketdevice.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/state.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/system.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/task.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/version.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/src/egse/zmq_ser.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/conftest.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/COPYING +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/IAS/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/INTA/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/data/command.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/data/new_local_settings.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/icons/hourglass.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/icons/soap_sponge.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/scripts/empty_process.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/scripts/handle_sigterm.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/scripts/process_with_children.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/scripts/raise_value_error.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/scripts/void-0.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/scripts/void-1.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_bits.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_config.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_decorators.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_device.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_env.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_fixtures.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_hk.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_influxdb_plugin.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_log.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_metrics.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_plugin.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_process.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_ratelimit.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_resource.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_response.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_settings.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_setup.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_signal.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_state.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_system.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_task.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-common/tests/test_zmq_ser.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/cgse_coordinates/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/cgse_coordinates/settings.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/tests/test_avoidance.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/tests/test_coordinates_plot.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/tests/test_coordinates_serialize.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/tests/test_point.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/tests/test_ref_model.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/tests/test_reference_frames.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-coordinates/tests/test_refmodel.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/.envrc.disabled +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/service_registry.db +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/cgse_core/_start.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/cgse_core/_status.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/cgse_core/_stop.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/cgse_core/cgse_explore.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/cgse_core/services.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/_setup_core.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/async_control.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/async_control_claude.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/command.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/confman/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/confman/confman_cs.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/connect-todo.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/connect.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/control.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/dummy.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/icons/busy.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/icons/operational-mode.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/icons/pm_ui.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/icons/simulator-mode.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/icons/start-process-button.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/icons/stop-process-button.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/icons/user-interface.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/listener.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/metricshub/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/metricshub/server.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/mixin.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/monitoring.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/notifyhub/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/notifyhub/client.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/notifyhub/event.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/notifyhub/server.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/notifyhub/services.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/notifyhub/test.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/procman/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/procman/procman_cs.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/procman/procman_protocol.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/procman/procman_ui.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/protocol.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/proxy.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/registry/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/registry/backend.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/registry/service.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/services.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/services.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/storage/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/conftest.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/fixtures/default_env.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/fixtures/helpers.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/fixtures/services.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/script_subscribe_to_notifyhub.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/script_test_async_registry_client.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/script_test_service_registry_server.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/script_test_sync_registry_client.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/services.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/stress_test_registry_server.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_async_control.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_client_server_interaction.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_cm_cs.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_command.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_confman_setups.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_connect.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_control.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_dummy.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_event_notification.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_extensions.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_listener.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_logger.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_mixin.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_notify_hub.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_protocol.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_registry_backend.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_server_running.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_server_running_with_fixture.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_settings_core.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-core/tests/test_zmq_microservice.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/led.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/states.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/mkdocs.yml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/noxfile.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/overrides/.icons/custom/dbend-dark.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/overrides/.icons/custom/dbend-light.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/overrides/.icons/custom/gear.svg +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/cgse-tools/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/cgse-tools/src/cgse_tools/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/justfile +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/noxfile.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/service_registry.db +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_acs.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_adev.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_dev.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_mon.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_sim.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_services.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/temperature_readings.log +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/tests/script_daq6510_central_heating.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/tests/script_daq6510_mon.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/tests/script_plot_readings.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/tests/test_adev.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/keithley-tempcontrol/tests/test_dev.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_cs.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_devif.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_protocol.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_services.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/settings.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/lakeshore-tempcontrol/tests/test_lakeshore336_simulator.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_sim.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/__init__.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_services.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/settings.yaml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/tests/test_puna.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/tests/test_puna_cs.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/generic/symetrie-hexapod/tests/test_puna_simulator.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/plato/plato-fits/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/plato/plato-hdf5/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/plato/plato-spw/README.md +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/projects/plato/plato-spw/src/egse/spw.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/ruff.toml +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/scratch/advanced-process-monitoring.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/scratch/live-process-monitoring.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/scratch/match-case.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/scratch/processes.json +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/scratch/simple-process-monitoring.py +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/temperature_readings.log +0 -0
- {cgse-0.16.8 → cgse-0.16.10}/test_service_registry.db +0 -0
|
@@ -39,8 +39,8 @@ Settings
|
|
|
39
39
|
│ ├── METRICS_PORT: 7003
|
|
40
40
|
│ ├── MAX_NR_LOG_FILES: 20
|
|
41
41
|
│ ├── MAX_SIZE_LOG_FILES: 20
|
|
42
|
-
│ ├──
|
|
43
|
-
│ └──
|
|
42
|
+
│ ├── EXTERN_LOG_HOST: 127.0.0.1
|
|
43
|
+
│ └── EXTERN_LOG_PORT: 19996
|
|
44
44
|
├── Configuration Manager Control Server
|
|
45
45
|
│ ├── PROTOCOL: tcp
|
|
46
46
|
│ ├── HOSTNAME: localhost
|
|
@@ -146,8 +146,8 @@ Logging Control Server: # LOG_CS
|
|
|
146
146
|
METRICS_PORT: 7003 # The HTTP port where Prometheus will connect to for retrieving metrics
|
|
147
147
|
MAX_NR_LOG_FILES: 20 # The maximum number of log files that will be maintained in a roll-over
|
|
148
148
|
MAX_SIZE_LOG_FILES: 20 # The maximum size one log file can become
|
|
149
|
-
|
|
150
|
-
|
|
149
|
+
EXTERN_LOG_HOST: 127.0.0.1 # The IP address of the external logger
|
|
150
|
+
EXTERN_LOG_PORT: 19996 # The port number on which the external logger is listening
|
|
151
151
|
|
|
152
152
|
Configuration Manager Control Server: # CM_CS
|
|
153
153
|
|
|
@@ -18,8 +18,8 @@ Logging Control Server: # LOG_CS
|
|
|
18
18
|
MAX_SIZE_LOG_FILES: 20 # The maximum size one log file can become
|
|
19
19
|
RECEIVER_PORT: 6105
|
|
20
20
|
COMMANDER_PORT: 6106
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
EXTERN_LOG_HOST: 127.0.0.1 # The IP address of the external logger
|
|
22
|
+
EXTERN_LOG_PORT: 19996 # The port number on which the external logger is listening
|
|
23
23
|
|
|
24
24
|
Configuration Manager Control Server: # CM_CS
|
|
25
25
|
|
|
@@ -35,6 +35,7 @@ import zmq
|
|
|
35
35
|
from egse.log import LOG_FORMAT_FULL
|
|
36
36
|
from egse.log import PackageFilter
|
|
37
37
|
from egse.log import egse_logger
|
|
38
|
+
from egse.log import get_log_level_from_env
|
|
38
39
|
from egse.log import logger
|
|
39
40
|
from egse.log import root_logger
|
|
40
41
|
from egse.registry.client import RegistryClient
|
|
@@ -201,7 +202,7 @@ def setup_logging():
|
|
|
201
202
|
|
|
202
203
|
logging.disable(logging.NOTSET)
|
|
203
204
|
for handler in root_logger.handlers:
|
|
204
|
-
handler.setLevel(
|
|
205
|
+
handler.setLevel(get_log_level_from_env())
|
|
205
206
|
|
|
206
207
|
egse_logger.setLevel(logging.DEBUG)
|
|
207
208
|
|
|
@@ -144,9 +144,9 @@ def start():
|
|
|
144
144
|
stream_handler.setFormatter(stream_formatter)
|
|
145
145
|
stream_handler.addFilter(PackageFilter())
|
|
146
146
|
|
|
147
|
-
# Log records are also sent to the
|
|
147
|
+
# Log records are also sent to the external logger
|
|
148
148
|
|
|
149
|
-
socket_handler = SocketHandler(CTRL_SETTINGS.
|
|
149
|
+
socket_handler = SocketHandler(CTRL_SETTINGS.EXTERN_LOG_HOST, CTRL_SETTINGS.EXTERN_LOG_PORT)
|
|
150
150
|
socket_handler.addFilter(PackageFilter())
|
|
151
151
|
socket_handler.setFormatter(file_formatter)
|
|
152
152
|
|
|
@@ -114,8 +114,9 @@ class RegistryClient:
|
|
|
114
114
|
self.poller.register(self.sub_socket, zmq.POLLIN)
|
|
115
115
|
|
|
116
116
|
def _connect_hb_socket(self):
|
|
117
|
-
self.hb_socket = self.context.socket(zmq.
|
|
117
|
+
self.hb_socket = self.context.socket(zmq.DEALER)
|
|
118
118
|
self.hb_socket.setsockopt(zmq.LINGER, 0) # Don't wait for unsent messages on close()
|
|
119
|
+
self.hb_socket.setsockopt(zmq.IDENTITY, self._client_id)
|
|
119
120
|
self.hb_socket.connect(self.registry_hb_endpoint)
|
|
120
121
|
|
|
121
122
|
def disconnect(self):
|
|
@@ -214,9 +215,6 @@ class RegistryClient:
|
|
|
214
215
|
return response
|
|
215
216
|
else:
|
|
216
217
|
self.logger.error(f"Request timed out after {HEART_BEAT_TIMEOUT:.2f}s")
|
|
217
|
-
self._disconnect_hb_socket()
|
|
218
|
-
time.sleep(HEART_BEAT_RECONNECT)
|
|
219
|
-
self._connect_hb_socket()
|
|
220
218
|
return {"success": False, "error": "Request timed out"}
|
|
221
219
|
|
|
222
220
|
except zmq.ZMQError as exc:
|
|
@@ -329,7 +327,7 @@ class RegistryClient:
|
|
|
329
327
|
metadata=self._service_info["metadata"],
|
|
330
328
|
)
|
|
331
329
|
|
|
332
|
-
def discover_service(self, service_type: str
|
|
330
|
+
def discover_service(self, service_type: str) -> dict[str, Any] | None:
|
|
333
331
|
"""
|
|
334
332
|
Discover a service of the specified type. The service is guaranteed to be healthy at the time of discovery.
|
|
335
333
|
|
|
@@ -341,15 +339,10 @@ class RegistryClient:
|
|
|
341
339
|
|
|
342
340
|
Args:
|
|
343
341
|
service_type: Type of service to discover
|
|
344
|
-
use_cache: Whether to use cached service information
|
|
345
342
|
|
|
346
343
|
Returns:
|
|
347
344
|
Service information if found, None otherwise
|
|
348
345
|
"""
|
|
349
|
-
# Try to use cache first if enabled
|
|
350
|
-
if use_cache:
|
|
351
|
-
self.logger.info("Cache not yet implemented.")
|
|
352
|
-
|
|
353
346
|
request = {"action": "discover", "service_type": service_type}
|
|
354
347
|
|
|
355
348
|
response = self._send_request(MessageType.REQUEST_WITH_REPLY, request)
|
|
@@ -363,14 +356,13 @@ class RegistryClient:
|
|
|
363
356
|
self.logger.warning(f"Service discovery failed: {response.get('error')}")
|
|
364
357
|
return None
|
|
365
358
|
|
|
366
|
-
def get_service(self, service_id: str | None = None
|
|
359
|
+
def get_service(self, service_id: str | None = None) -> dict[str, Any] | None:
|
|
367
360
|
"""
|
|
368
361
|
Get information about a specific service. When no service_id is given,
|
|
369
362
|
the service_id known to this client will be used.
|
|
370
363
|
|
|
371
364
|
Args:
|
|
372
365
|
service_id: ID of the service to get [default=None]
|
|
373
|
-
use_cache: Whether to use cached service information
|
|
374
366
|
|
|
375
367
|
Returns:
|
|
376
368
|
Service information if found, None otherwise.
|
|
@@ -479,14 +471,14 @@ class RegistryClient:
|
|
|
479
471
|
|
|
480
472
|
# Do a health check
|
|
481
473
|
if not self.health_check():
|
|
482
|
-
self.logger.warning("ServiceRegistry not responding.")
|
|
474
|
+
self.logger.warning("Heartbeat failed: ServiceRegistry not responding.")
|
|
483
475
|
return
|
|
484
476
|
else:
|
|
485
|
-
self.logger.info("
|
|
477
|
+
self.logger.info("Heartbeat failed, but health check succeeded, reregistering...")
|
|
486
478
|
self.reregister()
|
|
487
479
|
|
|
488
480
|
else:
|
|
489
|
-
self.logger.debug(response.get(
|
|
481
|
+
self.logger.debug(f"Heartbeat succeeded: {response.get('message')}")
|
|
490
482
|
|
|
491
483
|
except Exception as exc:
|
|
492
484
|
self.logger.error(f"Error sending heartbeat: {exc}")
|
|
@@ -582,10 +574,6 @@ class AsyncRegistryClient:
|
|
|
582
574
|
|
|
583
575
|
self._event_handlers = {}
|
|
584
576
|
|
|
585
|
-
# Service cache (for discovery)
|
|
586
|
-
self._service_cache = {}
|
|
587
|
-
self._service_cache_lock = None
|
|
588
|
-
|
|
589
577
|
self.req_socket: zmq.asyncio.Socket | None = None
|
|
590
578
|
self.sub_socket: zmq.asyncio.Socket | None = None
|
|
591
579
|
self.hb_socket: zmq.asyncio.Socket | None = None
|
|
@@ -613,8 +601,9 @@ class AsyncRegistryClient:
|
|
|
613
601
|
self.sub_socket.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
614
602
|
|
|
615
603
|
def _connect_hb_socket(self):
|
|
616
|
-
self.hb_socket = self.context.socket(zmq.
|
|
604
|
+
self.hb_socket = self.context.socket(zmq.DEALER)
|
|
617
605
|
self.hb_socket.setsockopt(zmq.LINGER, 0) # Don't wait for unsent messages on close()
|
|
606
|
+
self.hb_socket.setsockopt(zmq.IDENTITY, self._client_id)
|
|
618
607
|
self.hb_socket.connect(self.registry_hb_endpoint)
|
|
619
608
|
|
|
620
609
|
def disconnect(self):
|
|
@@ -634,11 +623,6 @@ class AsyncRegistryClient:
|
|
|
634
623
|
self.hb_socket.close()
|
|
635
624
|
self.hb_socket = None
|
|
636
625
|
|
|
637
|
-
def _get_service_cache_lock(self):
|
|
638
|
-
if self._service_cache_lock is None:
|
|
639
|
-
self._service_cache_lock = asyncio.Lock()
|
|
640
|
-
return self._service_cache_lock
|
|
641
|
-
|
|
642
626
|
async def _send_request(
|
|
643
627
|
self, msg_type: MessageType, request: dict[str, Any], timeout: float = None
|
|
644
628
|
) -> dict[str, Any]:
|
|
@@ -713,11 +697,8 @@ class AsyncRegistryClient:
|
|
|
713
697
|
return response
|
|
714
698
|
except asyncio.TimeoutError:
|
|
715
699
|
self.logger.error(f"Heartbeat request timed out after {HEART_BEAT_TIMEOUT:.2f}s")
|
|
716
|
-
# Reset the socket to avoid invalid state
|
|
717
|
-
self._disconnect_hb_socket()
|
|
718
|
-
await asyncio.sleep(HEART_BEAT_RECONNECT)
|
|
719
|
-
self._connect_hb_socket()
|
|
720
700
|
return {"success": False, "error": "Heartbeat request timed out"}
|
|
701
|
+
|
|
721
702
|
except zmq.ZMQError as exc:
|
|
722
703
|
self.logger.error(f"ZMQ error: {exc}", exc_info=True)
|
|
723
704
|
return {"success": False, "error": str(exc)}
|
|
@@ -873,14 +854,14 @@ class AsyncRegistryClient:
|
|
|
873
854
|
|
|
874
855
|
# Do a health check
|
|
875
856
|
if not await self.health_check():
|
|
876
|
-
self.logger.warning("ServiceRegistry not responding.")
|
|
857
|
+
self.logger.warning("Heartbeat failed: ServiceRegistry not responding.")
|
|
877
858
|
continue
|
|
878
859
|
else:
|
|
879
|
-
self.logger.info("
|
|
860
|
+
self.logger.info("Heartbeat failed, but health check succeeded, reregistering...")
|
|
880
861
|
await self.reregister()
|
|
881
862
|
|
|
882
863
|
else:
|
|
883
|
-
self.logger.debug(response.get(
|
|
864
|
+
self.logger.debug(f"Heartbeat succeeded: {response.get('message')}")
|
|
884
865
|
except Exception as exc:
|
|
885
866
|
self.logger.error(f"Error in heartbeat loop: {exc}", exc_info=True)
|
|
886
867
|
|
|
@@ -992,9 +973,6 @@ class AsyncRegistryClient:
|
|
|
992
973
|
|
|
993
974
|
self.logger.debug(f"Received event: {event_type}")
|
|
994
975
|
|
|
995
|
-
# Update service cache based on events
|
|
996
|
-
await self._update_cache_from_event(event_type, event)
|
|
997
|
-
|
|
998
976
|
# Call registered handlers
|
|
999
977
|
handlers = self._event_handlers.get(event_type, [])
|
|
1000
978
|
for handler in handlers:
|
|
@@ -1022,30 +1000,7 @@ class AsyncRegistryClient:
|
|
|
1022
1000
|
self.logger.info("Started event listener task")
|
|
1023
1001
|
return task
|
|
1024
1002
|
|
|
1025
|
-
async def
|
|
1026
|
-
"""
|
|
1027
|
-
Update the service cache based on registry events.
|
|
1028
|
-
|
|
1029
|
-
Args:
|
|
1030
|
-
event_type: Type of the event.
|
|
1031
|
-
event: Event data
|
|
1032
|
-
"""
|
|
1033
|
-
async with self._get_service_cache_lock():
|
|
1034
|
-
data = event.get("data", {})
|
|
1035
|
-
service_id = data.get("service_id")
|
|
1036
|
-
|
|
1037
|
-
if not service_id:
|
|
1038
|
-
return
|
|
1039
|
-
|
|
1040
|
-
if event_type == "register":
|
|
1041
|
-
service_info = data.get("service_info", {})
|
|
1042
|
-
if service_info:
|
|
1043
|
-
self._service_cache[service_id] = service_info
|
|
1044
|
-
elif event_type in ("deregister", "expire"):
|
|
1045
|
-
if service_id in self._service_cache:
|
|
1046
|
-
del self._service_cache[service_id]
|
|
1047
|
-
|
|
1048
|
-
async def discover_service(self, service_type: str, use_cache: bool = True) -> dict[str, Any] | None:
|
|
1003
|
+
async def discover_service(self, service_type: str) -> dict[str, Any] | None:
|
|
1049
1004
|
"""
|
|
1050
1005
|
Discover a service of the specified type. The service is guaranteed to be healthy at the time of discovery.
|
|
1051
1006
|
|
|
@@ -1057,27 +1012,11 @@ class AsyncRegistryClient:
|
|
|
1057
1012
|
|
|
1058
1013
|
Args:
|
|
1059
1014
|
service_type: Type of service to discover
|
|
1060
|
-
use_cache: Whether to use cached service information
|
|
1061
1015
|
|
|
1062
1016
|
Returns:
|
|
1063
1017
|
Service information if found, None otherwise
|
|
1064
1018
|
"""
|
|
1065
|
-
|
|
1066
|
-
if use_cache:
|
|
1067
|
-
async with self._get_service_cache_lock():
|
|
1068
|
-
# Find services of the specified type
|
|
1069
|
-
matching_services = []
|
|
1070
|
-
for service_id, service_info in self._service_cache.items():
|
|
1071
|
-
if service_info.get("type") == service_type or service_type in service_info.get("tags", []):
|
|
1072
|
-
matching_services.append(service_info)
|
|
1073
|
-
|
|
1074
|
-
if matching_services:
|
|
1075
|
-
# Simple load balancing - random selection
|
|
1076
|
-
import random
|
|
1077
|
-
|
|
1078
|
-
return random.choice(matching_services)
|
|
1079
|
-
|
|
1080
|
-
# If not found in cache or cache disabled, ask the registry
|
|
1019
|
+
|
|
1081
1020
|
request = {"action": "discover", "service_type": service_type}
|
|
1082
1021
|
|
|
1083
1022
|
response = await self._send_request(MessageType.REQUEST_WITH_REPLY, request)
|
|
@@ -1087,34 +1026,25 @@ class AsyncRegistryClient:
|
|
|
1087
1026
|
if response.get("success"):
|
|
1088
1027
|
service = response.get("service")
|
|
1089
1028
|
|
|
1090
|
-
# Update cache
|
|
1091
|
-
if service and "id" in service:
|
|
1092
|
-
async with self._get_service_cache_lock():
|
|
1093
|
-
self._service_cache[service["id"]] = service
|
|
1094
|
-
|
|
1095
1029
|
return service
|
|
1096
1030
|
else:
|
|
1097
1031
|
self.logger.warning(f"Service discovery failed: {response.get('error')}")
|
|
1098
1032
|
return None
|
|
1099
1033
|
|
|
1100
|
-
async def get_service(self, service_id: str
|
|
1034
|
+
async def get_service(self, service_id: str | None = None) -> dict[str, Any] | None:
|
|
1101
1035
|
"""
|
|
1102
|
-
Get information about a specific service.
|
|
1036
|
+
Get information about a specific service. When no service_id is given,
|
|
1037
|
+
the service_id known to this client will be used.
|
|
1103
1038
|
|
|
1104
1039
|
Args:
|
|
1105
1040
|
service_id: ID of the service to get
|
|
1106
|
-
use_cache: Whether to use cached service information
|
|
1107
1041
|
|
|
1108
1042
|
Returns:
|
|
1109
1043
|
Service information if found, None otherwise
|
|
1110
1044
|
"""
|
|
1111
|
-
# Try to use cache first if enabled
|
|
1112
|
-
if use_cache:
|
|
1113
|
-
async with self._get_service_cache_lock():
|
|
1114
|
-
if service_id in self._service_cache:
|
|
1115
|
-
return self._service_cache[service_id]
|
|
1116
1045
|
|
|
1117
|
-
|
|
1046
|
+
service_id = service_id or self._service_id
|
|
1047
|
+
|
|
1118
1048
|
request = {"action": "get", "service_id": service_id}
|
|
1119
1049
|
|
|
1120
1050
|
response = await self._send_request(MessageType.REQUEST_WITH_REPLY, request)
|
|
@@ -1122,11 +1052,6 @@ class AsyncRegistryClient:
|
|
|
1122
1052
|
if response.get("success"):
|
|
1123
1053
|
service = response.get("service")
|
|
1124
1054
|
|
|
1125
|
-
# Update cache
|
|
1126
|
-
if service:
|
|
1127
|
-
async with self._get_service_cache_lock():
|
|
1128
|
-
self._service_cache[service_id] = service
|
|
1129
|
-
|
|
1130
1055
|
return service
|
|
1131
1056
|
else:
|
|
1132
1057
|
self.logger.warning(f"Get service failed: {response.get('error')}")
|
|
@@ -1149,12 +1074,6 @@ class AsyncRegistryClient:
|
|
|
1149
1074
|
if response.get("success"):
|
|
1150
1075
|
services = response.get("services", [])
|
|
1151
1076
|
|
|
1152
|
-
# Update cache
|
|
1153
|
-
async with self._get_service_cache_lock():
|
|
1154
|
-
for service in services:
|
|
1155
|
-
if "id" in service:
|
|
1156
|
-
self._service_cache[service["id"]] = service
|
|
1157
|
-
|
|
1158
1077
|
return services
|
|
1159
1078
|
else:
|
|
1160
1079
|
self.logger.warning(f"List services failed: {response.get('error')}")
|
|
@@ -1224,35 +1143,6 @@ class AsyncRegistryClient:
|
|
|
1224
1143
|
except Exception as exc:
|
|
1225
1144
|
self.logger.error(f"Error during cleanup: {exc}")
|
|
1226
1145
|
|
|
1227
|
-
@asynccontextmanager
|
|
1228
|
-
async def register_context(self, *args, **kwargs):
|
|
1229
|
-
"""
|
|
1230
|
-
Async context manager for service registration.
|
|
1231
|
-
|
|
1232
|
-
Example:
|
|
1233
|
-
async with client.register_context("my-service", "localhost", 8080):
|
|
1234
|
-
# Service is registered
|
|
1235
|
-
await app.start()
|
|
1236
|
-
# Service is automatically deregistered
|
|
1237
|
-
"""
|
|
1238
|
-
service_id = await self.register(*args, **kwargs)
|
|
1239
|
-
|
|
1240
|
-
if not service_id:
|
|
1241
|
-
raise RuntimeError("Failed to register service")
|
|
1242
|
-
|
|
1243
|
-
# Start heartbeat and event listener
|
|
1244
|
-
await self.start_heartbeat()
|
|
1245
|
-
await self.start_event_listener()
|
|
1246
|
-
|
|
1247
|
-
try:
|
|
1248
|
-
yield service_id
|
|
1249
|
-
finally:
|
|
1250
|
-
# Clean up
|
|
1251
|
-
await self.stop_event_listener()
|
|
1252
|
-
await self.stop_heartbeat()
|
|
1253
|
-
await self.deregister()
|
|
1254
|
-
# await self.close() # client shall not be closed by this context manager !!
|
|
1255
|
-
|
|
1256
1146
|
|
|
1257
1147
|
def is_service_registered(service_type: str):
|
|
1258
1148
|
"""Convenience function to check if a service is registered."""
|
|
@@ -101,19 +101,19 @@ class AsyncRegistryServer:
|
|
|
101
101
|
req_rep_endpoint = f"tcp://*:{self.req_port}"
|
|
102
102
|
self.req_socket = self.context.socket(zmq.ROUTER)
|
|
103
103
|
self.req_socket.bind(req_rep_endpoint)
|
|
104
|
-
self.logger.
|
|
104
|
+
self.logger.debug(f"Binding request ROUTER socket to {req_rep_endpoint}")
|
|
105
105
|
|
|
106
106
|
# Socket to publish service events
|
|
107
107
|
pub_endpoint = f"tcp://*:{self.pub_port}"
|
|
108
108
|
self.pub_socket = self.context.socket(zmq.PUB)
|
|
109
109
|
self.pub_socket.bind(pub_endpoint)
|
|
110
|
-
self.logger.
|
|
110
|
+
self.logger.debug(f"Binding publish PUB socket to {pub_endpoint}")
|
|
111
111
|
|
|
112
112
|
# Socket to handle heartbeats
|
|
113
113
|
hb_endpoint = f"tcp://*:{self.hb_port}"
|
|
114
|
-
self.hb_socket = self.context.socket(zmq.
|
|
114
|
+
self.hb_socket = self.context.socket(zmq.ROUTER)
|
|
115
115
|
self.hb_socket.bind(hb_endpoint)
|
|
116
|
-
self.logger.
|
|
116
|
+
self.logger.debug(f"Binding heartbeat ROUTER socket to {hb_endpoint}")
|
|
117
117
|
|
|
118
118
|
async def initialize_backend(self):
|
|
119
119
|
"""Initialize the storage backend."""
|
|
@@ -137,8 +137,8 @@ class AsyncRegistryServer:
|
|
|
137
137
|
|
|
138
138
|
self._running = True
|
|
139
139
|
self.logger.info(
|
|
140
|
-
f"Async registry server started on ports {self.req_port} (ROUTER-DEALER),
|
|
141
|
-
f"and {self.hb_port} (Heartbeat)"
|
|
140
|
+
f"Async registry server started on ports {self.req_port} (Requests ROUTER-DEALER), "
|
|
141
|
+
f"{self.pub_port} (Publish PUB), and {self.hb_port} (Heartbeat ROUTER)"
|
|
142
142
|
)
|
|
143
143
|
|
|
144
144
|
# Start the cleanup task
|
|
@@ -400,22 +400,35 @@ class AsyncRegistryServer:
|
|
|
400
400
|
self.logger.info("Started heartbeats handler task")
|
|
401
401
|
|
|
402
402
|
try:
|
|
403
|
+
message_parts = None
|
|
403
404
|
while self._running:
|
|
404
405
|
try:
|
|
405
406
|
# Receive heartbeat (non-blocking with timeout)
|
|
406
|
-
|
|
407
|
+
message_parts = await asyncio.wait_for(self.hb_socket.recv_multipart(), timeout=1.0)
|
|
408
|
+
|
|
409
|
+
self.logger.debug(f"{message_parts=}")
|
|
410
|
+
|
|
411
|
+
if len(message_parts) == 2:
|
|
412
|
+
client_id = message_parts[0]
|
|
413
|
+
request = message_parts[1]
|
|
414
|
+
|
|
415
|
+
# Parse the request
|
|
416
|
+
request = json.loads(request)
|
|
417
|
+
self.logger.info(f"Received heartbeat request: {request}")
|
|
407
418
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
419
|
+
response = await self._handle_renew(request)
|
|
420
|
+
if VERBOSE_DEBUG:
|
|
421
|
+
self.logger.debug(f"{response=}")
|
|
411
422
|
|
|
412
|
-
|
|
423
|
+
# Send the response
|
|
424
|
+
await self.hb_socket.send_multipart([client_id, json.dumps(response).encode()])
|
|
413
425
|
|
|
414
|
-
|
|
415
|
-
|
|
426
|
+
else:
|
|
427
|
+
self.logger.warning("Heartbeat request: message corrupted, check debug messages.")
|
|
416
428
|
|
|
417
429
|
except asyncio.TimeoutError:
|
|
418
|
-
|
|
430
|
+
if VERBOSE_DEBUG:
|
|
431
|
+
self.logger.debug("waiting for heartbeat...")
|
|
419
432
|
continue
|
|
420
433
|
|
|
421
434
|
except Exception as exc:
|
|
@@ -526,12 +539,6 @@ async def start(
|
|
|
526
539
|
):
|
|
527
540
|
"""Run the registry server with signal handling."""
|
|
528
541
|
|
|
529
|
-
logging.basicConfig(
|
|
530
|
-
level=get_logging_level(log_level),
|
|
531
|
-
format="[%(asctime)s] %(threadName)-12s %(levelname)-8s %(name)-12s %(lineno)5d:%(module)-20s %(message)s",
|
|
532
|
-
)
|
|
533
|
-
logging.getLogger("aiosqlite").setLevel(logging.INFO)
|
|
534
|
-
|
|
535
542
|
with remote_logging():
|
|
536
543
|
server = AsyncRegistryServer(
|
|
537
544
|
req_port=req_port,
|
|
@@ -62,6 +62,8 @@ class StorageControlServer(ControlServer):
|
|
|
62
62
|
|
|
63
63
|
multiprocessing.current_process().name = PROCESS_NAME
|
|
64
64
|
|
|
65
|
+
self.scheduler: BackgroundScheduler | None = None
|
|
66
|
+
|
|
65
67
|
self.logger = logger
|
|
66
68
|
self.service_name = PROCESS_NAME
|
|
67
69
|
self.service_type = SERVICE_TYPE
|
|
@@ -76,13 +78,6 @@ class StorageControlServer(ControlServer):
|
|
|
76
78
|
|
|
77
79
|
self.register_service(service_type=SERVICE_TYPE)
|
|
78
80
|
|
|
79
|
-
# NOTE:
|
|
80
|
-
# Since the CM CS is started after the SM CS in the normal startup sequence, delay the task to load
|
|
81
|
-
# the Setup until after the CM CS has been properly started. We do that now with a delay time of 30s,
|
|
82
|
-
# but we might in the future use a function returning a boolean, until...
|
|
83
|
-
# from egse.confman import is_configuration_manager_active
|
|
84
|
-
# self.schedule_task(self.device_protocol.controller.load_setup, after=10.0, when=is_configuration_manager_active)
|
|
85
|
-
|
|
86
81
|
def before_serve(self):
|
|
87
82
|
self.scheduler = BackgroundScheduler(timezone=utc)
|
|
88
83
|
self.scheduler.start()
|
|
@@ -30,7 +30,6 @@ Notes:
|
|
|
30
30
|
"""
|
|
31
31
|
|
|
32
32
|
import asyncio
|
|
33
|
-
import logging
|
|
34
33
|
import sys
|
|
35
34
|
import time
|
|
36
35
|
|
|
@@ -88,7 +87,7 @@ def test_proper_termination_of_tasks_sync(
|
|
|
88
87
|
assert response["name"] == "sync-context-test-service"
|
|
89
88
|
assert response["metadata"]["msg"] == "Hello, World!"
|
|
90
89
|
|
|
91
|
-
print("Sleeping for
|
|
90
|
+
print("Sleeping for 50s to let some heartbeats come through...")
|
|
92
91
|
time.sleep(50.0)
|
|
93
92
|
|
|
94
93
|
client.stop_heartbeat()
|
|
@@ -134,8 +133,8 @@ async def test_proper_termination_of_tasks_async(
|
|
|
134
133
|
assert response["name"] == "async-context-test-service"
|
|
135
134
|
assert response["metadata"]["msg"] == "Hello, World!"
|
|
136
135
|
|
|
137
|
-
print("Sleeping for
|
|
138
|
-
await asyncio.sleep(
|
|
136
|
+
print("Sleeping for 50s to let some heartbeats come through...")
|
|
137
|
+
await asyncio.sleep(50.0)
|
|
139
138
|
|
|
140
139
|
await client.stop_heartbeat()
|
|
141
140
|
await client.deregister(service_id)
|
|
@@ -166,9 +165,4 @@ def main(
|
|
|
166
165
|
|
|
167
166
|
|
|
168
167
|
if __name__ == "__main__":
|
|
169
|
-
logging.basicConfig(
|
|
170
|
-
level=logging.DEBUG,
|
|
171
|
-
format="[%(asctime)s] %(threadName)-12s %(levelname)-8s %(name)-12s %(lineno)5d:%(module)-20s %(message)s",
|
|
172
|
-
)
|
|
173
|
-
|
|
174
168
|
sys.exit(app())
|
|
@@ -787,70 +787,3 @@ async def test_client_health_check(client, server):
|
|
|
787
787
|
"""Test health check."""
|
|
788
788
|
health = await client.health_check()
|
|
789
789
|
assert health is True
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
@pytest.mark.asyncio
|
|
793
|
-
async def test_client_caching(client, server):
|
|
794
|
-
"""Test client's service caching."""
|
|
795
|
-
|
|
796
|
-
service_id = await client.register("cache-test-service", "localhost", 8080, service_type="cache-test")
|
|
797
|
-
|
|
798
|
-
# Look up the service (should populate cache)
|
|
799
|
-
service = await client.get_service(service_id)
|
|
800
|
-
assert service is not None
|
|
801
|
-
|
|
802
|
-
# Check if it's in the cache
|
|
803
|
-
async with client._service_cache_lock:
|
|
804
|
-
assert service_id in client._service_cache
|
|
805
|
-
|
|
806
|
-
# Look up by type (should use cache when use_cache=True)
|
|
807
|
-
with patch.object(client, "_send_request", new_callable=AsyncMock) as mock_send:
|
|
808
|
-
# First call with use_cache=True should check cache
|
|
809
|
-
service = await client.discover_service("cache-test", use_cache=True)
|
|
810
|
-
assert service is not None
|
|
811
|
-
assert service["id"] == service_id
|
|
812
|
-
|
|
813
|
-
# Configure the mock to return a dictionary that matches what _send_request would return
|
|
814
|
-
mock_send.return_value = {
|
|
815
|
-
"success": True,
|
|
816
|
-
"service": {
|
|
817
|
-
"id": service_id,
|
|
818
|
-
"name": "cache-test-service",
|
|
819
|
-
"host": "localhost",
|
|
820
|
-
"port": 8080,
|
|
821
|
-
"type": "cache-test",
|
|
822
|
-
},
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
# Second call with use_cache=False should make a request
|
|
826
|
-
service = await client.discover_service("cache-test", use_cache=False)
|
|
827
|
-
assert service is not None
|
|
828
|
-
assert mock_send.called
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
@pytest.mark.asyncio
|
|
832
|
-
async def test_client_register_context(client, server, req_socket):
|
|
833
|
-
"""Test the register_context context manager."""
|
|
834
|
-
|
|
835
|
-
# Use the context manager
|
|
836
|
-
async with client.register_context(
|
|
837
|
-
"context-test-service", "localhost", 8080, service_type="context-test"
|
|
838
|
-
) as service_id:
|
|
839
|
-
# Verify the service was registered
|
|
840
|
-
response = await send_request(
|
|
841
|
-
MessageType.REQUEST_WITH_REPLY, req_socket, {"action": "get", "service_id": service_id}
|
|
842
|
-
)
|
|
843
|
-
|
|
844
|
-
logger.info(f"----- In test_client_register_context: {response}")
|
|
845
|
-
|
|
846
|
-
assert response["success"] is True
|
|
847
|
-
assert response["service"]["name"] == "context-test-service"
|
|
848
|
-
|
|
849
|
-
logger.info("----- In test_client_register_context: after context...")
|
|
850
|
-
|
|
851
|
-
# After exiting the context, the service should be deregistered
|
|
852
|
-
response = await send_request(
|
|
853
|
-
MessageType.REQUEST_WITH_REPLY, req_socket, {"action": "get", "service_id": service_id}
|
|
854
|
-
)
|
|
855
|
-
|
|
856
|
-
assert response["success"] is False
|