14 """Configure Traffic Director for different GRPC Proxyless.
16 This is intended as a debugging / local development helper and not executed
17 as a part of interop test suites.
19 Typical usage examples:
21 # Regular proxyless setup
22 python -m bin.run_td_setup --flagfile=config/local-dev.cfg
24 # Additional commands: cleanup, backend management, etc.
25 python -m bin.run_td_setup --flagfile=config/local-dev.cfg --cmd=cleanup
27 # PSM security setup options: mtls, tls, etc.
28 python -m bin.run_td_setup --flagfile=config/local-dev.cfg --security=mtls
30 # More information and usage options
31 python -m bin.run_td_setup --helpfull
36 from absl
import flags
38 from framework
import xds_flags
39 from framework
import xds_k8s_flags
46 logger = logging.getLogger(__name__)
48 _CMD = flags.DEFINE_enum(
'cmd',
51 'cycle',
'create',
'cleanup',
'backends-add',
52 'backends-cleanup',
'unused-xds-port'
55 _SECURITY = flags.DEFINE_enum(
'security',
58 'mtls',
'tls',
'plaintext',
'mtls_error',
61 help=
'Configure TD with security')
62 flags.adopt_module_key_flags(xds_flags)
63 flags.adopt_module_key_flags(xds_k8s_flags)
65 flags.mark_flag_as_required(
"resource_suffix")
67 KubernetesServerRunner = server_app.KubernetesServerRunner
72 raise app.UsageError(
'Too many command-line arguments.')
75 security_mode = _SECURITY.value
77 project: str = xds_flags.PROJECT.value
78 network: str = xds_flags.NETWORK.value
81 resource_prefix: str = xds_flags.RESOURCE_PREFIX.value
82 resource_suffix: str = xds_flags.RESOURCE_SUFFIX.value
85 server_name = xds_flags.SERVER_NAME.value
86 server_port = xds_flags.SERVER_PORT.value
87 server_maintenance_port = xds_flags.SERVER_MAINTENANCE_PORT.value
88 server_xds_host = xds_flags.SERVER_XDS_HOST.value
89 server_xds_port = xds_flags.SERVER_XDS_PORT.value
90 server_namespace = KubernetesServerRunner.make_namespace_name(
91 resource_prefix, resource_suffix)
93 gcp_api_manager = gcp.api.GcpApiManager()
95 if security_mode
is None:
96 td = traffic_director.TrafficDirectorManager(
100 resource_prefix=resource_prefix,
101 resource_suffix=resource_suffix)
103 td = traffic_director.TrafficDirectorSecureManager(
107 resource_prefix=resource_prefix,
108 resource_suffix=resource_suffix)
109 if server_maintenance_port
is None:
110 server_maintenance_port = KubernetesServerRunner.DEFAULT_SECURE_MODE_MAINTENANCE_PORT
113 if command
in (
'create',
'cycle'):
114 logger.info(
'Create mode')
115 if security_mode
is None:
116 logger.info(
'No security')
117 td.setup_for_grpc(server_xds_host,
119 health_check_port=server_maintenance_port)
121 elif security_mode ==
'mtls':
122 logger.info(
'Setting up mtls')
123 td.setup_for_grpc(server_xds_host,
125 health_check_port=server_maintenance_port)
126 td.setup_server_security(server_namespace=server_namespace,
127 server_name=server_name,
128 server_port=server_port,
131 td.setup_client_security(server_namespace=server_namespace,
132 server_name=server_name,
136 elif security_mode ==
'tls':
137 logger.info(
'Setting up tls')
138 td.setup_for_grpc(server_xds_host,
140 health_check_port=server_maintenance_port)
141 td.setup_server_security(server_namespace=server_namespace,
142 server_name=server_name,
143 server_port=server_port,
146 td.setup_client_security(server_namespace=server_namespace,
147 server_name=server_name,
151 elif security_mode ==
'plaintext':
152 logger.info(
'Setting up plaintext')
153 td.setup_for_grpc(server_xds_host,
155 health_check_port=server_maintenance_port)
156 td.setup_server_security(server_namespace=server_namespace,
157 server_name=server_name,
158 server_port=server_port,
161 td.setup_client_security(server_namespace=server_namespace,
162 server_name=server_name,
166 elif security_mode ==
'mtls_error':
169 logger.info(
'Setting up mtls_error')
170 td.setup_for_grpc(server_xds_host,
172 health_check_port=server_maintenance_port)
173 td.setup_server_security(server_namespace=server_namespace,
174 server_name=server_name,
175 server_port=server_port,
178 td.setup_client_security(server_namespace=server_namespace,
179 server_name=server_name,
183 elif security_mode ==
'server_authz_error':
186 logger.info(
'Setting up mtls_error')
187 td.setup_for_grpc(server_xds_host,
189 health_check_port=server_maintenance_port)
192 td.setup_server_security(server_namespace=server_namespace,
193 server_name=server_name,
194 server_port=server_port,
197 td.setup_client_security(
198 server_namespace=f
'incorrect-namespace-{rand.rand_string()}',
199 server_name=server_name,
203 logger.info(
'Works!')
205 logger.exception(
'Got error during creation')
207 if command
in (
'cleanup',
'cycle'):
208 logger.info(
'Cleaning up')
209 td.cleanup(force=
True)
211 if command ==
'backends-add':
212 logger.info(
'Adding backends')
213 k8s_api_manager = k8s.KubernetesApiManager(
214 xds_k8s_flags.KUBE_CONTEXT.value)
215 k8s_namespace = k8s.KubernetesNamespace(k8s_api_manager,
218 neg_name, neg_zones = k8s_namespace.get_service_neg(
219 server_name, server_port)
221 td.load_backend_service()
222 td.backend_service_add_neg_backends(neg_name, neg_zones)
223 td.wait_for_backends_healthy_status()
224 elif command ==
'backends-cleanup':
225 td.load_backend_service()
226 td.backend_service_remove_all_backends()
227 elif command ==
'unused-xds-port':
229 unused_xds_port = td.find_unused_forwarding_rule_port()
230 logger.info(
'Found unused forwarding rule port: %s',
233 logger.exception(
"Couldn't find unused forwarding rule port")
236 if __name__ ==
'__main__':