Skip to content

Commit 6917dd9

Browse files
committed
Write migration and test for restart run key change
1 parent b9aa01a commit 6917dd9

3 files changed

Lines changed: 142 additions & 1 deletion

File tree

src/ert/storage/local_storage.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
logger = logging.getLogger(__name__)
3333

34-
_LOCAL_STORAGE_VERSION = 37
34+
_LOCAL_STORAGE_VERSION = 38
3535

3636

3737
def open_storage(
@@ -642,6 +642,7 @@ def _migrate(self, version: int) -> None:
642642
to35,
643643
to36,
644644
to37,
645+
to38,
645646
)
646647

647648
try: # ruff: ignore[too-many-statements-in-try-clause]
@@ -708,6 +709,7 @@ def _migrate(self, version: int) -> None:
708709
34: to35,
709710
35: to36,
710711
36: to37,
712+
37: to38,
711713
}
712714
for from_version in range(version, _LOCAL_STORAGE_VERSION):
713715
migrations[from_version].migrate(self.path)

src/ert/storage/migration/to38.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from __future__ import annotations
2+
3+
import json
4+
import logging
5+
from pathlib import Path
6+
7+
logger = logging.getLogger(__name__)
8+
9+
info = "Rename 'restart_run' Multiple Data Assimilation class key to 'select_prior'"
10+
11+
12+
def _rename_restart_run_mda_key_to_select_prior(path: Path) -> None:
13+
experiments_dir = path / "experiments"
14+
if not experiments_dir.exists():
15+
return
16+
17+
for exp_dir in experiments_dir.iterdir():
18+
if not exp_dir.is_dir():
19+
continue
20+
21+
index_file = exp_dir / "index.json"
22+
if not index_file.exists():
23+
continue
24+
25+
index_data = json.loads(index_file.read_text(encoding="utf-8"))
26+
experiment_data = index_data.get("experiment", {})
27+
28+
experiment_type = experiment_data.get("experiment_type", "")
29+
if experiment_type != "Multiple Data Assimilation":
30+
continue
31+
32+
experiment_data["select_prior"] = experiment_data.pop("restart_run")
33+
34+
index_file.write_text(json.dumps(index_data, indent=2), encoding="utf-8")
35+
36+
37+
def migrate(path: Path) -> None:
38+
_rename_restart_run_mda_key_to_select_prior(path)
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import json
2+
3+
import hypothesis.strategies as st
4+
import pytest
5+
from hypothesis import assume, given, settings
6+
7+
from ert.storage.migration.to38 import migrate
8+
9+
_OLD_KEY = "restart_run"
10+
_NEW_KEY = "select_prior"
11+
_MDA_EXP_TYPE = "Multiple Data Assimilation"
12+
13+
14+
def migrate_and_load_updated_experiment(tmp_path, original_experiment_data):
15+
root = tmp_path / "project"
16+
root.mkdir()
17+
18+
exp_path = root / "experiments" / "exp1"
19+
exp_path.mkdir(parents=True)
20+
21+
index_data = {
22+
"id": "exp-id",
23+
"name": "exp1",
24+
"ensembles": [],
25+
"experiment": {
26+
**original_experiment_data,
27+
},
28+
}
29+
(exp_path / "index.json").write_text(json.dumps(index_data), encoding="utf-8")
30+
31+
migrate(root)
32+
33+
updated = json.loads((exp_path / "index.json").read_text(encoding="utf-8"))
34+
return updated["experiment"]
35+
36+
37+
def test_that_restart_run_key_not_present_in_migrated_experiment(tmp_path):
38+
39+
original_experiment_data = {
40+
"experiment_type": _MDA_EXP_TYPE,
41+
_OLD_KEY: True,
42+
}
43+
44+
migrated_experiment = migrate_and_load_updated_experiment(
45+
tmp_path, original_experiment_data
46+
)
47+
48+
assert _OLD_KEY not in migrated_experiment
49+
50+
51+
def test_that_select_prior_key_is_present_in_migrated_experiment(tmp_path):
52+
53+
original_experiment_data = {
54+
"experiment_type": _MDA_EXP_TYPE,
55+
_OLD_KEY: True,
56+
}
57+
58+
migrated_experiment = migrate_and_load_updated_experiment(
59+
tmp_path, original_experiment_data
60+
)
61+
62+
assert _NEW_KEY in migrated_experiment
63+
64+
65+
@pytest.mark.parametrize("original_value", [True, False])
66+
def test_that_new_key_value_is_equal_to_old_key_value(tmp_path, original_value):
67+
68+
original_experiment_data = {
69+
"experiment_type": _MDA_EXP_TYPE,
70+
_OLD_KEY: original_value,
71+
}
72+
73+
migrated_experiment = migrate_and_load_updated_experiment(
74+
tmp_path, original_experiment_data
75+
)
76+
77+
assert migrated_experiment[_NEW_KEY] == original_value
78+
79+
80+
@given(non_mda_experiment_type=st.text())
81+
@settings(max_examples=10)
82+
def test_that_non_mda_experiment_type_is_not_migrated(
83+
tmp_path_factory, non_mda_experiment_type
84+
):
85+
86+
# to avoid hypothesis tmp_path fixture error
87+
tmp_path = tmp_path_factory.mktemp("arbitrary")
88+
89+
assume(non_mda_experiment_type != _MDA_EXP_TYPE)
90+
91+
original_experiment_data = {
92+
"experiment_type": non_mda_experiment_type,
93+
_OLD_KEY: True,
94+
}
95+
96+
migrated_experiment = migrate_and_load_updated_experiment(
97+
tmp_path, original_experiment_data
98+
)
99+
100+
assert _OLD_KEY in migrated_experiment
101+
assert _NEW_KEY not in migrated_experiment

0 commit comments

Comments
 (0)