diff --git a/servicex_app/servicex_app/resources/transformation/submit.py b/servicex_app/servicex_app/resources/transformation/submit.py index 2aaccb172..5399dd4e8 100644 --- a/servicex_app/servicex_app/resources/transformation/submit.py +++ b/servicex_app/servicex_app/resources/transformation/submit.py @@ -97,6 +97,13 @@ def make_api( location="json", help="Static list of Root Files. Provide this or Dataset Identifier.", ) + cls.parser.add_argument( + "client-version", + type=str, + default="unknown", + location="json", + help="The client-version submitting the transformation.", + ) cls.parser.add_argument("selection", help="Query string") cls.parser.add_argument("codegen") cls.parser.add_argument("tree-name") @@ -186,6 +193,7 @@ def post(self): did = args.get("did") file_list = args.get("file-list") user_codegen_name = args.get("codegen") + client_version = args.get("client-version") code_gen_image_name = config["CODE_GEN_IMAGES"].get(user_codegen_name, None) namespace = config["TRANSFORMER_NAMESPACE"] @@ -316,6 +324,10 @@ def post(self): current_app.logger.info( "Transformation request submitted!", extra={"request_id": request_id} ) + current_app.logger.info( + f"Transformation submitted with client version: {client_version}", + extra={"request_id": request_id}, + ) return {"request_id": str(request_id)} except Exception as eek: current_app.logger.exception( diff --git a/servicex_app/servicex_app_test/resources/transformation/test_submit.py b/servicex_app/servicex_app_test/resources/transformation/test_submit.py index 28b0f999b..f20ad43d3 100644 --- a/servicex_app/servicex_app_test/resources/transformation/test_submit.py +++ b/servicex_app/servicex_app_test/resources/transformation/test_submit.py @@ -635,6 +635,42 @@ def _side_effect(selection_string, request_id, namespace, user_codegen_name): assert saved_obj assert saved_obj.image == image + def test_submit_transformation_logs_client_version( + self, mocker, mock_dataset_manager_from_did, mock_codegen + ): + client = self._test_client(code_gen_service=mock_codegen) + mock_info = mocker.patch.object(client.application.logger, "info") + with client.application.app_context(): + request = self._generate_transformation_request( + **{"client-version": "3.0.1"} + ) + response = client.post( + "/servicex/transformation", json=request, headers=self.fake_header() + ) + assert response.status_code == 200 + request_id = response.json["request_id"] + mock_info.assert_any_call( + "Transformation submitted with client version: 3.0.1", + extra={"request_id": request_id}, + ) + + def test_submit_transformation_logs_unknown_client_version( + self, mocker, mock_dataset_manager_from_did, mock_codegen + ): + client = self._test_client(code_gen_service=mock_codegen) + mock_info = mocker.patch.object(client.application.logger, "info") + with client.application.app_context(): + request = self._generate_transformation_request() + response = client.post( + "/servicex/transformation", json=request, headers=self.fake_header() + ) + assert response.status_code == 200 + request_id = response.json["request_id"] + mock_info.assert_any_call( + "Transformation submitted with client version: unknown", + extra={"request_id": request_id}, + ) + class TestValidateCustomDockerImage: """Tests for the validate_custom_docker_image function"""