Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/changes/2129.bugfix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Disable Astropy IERS auto-download in offline/test mode to prevent network timeouts and spurious warnings causing test failures.
24 changes: 24 additions & 0 deletions src/simtools/application_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
from dataclasses import dataclass
from pathlib import Path

from astropy.utils import iers

import simtools.utils.general as gen
from simtools import dependencies, version
from simtools.configuration import configurator
Expand All @@ -20,6 +22,26 @@
]


def _configure_iers_from_env():
"""
Configure Astropy IERS behavior based on environment variables.

This disables network access for IERS tables when running in offline mode.

Controlled via:
SIMTOOLS_OFFLINE_IERS=1
"""
if os.getenv("SIMTOOLS_OFFLINE_IERS") != "1":
return

if iers is None:
return # nothing to configure

iers.conf.auto_download = False
iers.conf.use_network = False
iers.conf.iers_degraded_accuracy = "warn"


def setup_logging(logger_name=None, log_level="INFO", log_file=None):
"""
Set up logging configuration.
Expand Down Expand Up @@ -282,6 +304,8 @@ def main():
app_context.logger.info("Starting application")
# ... rest of application logic
"""
_configure_iers_from_env()

args_dict, db_config = parse_function()
config.load(
args_dict,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ def __init__(
telescope names when matching lookup-table telescope selections.
"""
self._logger = logging.getLogger(__name__)

self.axes = axes["axes"] if "axes" in axes else axes
self.coordinate_system = coordinate_system
self.observing_location = (
Expand Down
12 changes: 11 additions & 1 deletion tests/integration_tests/test_applications_from_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import copy
import logging
import os
import subprocess
from pathlib import Path

Expand Down Expand Up @@ -69,7 +70,16 @@ def test_applications_from_config(tmp_test_directory, config, request):
pytest.skip(str(exc))

logger.info(f"Running application: {cmd}")
result = subprocess.run(cmd, shell=True, input="y\n", capture_output=True, text=True)
env = os.environ.copy()
env["SIMTOOLS_OFFLINE_IERS"] = "1"
result = subprocess.run(
cmd,
shell=True,
input="y\n",
capture_output=True,
text=True,
env=env,
)
msg = f"Command {cmd!r} failed. stdout:\n{result.stdout}\nstderr:\n{result.stderr}"
assert result.returncode == 0, msg

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -637,3 +637,31 @@ def test_missing_observing_time(grid_gen):

with pytest.raises(ValueError, match="Observing time is not set"):
grid_gen.convert_altaz_to_radec(45 * u.deg, 30 * u.deg)


def test_iers_not_modified_without_env(monkeypatch):
from simtools.application_control import _configure_iers_from_env

iers.conf.auto_download = True

monkeypatch.delenv("SIMTOOLS_OFFLINE_IERS", raising=False)

_configure_iers_from_env()

GridGeneration(axes={"axes": {}})

assert iers.conf.auto_download is True


def test_iers_disabled_with_env(monkeypatch):
from simtools.application_control import _configure_iers_from_env

iers.conf.auto_download = True

monkeypatch.setenv("SIMTOOLS_OFFLINE_IERS", "1")

_configure_iers_from_env()

GridGeneration(axes={"axes": {}})

assert iers.conf.auto_download is False
Original file line number Diff line number Diff line change
Expand Up @@ -407,3 +407,53 @@ def test_plot_inferred_radec_grid_logs_no_tracks(tmp_test_directory, caplog):
assert "No inferred RA/Dec grid tracks available for plotting" in caplog.text
finally:
plt.close(figure)


def test_iers_disabled_with_env_plotter(monkeypatch, tmp_test_directory):
from simtools.application_control import _configure_iers_from_env

iers.conf.auto_download = True
iers.conf.auto_max_age = 30

monkeypatch.setenv("SIMTOOLS_OFFLINE_IERS", "1")

_configure_iers_from_env()

grid_file = _write_grid_file(
tmp_test_directory,
"grid.ecsv",
[{"azimuth": 0.0, "zenith_angle": 0.0}],
)

_create_plotter(
grid_file=grid_file,
observation_time="2025-01-01 00:00:00",
output_path=Path(tmp_test_directory) / "output",
)

assert iers.conf.auto_download is False


def test_iers_not_modified_without_env_plotter(monkeypatch, tmp_test_directory):
from simtools.application_control import _configure_iers_from_env

iers.conf.auto_download = True
iers.conf.auto_max_age = 30

monkeypatch.delenv("SIMTOOLS_OFFLINE_IERS", raising=False)

_configure_iers_from_env()

grid_file = _write_grid_file(
tmp_test_directory,
"grid.ecsv",
[{"azimuth": 0.0, "zenith_angle": 0.0}],
)

_create_plotter(
grid_file=grid_file,
observation_time="2025-01-01 00:00:00",
output_path=Path(tmp_test_directory) / "output",
)

assert iers.conf.auto_download is True
Loading