diff --git a/scos_actions/__init__.py b/scos_actions/__init__.py index 73d4c8be..9e17e009 100644 --- a/scos_actions/__init__.py +++ b/scos_actions/__init__.py @@ -1 +1 @@ -__version__ = "8.0.0" +__version__ = "8.0.1" diff --git a/scos_actions/actions/acquire_sea_data_product.py b/scos_actions/actions/acquire_sea_data_product.py index 3409699a..20a684da 100644 --- a/scos_actions/actions/acquire_sea_data_product.py +++ b/scos_actions/actions/acquire_sea_data_product.py @@ -79,9 +79,6 @@ env = Env() logger = logging.getLogger(__name__) -if not ray.is_initialized(): - # Dashboard is only enabled if ray[default] is installed - ray.init() # Define parameter keys RF_PATH = "rf_path" @@ -507,6 +504,13 @@ def __call__(self, sensor: Sensor, schedule_entry: dict, task_id: int): """This is the entrypoint function called by the scheduler.""" self._sensor = sensor action_start_tic = perf_counter() + # Ray should have already been initialized within scos-sensor, + # but check and initialize just in case. + if not ray.is_initialized(): + logger.info("Initializing ray.") + logger.info("Set RAY_INIT=true to avoid initializing within " + __name__) + # Dashboard is only enabled if ray[default] is installed + ray.init() _ = psutil.cpu_percent(interval=None) # Initialize CPU usage monitor self.test_required_components() diff --git a/scos_actions/actions/acquire_single_freq_fft.py b/scos_actions/actions/acquire_single_freq_fft.py index aa6f16ba..cf31ae8f 100644 --- a/scos_actions/actions/acquire_single_freq_fft.py +++ b/scos_actions/actions/acquire_single_freq_fft.py @@ -89,6 +89,7 @@ import logging from numpy import float32, ndarray + from scos_actions.actions.interfaces.measurement_action import MeasurementAction from scos_actions.hardware.mocks.mock_gps import MockGPS from scos_actions.metadata.structs import ntia_algorithm diff --git a/scos_actions/actions/acquire_single_freq_tdomain_iq.py b/scos_actions/actions/acquire_single_freq_tdomain_iq.py index 0eb55655..fb505090 100644 --- a/scos_actions/actions/acquire_single_freq_tdomain_iq.py +++ b/scos_actions/actions/acquire_single_freq_tdomain_iq.py @@ -34,12 +34,12 @@ import logging from numpy import complex64 + +from scos_actions import utils from scos_actions.actions.interfaces.measurement_action import MeasurementAction from scos_actions.hardware.mocks.mock_gps import MockGPS from scos_actions.utils import get_parameter -from scos_actions import utils - logger = logging.getLogger(__name__) # Define parameter keys diff --git a/scos_actions/actions/acquire_stepped_freq_tdomain_iq.py b/scos_actions/actions/acquire_stepped_freq_tdomain_iq.py index 495be7e2..39575f8b 100644 --- a/scos_actions/actions/acquire_stepped_freq_tdomain_iq.py +++ b/scos_actions/actions/acquire_stepped_freq_tdomain_iq.py @@ -38,6 +38,8 @@ import logging import numpy as np + +from scos_actions import utils from scos_actions.actions.acquire_single_freq_tdomain_iq import ( CAL_ADJUST, DURATION_MS, @@ -51,8 +53,6 @@ from scos_actions.signals import measurement_action_completed from scos_actions.utils import get_parameter -from scos_actions import utils - logger = logging.getLogger(__name__) diff --git a/scos_actions/actions/calibrate_y_factor.py b/scos_actions/actions/calibrate_y_factor.py index d26bb743..15cf9fd9 100644 --- a/scos_actions/actions/calibrate_y_factor.py +++ b/scos_actions/actions/calibrate_y_factor.py @@ -75,6 +75,8 @@ import numpy as np from scipy.constants import Boltzmann from scipy.signal import sosfilt + +from scos_actions import utils from scos_actions.actions.interfaces.action import Action from scos_actions.hardware.sensor import Sensor from scos_actions.hardware.sigan_iface import SIGAN_SETTINGS_KEYS @@ -92,8 +94,6 @@ from scos_actions.signals import trigger_api_restart from scos_actions.utils import ParameterException, get_parameter -from scos_actions import utils - logger = logging.getLogger(__name__) # Define parameter keys diff --git a/scos_actions/actions/interfaces/measurement_action.py b/scos_actions/actions/interfaces/measurement_action.py index f0b06e54..88a0a239 100644 --- a/scos_actions/actions/interfaces/measurement_action.py +++ b/scos_actions/actions/interfaces/measurement_action.py @@ -3,6 +3,7 @@ from typing import Optional import numpy as np + from scos_actions.actions.interfaces.action import Action from scos_actions.hardware.sensor import Sensor from scos_actions.metadata.structs import ntia_sensor diff --git a/scos_actions/actions/runtime_error_action.py b/scos_actions/actions/runtime_error_action.py new file mode 100644 index 00000000..13058bc9 --- /dev/null +++ b/scos_actions/actions/runtime_error_action.py @@ -0,0 +1,28 @@ +"""A simple example action that raises a RuntimeError.""" + +import logging +from typing import Optional + +from scos_actions.actions.interfaces.action import Action +from scos_actions.hardware.sensor import Sensor + +logger = logging.getLogger(__name__) + + +class RuntimeErrorAction(Action): + """ + Raise a runtime error. + This is useful for testing and debugging. Note: this action + is currently not loaded in any scenario and must be manually + added to use. + + """ + + def __init__(self): + super().__init__(parameters={"name": "RuntimeErrorAction"}) + + def __call__(self, sensor: Optional[Sensor], schedule_entry: dict, task_id: int): + msg = "Raising RuntimeError {name}/{tid}" + schedule_entry_name = schedule_entry["name"] + logger.log(msg=msg.format(name=schedule_entry_name, tid=task_id)) + raise RuntimeError("RuntimeError from RuntimeErrorAction") diff --git a/scos_actions/actions/system_exit_action.py b/scos_actions/actions/system_exit_action.py new file mode 100644 index 00000000..f275be8a --- /dev/null +++ b/scos_actions/actions/system_exit_action.py @@ -0,0 +1,28 @@ +"""A simple action that raises SystemExit""" + +import logging +from typing import Optional + +from scos_actions.actions.interfaces.action import Action +from scos_actions.hardware.sensor import Sensor + +logger = logging.getLogger(__name__) + + +class SystemExitAction(Action): + """ + Raise a SystemExit. + This is useful for testing and debugging. Note: this action + is currently not loaded in any scenario and must be manually + added to use. + + """ + + def __init__(self): + super().__init__(parameters={"name": "SystemExitAction"}) + + def __call__(self, sensor: Optional[Sensor], schedule_entry: dict, task_id: int): + msg = "Raising SystemExit {name}/{tid}" + schedule_entry_name = schedule_entry["name"] + logger.log(msg=msg.format(name=schedule_entry_name, tid=task_id)) + raise SystemExit("SystemExit produced by SystemExitAction. ") diff --git a/scos_actions/discover/__init__.py b/scos_actions/discover/__init__.py index 84ba8e6e..0fa0128f 100644 --- a/scos_actions/discover/__init__.py +++ b/scos_actions/discover/__init__.py @@ -5,7 +5,9 @@ from scos_actions.discover.yaml import load_from_yaml from scos_actions.settings import ACTION_DEFINITIONS_DIR -actions = {"logger": Logger()} +actions = { + "logger": Logger(), +} test_actions = { "test_sync_gps": SyncGps(parameters={"name": "test_sync_gps"}), "test_monitor_sigan": MonitorSignalAnalyzer( diff --git a/scos_actions/hardware/sigan_iface.py b/scos_actions/hardware/sigan_iface.py index 7ed01d45..3b211113 100644 --- a/scos_actions/hardware/sigan_iface.py +++ b/scos_actions/hardware/sigan_iface.py @@ -4,6 +4,7 @@ from typing import Dict, Optional from its_preselector.web_relay import WebRelay + from scos_actions.calibration.calibration import Calibration from scos_actions.hardware.utils import power_cycle_sigan from scos_actions.utils import convert_string_to_millisecond_iso_format diff --git a/scos_actions/signal_processing/calibration.py b/scos_actions/signal_processing/calibration.py index 41ef5d71..785685d3 100644 --- a/scos_actions/signal_processing/calibration.py +++ b/scos_actions/signal_processing/calibration.py @@ -4,6 +4,7 @@ import numpy as np from its_preselector.preselector import Preselector from scipy.constants import Boltzmann + from scos_actions.signal_processing.unit_conversion import ( convert_celsius_to_fahrenheit, convert_celsius_to_kelvins,