diff --git a/sdks/python/apache_beam/runners/portability/sdk_container_builder.py b/sdks/python/apache_beam/runners/portability/sdk_container_builder.py index 9237e0c9f828..589963742c57 100644 --- a/sdks/python/apache_beam/runners/portability/sdk_container_builder.py +++ b/sdks/python/apache_beam/runners/portability/sdk_container_builder.py @@ -27,6 +27,7 @@ import json import logging import os +import posixpath import shutil import subprocess import sys @@ -81,7 +82,7 @@ def __init__(self, options): def _build(self): container_image_tag = str(uuid.uuid4()) - container_image_name = os.path.join( + container_image_name = posixpath.join( self._docker_registry_push_url or '', 'beam_python_prebuilt_sdk:%s' % container_image_tag) with tempfile.TemporaryDirectory() as temp_folder: diff --git a/sdks/python/apache_beam/runners/portability/sdk_container_builder_test.py b/sdks/python/apache_beam/runners/portability/sdk_container_builder_test.py index 955fe328f171..a8cee4f127a1 100644 --- a/sdks/python/apache_beam/runners/portability/sdk_container_builder_test.py +++ b/sdks/python/apache_beam/runners/portability/sdk_container_builder_test.py @@ -94,6 +94,32 @@ def test_build_container_image_locates_subclass_invokes_build( mocked_local_builder.assert_called_once_with(options) mocked_local_builder.return_value._build.assert_called_once_with() + def test_container_image_name_uses_forward_slashes(self): + """Verify container image names use forward slashes as URI separators.""" + options = pipeline_options.PipelineOptions([ + '--docker_registry_push_url=europe-west1-docker.pkg.dev/project-id'\ + '/repo-name', + ]) + builder = sdk_container_builder._SdkContainerImageLocalBuilder(options) + + # Mock the file and docker operations + with unittest.mock.patch( + 'apache_beam.runners.portability.sdk_container_builder.tempfile.' \ + 'TemporaryDirectory' + ): + with unittest.mock.patch.object(builder, '_prepare_dependencies'): + with unittest.mock.patch.object(builder, + '_invoke_docker_build_and_push'): + container_image_name = builder._build() + + expected_prefix = 'europe-west1-docker.pkg.dev/project-id/repo-name/' \ + 'beam_python_prebuilt_sdk:' + self.assertTrue( + container_image_name.startswith(expected_prefix), + f'Expected image name to start with {expected_prefix},'\ + f' got: {container_image_name}' + ) + if __name__ == '__main__': # Run the tests.