diff --git a/Dockerfile b/Dockerfile index 9ba5d0e..9f34b21 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,10 +2,20 @@ FROM python:3.11-slim-bookworm WORKDIR /app/simulator_worker -# Install OpenJDK-17 -RUN apt-get -y update && \ - apt-get install -y openjdk-17-jdk && \ - apt-get clean; + +# Install required tools and OpenJDK 21 manually +RUN apt-get update && \ + apt-get install -y wget tar ca-certificates && \ + apt-get clean && \ + wget https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz && \ + tar -xzf openjdk-21.0.2_linux-x64_bin.tar.gz && \ + mv jdk-21.0.2 /usr/local/openjdk-21 && \ + rm openjdk-21.0.2_linux-x64_bin.tar.gz + +# Set environment variables for Java +ENV JAVA_HOME=/usr/local/openjdk-21 +ENV PATH="$JAVA_HOME/bin:$PATH" + COPY . /app/simulator_worker/ WORKDIR /app/simulator_worker diff --git a/dev-requirements.txt b/dev-requirements.txt index e95cea9..36672d2 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -16,9 +16,9 @@ amqp==5.3.1 # via # -c ..\..\requirements.txt # kombu -attrs==25.3.0 +attrs==25.4.0 # via flake8-bugbear -billiard==4.2.1 +billiard==4.2.2 # via # -c ..\..\requirements.txt # celery @@ -26,19 +26,19 @@ black==24.10.0 # via simulator-worker (..\..\pyproject.toml) build==1.2.2.post1 # via simulator-worker (..\..\pyproject.toml) -celery==5.5.1 +celery==5.5.3 # via # -c ..\..\requirements.txt # omotes-sdk-python -certifi==2025.1.31 +certifi==2025.10.5 # via # -c ..\..\requirements.txt # requests -charset-normalizer==3.4.1 +charset-normalizer==3.4.3 # via # -c ..\..\requirements.txt # requests -click==8.1.8 +click==8.3.0 # via # -c ..\..\requirements.txt # black @@ -50,7 +50,7 @@ click-didyoumean==0.3.1 # via # -c ..\..\requirements.txt # celery -click-plugins==1.1.1 +click-plugins==1.1.1.2 # via # -c ..\..\requirements.txt # celery @@ -68,7 +68,7 @@ coolprop==6.6.0 # via # -c ..\..\requirements.txt # omotes-simulator-core -coverage[toml]==7.8.0 +coverage[toml]==7.10.7 # via pytest-cov dataclass-wizard==0.22.3 # via @@ -111,30 +111,34 @@ iniconfig==2.1.0 # via pytest isort==5.13.2 # via simulator-worker (..\..\pyproject.toml) -kombu==5.5.2 +kombu==5.5.4 # via # -c ..\..\requirements.txt # celery -lxml==5.3.2 +lxml==6.0.2 # via # -c ..\..\requirements.txt # pyecore mccabe==0.7.0 # via flake8 -msgpack==1.1.0 +msgpack==1.1.2 # via # -c ..\..\requirements.txt # influxdb -multidict==6.4.3 +multidict==6.7.0 # via # -c ..\..\requirements.txt # yarl mypy==1.13.0 # via simulator-worker (..\..\pyproject.toml) -mypy-extensions==1.0.0 +mypy-extensions==1.1.0 # via # black # mypy +networkx==2.7.1 + # via + # -c ..\..\requirements.txt + # omotes-simulator-core numpy==2.1.3 # via # -c ..\..\requirements.txt @@ -142,15 +146,15 @@ numpy==2.1.3 # pandas # pandas-stubs # scipy -omotes-sdk-protocol==1.1.0 +omotes-sdk-protocol==1.2.0 # via # -c ..\..\requirements.txt # omotes-sdk-python -omotes-sdk-python==4.1.0 +omotes-sdk-python==4.3.2 # via # -c ..\..\requirements.txt # simulator-worker (..\..\pyproject.toml) -omotes-simulator-core==0.0.20 +omotes-simulator-core==0.0.28 # via # -c ..\..\requirements.txt # simulator-worker (..\..\pyproject.toml) @@ -158,10 +162,12 @@ ordered-set==4.1.0 # via # -c ..\..\requirements.txt # pyecore -packaging==24.2 +packaging==25.0 # via + # -c ..\..\requirements.txt # black # build + # kombu # pytest # setuptools-git-versioning pamqp==3.3.0 @@ -178,19 +184,19 @@ pandas-stubs==2.1.4.231227 # via simulator-worker (..\..\pyproject.toml) pathspec==0.12.1 # via black -platformdirs==4.3.7 +platformdirs==4.5.0 # via black -pluggy==1.5.0 +pluggy==1.6.0 # via pytest -prompt-toolkit==3.0.50 +prompt-toolkit==3.0.52 # via # -c ..\..\requirements.txt # click-repl -propcache==0.3.1 +propcache==0.4.1 # via # -c ..\..\requirements.txt # yarl -protobuf==5.29.4 +protobuf==5.29.5 # via # -c ..\..\requirements.txt # omotes-sdk-protocol @@ -198,11 +204,11 @@ pycodestyle==2.12.1 # via flake8 pydocstyle==6.3.0 # via flake8-docstrings -pyecore==0.12.1 +pyecore==0.13.2 # via # -c ..\..\requirements.txt # pyesdl -pyesdl==24.2 +pyesdl==25.7 # via # -c ..\..\requirements.txt # omotes-sdk-python @@ -237,11 +243,11 @@ pytz==2025.2 # -c ..\..\requirements.txt # influxdb # pandas -requests==2.32.3 +requests==2.32.5 # via # -c ..\..\requirements.txt # influxdb -restrictedpython==8.1a1.dev0 +restrictedpython==8.0 # via # -c ..\..\requirements.txt # pyecore @@ -257,15 +263,15 @@ six==1.17.0 # flake8-tuple # influxdb # python-dateutil -snowballstemmer==2.2.0 +snowballstemmer==3.0.1 # via pydocstyle streamcapture==1.2.5 # via # -c ..\..\requirements.txt # omotes-sdk-python -types-pytz==2025.2.0.20250326 +types-pytz==2025.2.0.20250809 # via pandas-stubs -typing-extensions==4.13.2 +typing-extensions==4.15.0 # via # -c ..\..\requirements.txt # mypy @@ -275,7 +281,7 @@ tzdata==2025.2 # -c ..\..\requirements.txt # kombu # pandas -urllib3==2.4.0 +urllib3==2.5.0 # via # -c ..\..\requirements.txt # requests @@ -285,13 +291,13 @@ vine==5.1.0 # amqp # celery # kombu -wcwidth==0.2.13 +wcwidth==0.2.14 # via # -c ..\..\requirements.txt # prompt-toolkit wheel==0.45.1 # via simulator-worker (..\..\pyproject.toml) -yarl==1.19.0 +yarl==1.22.0 # via # -c ..\..\requirements.txt # aio-pika diff --git a/pyproject.toml b/pyproject.toml index 179a089..20e3cd4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ dynamic = ["version"] authors = [{ name = "Michiel Tukker", email = "michiel.tukker@deltares.nl" }] description = "Nieuwe Warmte Nu / OMOTES: simulator-worker." readme = "README.md" -license = {file = "LICENSE"} +license = { file = "LICENSE" } classifiers = [ "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Programming Language :: Python :: 3", @@ -21,9 +21,9 @@ classifiers = [ dependencies = [ "python-dotenv ~= 1.0.0", - "omotes-sdk-python ~= 4.3.1", - "omotes-simulator-core==0.0.21", - "pyesdl==25.5.1", + "omotes-sdk-python ~= 4.3.2", + "omotes-simulator-core==0.0.28", + "pyesdl==25.7", "pandas ~= 2.2.2" ] diff --git a/requirements.txt b/requirements.txt index 7e6460b..2f0d178 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,15 +10,15 @@ aiormq==6.8.1 # via aio-pika amqp==5.3.1 # via kombu -billiard==4.2.1 +billiard==4.2.2 # via celery -celery==5.5.1 +celery==5.5.3 # via omotes-sdk-python -certifi==2025.1.31 +certifi==2025.10.5 # via requests -charset-normalizer==3.4.1 +charset-normalizer==3.4.3 # via requests -click==8.1.8 +click==8.3.0 # via # celery # click-didyoumean @@ -26,7 +26,7 @@ click==8.1.8 # click-repl click-didyoumean==0.3.1 # via celery -click-plugins==1.1.1 +click-plugins==1.1.1.2 # via celery click-repl==0.3.0 # via celery @@ -44,27 +44,31 @@ idna==3.10 # yarl influxdb==5.3.2 # via omotes-simulator-core -kombu==5.5.2 +kombu==5.5.4 # via celery -lxml==5.3.2 +lxml==6.0.2 # via pyecore -msgpack==1.1.0 +msgpack==1.1.2 # via influxdb -multidict==6.4.3 +multidict==6.7.0 # via yarl +networkx==2.7.1 + # via omotes-simulator-core numpy==2.1.3 # via # omotes-simulator-core # pandas # scipy -omotes-sdk-protocol==1.1.0 +omotes-sdk-protocol==1.2.0 # via omotes-sdk-python -omotes-sdk-python==4.1.0 +omotes-sdk-python==4.3.2 # via simulator-worker (..\..\pyproject.toml) -omotes-simulator-core==0.0.20 +omotes-simulator-core==0.0.28 # via simulator-worker (..\..\pyproject.toml) ordered-set==4.1.0 # via pyecore +packaging==25.0 + # via kombu pamqp==3.3.0 # via # aiormq @@ -73,15 +77,15 @@ pandas==2.2.3 # via # omotes-simulator-core # simulator-worker (..\..\pyproject.toml) -prompt-toolkit==3.0.50 +prompt-toolkit==3.0.52 # via click-repl -propcache==0.3.1 +propcache==0.4.1 # via yarl -protobuf==5.29.4 +protobuf==5.29.5 # via omotes-sdk-protocol -pyecore==0.12.1 +pyecore==0.13.2 # via pyesdl -pyesdl==24.2 +pyesdl==25.7 # via # omotes-sdk-python # omotes-simulator-core @@ -99,9 +103,9 @@ pytz==2025.2 # via # influxdb # pandas -requests==2.32.3 +requests==2.32.5 # via influxdb -restrictedpython==8.1a1.dev0 +restrictedpython==8.0 # via pyecore scipy==1.14.1 # via omotes-simulator-core @@ -111,22 +115,22 @@ six==1.17.0 # python-dateutil streamcapture==1.2.5 # via omotes-sdk-python -typing-extensions==4.13.2 +typing-extensions==4.15.0 # via omotes-sdk-python tzdata==2025.2 # via # kombu # pandas -urllib3==2.4.0 +urllib3==2.5.0 # via requests vine==5.1.0 # via # amqp # celery # kombu -wcwidth==0.2.13 +wcwidth==0.2.14 # via prompt-toolkit -yarl==1.19.0 +yarl==1.22.0 # via # aio-pika # aiormq diff --git a/src/simulator_worker/simulator_worker.py b/src/simulator_worker/simulator_worker.py index 0a5a350..502d314 100644 --- a/src/simulator_worker/simulator_worker.py +++ b/src/simulator_worker/simulator_worker.py @@ -44,7 +44,10 @@ def simulator_worker_task( - input_esdl: str, workflow_config: ProtobufDict, update_progress_handler: UpdateProgressHandler + input_esdl: str, + workflow_config: ProtobufDict, + update_progress_handler: UpdateProgressHandler, + workflow_type_name: str, ) -> tuple[str | None, list[EsdlMessage]]: """Simulator worker function for celery task. @@ -61,10 +64,11 @@ def simulator_worker_task( :param input_esdl: The input ESDL XML string. :param workflow_config: Extra parameters to configure this run. :param update_progress_handler: Handler to notify of any progress changes. + :param workflow_type_name: Name of the workflow. :return: Simulated ESDL with simulation result profiles added to input ESDL but no other changes. """ - logger.info("Starting Simulator-core...") + logger.info(f"Starting Simulator-core for task type '{workflow_type_name}'...") # TODO # pass update_progress_handler(fraction: float, msg: str) to simulator-core @@ -118,7 +122,7 @@ def simulator_worker_task( def start_app() -> None: """Design Toolkit Application application.""" try: - initialize_worker("simulator", simulator_worker_task) + initialize_worker(["simulator"], simulator_worker_task) except Exception as error: logger.error("Error occured: %s at: %s", error, traceback.format_exc(limit=-1)) logger.debug(traceback.format_exc()) diff --git a/src/simulator_worker/utils.py b/src/simulator_worker/utils.py index 19c08ec..0a865b9 100644 --- a/src/simulator_worker/utils.py +++ b/src/simulator_worker/utils.py @@ -14,6 +14,7 @@ # along with this program. If not, see . """utility functions for simulator-worker.""" import logging +import omotes_simulator_core import os import uuid from datetime import datetime @@ -241,6 +242,20 @@ def create_output_esdl(input_esdl: str, simulation_result: pd.DataFrame) -> str: series_for_asset_id_for_carrier = series_per_asset_id_for_carrier.setdefault(asset_id, []) series_for_asset_id_for_carrier.append((series_name, port)) + datasource = esdl.esdl.DataSource(name="Omotes simulator core run", + id=str(uuid.uuid4()), + description="This profile is a simulation results obtained " + "with the Omotes simulator core", + reference="https://simulator-core.readthedocs.io/en/latest/", + releaseDate=datetime.now(), + version=omotes_simulator_core.__version__, + license="GNU GENERAL PUBLIC LICENSE", + author="Deltares/TNO", + contactDetails="https://github.com/Project-OMOTES") + esh.energy_system.energySystemInformation.dataSources = esdl.DataSources(id=str(uuid.uuid4()), + dataSource=[ + datasource]) + capabilities = [esdl.Transport, esdl.Conversion, esdl.Consumer, esdl.Producer] for carrier_id in series_per_asset_id_per_carrier_id: for asset_id in series_per_asset_id_per_carrier_id[carrier_id]: @@ -256,7 +271,7 @@ def create_output_esdl(input_esdl: str, simulation_result: pd.DataFrame) -> str: for series_name, port in series_per_asset_id_per_carrier_id[carrier_id][asset_id]: # Add profile to esdl profile_name = series_name[1] - + reference = esdl.esdl.DataSourceReference(reference=datasource) profiles.profile_header.append(profile_name) profile_attributes = esdl.InfluxDBProfile( database=output_uuid, @@ -267,7 +282,9 @@ def create_output_esdl(input_esdl: str, simulation_result: pd.DataFrame) -> str: startDate=simulation_result.index[0], endDate=simulation_result.index[-1], id=str(uuid.uuid4()), - filters=f"\"assetId\"='{asset_id}'" + filters=f"\"assetId\"='{asset_id}'", + profileType=esdl.ProfileTypeEnum.OUTPUT, + dataSource=reference ) profile_attributes.profileQuantityAndUnit = get_profileQuantityAndUnit(profile_name)