diff --git a/laborious/activities/gates.py b/laborious/activities/gates.py index 4b183a0..d744578 100644 --- a/laborious/activities/gates.py +++ b/laborious/activities/gates.py @@ -229,7 +229,7 @@ class Gates(BaseActivity): return None, 0, "" @activity.defn(name="format_prediction") - async def format_prediction(self, input_data: dict[str, Any]) -> dict[str, Any]: + async def format_prediction(self, input_data: dict[str, Any]) -> dict[Any, Any]: """ Formats the prediction data. Args: @@ -254,7 +254,7 @@ class Gates(BaseActivity): return data.to_dict() @activity.defn(name="format_default_prediction") - async def format_default_prediction(self, input_data: dict[str, Any]) -> dict[str, Any]: + async def format_default_prediction(self, input_data: dict[str, Any]) -> dict[Any, Any]: """ Creates and formats the default prediction data, with zero value in prediction, and usefull information in the other fields. diff --git a/laborious/activities/opc.py b/laborious/activities/opc.py index 11cd77c..ee3b905 100644 --- a/laborious/activities/opc.py +++ b/laborious/activities/opc.py @@ -63,7 +63,7 @@ class OPC(BaseActivity): level=NotificationLevel.ERROR, attachment_content=trace ) - self.logger.error(trace) + raise e @activity.defn(name='write_opc_data') async def write_opc_data(self, input_data: dict[str, Any]): diff --git a/laborious/utils/repository/opc_repository.py b/laborious/utils/repository/opc_repository.py index cafcc41..4f46b71 100644 --- a/laborious/utils/repository/opc_repository.py +++ b/laborious/utils/repository/opc_repository.py @@ -218,6 +218,15 @@ class OpcRepository(): self.error_count += 1 return + if data_type not in data_type_map: + self.notification_handler.build_and_send_notification( + notification_id=f"OPC_WRITE_DATA_TYPE_ERROR_{self.name}", + message=f"Unsupported data type: {data_type}", + block="opc_repository", + level=NotificationLevel.ERROR + ) + return + data = data_type_map[data_type]['converter'](value) self.logger.info(f'Writing {data} - {type(data)} to {node}') ua_data = DataValue( diff --git a/tests/laborious/activities/test_opc.py b/tests/laborious/activities/test_opc.py index d012778..3c50733 100644 --- a/tests/laborious/activities/test_opc.py +++ b/tests/laborious/activities/test_opc.py @@ -112,16 +112,22 @@ def test_write_data_success(opc, tag, data_type, data): def test_write_data_exception(opc): opc.opc_repository['server1'].write_data.side_effect = Exception( "Test error") - opc.write_data(server='server1', tag='tag1', data=50, - data_type='int', tag_type='prediction') - opc.notification_handler.build_and_send_notification.assert_called_once_with( - notification_id="WRITE_OPC_PREDICTION_ERROR", - message="Error writing data to OPC server: Test error", - block="write_opc_data", - level=NotificationLevel.ERROR, - attachment_content=ANY - ) - opc.logger.error.assert_called_once() + + try: + opc.write_data(server='server1', tag='tag1', data=50, + data_type='int', tag_type='prediction') + + except Exception: + opc.notification_handler.build_and_send_notification.assert_called_once_with( + notification_id="WRITE_OPC_PREDICTION_ERROR", + message="Error writing data to OPC server: Test error", + block="write_opc_data", + level=NotificationLevel.ERROR, + attachment_content=ANY + ) + + else: + assert False, "Expected an exception to be raised" @mark.asyncio diff --git a/tests/laborious/utils/repository/test_opc_repository.py b/tests/laborious/utils/repository/test_opc_repository.py index ae9dd89..7369496 100644 --- a/tests/laborious/utils/repository/test_opc_repository.py +++ b/tests/laborious/utils/repository/test_opc_repository.py @@ -224,6 +224,24 @@ def test_write_data_get_node_failed(opc_repository): assert opc_repository.error_count == 1 +def test_write_data_invalid_data_type(opc_repository, mock_client): + opc_repository.validate_connection = MagicMock(return_value=True) + opc_repository.client = mock_client + mock_node = MagicMock() + mock_client.get_node.return_value = mock_node + + opc_repository.write_data("ns=2;s=TestNode", 42.0, "invalid_type") + opc_repository.validate_connection.assert_called_once() + mock_client.get_node.assert_called_once_with("ns=2;s=TestNode") + + opc_repository.notification_handler.build_and_send_notification.assert_called_once_with( + notification_id=f"OPC_WRITE_DATA_TYPE_ERROR_{opc_repository.name}", + message="Unsupported data type: invalid_type", + block="opc_repository", + level=NotificationLevel.ERROR + ) + + def test_write_data(opc_repository, mock_client): opc_repository.validate_connection = MagicMock(return_value=True) opc_repository.client = mock_client diff --git a/values.yaml b/values.yaml index bd46925..ba03752 100644 --- a/values.yaml +++ b/values.yaml @@ -152,7 +152,7 @@ env: - name: MLFLOW_PASSWORD value: "aignosi" - - name: OPC_NAME + - name: OPC_ID value: "server-1" - name: OPC_URL value: "opc.tcp://sientia-opc-simulator.sientia.svc.cluster.local:4840" @@ -183,4 +183,4 @@ ssh: # kubectl create secret generic git-ssh-key-sientia-laborious-worker \ # --namespace sientia \ # --from-file=ssh-privatekey=git_key \ -# --type=kubernetes.io/ssh-auth \ No newline at end of file +# --type=kubernetes.io/ssh-auth