Skip to content

Commit d5de357

Browse files
committed
Add command too to get the path to the scheduler conf script from the EFD and github
1 parent 975d13d commit d5de357

File tree

9 files changed

+96
-0
lines changed

9 files changed

+96
-0
lines changed

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ dev = [
6262
prenight = "schedview.app.prenight.prenight:main"
6363
scheduler_dashboard = "schedview.app.scheduler_dashboard.scheduler_dashboard_app:main"
6464
obs_version_at_time = "schedview.app.obs_version_at_time:version_at_time_cli"
65+
scheduler_config_at_time = "schedview.app.scheduler_config_at_time:scheduler_config_at_time_cli"
6566

6667
[tool.setuptools.dynamic]
6768
version = { attr = "setuptools_scm.get_version" }
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import argparse
2+
import asyncio
3+
4+
from astropy.time import Time
5+
6+
import schedview.collect
7+
8+
GITHUB_API_URL_BASE = "https://api.github.com/repos"
9+
10+
11+
def scheduler_config_at_time_cli():
12+
13+
# Get "now" so we can make it the default.
14+
now = Time.now()
15+
now_isot = now.isot
16+
assert isinstance(now.isot, str)
17+
18+
# Prepare argument parsing
19+
parser = argparse.ArgumentParser(
20+
prog="scheduler_config_at_time",
21+
description="Get the scheduler configuration script path the observatory as of a given time.",
22+
)
23+
parser.add_argument("instrument", type=str, help="The instrument being scheduled.")
24+
parser.add_argument(
25+
"--datetime",
26+
type=str,
27+
default=f"{now_isot[:19]}Z",
28+
help="UTC time in ISO 8601 T format: YYYY-MM-DDTHH:mm:SSZ",
29+
)
30+
31+
# Actually parse the arguments.
32+
args = parser.parse_args()
33+
34+
# Do the call
35+
time_cut = Time(args.datetime)
36+
ts_config_ocs_version = schedview.collect.get_version_at_time("ts_config_ocs", time_cut)
37+
38+
sal_indexes = schedview.collect.SAL_INDEX_GUESSES[args.instrument]
39+
loop = asyncio.get_event_loop()
40+
scheduler_config = loop.run_until_complete(
41+
schedview.collect.get_scheduler_config(ts_config_ocs_version, sal_indexes, time_cut)
42+
)
43+
44+
print(scheduler_config)
45+
46+
47+
if __name__ == "__main__":
48+
scheduler_config_at_time_cli()

schedview/collect/base/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from ..efd import (
44
SAL_INDEX_GUESSES,
5+
get_scheduler_config,
56
get_version_at_time,
67
make_efd_client,
78
make_version_table_for_time,

schedview/collect/efd.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from typing import Literal
77

88
import pandas as pd
9+
import requests
10+
import yaml
911
from astropy.time import Time, TimeDelta
1012
from lsst_efd_client import EfdClient
1113

@@ -298,3 +300,42 @@ def get_version_at_time(item: str, time_cut: Time | None = None, max_age: TimeDe
298300
)
299301

300302
return version
303+
304+
305+
async def get_scheduler_config(
306+
ts_config_ocs_version: str, sal_indexes: tuple[int, ...] | None = None, time_cut: Time | None = None
307+
) -> str:
308+
309+
latest_config_df = await query_latest_in_efd_topic(
310+
topic="lsst.sal.Scheduler.logevent_configurationApplied",
311+
fields=["SchedulerId", "configurations", "salIndex", "schemaVersion", "url", "version"],
312+
sal_indexes=sal_indexes,
313+
time_cut=time_cut,
314+
num_records=1,
315+
)
316+
config_fname = latest_config_df["configurations"].iloc[0].split(",")[-1]
317+
schema_version = latest_config_df["schemaVersion"].iloc[0]
318+
319+
scheduler_config_ocs_url = "/".join(
320+
[
321+
"https://raw.githubusercontent.com",
322+
"lsst-ts",
323+
"ts_config_ocs",
324+
ts_config_ocs_version,
325+
"Scheduler",
326+
schema_version,
327+
config_fname,
328+
]
329+
)
330+
331+
response = requests.get(scheduler_config_ocs_url, allow_redirects=True)
332+
scheduler_config_ocs = yaml.safe_load(response.content.decode("utf-8"))
333+
334+
scheduler_config = scheduler_config_ocs["auxtel"]["feature_scheduler_driver_configuration"][
335+
"scheduler_config"
336+
]
337+
338+
relative_scheduler_config = scheduler_config[
339+
scheduler_config.find("/ts_config_ocs/Scheduler/feature_scheduler") + 1 :
340+
]
341+
return relative_scheduler_config

schedview/collect/local/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from ..efd import (
77
SAL_INDEX_GUESSES,
8+
get_scheduler_config,
89
get_version_at_time,
910
make_efd_client,
1011
make_version_table_for_time,

schedview/collect/summit/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from ..efd import (
44
SAL_INDEX_GUESSES,
5+
get_scheduler_config,
56
get_version_at_time,
67
make_efd_client,
78
make_version_table_for_time,

schedview/collect/tucson/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from ..efd import (
44
SAL_INDEX_GUESSES,
5+
get_scheduler_config,
56
get_version_at_time,
67
make_efd_client,
78
make_version_table_for_time,

schedview/collect/usdf/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from ..efd import (
44
SAL_INDEX_GUESSES,
5+
get_scheduler_config,
56
get_version_at_time,
67
make_efd_client,
78
make_version_table_for_time,

schedview/collect/usdfdev/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from ..efd import (
44
SAL_INDEX_GUESSES,
5+
get_scheduler_config,
56
get_version_at_time,
67
make_efd_client,
78
make_version_table_for_time,

0 commit comments

Comments
 (0)