15 """Builds the content of xds-protos package"""
19 from grpc_tools
import protoc
23 EXCLUDE_PROTO_PACKAGES_LIST = [
25 'envoy/service/metrics/v2',
26 'envoy/service/metrics/v3',
27 'envoy/service/metrics/v4alpha',
31 WORK_DIR = os.path.dirname(os.path.abspath(__file__))
32 GRPC_ROOT = os.path.abspath(os.path.join(WORK_DIR,
'..',
'..',
'..',
'..'))
33 XDS_PROTO_ROOT = os.path.join(GRPC_ROOT,
'third_party',
'envoy-api')
34 UDPA_PROTO_ROOT = os.path.join(GRPC_ROOT,
'third_party',
'udpa')
35 GOOGLEAPIS_ROOT = os.path.join(GRPC_ROOT,
'third_party',
'googleapis')
36 VALIDATE_ROOT = os.path.join(GRPC_ROOT,
'third_party',
'protoc-gen-validate')
37 OPENCENSUS_PROTO_ROOT = os.path.join(GRPC_ROOT,
'third_party',
38 'opencensus-proto',
'src')
39 OPENTELEMETRY_PROTO_ROOT = os.path.join(GRPC_ROOT,
'third_party',
41 WELL_KNOWN_PROTOS_INCLUDE = pkg_resources.resource_filename(
42 'grpc_tools',
'_proto')
43 OUTPUT_PATH = WORK_DIR
46 TEST_FILE_NAME =
'generated_file_import_test.py'
50 PKGUTIL_STYLE_INIT =
"__path__ = __import__('pkgutil').extend_path(__path__, __name__)\n"
51 NAMESPACE_PACKAGES = [
"google"]
56 service: bool =
False):
57 TEST_IMPORTS.append(
"from %s import %s\n" % (proto_package_path.replace(
58 '/',
'.'), file_name.replace(
'.proto',
'_pb2')))
60 TEST_IMPORTS.append(
"from %s import %s\n" % (proto_package_path.replace(
61 '/',
'.'), file_name.replace(
'.proto',
'_pb2_grpc')))
65 COMPILE_PROTO_ONLY = [
67 '--proto_path={}'.
format(XDS_PROTO_ROOT),
68 '--proto_path={}'.
format(UDPA_PROTO_ROOT),
69 '--proto_path={}'.
format(GOOGLEAPIS_ROOT),
70 '--proto_path={}'.
format(VALIDATE_ROOT),
71 '--proto_path={}'.
format(WELL_KNOWN_PROTOS_INCLUDE),
72 '--proto_path={}'.
format(OPENCENSUS_PROTO_ROOT),
73 '--proto_path={}'.
format(OPENTELEMETRY_PROTO_ROOT),
74 '--python_out={}'.
format(OUTPUT_PATH),
76 COMPILE_BOTH = COMPILE_PROTO_ONLY + [
'--grpc_python_out={}'.
format(OUTPUT_PATH)]
80 return proto_package_path.startswith(
'envoy/service')
84 for root, _, files
in os.walk(os.path.join(proto_root, sub_dir)):
85 proto_package_path = os.path.relpath(root, proto_root)
86 if proto_package_path
in EXCLUDE_PROTO_PACKAGES_LIST:
87 print(f
'Skipping package {proto_package_path}')
89 for file_name
in files:
90 if file_name.endswith(
'.proto'):
93 return_code = protoc.main(COMPILE_BOTH +
94 [os.path.join(root, file_name)])
97 return_code = protoc.main(COMPILE_PROTO_ONLY +
98 [os.path.join(root, file_name)])
103 raise Exception(
'error: {} failed'.
format(COMPILE_BOTH))
107 with open(os.path.join(path,
"__init__.py"),
'w')
as f:
111 if package_path
in NAMESPACE_PACKAGES:
112 f.write(PKGUTIL_STYLE_INIT)
122 compile_protos(GOOGLEAPIS_ROOT, os.path.join(
'google',
'longrunning'))
123 compile_protos(GOOGLEAPIS_ROOT, os.path.join(
'google',
'logging'))
131 for proto_root_module
in [
132 'envoy',
'google',
'opencensus',
'udpa',
'validate',
'xds',
135 for root, _, _
in os.walk(os.path.join(WORK_DIR, proto_root_module)):
136 package_path = os.path.relpath(root, WORK_DIR)
140 with open(os.path.join(WORK_DIR, TEST_FILE_NAME),
'w')
as f:
141 f.writelines(TEST_IMPORTS)
144 if __name__ ==
"__main__":