3535
3636from apache_beam import pvalue
3737from apache_beam .coders import RowCoder
38- from apache_beam .options . pipeline_options import CrossLanguageOptions
38+ from apache_beam .options import pipeline_options
3939from apache_beam .portability import common_urns
4040from apache_beam .portability .api import beam_artifact_api_pb2_grpc
4141from apache_beam .portability .api import beam_expansion_api_pb2
@@ -1030,22 +1030,29 @@ class JavaJarExpansionService(object):
10301030 append_args: arguments to be provided when starting up the
10311031 expansion service using the jar file. These arguments will be appended to
10321032 the default arguments.
1033+ user_agent: the user agent to use when downloading the jar.
10331034 """
10341035 def __init__ (
1035- self , path_to_jar , extra_args = None , classpath = None , append_args = None ):
1036+ self ,
1037+ path_to_jar ,
1038+ extra_args = None ,
1039+ classpath = None ,
1040+ append_args = None ,
1041+ user_agent = None ):
10361042 if extra_args and append_args :
10371043 raise ValueError ('Only one of extra_args or append_args may be provided' )
10381044 self .path_to_jar = path_to_jar
10391045 self ._extra_args = extra_args
10401046 self ._classpath = classpath or []
10411047 self ._service_count = 0
10421048 self ._append_args = append_args or []
1049+ self ._user_agent = user_agent
10431050
10441051 def is_existing_service (self ):
10451052 return subprocess_server .is_service_endpoint (self .path_to_jar )
10461053
10471054 @staticmethod
1048- def _expand_jars (jar ):
1055+ def _expand_jars (jar , user_agent = None ):
10491056 if glob .glob (jar ):
10501057 return glob .glob (jar )
10511058 elif isinstance (jar , str ) and (jar .startswith ('http://' ) or
@@ -1064,14 +1071,15 @@ def _expand_jars(jar):
10641071 return [jar ]
10651072 path = subprocess_server .JavaJarServer .local_jar (
10661073 subprocess_server .JavaJarServer .path_to_maven_jar (
1067- artifact_id , group_id , version ))
1074+ artifact_id , group_id , version ),
1075+ user_agent = user_agent )
10681076 return [path ]
10691077
10701078 def _default_args (self ):
10711079 """Default arguments to be used by `JavaJarExpansionService`."""
10721080
10731081 to_stage = ',' .join ([self .path_to_jar ] + sum ((
1074- JavaJarExpansionService ._expand_jars (jar )
1082+ JavaJarExpansionService ._expand_jars (jar , self . _user_agent )
10751083 for jar in self ._classpath or []), []))
10761084 args = ['{{PORT}}' , f'--filesToStage={ to_stage } ' ]
10771085 # TODO(robertwb): See if it's possible to scope this per pipeline.
@@ -1080,10 +1088,14 @@ def _default_args(self):
10801088 args .append ('--alsoStartLoopbackWorker' )
10811089 return args
10821090
1091+ def with_user_agent (self , user_agent : str ):
1092+ self ._user_agent = user_agent
1093+ return self
1094+
10831095 def __enter__ (self ):
10841096 if self ._service_count == 0 :
10851097 self .path_to_jar = subprocess_server .JavaJarServer .local_jar (
1086- self .path_to_jar )
1098+ self .path_to_jar , user_agent = self . _user_agent )
10871099 if self ._extra_args is None :
10881100 self ._extra_args = self ._default_args () + self ._append_args
10891101 # Consider memoizing these servers (with some timeout).
@@ -1095,7 +1107,8 @@ def __enter__(self):
10951107 classpath_urls = [
10961108 subprocess_server .JavaJarServer .local_jar (path )
10971109 for jar in self ._classpath
1098- for path in JavaJarExpansionService ._expand_jars (jar )
1110+ for path in JavaJarExpansionService ._expand_jars (
1111+ jar , user_agent = self ._user_agent )
10991112 ]
11001113 self ._service_provider = subprocess_server .JavaJarServer (
11011114 ExpansionAndArtifactRetrievalStub ,
@@ -1138,12 +1151,17 @@ def __init__(
11381151 extra_args = None ,
11391152 gradle_appendix = None ,
11401153 classpath = None ,
1141- append_args = None ):
1154+ append_args = None ,
1155+ user_agent = None ):
11421156 path_to_jar = subprocess_server .JavaJarServer .path_to_beam_jar (
11431157 gradle_target , gradle_appendix )
11441158 self .gradle_target = gradle_target
11451159 super ().__init__ (
1146- path_to_jar , extra_args , classpath = classpath , append_args = append_args )
1160+ path_to_jar ,
1161+ extra_args ,
1162+ classpath = classpath ,
1163+ append_args = append_args ,
1164+ user_agent = user_agent )
11471165
11481166
11491167def _maybe_use_transform_service (provided_service = None , options = None ):
@@ -1185,10 +1203,11 @@ def is_docker_available():
11851203 docker_available = is_docker_available ()
11861204
11871205 use_transform_service = options .view_as (
1188- CrossLanguageOptions ).use_transform_service
1206+ pipeline_options .CrossLanguageOptions ).use_transform_service
1207+ user_agent = options .view_as (pipeline_options .SetupOptions ).user_agent
11891208
11901209 if (java_available and provided_service and not use_transform_service ):
1191- return provided_service
1210+ return provided_service . with_user_agent ( user_agent )
11921211 elif docker_available :
11931212 if use_transform_service :
11941213 error_append = 'it was explicitly requested'
@@ -1210,7 +1229,7 @@ def is_docker_available():
12101229 beam_version = beam_version .__version__
12111230
12121231 return transform_service_launcher .TransformServiceLauncher (
1213- project_name , port , beam_version )
1232+ project_name , port , beam_version , user_agent )
12141233 else :
12151234 raise ValueError (
12161235 'Cannot start an expansion service since neither Java nor '
0 commit comments