From e219f8a99569598024d67f86cdd345ffaa0c9fe2 Mon Sep 17 00:00:00 2001 From: Matt Shirley Date: Tue, 4 Nov 2025 17:49:37 -0600 Subject: [PATCH 1/5] add docker_image selection parameter --- servicex/topcp/topcp.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/servicex/topcp/topcp.py b/servicex/topcp/topcp.py index 98a80d97..0a726f22 100644 --- a/servicex/topcp/topcp.py +++ b/servicex/topcp/topcp.py @@ -52,6 +52,8 @@ class TopCPQuery(QueryStringGenerator): """Toggles off the computation of systematics""" no_filter: Optional[bool] = False """Save all events regardless of analysis filters (still saves the decision)""" + docker_image: Optional[str] = None + """Docker image to use""" @pydantic.model_validator(mode="after") def no_input_yaml(self): @@ -84,6 +86,7 @@ def generate_selection_string(self): "max_events": self.max_events, "no_systematics": self.no_systematics, "no_filter": self.no_filter, + "docker_image": self.docker_image, } return json.dumps(query) From cc40423531d6335cc99b7daef69af80fca4fdfa8 Mon Sep 17 00:00:00 2001 From: Matt Shirley Date: Tue, 11 Nov 2025 16:01:33 -0600 Subject: [PATCH 2/5] only put docker_image if present to preserve backwards compatibility with older versions --- servicex/topcp/topcp.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/servicex/topcp/topcp.py b/servicex/topcp/topcp.py index 0a726f22..3c1e6fea 100644 --- a/servicex/topcp/topcp.py +++ b/servicex/topcp/topcp.py @@ -86,8 +86,11 @@ def generate_selection_string(self): "max_events": self.max_events, "no_systematics": self.no_systematics, "no_filter": self.no_filter, - "docker_image": self.docker_image, } + + if self.docker_image is not None: + query["docker_image"] = self.docker_image + return json.dumps(query) @classmethod From d42e2d65b6396ae6cfb754eef6e71748ff0b61d0 Mon Sep 17 00:00:00 2001 From: Matt Shirley Date: Mon, 1 Dec 2025 13:21:04 -0600 Subject: [PATCH 3/5] add test with custom docker image --- tests/test_topcp_dataset.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/test_topcp_dataset.py b/tests/test_topcp_dataset.py index 46c3577a..a2e548bc 100644 --- a/tests/test_topcp_dataset.py +++ b/tests/test_topcp_dataset.py @@ -113,3 +113,21 @@ def test_yaml_serialization(): def test_no_yaml(): with pytest.raises(ValueError): TopCPQuery() + + +def test_docker_image(tmp_path): + reco_file = tmp_path / "reco.yaml" + reco_file.write_text( + """ +CommonServices: + runSystematics: False + """ + ) + + docker_image = "my-custom-image:latest" + topcp_query = TopCPQuery(reco=reco_file, docker_image=docker_image) + query_string = topcp_query.generate_selection_string() + query = json.loads(query_string) + + assert "docker_image" in query, "Missing docker_image key" + assert query["docker_image"] == docker_image From 0a0796a9e021c3631ead768ace2d6c1c170dceb7 Mon Sep 17 00:00:00 2001 From: Matt Shirley Date: Wed, 3 Dec 2025 16:19:52 -0600 Subject: [PATCH 4/5] change to --- servicex/topcp/topcp.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/servicex/topcp/topcp.py b/servicex/topcp/topcp.py index 3c1e6fea..26d965ed 100644 --- a/servicex/topcp/topcp.py +++ b/servicex/topcp/topcp.py @@ -52,7 +52,7 @@ class TopCPQuery(QueryStringGenerator): """Toggles off the computation of systematics""" no_filter: Optional[bool] = False """Save all events regardless of analysis filters (still saves the decision)""" - docker_image: Optional[str] = None + image: Optional[str] = None """Docker image to use""" @pydantic.model_validator(mode="after") @@ -88,8 +88,8 @@ def generate_selection_string(self): "no_filter": self.no_filter, } - if self.docker_image is not None: - query["docker_image"] = self.docker_image + if self.image is not None: + query["docker_image"] = self.image return json.dumps(query) From 1fe7cae407a0afc7c68304499201a35bb0c8248e Mon Sep 17 00:00:00 2001 From: Matt Shirley Date: Thu, 4 Dec 2025 12:52:59 -0600 Subject: [PATCH 5/5] update key --- tests/test_topcp_dataset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_topcp_dataset.py b/tests/test_topcp_dataset.py index a2e548bc..291281ec 100644 --- a/tests/test_topcp_dataset.py +++ b/tests/test_topcp_dataset.py @@ -125,7 +125,7 @@ def test_docker_image(tmp_path): ) docker_image = "my-custom-image:latest" - topcp_query = TopCPQuery(reco=reco_file, docker_image=docker_image) + topcp_query = TopCPQuery(reco=reco_file, image=docker_image) query_string = topcp_query.generate_selection_string() query = json.loads(query_string)