diff --git a/servicex_analysis_utils/dataset_resolver.py b/servicex_analysis_utils/dataset_resolver.py index a817d16..e693091 100644 --- a/servicex_analysis_utils/dataset_resolver.py +++ b/servicex_analysis_utils/dataset_resolver.py @@ -72,6 +72,19 @@ def ds_type_resolver( elif ds_name.startswith("root://") and ds_name.endswith("*"): return dataset.XRootD(ds_name) + elif ds_name.startswith("/eos/"): + if "/eos/opendata/" in ds_name: + return dataset.FileList([f"root://eospublic.cern.ch/{ds_name}"]) + elif "/eos/atlas/" in ds_name: + return dataset.FileList([f"root://eosatlas.cern.ch/{ds_name}"]) + elif "/eos/cms/" in ds_name: + return dataset.FileList([f"root://eoscms.cern.ch/{ds_name}"]) + else: + raise ValueError( + f"Unable to determine the correct EOS instance for the provided path: {ds_name}." + "Please provide the full root:// URL. Cannot be a user path." + ) + elif re.match(r"^root://", ds_name): return dataset.FileList(ds_name) diff --git a/tests/test_dataset_resolver.py b/tests/test_dataset_resolver.py index 0460299..0164053 100644 --- a/tests/test_dataset_resolver.py +++ b/tests/test_dataset_resolver.py @@ -45,3 +45,18 @@ def test_find_dataset(input_ds, expected_type): dataset = ds_type_resolver(input_ds) assert isinstance(dataset, expected_type) + + +@pytest.mark.parametrize( + "eos_path, prefix", + [ + ("/eos/opendata/atlas/rucio/somefile.root", "root://eospublic.cern.ch/"), + ("/eos/opendata/cms/rucio/somefile.root", "root://eospublic.cern.ch/"), + ("/eos/atlas/atlascerngroupdisk/somefile.root", "root://eosatlas.cern.ch/"), + ("/eos/cms/store/somefile.root", "root://eoscms.cern.ch/"), + ], +) +def test_eos_url_parsing(eos_path, prefix): + ds_out = ds_type_resolver(eos_path) + assert isinstance(ds_out, dataset.FileList) + assert ds_out.files[0] == prefix + eos_path