grpc 1.32.0 → 1.36.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (1031) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1086 -3054
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +15 -7
  6. data/include/grpc/grpc_security.h +227 -171
  7. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  8. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +10 -8
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/port_platform.h +22 -55
  12. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  13. data/include/grpc/slice_buffer.h +3 -3
  14. data/include/grpc/support/sync.h +3 -3
  15. data/include/grpc/support/time.h +7 -7
  16. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
  17. data/src/core/ext/filters/client_channel/client_channel.cc +2788 -1535
  18. data/src/core/ext/filters/client_channel/client_channel.h +0 -6
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.cc +0 -4
  21. data/src/core/ext/filters/client_channel/config_selector.h +40 -8
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +186 -0
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +10 -7
  25. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -4
  26. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +7 -8
  27. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  28. data/src/core/ext/filters/client_channel/lb_policy.cc +6 -2
  29. data/src/core/ext/filters/client_channel/lb_policy.h +6 -7
  30. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +48 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
  32. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -3
  33. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +204 -195
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  41. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +58 -26
  42. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -5
  43. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +14 -34
  44. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +6 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +478 -145
  46. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +52 -24
  47. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +29 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +810 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +722 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1384 -0
  51. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  52. data/src/core/ext/filters/client_channel/resolver.cc +4 -5
  53. data/src/core/ext/filters/client_channel/resolver.h +5 -13
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +43 -59
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +3 -3
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +443 -17
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
  59. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +22 -23
  60. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +21 -18
  61. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  62. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +362 -0
  63. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +37 -30
  64. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +566 -366
  65. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +28 -0
  66. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  67. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  68. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  69. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +29 -74
  70. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +12 -10
  71. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  72. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -2
  73. data/src/core/ext/filters/client_channel/server_address.cc +86 -0
  74. data/src/core/ext/filters/client_channel/server_address.h +52 -36
  75. data/src/core/ext/filters/client_channel/service_config.cc +18 -13
  76. data/src/core/ext/filters/client_channel/service_config.h +8 -5
  77. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  78. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  79. data/src/core/ext/filters/client_channel/service_config_parser.cc +8 -6
  80. data/src/core/ext/filters/client_channel/service_config_parser.h +8 -5
  81. data/src/core/ext/filters/client_channel/subchannel.cc +53 -66
  82. data/src/core/ext/filters/client_channel/subchannel.h +14 -20
  83. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -5
  84. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -2
  85. data/src/core/ext/filters/deadline/deadline_filter.cc +87 -79
  86. data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
  87. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
  88. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  89. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  90. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  91. data/src/core/ext/filters/max_age/max_age_filter.cc +36 -33
  92. data/src/core/ext/filters/message_size/message_size_filter.cc +3 -2
  93. data/src/core/ext/filters/message_size/message_size_filter.h +2 -1
  94. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  95. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  96. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
  97. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  98. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +20 -8
  99. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  100. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +26 -14
  101. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +226 -95
  102. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
  103. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
  104. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  105. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
  106. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  107. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +28 -42
  108. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -2
  109. data/src/core/ext/transport/chttp2/transport/flow_control.h +13 -3
  110. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  111. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  112. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  113. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -8
  114. data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
  115. data/src/core/ext/transport/chttp2/transport/parsing.cc +18 -3
  116. data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
  117. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  118. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  119. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  120. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  121. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +52 -33
  122. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +199 -34
  123. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  124. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  125. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +171 -98
  126. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +625 -202
  127. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  128. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  129. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +24 -23
  130. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +62 -21
  131. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +36 -24
  132. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +133 -39
  133. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  134. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  135. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +70 -45
  136. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +275 -78
  137. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +31 -24
  138. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +107 -47
  139. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +53 -0
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +149 -0
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +74 -28
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +248 -43
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +41 -41
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +172 -89
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +63 -39
  150. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +254 -60
  151. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -2
  152. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  153. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  154. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  155. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +42 -0
  156. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +126 -0
  157. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -14
  158. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  159. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  160. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  161. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  162. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  163. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  164. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  165. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +49 -27
  166. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +204 -48
  167. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +47 -26
  168. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +181 -48
  169. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -3
  170. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  171. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -17
  172. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +96 -33
  173. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +15 -13
  174. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +70 -37
  175. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +352 -199
  176. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +1334 -443
  177. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +8 -7
  178. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +34 -10
  179. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -4
  180. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  181. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  182. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  183. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +129 -80
  184. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +525 -166
  185. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
  186. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  187. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +26 -24
  188. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +121 -64
  189. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +7 -6
  190. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +29 -8
  191. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +70 -29
  192. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +296 -63
  193. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  194. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  195. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  196. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  197. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +51 -34
  198. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +188 -75
  199. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -4
  200. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  201. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -4
  202. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  203. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -8
  204. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  205. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -3
  206. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  207. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  208. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  209. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  210. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  211. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  212. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  213. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  214. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  215. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  216. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  217. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +4 -4
  218. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +22 -3
  219. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  220. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  221. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  222. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  223. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  224. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  225. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  226. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  227. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  228. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  229. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  230. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  231. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  232. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  233. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +242 -0
  234. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +830 -0
  235. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +54 -37
  236. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +171 -59
  237. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  238. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  239. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  240. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  241. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  242. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  243. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  244. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  245. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  246. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  247. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  248. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  249. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  250. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  251. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  252. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  253. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  254. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  255. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  256. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  257. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  258. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  259. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  260. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  261. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  262. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  263. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  264. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  265. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  266. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  267. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -0
  268. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +64 -0
  269. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  270. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  271. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  272. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  273. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  274. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  275. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  276. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  277. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  278. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +28 -0
  279. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  280. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  281. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  282. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  283. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  284. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +36 -0
  285. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  286. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  287. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  288. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  289. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  290. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
  291. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
  292. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
  293. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
  294. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +251 -0
  295. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
  296. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
  297. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
  298. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +543 -0
  299. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
  300. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
  301. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
  302. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +136 -0
  303. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
  304. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
  305. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
  306. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
  307. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
  308. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +272 -0
  309. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +135 -0
  310. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
  311. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
  312. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
  313. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
  314. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
  315. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
  316. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
  317. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
  318. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
  319. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
  320. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
  321. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
  322. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +228 -0
  323. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +80 -0
  324. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +43 -0
  325. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
  326. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
  327. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
  328. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +68 -0
  329. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
  330. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +107 -0
  331. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
  332. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
  333. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
  334. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
  335. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
  336. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
  337. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
  338. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +195 -0
  339. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
  340. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +193 -0
  341. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
  342. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +59 -0
  343. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
  344. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +101 -0
  345. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
  346. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +938 -0
  347. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +285 -0
  348. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
  349. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
  350. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +61 -0
  351. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
  352. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  353. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  354. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +504 -0
  355. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
  356. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +44 -0
  357. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
  358. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +170 -0
  359. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
  360. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +97 -0
  361. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
  362. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +246 -0
  363. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
  364. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
  365. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
  366. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
  367. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
  368. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +142 -0
  369. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +65 -0
  370. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +73 -0
  371. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
  372. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +72 -0
  373. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
  374. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +80 -0
  375. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
  376. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +80 -0
  377. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
  378. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
  379. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
  380. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
  381. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
  382. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
  383. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
  384. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
  385. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
  386. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
  387. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
  388. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +69 -0
  389. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
  390. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
  391. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
  392. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
  393. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
  394. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
  395. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
  396. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
  397. data/src/core/ext/{upb-generated/gogoproto/gogo.upb.h → upbdefs-generated/envoy/type/v3/http.upbdefs.h} +10 -9
  398. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
  399. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
  400. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
  401. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
  402. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
  403. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
  404. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
  405. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
  406. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
  407. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
  408. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +39 -0
  409. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
  410. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
  411. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
  412. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +40 -0
  413. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
  414. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
  415. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
  416. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
  417. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
  418. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +40 -0
  419. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
  420. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
  421. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
  422. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
  423. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
  424. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
  425. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
  426. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
  427. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
  428. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
  429. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
  430. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
  431. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
  432. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
  433. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
  434. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +310 -0
  435. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
  436. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  437. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  438. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  439. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  440. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  441. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  442. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  443. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  444. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  445. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  446. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  447. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  448. data/src/core/ext/xds/certificate_provider_factory.h +61 -0
  449. data/src/core/ext/xds/certificate_provider_registry.cc +103 -0
  450. data/src/core/ext/xds/certificate_provider_registry.h +57 -0
  451. data/src/core/ext/xds/certificate_provider_store.cc +87 -0
  452. data/src/core/ext/xds/certificate_provider_store.h +112 -0
  453. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +144 -0
  454. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +69 -0
  455. data/src/core/ext/xds/xds_api.cc +1149 -1058
  456. data/src/core/ext/xds/xds_api.h +215 -144
  457. data/src/core/ext/xds/xds_bootstrap.cc +228 -62
  458. data/src/core/ext/xds/xds_bootstrap.h +35 -12
  459. data/src/core/ext/xds/xds_certificate_provider.cc +405 -0
  460. data/src/core/ext/xds/xds_certificate_provider.h +151 -0
  461. data/src/core/ext/xds/xds_channel_args.h +6 -3
  462. data/src/core/ext/xds/xds_client.cc +620 -495
  463. data/src/core/ext/xds/xds_client.h +121 -58
  464. data/src/core/ext/xds/xds_client_stats.cc +61 -17
  465. data/src/core/ext/xds/xds_client_stats.h +35 -7
  466. data/src/core/ext/xds/xds_server_config_fetcher.cc +267 -0
  467. data/src/core/lib/channel/channel_args.cc +9 -8
  468. data/src/core/lib/channel/channel_args.h +0 -1
  469. data/src/core/lib/channel/channel_trace.cc +4 -2
  470. data/src/core/lib/channel/channel_trace.h +1 -1
  471. data/src/core/lib/channel/channelz.cc +23 -59
  472. data/src/core/lib/channel/channelz.h +13 -22
  473. data/src/core/lib/channel/channelz_registry.cc +12 -11
  474. data/src/core/lib/channel/channelz_registry.h +3 -1
  475. data/src/core/lib/channel/handshaker.cc +4 -7
  476. data/src/core/lib/channel/handshaker.h +3 -3
  477. data/src/core/lib/compression/compression.cc +8 -4
  478. data/src/core/lib/compression/compression_args.cc +3 -2
  479. data/src/core/lib/compression/compression_internal.cc +10 -5
  480. data/src/core/lib/compression/compression_internal.h +2 -1
  481. data/src/core/lib/compression/stream_compression_identity.cc +1 -3
  482. data/src/core/lib/debug/stats.h +2 -2
  483. data/src/core/lib/debug/stats_data.cc +1 -0
  484. data/src/core/lib/debug/stats_data.h +13 -13
  485. data/src/core/lib/gpr/alloc.cc +3 -2
  486. data/src/core/lib/gpr/cpu_iphone.cc +10 -2
  487. data/src/core/lib/gpr/log.cc +59 -17
  488. data/src/core/lib/gpr/log_linux.cc +19 -3
  489. data/src/core/lib/gpr/log_posix.cc +15 -1
  490. data/src/core/lib/gpr/log_windows.cc +18 -4
  491. data/src/core/lib/gpr/murmur_hash.cc +1 -1
  492. data/src/core/lib/gpr/spinlock.h +10 -2
  493. data/src/core/lib/gpr/string.cc +23 -22
  494. data/src/core/lib/gpr/string.h +5 -6
  495. data/src/core/lib/gpr/sync.cc +4 -4
  496. data/src/core/lib/gpr/time.cc +12 -12
  497. data/src/core/lib/gpr/time_precise.cc +5 -2
  498. data/src/core/lib/gpr/time_precise.h +6 -2
  499. data/src/core/lib/gpr/tls.h +4 -0
  500. data/src/core/lib/gpr/tls_msvc.h +2 -0
  501. data/src/core/lib/gpr/tls_stdcpp.h +48 -0
  502. data/src/core/lib/gpr/useful.h +5 -4
  503. data/src/core/lib/gprpp/arena.h +3 -2
  504. data/src/core/lib/gprpp/dual_ref_counted.h +331 -0
  505. data/src/core/lib/gprpp/examine_stack.cc +43 -0
  506. data/src/core/lib/gprpp/examine_stack.h +46 -0
  507. data/src/core/lib/gprpp/fork.cc +2 -2
  508. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  509. data/src/core/lib/gprpp/mpscq.cc +2 -2
  510. data/src/core/lib/gprpp/orphanable.h +4 -8
  511. data/src/core/lib/gprpp/ref_counted.h +91 -68
  512. data/src/core/lib/gprpp/ref_counted_ptr.h +166 -7
  513. data/src/core/lib/{security/authorization/mock_cel/statusor.h → gprpp/stat.h} +13 -25
  514. data/src/core/lib/gprpp/stat_posix.cc +49 -0
  515. data/src/core/lib/gprpp/stat_windows.cc +48 -0
  516. data/src/core/lib/gprpp/sync.h +129 -40
  517. data/src/core/lib/gprpp/thd.h +2 -2
  518. data/src/core/lib/gprpp/thd_posix.cc +42 -37
  519. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  520. data/src/core/lib/gprpp/time_util.cc +77 -0
  521. data/src/core/lib/gprpp/time_util.h +42 -0
  522. data/src/core/lib/http/httpcli.cc +1 -1
  523. data/src/core/lib/http/httpcli.h +2 -3
  524. data/src/core/lib/http/httpcli_security_connector.cc +3 -3
  525. data/src/core/lib/http/parser.cc +47 -27
  526. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  527. data/src/core/lib/iomgr/combiner.cc +2 -1
  528. data/src/core/lib/iomgr/endpoint.h +1 -1
  529. data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -5
  530. data/src/core/lib/iomgr/error.cc +17 -12
  531. data/src/core/lib/iomgr/error_internal.h +1 -1
  532. data/src/core/lib/iomgr/ev_apple.cc +10 -7
  533. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -13
  534. data/src/core/lib/iomgr/ev_epollex_linux.cc +29 -21
  535. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  536. data/src/core/lib/iomgr/exec_ctx.cc +1 -1
  537. data/src/core/lib/iomgr/exec_ctx.h +16 -12
  538. data/src/core/lib/iomgr/executor.cc +2 -1
  539. data/src/core/lib/iomgr/executor.h +1 -1
  540. data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
  541. data/src/core/lib/iomgr/executor/threadpool.h +4 -4
  542. data/src/core/lib/iomgr/iomgr.cc +1 -1
  543. data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
  544. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
  545. data/src/core/lib/iomgr/load_file.h +1 -1
  546. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  547. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  548. data/src/core/lib/iomgr/parse_address.cc +127 -43
  549. data/src/core/lib/iomgr/parse_address.h +32 -8
  550. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
  551. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  552. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  553. data/src/core/lib/iomgr/python_util.h +4 -4
  554. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  555. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -5
  556. data/src/core/lib/iomgr/resource_quota.cc +4 -4
  557. data/src/core/lib/iomgr/sockaddr_utils.cc +11 -11
  558. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  559. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  560. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  561. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
  562. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  563. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  564. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  565. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  566. data/src/core/lib/iomgr/tcp_posix.cc +16 -12
  567. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  568. data/src/core/lib/iomgr/timer_custom.cc +5 -5
  569. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  570. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  571. data/src/core/lib/iomgr/udp_server.cc +1 -2
  572. data/src/core/lib/iomgr/udp_server.h +1 -2
  573. data/src/core/lib/iomgr/unix_sockets_posix.cc +32 -21
  574. data/src/core/lib/iomgr/unix_sockets_posix.h +5 -0
  575. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +7 -0
  576. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  577. data/src/core/lib/json/json.h +12 -2
  578. data/src/core/lib/json/json_reader.cc +8 -4
  579. data/src/core/lib/json/json_util.cc +58 -0
  580. data/src/core/lib/json/json_util.h +204 -0
  581. data/src/core/lib/json/json_writer.cc +2 -1
  582. data/src/core/lib/security/authorization/evaluate_args.cc +5 -10
  583. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  584. data/src/core/lib/security/authorization/matchers.cc +339 -0
  585. data/src/core/lib/security/authorization/matchers.h +158 -0
  586. data/src/core/lib/security/authorization/mock_cel/activation.h +1 -1
  587. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +3 -1
  588. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +5 -4
  589. data/src/core/lib/security/authorization/mock_cel/cel_value.h +13 -7
  590. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +6 -6
  591. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +10 -9
  592. data/src/core/lib/security/context/security_context.cc +4 -3
  593. data/src/core/lib/security/context/security_context.h +3 -1
  594. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  595. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  596. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  597. data/src/core/lib/security/credentials/credentials.cc +7 -7
  598. data/src/core/lib/security/credentials/credentials.h +5 -4
  599. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  600. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  601. data/src/core/lib/security/credentials/external/aws_request_signer.cc +213 -0
  602. data/src/core/lib/security/credentials/external/aws_request_signer.h +72 -0
  603. data/src/core/lib/security/credentials/external/external_account_credentials.cc +497 -0
  604. data/src/core/lib/security/credentials/external/external_account_credentials.h +120 -0
  605. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +135 -0
  606. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +48 -0
  607. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +213 -0
  608. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +58 -0
  609. data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -2
  610. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -18
  611. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +64 -0
  612. data/src/core/lib/security/credentials/jwt/json_token.cc +3 -3
  613. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
  614. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -4
  615. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  616. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  617. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +39 -46
  618. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  619. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  620. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +7 -6
  621. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  622. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +346 -0
  623. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +213 -0
  624. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +399 -0
  625. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +138 -0
  626. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +78 -150
  627. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +57 -187
  628. data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -13
  629. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -3
  630. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  631. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  632. data/src/core/lib/security/credentials/xds/xds_credentials.cc +244 -0
  633. data/src/core/lib/security/credentials/xds/xds_credentials.h +69 -0
  634. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  635. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -13
  636. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +121 -0
  637. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +87 -0
  638. data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
  639. data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
  640. data/src/core/lib/security/security_connector/local/local_security_connector.cc +3 -3
  641. data/src/core/lib/security/security_connector/security_connector.cc +4 -3
  642. data/src/core/lib/security/security_connector/security_connector.h +4 -2
  643. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  644. data/src/core/lib/security/security_connector/ssl_utils.cc +5 -2
  645. data/src/core/lib/security/security_connector/ssl_utils.h +19 -19
  646. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +354 -279
  647. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +105 -61
  648. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  649. data/src/core/lib/security/transport/security_handshaker.cc +4 -6
  650. data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
  651. data/src/core/lib/security/util/json_util.h +1 -0
  652. data/src/core/lib/slice/slice.cc +7 -4
  653. data/src/core/lib/slice/slice_buffer.cc +2 -1
  654. data/src/core/lib/slice/slice_intern.cc +7 -8
  655. data/src/core/lib/slice/slice_internal.h +2 -2
  656. data/src/core/lib/surface/call.cc +41 -32
  657. data/src/core/lib/surface/call_details.cc +8 -8
  658. data/src/core/lib/surface/channel.cc +25 -41
  659. data/src/core/lib/surface/channel.h +9 -3
  660. data/src/core/lib/surface/channel_init.cc +1 -1
  661. data/src/core/lib/surface/completion_queue.cc +30 -24
  662. data/src/core/lib/surface/completion_queue.h +16 -16
  663. data/src/core/lib/surface/init.cc +45 -29
  664. data/src/core/lib/surface/lame_client.cc +20 -46
  665. data/src/core/lib/surface/lame_client.h +4 -0
  666. data/src/core/lib/surface/server.cc +66 -20
  667. data/src/core/lib/surface/server.h +42 -7
  668. data/src/core/lib/surface/validate_metadata.h +3 -0
  669. data/src/core/lib/surface/version.cc +2 -2
  670. data/src/core/lib/transport/authority_override.cc +6 -4
  671. data/src/core/lib/transport/authority_override.h +7 -2
  672. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  673. data/src/core/lib/transport/bdp_estimator.h +2 -1
  674. data/src/core/lib/transport/byte_stream.h +3 -3
  675. data/src/core/lib/transport/connectivity_state.h +11 -9
  676. data/src/core/lib/transport/error_utils.h +1 -1
  677. data/src/core/lib/transport/metadata.cc +16 -2
  678. data/src/core/lib/transport/metadata.h +2 -2
  679. data/src/core/lib/transport/metadata_batch.h +4 -4
  680. data/src/core/lib/transport/static_metadata.cc +1 -1
  681. data/src/core/lib/transport/status_metadata.cc +4 -3
  682. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  683. data/src/core/lib/transport/transport.cc +5 -3
  684. data/src/core/lib/transport/transport.h +8 -8
  685. data/src/core/lib/uri/uri_parser.cc +131 -249
  686. data/src/core/lib/uri/uri_parser.h +57 -21
  687. data/src/core/plugin_registry/grpc_plugin_registry.cc +47 -20
  688. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  689. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  690. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +18 -21
  691. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +43 -47
  692. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  693. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  694. data/src/core/tsi/fake_transport_security.cc +7 -4
  695. data/src/core/tsi/local_transport_security.cc +5 -1
  696. data/src/core/tsi/local_transport_security.h +6 -7
  697. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  698. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  699. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -2
  700. data/src/core/tsi/ssl_transport_security.cc +75 -58
  701. data/src/core/tsi/ssl_transport_security.h +6 -6
  702. data/src/core/tsi/transport_security.cc +10 -8
  703. data/src/core/tsi/transport_security_interface.h +1 -1
  704. data/src/ruby/ext/grpc/extconf.rb +1 -1
  705. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  706. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +36 -16
  707. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +70 -40
  708. data/src/ruby/lib/grpc/version.rb +1 -1
  709. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +35 -0
  710. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  711. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  712. data/third_party/abseil-cpp/absl/algorithm/container.h +59 -22
  713. data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
  714. data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
  715. data/third_party/abseil-cpp/absl/base/casts.h +9 -6
  716. data/third_party/abseil-cpp/absl/base/config.h +60 -17
  717. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
  718. data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
  719. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -0
  720. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  721. data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
  722. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +1 -1
  723. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
  724. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
  725. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
  726. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
  727. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
  728. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
  729. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
  730. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
  731. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
  732. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
  733. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
  734. data/third_party/abseil-cpp/absl/base/macros.h +36 -109
  735. data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
  736. data/third_party/abseil-cpp/absl/base/options.h +31 -4
  737. data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
  738. data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
  739. data/third_party/abseil-cpp/absl/container/fixed_array.h +42 -25
  740. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  741. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +2 -1
  742. data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
  743. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -2
  744. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
  745. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +49 -29
  746. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +15 -0
  747. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +24 -7
  748. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -1
  749. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +35 -11
  750. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +10 -9
  751. data/third_party/abseil-cpp/absl/container/internal/layout.h +7 -5
  752. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  753. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +55 -34
  754. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +5 -4
  755. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +66 -16
  756. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +4 -0
  757. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +13 -4
  758. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +43 -24
  759. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +12 -3
  760. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +10 -2
  761. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +22 -1
  762. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +0 -21
  763. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +12 -1
  764. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
  765. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +100 -20
  766. data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
  767. data/third_party/abseil-cpp/absl/functional/function_ref.h +1 -1
  768. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
  769. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  770. data/third_party/abseil-cpp/absl/hash/hash.h +6 -5
  771. data/third_party/abseil-cpp/absl/hash/internal/hash.h +73 -65
  772. data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
  773. data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
  774. data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
  775. data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
  776. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
  777. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  778. data/third_party/abseil-cpp/absl/status/status.cc +4 -6
  779. data/third_party/abseil-cpp/absl/status/status.h +502 -113
  780. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +5 -10
  781. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  782. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  783. data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
  784. data/third_party/abseil-cpp/absl/strings/cord.cc +91 -112
  785. data/third_party/abseil-cpp/absl/strings/cord.h +360 -205
  786. data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
  787. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
  788. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  789. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
  790. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  791. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +45 -23
  792. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
  793. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
  794. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
  795. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
  796. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
  797. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
  798. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
  799. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
  800. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
  801. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
  802. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
  803. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
  804. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
  805. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  806. data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
  807. data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
  808. data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
  809. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
  810. data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
  811. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
  812. data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
  813. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  814. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +4 -3
  815. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +28 -28
  816. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +4 -16
  817. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -1
  818. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +8 -0
  819. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -2
  820. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -64
  821. data/third_party/abseil-cpp/absl/synchronization/mutex.h +15 -6
  822. data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -9
  823. data/third_party/abseil-cpp/absl/time/clock.cc +3 -3
  824. data/third_party/abseil-cpp/absl/time/duration.cc +90 -59
  825. data/third_party/abseil-cpp/absl/time/format.cc +43 -36
  826. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +26 -16
  827. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +4 -2
  828. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
  829. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
  830. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
  831. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
  832. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +136 -129
  833. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
  834. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +8 -7
  835. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -6
  836. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -1
  837. data/third_party/abseil-cpp/absl/time/time.h +15 -16
  838. data/third_party/abseil-cpp/absl/types/internal/variant.h +4 -4
  839. data/third_party/abseil-cpp/absl/types/optional.h +9 -9
  840. data/third_party/abseil-cpp/absl/types/span.h +49 -36
  841. data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
  842. data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
  843. data/third_party/boringssl-with-bazel/err_data.c +728 -720
  844. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  845. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
  846. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
  847. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
  848. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  849. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
  850. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  851. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -20
  852. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
  853. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  854. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
  855. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
  856. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  857. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  858. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  859. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
  860. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  861. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  862. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  863. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  864. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  865. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  866. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
  867. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  868. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  869. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  870. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  871. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +9 -43
  872. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +55 -4
  873. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +34 -0
  874. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  875. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +4 -0
  876. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +6 -2
  877. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
  878. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  879. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  880. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
  881. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
  882. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  883. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
  884. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  885. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
  886. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
  887. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
  888. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +128 -38
  889. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
  890. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +4 -0
  891. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +30 -10
  892. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +107 -54
  893. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +155 -2
  894. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +112 -36
  895. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +63 -9
  896. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  897. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  898. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  899. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  900. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
  901. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  902. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +118 -49
  903. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +267 -95
  904. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +210 -34
  905. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
  906. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +3 -3
  907. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +6 -4
  908. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  909. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +3 -3
  910. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -1
  911. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +8 -3
  912. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +27 -21
  913. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -1
  914. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
  915. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +32 -11
  916. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +3 -3
  917. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +67 -67
  918. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +4 -4
  919. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +29 -35
  920. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +42 -25
  921. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +9 -8
  922. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +10 -10
  923. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +3 -4
  924. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +28 -40
  925. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  926. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +38 -3
  927. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  928. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +1 -4
  929. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
  930. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  931. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +25 -24
  932. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  933. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +32 -28
  934. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
  935. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  936. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +42 -22
  937. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  938. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +1 -1
  939. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  940. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +2 -2
  941. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +55 -8
  942. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +7 -7
  943. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  944. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
  945. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +10 -8
  946. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -546
  947. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  948. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +15 -7
  949. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
  950. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  951. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  952. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +21 -0
  953. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +1 -1
  954. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
  955. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +62 -20
  956. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +10 -0
  957. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
  958. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +16 -3
  959. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
  960. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
  961. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
  962. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  963. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +106 -27
  964. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -8
  965. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +42 -14
  966. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +462 -163
  967. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +593 -440
  968. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
  969. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +35 -0
  970. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +22 -21
  971. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +13 -23
  972. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +11 -6
  973. data/third_party/boringssl-with-bazel/src/ssl/internal.h +82 -26
  974. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
  975. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +49 -9
  976. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +8 -9
  977. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +87 -14
  978. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +18 -22
  979. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  980. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
  981. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +537 -34
  982. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -2
  983. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +59 -21
  984. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
  985. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +194 -58
  986. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  987. data/third_party/upb/upb/decode.c +248 -167
  988. data/third_party/upb/upb/decode.h +20 -1
  989. data/third_party/upb/upb/decode.int.h +163 -0
  990. data/third_party/upb/upb/decode_fast.c +1040 -0
  991. data/third_party/upb/upb/decode_fast.h +126 -0
  992. data/third_party/upb/upb/def.c +2178 -0
  993. data/third_party/upb/upb/def.h +315 -0
  994. data/third_party/upb/upb/def.hpp +439 -0
  995. data/third_party/upb/upb/encode.c +227 -169
  996. data/third_party/upb/upb/encode.h +27 -2
  997. data/third_party/upb/upb/json_decode.c +1443 -0
  998. data/third_party/upb/upb/json_decode.h +23 -0
  999. data/third_party/upb/upb/json_encode.c +713 -0
  1000. data/third_party/upb/upb/json_encode.h +36 -0
  1001. data/third_party/upb/upb/msg.c +167 -88
  1002. data/third_party/upb/upb/msg.h +174 -34
  1003. data/third_party/upb/upb/port_def.inc +74 -61
  1004. data/third_party/upb/upb/port_undef.inc +3 -7
  1005. data/third_party/upb/upb/reflection.c +408 -0
  1006. data/third_party/upb/upb/reflection.h +168 -0
  1007. data/third_party/upb/upb/table.c +34 -197
  1008. data/third_party/upb/upb/table.int.h +14 -5
  1009. data/third_party/upb/upb/text_encode.c +421 -0
  1010. data/third_party/upb/upb/text_encode.h +38 -0
  1011. data/third_party/upb/upb/upb.c +18 -41
  1012. data/third_party/upb/upb/upb.h +36 -7
  1013. data/third_party/upb/upb/upb.hpp +4 -4
  1014. data/third_party/upb/upb/upb.int.h +29 -0
  1015. metadata +309 -63
  1016. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -946
  1017. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +0 -537
  1018. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +0 -1141
  1019. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  1020. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  1021. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -354
  1022. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -142
  1023. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +0 -17
  1024. data/src/core/ext/xds/xds_channel.h +0 -46
  1025. data/src/core/ext/xds/xds_channel_secure.cc +0 -103
  1026. data/src/core/lib/gprpp/map.h +0 -53
  1027. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  1028. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
  1029. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c +0 -110
  1030. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c +0 -274
  1031. data/third_party/upb/upb/port.c +0 -26
@@ -0,0 +1,87 @@
1
+ //
2
+ //
3
+ // Copyright 2020 gRPC authors.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 (the "License");
6
+ // you may not use this file except in compliance with the License.
7
+ // You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing, software
12
+ // distributed under the License is distributed on an "AS IS" BASIS,
13
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ // See the License for the specific language governing permissions and
15
+ // limitations under the License.
16
+ //
17
+ //
18
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/ext/xds/certificate_provider_store.h"
22
+
23
+ #include "src/core/ext/xds/certificate_provider_registry.h"
24
+
25
+ namespace grpc_core {
26
+
27
+ // If a certificate provider is created, the CertificateProviderStore
28
+ // maintains a raw pointer to the created CertificateProviderWrapper so that
29
+ // future calls to `CreateOrGetCertificateProvider()` with the same key result
30
+ // in returning a ref to this created certificate provider. This entry is
31
+ // deleted when the refcount to this provider reaches zero.
32
+ RefCountedPtr<grpc_tls_certificate_provider>
33
+ CertificateProviderStore::CreateOrGetCertificateProvider(
34
+ absl::string_view key) {
35
+ RefCountedPtr<CertificateProviderWrapper> result;
36
+ MutexLock lock(&mu_);
37
+ auto it = certificate_providers_map_.find(key);
38
+ if (it == certificate_providers_map_.end()) {
39
+ result = CreateCertificateProviderLocked(key);
40
+ if (result != nullptr) {
41
+ certificate_providers_map_.insert({result->key(), result.get()});
42
+ }
43
+ } else {
44
+ result = it->second->RefIfNonZero();
45
+ if (result == nullptr) {
46
+ result = CreateCertificateProviderLocked(key);
47
+ it->second = result.get();
48
+ }
49
+ }
50
+ return result;
51
+ }
52
+
53
+ RefCountedPtr<CertificateProviderStore::CertificateProviderWrapper>
54
+ CertificateProviderStore::CreateCertificateProviderLocked(
55
+ absl::string_view key) {
56
+ auto plugin_config_it = plugin_config_map_.find(std::string(key));
57
+ if (plugin_config_it == plugin_config_map_.end()) {
58
+ return nullptr;
59
+ }
60
+ CertificateProviderFactory* factory =
61
+ CertificateProviderRegistry::LookupCertificateProviderFactory(
62
+ plugin_config_it->second.plugin_name);
63
+ if (factory == nullptr) {
64
+ // This should never happen since an entry is only inserted in the
65
+ // plugin_config_map_ if the corresponding factory was found when parsing
66
+ // the xDS bootstrap file.
67
+ gpr_log(GPR_ERROR, "Certificate provider factory %s not found",
68
+ plugin_config_it->second.plugin_name.c_str());
69
+ return nullptr;
70
+ }
71
+ return MakeRefCounted<CertificateProviderWrapper>(
72
+ factory->CreateCertificateProvider(plugin_config_it->second.config),
73
+ Ref(), plugin_config_it->first);
74
+ }
75
+
76
+ void CertificateProviderStore::ReleaseCertificateProvider(
77
+ absl::string_view key, CertificateProviderWrapper* wrapper) {
78
+ MutexLock lock(&mu_);
79
+ auto it = certificate_providers_map_.find(key);
80
+ if (it != certificate_providers_map_.end()) {
81
+ if (it->second == wrapper) {
82
+ certificate_providers_map_.erase(it);
83
+ }
84
+ }
85
+ }
86
+
87
+ } // namespace grpc_core
@@ -0,0 +1,112 @@
1
+ //
2
+ //
3
+ // Copyright 2020 gRPC authors.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 (the "License");
6
+ // you may not use this file except in compliance with the License.
7
+ // You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing, software
12
+ // distributed under the License is distributed on an "AS IS" BASIS,
13
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ // See the License for the specific language governing permissions and
15
+ // limitations under the License.
16
+ //
17
+ //
18
+
19
+ #ifndef GRPC_CORE_EXT_XDS_CERTIFICATE_PROVIDER_STORE_H
20
+ #define GRPC_CORE_EXT_XDS_CERTIFICATE_PROVIDER_STORE_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include <map>
25
+
26
+ #include "absl/strings/string_view.h"
27
+
28
+ #include "src/core/ext/xds/certificate_provider_factory.h"
29
+ #include "src/core/lib/gprpp/orphanable.h"
30
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
31
+ #include "src/core/lib/gprpp/sync.h"
32
+ #include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h"
33
+
34
+ namespace grpc_core {
35
+
36
+ // Map for xDS based grpc_tls_certificate_provider instances.
37
+ class CertificateProviderStore
38
+ : public InternallyRefCounted<CertificateProviderStore> {
39
+ public:
40
+ struct PluginDefinition {
41
+ std::string plugin_name;
42
+ RefCountedPtr<CertificateProviderFactory::Config> config;
43
+ };
44
+
45
+ // Maps plugin instance (opaque) name to plugin defition.
46
+ typedef std::map<std::string, PluginDefinition> PluginDefinitionMap;
47
+
48
+ explicit CertificateProviderStore(PluginDefinitionMap plugin_config_map)
49
+ : plugin_config_map_(std::move(plugin_config_map)) {}
50
+
51
+ // If a certificate provider corresponding to the instance name \a key is
52
+ // found, a ref to the grpc_tls_certificate_provider is returned. If no
53
+ // provider is found for the key, a new provider is created from the plugin
54
+ // definition map.
55
+ // Returns nullptr on failure to get or create a new certificate provider.
56
+ RefCountedPtr<grpc_tls_certificate_provider> CreateOrGetCertificateProvider(
57
+ absl::string_view key);
58
+
59
+ void Orphan() override { Unref(); }
60
+
61
+ private:
62
+ // A thin wrapper around `grpc_tls_certificate_provider` which allows removing
63
+ // the entry from the CertificateProviderStore when the refcount reaches zero.
64
+ class CertificateProviderWrapper : public grpc_tls_certificate_provider {
65
+ public:
66
+ CertificateProviderWrapper(
67
+ RefCountedPtr<grpc_tls_certificate_provider> certificate_provider,
68
+ RefCountedPtr<CertificateProviderStore> store, absl::string_view key)
69
+ : certificate_provider_(std::move(certificate_provider)),
70
+ store_(std::move(store)),
71
+ key_(key) {}
72
+
73
+ ~CertificateProviderWrapper() override {
74
+ store_->ReleaseCertificateProvider(key_, this);
75
+ }
76
+
77
+ grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor()
78
+ const override {
79
+ return certificate_provider_->distributor();
80
+ }
81
+
82
+ grpc_pollset_set* interested_parties() const override {
83
+ return certificate_provider_->interested_parties();
84
+ }
85
+
86
+ absl::string_view key() const { return key_; }
87
+
88
+ private:
89
+ RefCountedPtr<grpc_tls_certificate_provider> certificate_provider_;
90
+ RefCountedPtr<CertificateProviderStore> store_;
91
+ absl::string_view key_;
92
+ };
93
+
94
+ RefCountedPtr<CertificateProviderWrapper> CreateCertificateProviderLocked(
95
+ absl::string_view key);
96
+
97
+ // Releases a previously created certificate provider from the certificate
98
+ // provider map if the value matches \a wrapper.
99
+ void ReleaseCertificateProvider(absl::string_view key,
100
+ CertificateProviderWrapper* wrapper);
101
+
102
+ Mutex mu_;
103
+ // Map of plugin configurations
104
+ PluginDefinitionMap plugin_config_map_;
105
+ // Underlying map for the providers.
106
+ std::map<absl::string_view, CertificateProviderWrapper*>
107
+ certificate_providers_map_;
108
+ };
109
+
110
+ } // namespace grpc_core
111
+
112
+ #endif // GRPC_CORE_EXT_XDS_CERTIFICATE_PROVIDER_STORE_H
@@ -0,0 +1,144 @@
1
+ //
2
+ //
3
+ // Copyright 2020 gRPC authors.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 (the "License");
6
+ // you may not use this file except in compliance with the License.
7
+ // You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing, software
12
+ // distributed under the License is distributed on an "AS IS" BASIS,
13
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ // See the License for the specific language governing permissions and
15
+ // limitations under the License.
16
+ //
17
+ //
18
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/ext/xds/file_watcher_certificate_provider_factory.h"
22
+
23
+ #include "absl/strings/str_format.h"
24
+ #include "absl/strings/str_join.h"
25
+
26
+ #include "src/core/ext/xds/certificate_provider_registry.h"
27
+ #include "src/core/lib/json/json_util.h"
28
+
29
+ namespace grpc_core {
30
+
31
+ namespace {
32
+
33
+ const char* kFileWatcherPlugin = "file_watcher";
34
+
35
+ } // namespace
36
+
37
+ //
38
+ // FileWatcherCertificateProviderFactory::Config
39
+ //
40
+
41
+ const char* FileWatcherCertificateProviderFactory::Config::name() const {
42
+ return kFileWatcherPlugin;
43
+ }
44
+
45
+ std::string FileWatcherCertificateProviderFactory::Config::ToString() const {
46
+ std::vector<std::string> parts;
47
+ parts.push_back("{");
48
+ if (!identity_cert_file_.empty()) {
49
+ parts.push_back(
50
+ absl::StrFormat("certificate_file=\"%s\", ", identity_cert_file_));
51
+ }
52
+ if (!identity_cert_file_.empty()) {
53
+ parts.push_back(
54
+ absl::StrFormat("private_key_file=\"%s\", ", private_key_file_));
55
+ }
56
+ if (!identity_cert_file_.empty()) {
57
+ parts.push_back(
58
+ absl::StrFormat("ca_certificate_file=\"%s\", ", root_cert_file_));
59
+ }
60
+ parts.push_back(
61
+ absl::StrFormat("refresh_interval=%ldms}", refresh_interval_ms_));
62
+ return absl::StrJoin(parts, "");
63
+ }
64
+
65
+ RefCountedPtr<FileWatcherCertificateProviderFactory::Config>
66
+ FileWatcherCertificateProviderFactory::Config::Parse(const Json& config_json,
67
+ grpc_error** error) {
68
+ auto config = MakeRefCounted<FileWatcherCertificateProviderFactory::Config>();
69
+ if (config_json.type() != Json::Type::OBJECT) {
70
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
71
+ "error:config type should be OBJECT.");
72
+ return nullptr;
73
+ }
74
+ std::vector<grpc_error*> error_list;
75
+ ParseJsonObjectField(config_json.object_value(), "certificate_file",
76
+ &config->identity_cert_file_, &error_list, false);
77
+ ParseJsonObjectField(config_json.object_value(), "private_key_file",
78
+ &config->private_key_file_, &error_list, false);
79
+ if (config->identity_cert_file_.empty() !=
80
+ config->private_key_file_.empty()) {
81
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
82
+ "fields \"certificate_file\" and \"private_key_file\" must be both set "
83
+ "or both unset."));
84
+ }
85
+ ParseJsonObjectField(config_json.object_value(), "ca_certificate_file",
86
+ &config->root_cert_file_, &error_list, false);
87
+ if (config->identity_cert_file_.empty() && config->root_cert_file_.empty()) {
88
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
89
+ "At least one of \"certificate_file\" and \"ca_certificate_file\" must "
90
+ "be specified."));
91
+ }
92
+ if (!ParseJsonObjectFieldAsDuration(
93
+ config_json.object_value(), "refresh_interval",
94
+ &config->refresh_interval_ms_, &error_list, false)) {
95
+ config->refresh_interval_ms_ = 10 * 60 * 1000; // 10 minutes default
96
+ }
97
+ if (!error_list.empty()) {
98
+ *error = GRPC_ERROR_CREATE_FROM_VECTOR(
99
+ "Error parsing file watcher certificate provider config", &error_list);
100
+ return nullptr;
101
+ }
102
+ return config;
103
+ }
104
+
105
+ //
106
+ // FileWatcherCertificateProviderFactory
107
+ //
108
+
109
+ const char* FileWatcherCertificateProviderFactory::name() const {
110
+ return kFileWatcherPlugin;
111
+ }
112
+
113
+ RefCountedPtr<CertificateProviderFactory::Config>
114
+ FileWatcherCertificateProviderFactory::CreateCertificateProviderConfig(
115
+ const Json& config_json, grpc_error** error) {
116
+ return FileWatcherCertificateProviderFactory::Config::Parse(config_json,
117
+ error);
118
+ }
119
+
120
+ RefCountedPtr<grpc_tls_certificate_provider>
121
+ FileWatcherCertificateProviderFactory::CreateCertificateProvider(
122
+ RefCountedPtr<CertificateProviderFactory::Config> config) {
123
+ if (config->name() != name()) {
124
+ gpr_log(GPR_ERROR, "Wrong config type Actual:%s vs Expected:%s",
125
+ config->name(), name());
126
+ return nullptr;
127
+ }
128
+ auto* file_watcher_config =
129
+ static_cast<FileWatcherCertificateProviderFactory::Config*>(config.get());
130
+ return MakeRefCounted<FileWatcherCertificateProvider>(
131
+ file_watcher_config->private_key_file(),
132
+ file_watcher_config->identity_cert_file(),
133
+ file_watcher_config->root_cert_file(),
134
+ file_watcher_config->refresh_interval_ms() / GPR_MS_PER_SEC);
135
+ }
136
+
137
+ void FileWatcherCertificateProviderInit() {
138
+ CertificateProviderRegistry::RegisterCertificateProviderFactory(
139
+ absl::make_unique<FileWatcherCertificateProviderFactory>());
140
+ }
141
+
142
+ void FileWatcherCertificateProviderShutdown() {}
143
+
144
+ } // namespace grpc_core
@@ -0,0 +1,69 @@
1
+ //
2
+ //
3
+ // Copyright 2020 gRPC authors.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 (the "License");
6
+ // you may not use this file except in compliance with the License.
7
+ // You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing, software
12
+ // distributed under the License is distributed on an "AS IS" BASIS,
13
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ // See the License for the specific language governing permissions and
15
+ // limitations under the License.
16
+ //
17
+ //
18
+
19
+ #ifndef GRPC_CORE_EXT_XDS_FILE_WATCHER_CERTIFICATE_PROVIDER_FACTORY_H
20
+ #define GRPC_CORE_EXT_XDS_FILE_WATCHER_CERTIFICATE_PROVIDER_FACTORY_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include "src/core/ext/xds/certificate_provider_factory.h"
25
+
26
+ namespace grpc_core {
27
+
28
+ class FileWatcherCertificateProviderFactory
29
+ : public CertificateProviderFactory {
30
+ public:
31
+ class Config : public CertificateProviderFactory::Config {
32
+ public:
33
+ static RefCountedPtr<Config> Parse(const Json& config_json,
34
+ grpc_error** error);
35
+
36
+ const char* name() const override;
37
+
38
+ std::string ToString() const override;
39
+
40
+ const std::string& identity_cert_file() const {
41
+ return identity_cert_file_;
42
+ }
43
+
44
+ const std::string& private_key_file() const { return private_key_file_; }
45
+
46
+ const std::string& root_cert_file() const { return root_cert_file_; }
47
+
48
+ grpc_millis refresh_interval_ms() const { return refresh_interval_ms_; }
49
+
50
+ private:
51
+ std::string identity_cert_file_;
52
+ std::string private_key_file_;
53
+ std::string root_cert_file_;
54
+ grpc_millis refresh_interval_ms_;
55
+ };
56
+
57
+ const char* name() const override;
58
+
59
+ RefCountedPtr<CertificateProviderFactory::Config>
60
+ CreateCertificateProviderConfig(const Json& config_json,
61
+ grpc_error** error) override;
62
+
63
+ RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
64
+ RefCountedPtr<CertificateProviderFactory::Config> config) override;
65
+ };
66
+
67
+ } // namespace grpc_core
68
+
69
+ #endif // GRPC_CORE_EXT_XDS_FILE_WATCHER_CERTIFICATE_PROVIDER_FACTORY_H
@@ -39,29 +39,46 @@
39
39
  #include "src/core/lib/gpr/env.h"
40
40
  #include "src/core/lib/gpr/string.h"
41
41
  #include "src/core/lib/gpr/useful.h"
42
+ #include "src/core/lib/gprpp/host_port.h"
42
43
  #include "src/core/lib/iomgr/error.h"
43
44
  #include "src/core/lib/iomgr/sockaddr_utils.h"
45
+ #include "src/core/lib/slice/slice_utils.h"
44
46
 
47
+ #include "envoy/config/cluster/v3/circuit_breaker.upb.h"
45
48
  #include "envoy/config/cluster/v3/cluster.upb.h"
49
+ #include "envoy/config/cluster/v3/cluster.upbdefs.h"
46
50
  #include "envoy/config/core/v3/address.upb.h"
47
51
  #include "envoy/config/core/v3/base.upb.h"
48
52
  #include "envoy/config/core/v3/config_source.upb.h"
49
53
  #include "envoy/config/core/v3/health_check.upb.h"
54
+ #include "envoy/config/core/v3/protocol.upb.h"
50
55
  #include "envoy/config/endpoint/v3/endpoint.upb.h"
56
+ #include "envoy/config/endpoint/v3/endpoint.upbdefs.h"
51
57
  #include "envoy/config/endpoint/v3/endpoint_components.upb.h"
52
58
  #include "envoy/config/endpoint/v3/load_report.upb.h"
53
59
  #include "envoy/config/listener/v3/api_listener.upb.h"
54
60
  #include "envoy/config/listener/v3/listener.upb.h"
61
+ #include "envoy/config/listener/v3/listener_components.upb.h"
55
62
  #include "envoy/config/route/v3/route.upb.h"
63
+ #include "envoy/config/route/v3/route.upbdefs.h"
56
64
  #include "envoy/config/route/v3/route_components.upb.h"
65
+ #include "envoy/extensions/clusters/aggregate/v3/cluster.upb.h"
57
66
  #include "envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h"
67
+ #include "envoy/extensions/transport_sockets/tls/v3/common.upb.h"
68
+ #include "envoy/extensions/transport_sockets/tls/v3/tls.upb.h"
58
69
  #include "envoy/service/cluster/v3/cds.upb.h"
70
+ #include "envoy/service/cluster/v3/cds.upbdefs.h"
59
71
  #include "envoy/service/discovery/v3/discovery.upb.h"
72
+ #include "envoy/service/discovery/v3/discovery.upbdefs.h"
60
73
  #include "envoy/service/endpoint/v3/eds.upb.h"
74
+ #include "envoy/service/endpoint/v3/eds.upbdefs.h"
61
75
  #include "envoy/service/listener/v3/lds.upb.h"
62
76
  #include "envoy/service/load_stats/v3/lrs.upb.h"
77
+ #include "envoy/service/load_stats/v3/lrs.upbdefs.h"
63
78
  #include "envoy/service/route/v3/rds.upb.h"
79
+ #include "envoy/service/route/v3/rds.upbdefs.h"
64
80
  #include "envoy/type/matcher/v3/regex.upb.h"
81
+ #include "envoy/type/matcher/v3/string.upb.h"
65
82
  #include "envoy/type/v3/percent.upb.h"
66
83
  #include "envoy/type/v3/range.upb.h"
67
84
  #include "google/protobuf/any.upb.h"
@@ -69,156 +86,55 @@
69
86
  #include "google/protobuf/struct.upb.h"
70
87
  #include "google/protobuf/wrappers.upb.h"
71
88
  #include "google/rpc/status.upb.h"
89
+ #include "upb/text_encode.h"
72
90
  #include "upb/upb.h"
73
91
 
74
92
  namespace grpc_core {
75
93
 
76
- //
77
- // XdsApi::Route::Matchers::PathMatcher
78
- //
79
-
80
- XdsApi::Route::Matchers::PathMatcher::PathMatcher(const PathMatcher& other)
81
- : type(other.type) {
82
- if (type == PathMatcherType::REGEX) {
83
- regex_matcher = absl::make_unique<RE2>(other.regex_matcher->pattern());
84
- } else {
85
- string_matcher = other.string_matcher;
86
- }
87
- }
88
-
89
- XdsApi::Route::Matchers::PathMatcher& XdsApi::Route::Matchers::PathMatcher::
90
- operator=(const PathMatcher& other) {
91
- type = other.type;
92
- if (type == PathMatcherType::REGEX) {
93
- regex_matcher = absl::make_unique<RE2>(other.regex_matcher->pattern());
94
- } else {
95
- string_matcher = other.string_matcher;
96
- }
97
- return *this;
98
- }
99
-
100
- bool XdsApi::Route::Matchers::PathMatcher::operator==(
101
- const PathMatcher& other) const {
102
- if (type != other.type) return false;
103
- if (type == PathMatcherType::REGEX) {
104
- // Should never be null.
105
- if (regex_matcher == nullptr || other.regex_matcher == nullptr) {
106
- return false;
107
- }
108
- return regex_matcher->pattern() == other.regex_matcher->pattern();
109
- }
110
- return string_matcher == other.string_matcher;
111
- }
112
-
113
- std::string XdsApi::Route::Matchers::PathMatcher::ToString() const {
114
- std::string path_type_string;
115
- switch (type) {
116
- case PathMatcherType::PATH:
117
- path_type_string = "path match";
118
- break;
119
- case PathMatcherType::PREFIX:
120
- path_type_string = "prefix match";
121
- break;
122
- case PathMatcherType::REGEX:
123
- path_type_string = "regex match";
124
- break;
125
- default:
126
- break;
127
- }
128
- return absl::StrFormat("Path %s:%s", path_type_string,
129
- type == PathMatcherType::REGEX
130
- ? regex_matcher->pattern()
131
- : string_matcher);
132
- }
133
-
134
- //
135
- // XdsApi::Route::Matchers::HeaderMatcher
136
- //
137
-
138
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcher(
139
- const HeaderMatcher& other)
140
- : name(other.name), type(other.type), invert_match(other.invert_match) {
141
- switch (type) {
142
- case HeaderMatcherType::REGEX:
143
- regex_match = absl::make_unique<RE2>(other.regex_match->pattern());
144
- break;
145
- case HeaderMatcherType::RANGE:
146
- range_start = other.range_start;
147
- range_end = other.range_end;
148
- break;
149
- case HeaderMatcherType::PRESENT:
150
- present_match = other.present_match;
151
- break;
152
- default:
153
- string_matcher = other.string_matcher;
154
- }
155
- }
156
-
157
- XdsApi::Route::Matchers::HeaderMatcher& XdsApi::Route::Matchers::HeaderMatcher::
158
- operator=(const HeaderMatcher& other) {
159
- name = other.name;
160
- type = other.type;
161
- invert_match = other.invert_match;
162
- switch (type) {
163
- case HeaderMatcherType::REGEX:
164
- regex_match = absl::make_unique<RE2>(other.regex_match->pattern());
165
- break;
166
- case HeaderMatcherType::RANGE:
167
- range_start = other.range_start;
168
- range_end = other.range_end;
169
- break;
170
- case HeaderMatcherType::PRESENT:
171
- present_match = other.present_match;
172
- break;
173
- default:
174
- string_matcher = other.string_matcher;
175
- }
176
- return *this;
177
- }
178
-
179
- bool XdsApi::Route::Matchers::HeaderMatcher::operator==(
180
- const HeaderMatcher& other) const {
181
- if (name != other.name) return false;
182
- if (type != other.type) return false;
183
- if (invert_match != other.invert_match) return false;
184
- switch (type) {
185
- case HeaderMatcherType::REGEX:
186
- return regex_match->pattern() != other.regex_match->pattern();
187
- case HeaderMatcherType::RANGE:
188
- return range_start != other.range_start && range_end != other.range_end;
189
- case HeaderMatcherType::PRESENT:
190
- return present_match != other.present_match;
191
- default:
192
- return string_matcher != other.string_matcher;
193
- }
194
- }
195
-
196
- std::string XdsApi::Route::Matchers::HeaderMatcher::ToString() const {
197
- switch (type) {
198
- case HeaderMatcherType::EXACT:
199
- return absl::StrFormat("Header exact match:%s %s:%s",
200
- invert_match ? " not" : "", name, string_matcher);
201
- case HeaderMatcherType::REGEX:
202
- return absl::StrFormat("Header regex match:%s %s:%s",
203
- invert_match ? " not" : "", name,
204
- regex_match->pattern());
205
- case HeaderMatcherType::RANGE:
206
- return absl::StrFormat("Header range match:%s %s:[%d, %d)",
207
- invert_match ? " not" : "", name, range_start,
208
- range_end);
209
- case HeaderMatcherType::PRESENT:
210
- return absl::StrFormat("Header present match:%s %s:%s",
211
- invert_match ? " not" : "", name,
212
- present_match ? "true" : "false");
213
- case HeaderMatcherType::PREFIX:
214
- return absl::StrFormat("Header prefix match:%s %s:%s",
215
- invert_match ? " not" : "", name, string_matcher);
216
- case HeaderMatcherType::SUFFIX:
217
- return absl::StrFormat("Header suffix match:%s %s:%s",
218
- invert_match ? " not" : "", name, string_matcher);
219
- default:
220
- return "";
221
- }
94
+ // TODO(donnadionne): Check to see if timeout is enabled, this will be
95
+ // removed once timeout feature is fully integration-tested and enabled by
96
+ // default.
97
+ bool XdsTimeoutEnabled() {
98
+ char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT");
99
+ bool parsed_value;
100
+ bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
101
+ gpr_free(value);
102
+ return parse_succeeded && parsed_value;
103
+ }
104
+
105
+ // TODO(donnadionne): Check to see if cluster types aggregate_cluster and
106
+ // logical_dns are enabled, this will be
107
+ // removed once the cluster types are fully integration-tested and enabled by
108
+ // default.
109
+ bool XdsAggregateAndLogicalDnsClusterEnabled() {
110
+ char* value = gpr_getenv(
111
+ "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER");
112
+ bool parsed_value;
113
+ bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
114
+ gpr_free(value);
115
+ return parse_succeeded && parsed_value;
116
+ }
117
+
118
+ // TODO(donnadionne): Check to see if ring hash policy is enabled, this will be
119
+ // removed once ring hash policy is fully integration-tested and enabled by
120
+ // default.
121
+ bool XdsRingHashEnabled() {
122
+ char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
123
+ bool parsed_value;
124
+ bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
125
+ gpr_free(value);
126
+ return parse_succeeded && parsed_value;
127
+ }
128
+
129
+ // TODO(yashykt): Check to see if xDS security is enabled. This will be
130
+ // removed once this feature is fully integration-tested and enabled by
131
+ // default.
132
+ bool XdsSecurityEnabled() {
133
+ char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT");
134
+ bool parsed_value;
135
+ bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
136
+ gpr_free(value);
137
+ return parse_succeeded && parsed_value;
222
138
  }
223
139
 
224
140
  //
@@ -227,9 +143,10 @@ std::string XdsApi::Route::Matchers::HeaderMatcher::ToString() const {
227
143
 
228
144
  std::string XdsApi::Route::Matchers::ToString() const {
229
145
  std::vector<std::string> contents;
230
- contents.push_back(path_matcher.ToString());
231
- for (const auto& header_it : header_matchers) {
232
- contents.push_back(header_it.ToString());
146
+ contents.push_back(
147
+ absl::StrFormat("PathMatcher{%s}", path_matcher.ToString()));
148
+ for (const HeaderMatcher& header_matcher : header_matchers) {
149
+ contents.push_back(header_matcher.ToString());
233
150
  }
234
151
  if (fraction_per_million.has_value()) {
235
152
  contents.push_back(absl::StrFormat("Fraction Per Million %d",
@@ -248,8 +165,11 @@ std::string XdsApi::Route::ToString() const {
248
165
  if (!cluster_name.empty()) {
249
166
  contents.push_back(absl::StrFormat("Cluster name: %s", cluster_name));
250
167
  }
251
- for (const auto& weighted_it : weighted_clusters) {
252
- contents.push_back(weighted_it.ToString());
168
+ for (const ClusterWeight& cluster_weight : weighted_clusters) {
169
+ contents.push_back(cluster_weight.ToString());
170
+ }
171
+ if (max_stream_duration.has_value()) {
172
+ contents.push_back(max_stream_duration->ToString());
253
173
  }
254
174
  return absl::StrJoin(contents, "\n");
255
175
  }
@@ -290,9 +210,11 @@ enum MatchType {
290
210
  };
291
211
 
292
212
  // Returns true if match succeeds.
293
- bool DomainMatch(MatchType match_type, std::string domain_pattern,
294
- std::string expected_host_name) {
213
+ bool DomainMatch(MatchType match_type, const std::string& domain_pattern_in,
214
+ const std::string& expected_host_name_in) {
295
215
  // Normalize the args to lower-case. Domain matching is case-insensitive.
216
+ std::string domain_pattern = domain_pattern_in;
217
+ std::string expected_host_name = expected_host_name_in;
296
218
  std::transform(domain_pattern.begin(), domain_pattern.end(),
297
219
  domain_pattern.begin(),
298
220
  [](unsigned char c) { return std::tolower(c); });
@@ -333,8 +255,8 @@ MatchType DomainPatternMatchType(const std::string& domain_pattern) {
333
255
 
334
256
  } // namespace
335
257
 
336
- const XdsApi::RdsUpdate::VirtualHost*
337
- XdsApi::RdsUpdate::FindVirtualHostForDomain(const std::string& domain) const {
258
+ XdsApi::RdsUpdate::VirtualHost* XdsApi::RdsUpdate::FindVirtualHostForDomain(
259
+ const std::string& domain) {
338
260
  // Find the best matched virtual host.
339
261
  // The search order for 4 groups of domain patterns:
340
262
  // 1. Exact match.
@@ -344,12 +266,12 @@ XdsApi::RdsUpdate::FindVirtualHostForDomain(const std::string& domain) const {
344
266
  // Within each group, longest match wins.
345
267
  // If the same best matched domain pattern appears in multiple virtual hosts,
346
268
  // the first matched virtual host wins.
347
- const VirtualHost* target_vhost = nullptr;
269
+ VirtualHost* target_vhost = nullptr;
348
270
  MatchType best_match_type = INVALID_MATCH;
349
271
  size_t longest_match = 0;
350
272
  // Check each domain pattern in each virtual host to determine the best
351
273
  // matched virtual host.
352
- for (const VirtualHost& vhost : virtual_hosts) {
274
+ for (VirtualHost& vhost : virtual_hosts) {
353
275
  for (const std::string& domain_pattern : vhost.domains) {
354
276
  // Check the match type first. Skip the pattern if it's not better than
355
277
  // current match.
@@ -375,49 +297,192 @@ XdsApi::RdsUpdate::FindVirtualHostForDomain(const std::string& domain) const {
375
297
  }
376
298
 
377
299
  //
378
- // XdsApi::PriorityListUpdate
300
+ // XdsApi::CommonTlsContext::CertificateValidationContext
379
301
  //
380
302
 
381
- bool XdsApi::PriorityListUpdate::operator==(
382
- const XdsApi::PriorityListUpdate& other) const {
383
- if (priorities_.size() != other.priorities_.size()) return false;
384
- for (size_t i = 0; i < priorities_.size(); ++i) {
385
- if (priorities_[i].localities != other.priorities_[i].localities) {
386
- return false;
387
- }
303
+ std::string XdsApi::CommonTlsContext::CertificateValidationContext::ToString()
304
+ const {
305
+ std::vector<std::string> contents;
306
+ for (const auto& match : match_subject_alt_names) {
307
+ contents.push_back(match.ToString());
388
308
  }
389
- return true;
309
+ return absl::StrFormat("{match_subject_alt_names=[%s]}",
310
+ absl::StrJoin(contents, ", "));
390
311
  }
391
312
 
392
- void XdsApi::PriorityListUpdate::Add(
393
- XdsApi::PriorityListUpdate::LocalityMap::Locality locality) {
394
- // Pad the missing priorities in case the localities are not ordered by
395
- // priority.
396
- if (!Contains(locality.priority)) priorities_.resize(locality.priority + 1);
397
- LocalityMap& locality_map = priorities_[locality.priority];
398
- locality_map.localities.emplace(locality.name, std::move(locality));
313
+ bool XdsApi::CommonTlsContext::CertificateValidationContext::Empty() const {
314
+ return match_subject_alt_names.empty();
399
315
  }
400
316
 
401
- const XdsApi::PriorityListUpdate::LocalityMap* XdsApi::PriorityListUpdate::Find(
402
- uint32_t priority) const {
403
- if (!Contains(priority)) return nullptr;
404
- return &priorities_[priority];
317
+ //
318
+ // XdsApi::CommonTlsContext::CertificateValidationContext
319
+ //
320
+
321
+ std::string XdsApi::CommonTlsContext::CertificateProviderInstance::ToString()
322
+ const {
323
+ absl::InlinedVector<std::string, 2> contents;
324
+ if (!instance_name.empty()) {
325
+ contents.push_back(absl::StrFormat("instance_name=%s", instance_name));
326
+ }
327
+ if (!certificate_name.empty()) {
328
+ contents.push_back(
329
+ absl::StrFormat("certificate_name=%s", certificate_name));
330
+ }
331
+ return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
405
332
  }
406
333
 
407
- bool XdsApi::PriorityListUpdate::Contains(
408
- const RefCountedPtr<XdsLocalityName>& name) {
409
- for (size_t i = 0; i < priorities_.size(); ++i) {
410
- const LocalityMap& locality_map = priorities_[i];
411
- if (locality_map.Contains(name)) return true;
334
+ bool XdsApi::CommonTlsContext::CertificateProviderInstance::Empty() const {
335
+ return instance_name.empty() && certificate_name.empty();
336
+ }
337
+
338
+ //
339
+ // XdsApi::CommonTlsContext::CombinedCertificateValidationContext
340
+ //
341
+
342
+ std::string
343
+ XdsApi::CommonTlsContext::CombinedCertificateValidationContext::ToString()
344
+ const {
345
+ absl::InlinedVector<std::string, 2> contents;
346
+ if (!default_validation_context.Empty()) {
347
+ contents.push_back(absl::StrFormat("default_validation_context=%s",
348
+ default_validation_context.ToString()));
412
349
  }
413
- return false;
350
+ if (!validation_context_certificate_provider_instance.Empty()) {
351
+ contents.push_back(absl::StrFormat(
352
+ "validation_context_certificate_provider_instance=%s",
353
+ validation_context_certificate_provider_instance.ToString()));
354
+ }
355
+ return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
356
+ }
357
+
358
+ bool XdsApi::CommonTlsContext::CombinedCertificateValidationContext::Empty()
359
+ const {
360
+ return default_validation_context.Empty() &&
361
+ validation_context_certificate_provider_instance.Empty();
362
+ }
363
+
364
+ //
365
+ // XdsApi::CommonTlsContext
366
+ //
367
+
368
+ std::string XdsApi::CommonTlsContext::ToString() const {
369
+ absl::InlinedVector<std::string, 2> contents;
370
+ if (!tls_certificate_certificate_provider_instance.Empty()) {
371
+ contents.push_back(absl::StrFormat(
372
+ "tls_certificate_certificate_provider_instance=%s",
373
+ tls_certificate_certificate_provider_instance.ToString()));
374
+ }
375
+ if (!combined_validation_context.Empty()) {
376
+ contents.push_back(absl::StrFormat("combined_validation_context=%s",
377
+ combined_validation_context.ToString()));
378
+ }
379
+ return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
380
+ }
381
+
382
+ bool XdsApi::CommonTlsContext::Empty() const {
383
+ return tls_certificate_certificate_provider_instance.Empty() &&
384
+ combined_validation_context.Empty();
414
385
  }
415
386
 
416
387
  //
417
- // XdsApi::DropConfig
388
+ // XdsApi::DownstreamTlsContext
418
389
  //
419
390
 
420
- bool XdsApi::DropConfig::ShouldDrop(const std::string** category_name) const {
391
+ std::string XdsApi::DownstreamTlsContext::ToString() const {
392
+ return absl::StrFormat("common_tls_context=%s, require_client_certificate=%s",
393
+ common_tls_context.ToString(),
394
+ require_client_certificate ? "true" : "false");
395
+ }
396
+
397
+ bool XdsApi::DownstreamTlsContext::Empty() const {
398
+ return common_tls_context.Empty();
399
+ }
400
+
401
+ //
402
+ // XdsApi::LdsUpdate
403
+ //
404
+
405
+ std::string XdsApi::LdsUpdate::ToString() const {
406
+ absl::InlinedVector<std::string, 3> contents;
407
+ if (type == ListenerType::kTcpListener) {
408
+ if (!downstream_tls_context.Empty()) {
409
+ contents.push_back(absl::StrFormat("downstream_tls_context=%s",
410
+ downstream_tls_context.ToString()));
411
+ }
412
+ } else if (type == ListenerType::kHttpApiListener) {
413
+ contents.push_back(absl::StrFormat(
414
+ "route_config_name=%s",
415
+ !route_config_name.empty() ? route_config_name.c_str() : "<inlined>"));
416
+ contents.push_back(absl::StrFormat("http_max_stream_duration=%s",
417
+ http_max_stream_duration.ToString()));
418
+ if (rds_update.has_value()) {
419
+ contents.push_back(
420
+ absl::StrFormat("rds_update=%s", rds_update->ToString()));
421
+ }
422
+ }
423
+ return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
424
+ }
425
+
426
+ //
427
+ // XdsApi::CdsUpdate
428
+ //
429
+
430
+ std::string XdsApi::CdsUpdate::ToString() const {
431
+ absl::InlinedVector<std::string, 4> contents;
432
+ if (!eds_service_name.empty()) {
433
+ contents.push_back(
434
+ absl::StrFormat("eds_service_name=%s", eds_service_name));
435
+ }
436
+ if (!common_tls_context.Empty()) {
437
+ contents.push_back(absl::StrFormat("common_tls_context=%s",
438
+ common_tls_context.ToString()));
439
+ }
440
+ if (lrs_load_reporting_server_name.has_value()) {
441
+ contents.push_back(absl::StrFormat("lrs_load_reporting_server_name=%s",
442
+ lrs_load_reporting_server_name.value()));
443
+ }
444
+ contents.push_back(
445
+ absl::StrFormat("max_concurrent_requests=%d", max_concurrent_requests));
446
+ return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
447
+ }
448
+
449
+ //
450
+ // XdsApi::EdsUpdate
451
+ //
452
+
453
+ std::string XdsApi::EdsUpdate::Priority::Locality::ToString() const {
454
+ std::vector<std::string> endpoint_strings;
455
+ for (const ServerAddress& endpoint : endpoints) {
456
+ endpoint_strings.emplace_back(endpoint.ToString());
457
+ }
458
+ return absl::StrCat("{name=", name->AsHumanReadableString(),
459
+ ", lb_weight=", lb_weight, ", endpoints=[",
460
+ absl::StrJoin(endpoint_strings, ", "), "]}");
461
+ }
462
+
463
+ bool XdsApi::EdsUpdate::Priority::operator==(const Priority& other) const {
464
+ if (localities.size() != other.localities.size()) return false;
465
+ auto it1 = localities.begin();
466
+ auto it2 = other.localities.begin();
467
+ while (it1 != localities.end()) {
468
+ if (*it1->first != *it2->first) return false;
469
+ if (it1->second != it2->second) return false;
470
+ ++it1;
471
+ ++it2;
472
+ }
473
+ return true;
474
+ }
475
+
476
+ std::string XdsApi::EdsUpdate::Priority::ToString() const {
477
+ std::vector<std::string> locality_strings;
478
+ for (const auto& p : localities) {
479
+ locality_strings.emplace_back(p.second.ToString());
480
+ }
481
+ return absl::StrCat("[", absl::StrJoin(locality_strings, ", "), "]");
482
+ }
483
+
484
+ bool XdsApi::EdsUpdate::DropConfig::ShouldDrop(
485
+ const std::string** category_name) const {
421
486
  for (size_t i = 0; i < drop_category_list_.size(); ++i) {
422
487
  const auto& drop_category = drop_category_list_[i];
423
488
  // Generate a random number in [0, 1000000).
@@ -430,6 +495,27 @@ bool XdsApi::DropConfig::ShouldDrop(const std::string** category_name) const {
430
495
  return false;
431
496
  }
432
497
 
498
+ std::string XdsApi::EdsUpdate::DropConfig::ToString() const {
499
+ std::vector<std::string> category_strings;
500
+ for (const DropCategory& category : drop_category_list_) {
501
+ category_strings.emplace_back(
502
+ absl::StrCat(category.name, "=", category.parts_per_million));
503
+ }
504
+ return absl::StrCat("{[", absl::StrJoin(category_strings, ", "),
505
+ "], drop_all=", drop_all_, "}");
506
+ }
507
+
508
+ std::string XdsApi::EdsUpdate::ToString() const {
509
+ std::vector<std::string> priority_strings;
510
+ for (size_t i = 0; i < priorities.size(); ++i) {
511
+ const Priority& priority = priorities[i];
512
+ priority_strings.emplace_back(
513
+ absl::StrCat("priority ", i, ": ", priority.ToString()));
514
+ }
515
+ return absl::StrCat("priorities=[", absl::StrJoin(priority_strings, ", "),
516
+ "], drop_config=", drop_config->ToString());
517
+ }
518
+
433
519
  //
434
520
  // XdsApi
435
521
  //
@@ -471,11 +557,10 @@ bool IsEds(absl::string_view type_url) {
471
557
  } // namespace
472
558
 
473
559
  XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
474
- const XdsBootstrap* bootstrap)
560
+ const XdsBootstrap::Node* node)
475
561
  : client_(client),
476
562
  tracer_(tracer),
477
- use_v3_(bootstrap != nullptr && bootstrap->server().ShouldUseV3()),
478
- bootstrap_(bootstrap),
563
+ node_(node),
479
564
  build_version_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING, " ",
480
565
  grpc_version_string())),
481
566
  user_agent_name_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING)) {}
@@ -576,12 +661,10 @@ void PopulateBuildVersion(upb_arena* arena, envoy_config_core_v3_Node* node_msg,
576
661
  encoded_build_version.size(), arena);
577
662
  }
578
663
 
579
- void PopulateNode(upb_arena* arena, const XdsBootstrap* bootstrap,
664
+ void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node, bool use_v3,
580
665
  const std::string& build_version,
581
666
  const std::string& user_agent_name,
582
- const std::string& server_name,
583
667
  envoy_config_core_v3_Node* node_msg) {
584
- const XdsBootstrap::Node* node = bootstrap->node();
585
668
  if (node != nullptr) {
586
669
  if (!node->id.empty()) {
587
670
  envoy_config_core_v3_Node_set_id(node_msg,
@@ -596,16 +679,6 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap* bootstrap,
596
679
  envoy_config_core_v3_Node_mutable_metadata(node_msg, arena);
597
680
  PopulateMetadata(arena, metadata, node->metadata.object_value());
598
681
  }
599
- if (!server_name.empty()) {
600
- google_protobuf_Struct* metadata =
601
- envoy_config_core_v3_Node_mutable_metadata(node_msg, arena);
602
- google_protobuf_Value* value = google_protobuf_Value_new(arena);
603
- google_protobuf_Value_set_string_value(value,
604
- StdStringToUpbString(server_name));
605
- google_protobuf_Struct_fields_set(
606
- metadata, upb_strview_makez("PROXYLESS_CLIENT_HOSTNAME"), value,
607
- arena);
608
- }
609
682
  if (!node->locality_region.empty() || !node->locality_zone.empty() ||
610
683
  !node->locality_subzone.empty()) {
611
684
  envoy_config_core_v3_Locality* locality =
@@ -624,7 +697,7 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap* bootstrap,
624
697
  }
625
698
  }
626
699
  }
627
- if (!bootstrap->server().ShouldUseV3()) {
700
+ if (!use_v3) {
628
701
  PopulateBuildVersion(arena, node_msg, build_version);
629
702
  }
630
703
  envoy_config_core_v3_Node_set_user_agent_name(
@@ -644,172 +717,17 @@ inline std::string UpbStringToStdString(const upb_strview& str) {
644
717
  return std::string(str.data, str.size);
645
718
  }
646
719
 
647
- inline void AddStringField(const char* name, const upb_strview& value,
648
- std::vector<std::string>* fields,
649
- bool add_if_empty = false) {
650
- if (value.size > 0 || add_if_empty) {
651
- fields->emplace_back(
652
- absl::StrCat(name, ": \"", UpbStringToAbsl(value), "\""));
653
- }
654
- }
655
-
656
- inline void AddUInt32ValueField(const char* name,
657
- const google_protobuf_UInt32Value* value,
658
- std::vector<std::string>* fields) {
659
- if (value != nullptr) {
660
- fields->emplace_back(absl::StrCat(
661
- name, " { value: ", google_protobuf_UInt32Value_value(value), " }"));
662
- }
663
- }
664
-
665
- inline void AddLocalityField(int indent_level,
666
- const envoy_config_core_v3_Locality* locality,
667
- std::vector<std::string>* fields) {
668
- std::string indent =
669
- absl::StrJoin(std::vector<std::string>(indent_level, " "), "");
670
- // region
671
- std::string field = absl::StrCat(indent, "region");
672
- AddStringField(field.c_str(), envoy_config_core_v3_Locality_region(locality),
673
- fields);
674
- // zone
675
- field = absl::StrCat(indent, "zone");
676
- AddStringField(field.c_str(), envoy_config_core_v3_Locality_zone(locality),
677
- fields);
678
- // sub_zone
679
- field = absl::StrCat(indent, "sub_zone");
680
- AddStringField(field.c_str(),
681
- envoy_config_core_v3_Locality_sub_zone(locality), fields);
682
- }
683
-
684
- void AddNodeLogFields(const envoy_config_core_v3_Node* node,
685
- const std::string& build_version,
686
- std::vector<std::string>* fields) {
687
- fields->emplace_back("node {");
688
- // id
689
- AddStringField(" id", envoy_config_core_v3_Node_id(node), fields);
690
- // metadata
691
- const google_protobuf_Struct* metadata =
692
- envoy_config_core_v3_Node_metadata(node);
693
- if (metadata != nullptr) {
694
- fields->emplace_back(" metadata {");
695
- size_t entry_idx = UPB_MAP_BEGIN;
696
- while (true) {
697
- const google_protobuf_Struct_FieldsEntry* entry =
698
- google_protobuf_Struct_fields_next(metadata, &entry_idx);
699
- if (entry == nullptr) break;
700
- fields->emplace_back(" field {");
701
- // key
702
- AddStringField(" key", google_protobuf_Struct_FieldsEntry_key(entry),
703
- fields);
704
- // value
705
- const google_protobuf_Value* value =
706
- google_protobuf_Struct_FieldsEntry_value(entry);
707
- if (value != nullptr) {
708
- std::string value_str;
709
- if (google_protobuf_Value_has_string_value(value)) {
710
- value_str = absl::StrCat(
711
- "string_value: \"",
712
- UpbStringToAbsl(google_protobuf_Value_string_value(value)), "\"");
713
- } else if (google_protobuf_Value_has_null_value(value)) {
714
- value_str = "null_value: NULL_VALUE";
715
- } else if (google_protobuf_Value_has_number_value(value)) {
716
- value_str = absl::StrCat("double_value: ",
717
- google_protobuf_Value_number_value(value));
718
- } else if (google_protobuf_Value_has_bool_value(value)) {
719
- value_str = absl::StrCat("bool_value: ",
720
- google_protobuf_Value_bool_value(value));
721
- } else if (google_protobuf_Value_has_struct_value(value)) {
722
- value_str = "struct_value: <not printed>";
723
- } else if (google_protobuf_Value_has_list_value(value)) {
724
- value_str = "list_value: <not printed>";
725
- } else {
726
- value_str = "<unknown>";
727
- }
728
- fields->emplace_back(absl::StrCat(" value { ", value_str, " }"));
729
- }
730
- fields->emplace_back(" }");
731
- }
732
- fields->emplace_back(" }");
733
- }
734
- // locality
735
- const envoy_config_core_v3_Locality* locality =
736
- envoy_config_core_v3_Node_locality(node);
737
- if (locality != nullptr) {
738
- fields->emplace_back(" locality {");
739
- AddLocalityField(2, locality, fields);
740
- fields->emplace_back(" }");
741
- }
742
- // build_version (doesn't exist in v3 proto; this is a horrible hack)
743
- if (!build_version.empty()) {
744
- fields->emplace_back(
745
- absl::StrCat(" build_version: \"", build_version, "\""));
746
- }
747
- // user_agent_name
748
- AddStringField(" user_agent_name",
749
- envoy_config_core_v3_Node_user_agent_name(node), fields);
750
- // user_agent_version
751
- AddStringField(" user_agent_version",
752
- envoy_config_core_v3_Node_user_agent_version(node), fields);
753
- // client_features
754
- size_t num_client_features;
755
- const upb_strview* client_features =
756
- envoy_config_core_v3_Node_client_features(node, &num_client_features);
757
- for (size_t i = 0; i < num_client_features; ++i) {
758
- AddStringField(" client_features", client_features[i], fields);
759
- }
760
- fields->emplace_back("}");
761
- }
762
-
763
720
  void MaybeLogDiscoveryRequest(
764
- XdsClient* client, TraceFlag* tracer,
765
- const envoy_service_discovery_v3_DiscoveryRequest* request,
766
- const std::string& build_version) {
721
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
722
+ const envoy_service_discovery_v3_DiscoveryRequest* request) {
767
723
  if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
768
724
  gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
769
- // TODO(roth): When we can upgrade upb, use upb textformat code to dump
770
- // the raw proto instead of doing this manually.
771
- std::vector<std::string> fields;
772
- // version_info
773
- AddStringField(
774
- "version_info",
775
- envoy_service_discovery_v3_DiscoveryRequest_version_info(request),
776
- &fields);
777
- // node
778
- const envoy_config_core_v3_Node* node =
779
- envoy_service_discovery_v3_DiscoveryRequest_node(request);
780
- if (node != nullptr) AddNodeLogFields(node, build_version, &fields);
781
- // resource_names
782
- size_t num_resource_names;
783
- const upb_strview* resource_names =
784
- envoy_service_discovery_v3_DiscoveryRequest_resource_names(
785
- request, &num_resource_names);
786
- for (size_t i = 0; i < num_resource_names; ++i) {
787
- AddStringField("resource_names", resource_names[i], &fields);
788
- }
789
- // type_url
790
- AddStringField(
791
- "type_url",
792
- envoy_service_discovery_v3_DiscoveryRequest_type_url(request), &fields);
793
- // response_nonce
794
- AddStringField(
795
- "response_nonce",
796
- envoy_service_discovery_v3_DiscoveryRequest_response_nonce(request),
797
- &fields);
798
- // error_detail
799
- const struct google_rpc_Status* error_detail =
800
- envoy_service_discovery_v3_DiscoveryRequest_error_detail(request);
801
- if (error_detail != nullptr) {
802
- fields.emplace_back("error_detail {");
803
- // code
804
- int32_t code = google_rpc_Status_code(error_detail);
805
- if (code != 0) fields.emplace_back(absl::StrCat(" code: ", code));
806
- // message
807
- AddStringField(" message", google_rpc_Status_message(error_detail),
808
- &fields);
809
- fields.emplace_back("}");
810
- }
725
+ const upb_msgdef* msg_type =
726
+ envoy_service_discovery_v3_DiscoveryRequest_getmsgdef(symtab);
727
+ char buf[10240];
728
+ upb_text_encode(request, msg_type, nullptr, 0, buf, sizeof(buf));
811
729
  gpr_log(GPR_DEBUG, "[xds_client %p] constructed ADS request: %s", client,
812
- absl::StrJoin(fields, "\n").c_str());
730
+ buf);
813
731
  }
814
732
  }
815
733
 
@@ -843,7 +761,7 @@ absl::string_view TypeUrlExternalToInternal(bool use_v3,
843
761
  } // namespace
844
762
 
845
763
  grpc_slice XdsApi::CreateAdsRequest(
846
- const std::string& type_url,
764
+ const XdsBootstrap::XdsServer& server, const std::string& type_url,
847
765
  const std::set<absl::string_view>& resource_names,
848
766
  const std::string& version, const std::string& nonce, grpc_error* error,
849
767
  bool populate_node) {
@@ -853,7 +771,7 @@ grpc_slice XdsApi::CreateAdsRequest(
853
771
  envoy_service_discovery_v3_DiscoveryRequest_new(arena.ptr());
854
772
  // Set type_url.
855
773
  absl::string_view real_type_url =
856
- TypeUrlExternalToInternal(use_v3_, type_url);
774
+ TypeUrlExternalToInternal(server.ShouldUseV3(), type_url);
857
775
  envoy_service_discovery_v3_DiscoveryRequest_set_type_url(
858
776
  request, StdStringToUpbString(real_type_url));
859
777
  // Set version_info.
@@ -868,17 +786,18 @@ grpc_slice XdsApi::CreateAdsRequest(
868
786
  }
869
787
  // Set error_detail if it's a NACK.
870
788
  if (error != GRPC_ERROR_NONE) {
871
- grpc_slice error_description_slice;
872
- GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION,
873
- &error_description_slice));
874
- upb_strview error_description_strview =
875
- upb_strview_make(reinterpret_cast<const char*>(
876
- GPR_SLICE_START_PTR(error_description_slice)),
877
- GPR_SLICE_LENGTH(error_description_slice));
878
789
  google_rpc_Status* error_detail =
879
790
  envoy_service_discovery_v3_DiscoveryRequest_mutable_error_detail(
880
791
  request, arena.ptr());
881
- google_rpc_Status_set_message(error_detail, error_description_strview);
792
+ // Hard-code INVALID_ARGUMENT as the status code.
793
+ // TODO(roth): If at some point we decide we care about this value,
794
+ // we could attach a status code to the individual errors where we
795
+ // generate them in the parsing code, and then use that here.
796
+ google_rpc_Status_set_code(error_detail, GRPC_STATUS_INVALID_ARGUMENT);
797
+ // Error description comes from the error that was passed in.
798
+ upb_strview error_description =
799
+ StdStringToUpbString(absl::string_view(grpc_error_string(error)));
800
+ google_rpc_Status_set_message(error_detail, error_description);
882
801
  GRPC_ERROR_UNREF(error);
883
802
  }
884
803
  // Populate node.
@@ -886,401 +805,87 @@ grpc_slice XdsApi::CreateAdsRequest(
886
805
  envoy_config_core_v3_Node* node_msg =
887
806
  envoy_service_discovery_v3_DiscoveryRequest_mutable_node(request,
888
807
  arena.ptr());
889
- PopulateNode(arena.ptr(), bootstrap_, build_version_, user_agent_name_, "",
890
- node_msg);
808
+ PopulateNode(arena.ptr(), node_, server.ShouldUseV3(), build_version_,
809
+ user_agent_name_, node_msg);
891
810
  }
892
811
  // Add resource_names.
893
812
  for (const auto& resource_name : resource_names) {
894
813
  envoy_service_discovery_v3_DiscoveryRequest_add_resource_names(
895
814
  request, StdStringToUpbString(resource_name), arena.ptr());
896
815
  }
897
- MaybeLogDiscoveryRequest(client_, tracer_, request, build_version_);
816
+ MaybeLogDiscoveryRequest(client_, tracer_, symtab_.ptr(), request);
898
817
  return SerializeDiscoveryRequest(arena.ptr(), request);
899
818
  }
900
819
 
901
820
  namespace {
902
821
 
903
822
  void MaybeLogDiscoveryResponse(
904
- XdsClient* client, TraceFlag* tracer,
823
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
905
824
  const envoy_service_discovery_v3_DiscoveryResponse* response) {
906
825
  if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
907
826
  gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
908
- // TODO(roth): When we can upgrade upb, use upb textformat code to dump
909
- // the raw proto instead of doing this manually.
910
- std::vector<std::string> fields;
911
- // version_info
912
- AddStringField(
913
- "version_info",
914
- envoy_service_discovery_v3_DiscoveryResponse_version_info(response),
915
- &fields);
916
- // resources
917
- size_t num_resources;
918
- envoy_service_discovery_v3_DiscoveryResponse_resources(response,
919
- &num_resources);
920
- fields.emplace_back(
921
- absl::StrCat("resources: <", num_resources, " element(s)>"));
922
- // type_url
923
- AddStringField(
924
- "type_url",
925
- envoy_service_discovery_v3_DiscoveryResponse_type_url(response),
926
- &fields);
927
- // nonce
928
- AddStringField("nonce",
929
- envoy_service_discovery_v3_DiscoveryResponse_nonce(response),
930
- &fields);
931
- gpr_log(GPR_DEBUG, "[xds_client %p] received response: %s", client,
932
- absl::StrJoin(fields, "\n").c_str());
827
+ const upb_msgdef* msg_type =
828
+ envoy_service_discovery_v3_DiscoveryResponse_getmsgdef(symtab);
829
+ char buf[10240];
830
+ upb_text_encode(response, msg_type, nullptr, 0, buf, sizeof(buf));
831
+ gpr_log(GPR_DEBUG, "[xds_client %p] received response: %s", client, buf);
933
832
  }
934
833
  }
935
834
 
936
835
  void MaybeLogRouteConfiguration(
937
- XdsClient* client, TraceFlag* tracer,
836
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
938
837
  const envoy_config_route_v3_RouteConfiguration* route_config) {
939
838
  if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
940
839
  gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
941
- // TODO(roth): When we can upgrade upb, use upb textformat code to dump
942
- // the raw proto instead of doing this manually.
943
- std::vector<std::string> fields;
944
- // name
945
- AddStringField("name",
946
- envoy_config_route_v3_RouteConfiguration_name(route_config),
947
- &fields);
948
- // virtual_hosts
949
- size_t num_virtual_hosts;
950
- const envoy_config_route_v3_VirtualHost* const* virtual_hosts =
951
- envoy_config_route_v3_RouteConfiguration_virtual_hosts(
952
- route_config, &num_virtual_hosts);
953
- for (size_t i = 0; i < num_virtual_hosts; ++i) {
954
- const auto* virtual_host = virtual_hosts[i];
955
- fields.push_back("virtual_hosts {");
956
- // name
957
- AddStringField(" name",
958
- envoy_config_route_v3_VirtualHost_name(virtual_host),
959
- &fields);
960
- // domains
961
- size_t num_domains;
962
- const upb_strview* const domains =
963
- envoy_config_route_v3_VirtualHost_domains(virtual_host, &num_domains);
964
- for (size_t j = 0; j < num_domains; ++j) {
965
- AddStringField(" domains", domains[j], &fields);
966
- }
967
- // routes
968
- size_t num_routes;
969
- const envoy_config_route_v3_Route* const* routes =
970
- envoy_config_route_v3_VirtualHost_routes(virtual_host, &num_routes);
971
- for (size_t j = 0; j < num_routes; ++j) {
972
- const auto* route = routes[j];
973
- fields.push_back(" route {");
974
- // name
975
- AddStringField(" name", envoy_config_route_v3_Route_name(route),
976
- &fields);
977
- // match
978
- const envoy_config_route_v3_RouteMatch* match =
979
- envoy_config_route_v3_Route_match(route);
980
- if (match != nullptr) {
981
- fields.emplace_back(" match {");
982
- // path matching
983
- if (envoy_config_route_v3_RouteMatch_has_prefix(match)) {
984
- AddStringField(" prefix",
985
- envoy_config_route_v3_RouteMatch_prefix(match),
986
- &fields,
987
- /*add_if_empty=*/true);
988
- } else if (envoy_config_route_v3_RouteMatch_has_path(match)) {
989
- AddStringField(" path",
990
- envoy_config_route_v3_RouteMatch_path(match),
991
- &fields,
992
- /*add_if_empty=*/true);
993
- } else if (envoy_config_route_v3_RouteMatch_has_safe_regex(match)) {
994
- fields.emplace_back(" safe_regex: <not printed>");
995
- } else {
996
- fields.emplace_back(" <unknown path matching type>");
997
- }
998
- // header matching
999
- size_t num_headers;
1000
- envoy_config_route_v3_RouteMatch_headers(match, &num_headers);
1001
- if (num_headers > 0) {
1002
- fields.emplace_back(
1003
- absl::StrCat(" headers: <", num_headers, " element(s)>"));
1004
- }
1005
- fields.emplace_back(" }");
1006
- }
1007
- // action
1008
- if (envoy_config_route_v3_Route_has_route(route)) {
1009
- const envoy_config_route_v3_RouteAction* action =
1010
- envoy_config_route_v3_Route_route(route);
1011
- fields.emplace_back(" route {");
1012
- if (envoy_config_route_v3_RouteAction_has_cluster(action)) {
1013
- AddStringField(" cluster",
1014
- envoy_config_route_v3_RouteAction_cluster(action),
1015
- &fields);
1016
- } else if (envoy_config_route_v3_RouteAction_has_cluster_header(
1017
- action)) {
1018
- AddStringField(
1019
- " cluster_header",
1020
- envoy_config_route_v3_RouteAction_cluster_header(action),
1021
- &fields);
1022
- } else if (envoy_config_route_v3_RouteAction_has_weighted_clusters(
1023
- action)) {
1024
- const envoy_config_route_v3_WeightedCluster* weighted_clusters =
1025
- envoy_config_route_v3_RouteAction_weighted_clusters(action);
1026
- fields.emplace_back(" weighted_clusters {");
1027
- size_t num_cluster_weights;
1028
- const envoy_config_route_v3_WeightedCluster_ClusterWeight* const*
1029
- cluster_weights =
1030
- envoy_config_route_v3_WeightedCluster_clusters(
1031
- weighted_clusters, &num_cluster_weights);
1032
- for (size_t i = 0; i < num_cluster_weights; ++i) {
1033
- const envoy_config_route_v3_WeightedCluster_ClusterWeight*
1034
- cluster_weight = cluster_weights[i];
1035
- fields.emplace_back(" clusters {");
1036
- AddStringField(
1037
- " name",
1038
- envoy_config_route_v3_WeightedCluster_ClusterWeight_name(
1039
- cluster_weight),
1040
- &fields);
1041
- AddUInt32ValueField(
1042
- " weight",
1043
- envoy_config_route_v3_WeightedCluster_ClusterWeight_weight(
1044
- cluster_weight),
1045
- &fields);
1046
- fields.emplace_back(" }");
1047
- }
1048
- AddUInt32ValueField(
1049
- " total_weight",
1050
- envoy_config_route_v3_WeightedCluster_total_weight(
1051
- weighted_clusters),
1052
- &fields);
1053
- fields.emplace_back(" }");
1054
- }
1055
- fields.emplace_back(" }");
1056
- } else if (envoy_config_route_v3_Route_has_redirect(route)) {
1057
- fields.emplace_back(" redirect: <not printed>");
1058
- } else if (envoy_config_route_v3_Route_has_direct_response(route)) {
1059
- fields.emplace_back(" direct_response: <not printed>");
1060
- } else if (envoy_config_route_v3_Route_has_filter_action(route)) {
1061
- fields.emplace_back(" filter_action: <not printed>");
1062
- }
1063
- fields.push_back(" }");
1064
- }
1065
- fields.push_back("}");
1066
- }
1067
- gpr_log(GPR_DEBUG, "[xds_client %p] RouteConfiguration: %s", client,
1068
- absl::StrJoin(fields, "\n").c_str());
840
+ const upb_msgdef* msg_type =
841
+ envoy_config_route_v3_RouteConfiguration_getmsgdef(symtab);
842
+ char buf[10240];
843
+ upb_text_encode(route_config, msg_type, nullptr, 0, buf, sizeof(buf));
844
+ gpr_log(GPR_DEBUG, "[xds_client %p] RouteConfiguration: %s", client, buf);
1069
845
  }
1070
846
  }
1071
847
 
1072
- void MaybeLogCluster(XdsClient* client, TraceFlag* tracer,
848
+ void MaybeLogCluster(XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
1073
849
  const envoy_config_cluster_v3_Cluster* cluster) {
1074
850
  if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
1075
851
  gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
1076
- // TODO(roth): When we can upgrade upb, use upb textformat code to dump
1077
- // the raw proto instead of doing this manually.
1078
- std::vector<std::string> fields;
1079
- // name
1080
- AddStringField("name", envoy_config_cluster_v3_Cluster_name(cluster),
1081
- &fields);
1082
- // type
1083
- if (envoy_config_cluster_v3_Cluster_has_type(cluster)) {
1084
- fields.emplace_back(absl::StrCat(
1085
- "type: ", envoy_config_cluster_v3_Cluster_type(cluster)));
1086
- } else if (envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
1087
- fields.emplace_back("cluster_type: <not printed>");
1088
- } else {
1089
- fields.emplace_back("<unknown type>");
1090
- }
1091
- // eds_cluster_config
1092
- const envoy_config_cluster_v3_Cluster_EdsClusterConfig* eds_cluster_config =
1093
- envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
1094
- if (eds_cluster_config != nullptr) {
1095
- fields.emplace_back("eds_cluster_config {");
1096
- // eds_config
1097
- const struct envoy_config_core_v3_ConfigSource* eds_config =
1098
- envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
1099
- eds_cluster_config);
1100
- if (eds_config != nullptr) {
1101
- if (envoy_config_core_v3_ConfigSource_has_ads(eds_config)) {
1102
- fields.emplace_back(" eds_config { ads {} }");
1103
- } else {
1104
- fields.emplace_back(" eds_config: <non-ADS type>");
1105
- }
1106
- }
1107
- // service_name
1108
- AddStringField(
1109
- " service_name",
1110
- envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
1111
- eds_cluster_config),
1112
- &fields);
1113
- fields.emplace_back("}");
1114
- }
1115
- // lb_policy
1116
- fields.emplace_back(absl::StrCat(
1117
- "lb_policy: ", envoy_config_cluster_v3_Cluster_lb_policy(cluster)));
1118
- // lrs_server
1119
- const envoy_config_core_v3_ConfigSource* lrs_server =
1120
- envoy_config_cluster_v3_Cluster_lrs_server(cluster);
1121
- if (lrs_server != nullptr) {
1122
- if (envoy_config_core_v3_ConfigSource_has_self(lrs_server)) {
1123
- fields.emplace_back("lrs_server { self {} }");
1124
- } else {
1125
- fields.emplace_back("lrs_server: <non-self type>");
1126
- }
1127
- }
1128
- gpr_log(GPR_DEBUG, "[xds_client %p] Cluster: %s", client,
1129
- absl::StrJoin(fields, "\n").c_str());
852
+ const upb_msgdef* msg_type =
853
+ envoy_config_cluster_v3_Cluster_getmsgdef(symtab);
854
+ char buf[10240];
855
+ upb_text_encode(cluster, msg_type, nullptr, 0, buf, sizeof(buf));
856
+ gpr_log(GPR_DEBUG, "[xds_client %p] Cluster: %s", client, buf);
1130
857
  }
1131
858
  }
1132
859
 
1133
860
  void MaybeLogClusterLoadAssignment(
1134
- XdsClient* client, TraceFlag* tracer,
861
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
1135
862
  const envoy_config_endpoint_v3_ClusterLoadAssignment* cla) {
1136
863
  if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
1137
864
  gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
1138
- // TODO(roth): When we can upgrade upb, use upb textformat code to dump
1139
- // the raw proto instead of doing this manually.
1140
- std::vector<std::string> fields;
1141
- // cluster_name
1142
- AddStringField(
1143
- "cluster_name",
1144
- envoy_config_endpoint_v3_ClusterLoadAssignment_cluster_name(cla),
1145
- &fields);
1146
- // endpoints
1147
- size_t num_localities;
1148
- const struct envoy_config_endpoint_v3_LocalityLbEndpoints* const*
1149
- locality_endpoints =
1150
- envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(
1151
- cla, &num_localities);
1152
- for (size_t i = 0; i < num_localities; ++i) {
1153
- const auto* locality_endpoint = locality_endpoints[i];
1154
- fields.emplace_back("endpoints {");
1155
- // locality
1156
- const auto* locality =
1157
- envoy_config_endpoint_v3_LocalityLbEndpoints_locality(
1158
- locality_endpoint);
1159
- if (locality != nullptr) {
1160
- fields.emplace_back(" locality {");
1161
- AddLocalityField(2, locality, &fields);
1162
- fields.emplace_back(" }");
1163
- }
1164
- // lb_endpoints
1165
- size_t num_lb_endpoints;
1166
- const envoy_config_endpoint_v3_LbEndpoint* const* lb_endpoints =
1167
- envoy_config_endpoint_v3_LocalityLbEndpoints_lb_endpoints(
1168
- locality_endpoint, &num_lb_endpoints);
1169
- for (size_t j = 0; j < num_lb_endpoints; ++j) {
1170
- const auto* lb_endpoint = lb_endpoints[j];
1171
- fields.emplace_back(" lb_endpoints {");
1172
- // health_status
1173
- uint32_t health_status =
1174
- envoy_config_endpoint_v3_LbEndpoint_health_status(lb_endpoint);
1175
- if (health_status > 0) {
1176
- fields.emplace_back(
1177
- absl::StrCat(" health_status: ", health_status));
1178
- }
1179
- // endpoint
1180
- const envoy_config_endpoint_v3_Endpoint* endpoint =
1181
- envoy_config_endpoint_v3_LbEndpoint_endpoint(lb_endpoint);
1182
- if (endpoint != nullptr) {
1183
- fields.emplace_back(" endpoint {");
1184
- // address
1185
- const auto* address =
1186
- envoy_config_endpoint_v3_Endpoint_address(endpoint);
1187
- if (address != nullptr) {
1188
- fields.emplace_back(" address {");
1189
- // socket_address
1190
- const auto* socket_address =
1191
- envoy_config_core_v3_Address_socket_address(address);
1192
- if (socket_address != nullptr) {
1193
- fields.emplace_back(" socket_address {");
1194
- // address
1195
- AddStringField(
1196
- " address",
1197
- envoy_config_core_v3_SocketAddress_address(socket_address),
1198
- &fields);
1199
- // port_value
1200
- if (envoy_config_core_v3_SocketAddress_has_port_value(
1201
- socket_address)) {
1202
- fields.emplace_back(
1203
- absl::StrCat(" port_value: ",
1204
- envoy_config_core_v3_SocketAddress_port_value(
1205
- socket_address)));
1206
- } else {
1207
- fields.emplace_back(" <non-numeric port>");
1208
- }
1209
- fields.emplace_back(" }");
1210
- } else {
1211
- fields.emplace_back(" <non-socket address>");
1212
- }
1213
- fields.emplace_back(" }");
1214
- }
1215
- fields.emplace_back(" }");
1216
- }
1217
- fields.emplace_back(" }");
1218
- }
1219
- // load_balancing_weight
1220
- AddUInt32ValueField(
1221
- " load_balancing_weight",
1222
- envoy_config_endpoint_v3_LocalityLbEndpoints_load_balancing_weight(
1223
- locality_endpoint),
1224
- &fields);
1225
- // priority
1226
- uint32_t priority = envoy_config_endpoint_v3_LocalityLbEndpoints_priority(
1227
- locality_endpoint);
1228
- if (priority > 0) {
1229
- fields.emplace_back(absl::StrCat(" priority: ", priority));
1230
- }
1231
- fields.emplace_back("}");
1232
- }
1233
- // policy
1234
- const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy* policy =
1235
- envoy_config_endpoint_v3_ClusterLoadAssignment_policy(cla);
1236
- if (policy != nullptr) {
1237
- fields.emplace_back("policy {");
1238
- // drop_overloads
1239
- size_t num_drop_overloads;
1240
- const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload* const*
1241
- drop_overloads =
1242
- envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_drop_overloads(
1243
- policy, &num_drop_overloads);
1244
- for (size_t i = 0; i < num_drop_overloads; ++i) {
1245
- auto* drop_overload = drop_overloads[i];
1246
- fields.emplace_back(" drop_overloads {");
1247
- // category
1248
- AddStringField(
1249
- " category",
1250
- envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_category(
1251
- drop_overload),
1252
- &fields);
1253
- // drop_percentage
1254
- const auto* drop_percentage =
1255
- envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_drop_percentage(
1256
- drop_overload);
1257
- if (drop_percentage != nullptr) {
1258
- fields.emplace_back(" drop_percentage {");
1259
- fields.emplace_back(absl::StrCat(
1260
- " numerator: ",
1261
- envoy_type_v3_FractionalPercent_numerator(drop_percentage)));
1262
- fields.emplace_back(absl::StrCat(
1263
- " denominator: ",
1264
- envoy_type_v3_FractionalPercent_denominator(drop_percentage)));
1265
- fields.emplace_back(" }");
1266
- }
1267
- fields.emplace_back(" }");
1268
- }
1269
- // overprovisioning_factor
1270
- fields.emplace_back("}");
1271
- }
865
+ const upb_msgdef* msg_type =
866
+ envoy_config_endpoint_v3_ClusterLoadAssignment_getmsgdef(symtab);
867
+ char buf[10240];
868
+ upb_text_encode(cla, msg_type, nullptr, 0, buf, sizeof(buf));
1272
869
  gpr_log(GPR_DEBUG, "[xds_client %p] ClusterLoadAssignment: %s", client,
1273
- absl::StrJoin(fields, "\n").c_str());
870
+ buf);
1274
871
  }
1275
872
  }
1276
873
 
1277
874
  grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
1278
875
  XdsApi::Route* route, bool* ignore_route) {
876
+ auto* case_sensitive_ptr =
877
+ envoy_config_route_v3_RouteMatch_case_sensitive(match);
878
+ bool case_sensitive = true;
879
+ if (case_sensitive_ptr != nullptr) {
880
+ case_sensitive = google_protobuf_BoolValue_value(case_sensitive_ptr);
881
+ }
882
+ StringMatcher::Type type;
883
+ std::string match_string;
1279
884
  if (envoy_config_route_v3_RouteMatch_has_prefix(match)) {
1280
885
  absl::string_view prefix =
1281
886
  UpbStringToAbsl(envoy_config_route_v3_RouteMatch_prefix(match));
1282
887
  // Empty prefix "" is accepted.
1283
- if (prefix.size() > 0) {
888
+ if (!prefix.empty()) {
1284
889
  // Prefix "/" is accepted.
1285
890
  if (prefix[0] != '/') {
1286
891
  // Prefix which does not start with a / will never match anything, so
@@ -1300,13 +905,12 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
1300
905
  return GRPC_ERROR_NONE;
1301
906
  }
1302
907
  }
1303
- route->matchers.path_matcher.type =
1304
- XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PREFIX;
1305
- route->matchers.path_matcher.string_matcher = std::string(prefix);
908
+ type = StringMatcher::Type::PREFIX;
909
+ match_string = std::string(prefix);
1306
910
  } else if (envoy_config_route_v3_RouteMatch_has_path(match)) {
1307
911
  absl::string_view path =
1308
912
  UpbStringToAbsl(envoy_config_route_v3_RouteMatch_path(match));
1309
- if (path.size() == 0) {
913
+ if (path.empty()) {
1310
914
  // Path that is empty will never match anything, so ignore this route.
1311
915
  *ignore_route = true;
1312
916
  return GRPC_ERROR_NONE;
@@ -1335,27 +939,28 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
1335
939
  *ignore_route = true;
1336
940
  return GRPC_ERROR_NONE;
1337
941
  }
1338
- route->matchers.path_matcher.type =
1339
- XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PATH;
1340
- route->matchers.path_matcher.string_matcher = std::string(path);
942
+ type = StringMatcher::Type::EXACT;
943
+ match_string = std::string(path);
1341
944
  } else if (envoy_config_route_v3_RouteMatch_has_safe_regex(match)) {
1342
945
  const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
1343
946
  envoy_config_route_v3_RouteMatch_safe_regex(match);
1344
947
  GPR_ASSERT(regex_matcher != nullptr);
1345
- std::string matcher = UpbStringToStdString(
948
+ type = StringMatcher::Type::SAFE_REGEX;
949
+ match_string = UpbStringToStdString(
1346
950
  envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
1347
- std::unique_ptr<RE2> regex = absl::make_unique<RE2>(std::move(matcher));
1348
- if (!regex->ok()) {
1349
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1350
- "Invalid regex string specified in path matcher.");
1351
- }
1352
- route->matchers.path_matcher.type =
1353
- XdsApi::Route::Matchers::PathMatcher::PathMatcherType::REGEX;
1354
- route->matchers.path_matcher.regex_matcher = std::move(regex);
1355
951
  } else {
1356
952
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1357
953
  "Invalid route path specifier specified.");
1358
954
  }
955
+ absl::StatusOr<StringMatcher> string_matcher =
956
+ StringMatcher::Create(type, match_string, case_sensitive);
957
+ if (!string_matcher.ok()) {
958
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
959
+ absl::StrCat("path matcher: ", string_matcher.status().message())
960
+ .c_str());
961
+ ;
962
+ }
963
+ route->matchers.path_matcher = std::move(string_matcher.value());
1359
964
  return GRPC_ERROR_NONE;
1360
965
  }
1361
966
 
@@ -1366,64 +971,62 @@ grpc_error* RouteHeaderMatchersParse(
1366
971
  envoy_config_route_v3_RouteMatch_headers(match, &size);
1367
972
  for (size_t i = 0; i < size; ++i) {
1368
973
  const envoy_config_route_v3_HeaderMatcher* header = headers[i];
1369
- XdsApi::Route::Matchers::HeaderMatcher header_matcher;
1370
- header_matcher.name =
974
+ const std::string name =
1371
975
  UpbStringToStdString(envoy_config_route_v3_HeaderMatcher_name(header));
976
+ HeaderMatcher::Type type;
977
+ std::string match_string;
978
+ int64_t range_start = 0;
979
+ int64_t range_end = 0;
980
+ bool present_match = false;
1372
981
  if (envoy_config_route_v3_HeaderMatcher_has_exact_match(header)) {
1373
- header_matcher.type =
1374
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::EXACT;
1375
- header_matcher.string_matcher = UpbStringToStdString(
982
+ type = HeaderMatcher::Type::EXACT;
983
+ match_string = UpbStringToStdString(
1376
984
  envoy_config_route_v3_HeaderMatcher_exact_match(header));
1377
985
  } else if (envoy_config_route_v3_HeaderMatcher_has_safe_regex_match(
1378
986
  header)) {
1379
987
  const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
1380
988
  envoy_config_route_v3_HeaderMatcher_safe_regex_match(header);
1381
989
  GPR_ASSERT(regex_matcher != nullptr);
1382
- const std::string matcher = UpbStringToStdString(
990
+ type = HeaderMatcher::Type::SAFE_REGEX;
991
+ match_string = UpbStringToStdString(
1383
992
  envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
1384
- std::unique_ptr<RE2> regex = absl::make_unique<RE2>(matcher);
1385
- if (!regex->ok()) {
1386
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1387
- "Invalid regex string specified in header matcher.");
1388
- }
1389
- header_matcher.type =
1390
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::REGEX;
1391
- header_matcher.regex_match = std::move(regex);
1392
993
  } else if (envoy_config_route_v3_HeaderMatcher_has_range_match(header)) {
1393
- header_matcher.type =
1394
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::RANGE;
994
+ type = HeaderMatcher::Type::RANGE;
1395
995
  const envoy_type_v3_Int64Range* range_matcher =
1396
996
  envoy_config_route_v3_HeaderMatcher_range_match(header);
1397
- header_matcher.range_start =
1398
- envoy_type_v3_Int64Range_start(range_matcher);
1399
- header_matcher.range_end = envoy_type_v3_Int64Range_end(range_matcher);
1400
- if (header_matcher.range_end < header_matcher.range_start) {
1401
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1402
- "Invalid range header matcher specifier specified: end "
1403
- "cannot be smaller than start.");
1404
- }
997
+ range_start = envoy_type_v3_Int64Range_start(range_matcher);
998
+ range_end = envoy_type_v3_Int64Range_end(range_matcher);
1405
999
  } else if (envoy_config_route_v3_HeaderMatcher_has_present_match(header)) {
1406
- header_matcher.type =
1407
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PRESENT;
1408
- header_matcher.present_match =
1409
- envoy_config_route_v3_HeaderMatcher_present_match(header);
1000
+ type = HeaderMatcher::Type::PRESENT;
1001
+ present_match = envoy_config_route_v3_HeaderMatcher_present_match(header);
1410
1002
  } else if (envoy_config_route_v3_HeaderMatcher_has_prefix_match(header)) {
1411
- header_matcher.type =
1412
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PREFIX;
1413
- header_matcher.string_matcher = UpbStringToStdString(
1003
+ type = HeaderMatcher::Type::PREFIX;
1004
+ match_string = UpbStringToStdString(
1414
1005
  envoy_config_route_v3_HeaderMatcher_prefix_match(header));
1415
1006
  } else if (envoy_config_route_v3_HeaderMatcher_has_suffix_match(header)) {
1416
- header_matcher.type =
1417
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::SUFFIX;
1418
- header_matcher.string_matcher = UpbStringToStdString(
1007
+ type = HeaderMatcher::Type::SUFFIX;
1008
+ match_string = UpbStringToStdString(
1419
1009
  envoy_config_route_v3_HeaderMatcher_suffix_match(header));
1010
+ } else if (envoy_config_route_v3_HeaderMatcher_has_contains_match(header)) {
1011
+ type = HeaderMatcher::Type::CONTAINS;
1012
+ match_string = UpbStringToStdString(
1013
+ envoy_config_route_v3_HeaderMatcher_contains_match(header));
1420
1014
  } else {
1421
1015
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1422
1016
  "Invalid route header matcher specified.");
1423
1017
  }
1424
- header_matcher.invert_match =
1018
+ bool invert_match =
1425
1019
  envoy_config_route_v3_HeaderMatcher_invert_match(header);
1426
- route->matchers.header_matchers.emplace_back(std::move(header_matcher));
1020
+ absl::StatusOr<HeaderMatcher> header_matcher =
1021
+ HeaderMatcher::Create(name, type, match_string, range_start, range_end,
1022
+ present_match, invert_match);
1023
+ if (!header_matcher.ok()) {
1024
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1025
+ absl::StrCat("header matcher: ", header_matcher.status().message())
1026
+ .c_str());
1027
+ }
1028
+ route->matchers.header_matchers.emplace_back(
1029
+ std::move(header_matcher.value()));
1427
1030
  }
1428
1031
  return GRPC_ERROR_NONE;
1429
1032
  }
@@ -1473,7 +1076,7 @@ grpc_error* RouteActionParse(const envoy_config_route_v3_Route* route_msg,
1473
1076
  if (envoy_config_route_v3_RouteAction_has_cluster(route_action)) {
1474
1077
  route->cluster_name = UpbStringToStdString(
1475
1078
  envoy_config_route_v3_RouteAction_cluster(route_action));
1476
- if (route->cluster_name.size() == 0) {
1079
+ if (route->cluster_name.empty()) {
1477
1080
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1478
1081
  "RouteAction cluster contains empty cluster name.");
1479
1082
  }
@@ -1512,6 +1115,7 @@ grpc_error* RouteActionParse(const envoy_config_route_v3_Route* route_msg,
1512
1115
  "RouteAction weighted_cluster cluster missing weight");
1513
1116
  }
1514
1117
  cluster.weight = google_protobuf_UInt32Value_value(weight);
1118
+ if (cluster.weight == 0) continue;
1515
1119
  sum_of_weights += cluster.weight;
1516
1120
  route->weighted_clusters.emplace_back(std::move(cluster));
1517
1121
  }
@@ -1526,16 +1130,36 @@ grpc_error* RouteActionParse(const envoy_config_route_v3_Route* route_msg,
1526
1130
  } else {
1527
1131
  // No cluster or weighted_clusters found in RouteAction, ignore this route.
1528
1132
  *ignore_route = true;
1529
- return GRPC_ERROR_NONE;
1133
+ }
1134
+ if (XdsTimeoutEnabled() && !*ignore_route) {
1135
+ const envoy_config_route_v3_RouteAction_MaxStreamDuration*
1136
+ max_stream_duration =
1137
+ envoy_config_route_v3_RouteAction_max_stream_duration(route_action);
1138
+ if (max_stream_duration != nullptr) {
1139
+ const google_protobuf_Duration* duration =
1140
+ envoy_config_route_v3_RouteAction_MaxStreamDuration_grpc_timeout_header_max(
1141
+ max_stream_duration);
1142
+ if (duration == nullptr) {
1143
+ duration =
1144
+ envoy_config_route_v3_RouteAction_MaxStreamDuration_max_stream_duration(
1145
+ max_stream_duration);
1146
+ }
1147
+ if (duration != nullptr) {
1148
+ XdsApi::Duration duration_in_route;
1149
+ duration_in_route.seconds = google_protobuf_Duration_seconds(duration);
1150
+ duration_in_route.nanos = google_protobuf_Duration_nanos(duration);
1151
+ route->max_stream_duration = duration_in_route;
1152
+ }
1153
+ }
1530
1154
  }
1531
1155
  return GRPC_ERROR_NONE;
1532
1156
  }
1533
1157
 
1534
1158
  grpc_error* RouteConfigParse(
1535
- XdsClient* client, TraceFlag* tracer,
1159
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
1536
1160
  const envoy_config_route_v3_RouteConfiguration* route_config,
1537
1161
  XdsApi::RdsUpdate* rds_update) {
1538
- MaybeLogRouteConfiguration(client, tracer, route_config);
1162
+ MaybeLogRouteConfiguration(client, tracer, symtab, route_config);
1539
1163
  // Get the virtual hosts.
1540
1164
  size_t size;
1541
1165
  const envoy_config_route_v3_VirtualHost* const* virtual_hosts =
@@ -1552,7 +1176,9 @@ grpc_error* RouteConfigParse(
1552
1176
  std::string domain_pattern = UpbStringToStdString(domains[j]);
1553
1177
  const MatchType match_type = DomainPatternMatchType(domain_pattern);
1554
1178
  if (match_type == INVALID_MATCH) {
1555
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid domain pattern.");
1179
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1180
+ absl::StrCat("Invalid domain pattern \"", domain_pattern, "\".")
1181
+ .c_str());
1556
1182
  }
1557
1183
  vhost.domains.emplace_back(std::move(domain_pattern));
1558
1184
  }
@@ -1589,13 +1215,6 @@ grpc_error* RouteConfigParse(
1589
1215
  error = RouteActionParse(routes[j], &route, &ignore_route);
1590
1216
  if (error != GRPC_ERROR_NONE) return error;
1591
1217
  if (ignore_route) continue;
1592
- const google_protobuf_BoolValue* case_sensitive =
1593
- envoy_config_route_v3_RouteMatch_case_sensitive(match);
1594
- if (case_sensitive != nullptr &&
1595
- !google_protobuf_BoolValue_value(case_sensitive)) {
1596
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1597
- "case_sensitive if set must be set to true.");
1598
- }
1599
1218
  vhost.routes.emplace_back(std::move(route));
1600
1219
  }
1601
1220
  if (vhost.routes.empty()) {
@@ -1605,11 +1224,263 @@ grpc_error* RouteConfigParse(
1605
1224
  return GRPC_ERROR_NONE;
1606
1225
  }
1607
1226
 
1227
+ XdsApi::CommonTlsContext::CertificateProviderInstance
1228
+ CertificateProviderInstanceParse(
1229
+ const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance*
1230
+ certificate_provider_instance_proto) {
1231
+ return {
1232
+ UpbStringToStdString(
1233
+ envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_instance_name(
1234
+ certificate_provider_instance_proto)),
1235
+ UpbStringToStdString(
1236
+ envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_certificate_name(
1237
+ certificate_provider_instance_proto))};
1238
+ }
1239
+
1240
+ grpc_error* CommonTlsContextParse(
1241
+ const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext*
1242
+ common_tls_context_proto,
1243
+ XdsApi::CommonTlsContext* common_tls_context) GRPC_MUST_USE_RESULT;
1244
+ grpc_error* CommonTlsContextParse(
1245
+ const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext*
1246
+ common_tls_context_proto,
1247
+ XdsApi::CommonTlsContext* common_tls_context) {
1248
+ auto* combined_validation_context =
1249
+ envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_combined_validation_context(
1250
+ common_tls_context_proto);
1251
+ if (combined_validation_context != nullptr) {
1252
+ auto* default_validation_context =
1253
+ envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CombinedCertificateValidationContext_default_validation_context(
1254
+ combined_validation_context);
1255
+ if (default_validation_context != nullptr) {
1256
+ size_t len = 0;
1257
+ auto* subject_alt_names_matchers =
1258
+ envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_match_subject_alt_names(
1259
+ default_validation_context, &len);
1260
+ for (size_t i = 0; i < len; ++i) {
1261
+ StringMatcher::Type type;
1262
+ std::string matcher;
1263
+ if (envoy_type_matcher_v3_StringMatcher_has_exact(
1264
+ subject_alt_names_matchers[i])) {
1265
+ type = StringMatcher::Type::EXACT;
1266
+ matcher =
1267
+ UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_exact(
1268
+ subject_alt_names_matchers[i]));
1269
+ } else if (envoy_type_matcher_v3_StringMatcher_has_prefix(
1270
+ subject_alt_names_matchers[i])) {
1271
+ type = StringMatcher::Type::PREFIX;
1272
+ matcher =
1273
+ UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_prefix(
1274
+ subject_alt_names_matchers[i]));
1275
+ } else if (envoy_type_matcher_v3_StringMatcher_has_suffix(
1276
+ subject_alt_names_matchers[i])) {
1277
+ type = StringMatcher::Type::SUFFIX;
1278
+ matcher =
1279
+ UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_suffix(
1280
+ subject_alt_names_matchers[i]));
1281
+ } else if (envoy_type_matcher_v3_StringMatcher_has_contains(
1282
+ subject_alt_names_matchers[i])) {
1283
+ type = StringMatcher::Type::CONTAINS;
1284
+ matcher =
1285
+ UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_contains(
1286
+ subject_alt_names_matchers[i]));
1287
+ } else if (envoy_type_matcher_v3_StringMatcher_has_safe_regex(
1288
+ subject_alt_names_matchers[i])) {
1289
+ type = StringMatcher::Type::SAFE_REGEX;
1290
+ auto* regex_matcher = envoy_type_matcher_v3_StringMatcher_safe_regex(
1291
+ subject_alt_names_matchers[i]);
1292
+ matcher = UpbStringToStdString(
1293
+ envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
1294
+ } else {
1295
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1296
+ "Invalid StringMatcher specified");
1297
+ }
1298
+ bool ignore_case = envoy_type_matcher_v3_StringMatcher_ignore_case(
1299
+ subject_alt_names_matchers[i]);
1300
+ absl::StatusOr<StringMatcher> string_matcher =
1301
+ StringMatcher::Create(type, matcher,
1302
+ /*case_sensitive=*/!ignore_case);
1303
+ if (!string_matcher.ok()) {
1304
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1305
+ absl::StrCat("string matcher: ",
1306
+ string_matcher.status().message())
1307
+ .c_str());
1308
+ }
1309
+ if (type == StringMatcher::Type::SAFE_REGEX && ignore_case) {
1310
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1311
+ "StringMatcher: ignore_case has no effect for SAFE_REGEX.");
1312
+ }
1313
+ common_tls_context->combined_validation_context
1314
+ .default_validation_context.match_subject_alt_names.push_back(
1315
+ std::move(string_matcher.value()));
1316
+ }
1317
+ }
1318
+ auto* validation_context_certificate_provider_instance =
1319
+ envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CombinedCertificateValidationContext_validation_context_certificate_provider_instance(
1320
+ combined_validation_context);
1321
+ if (validation_context_certificate_provider_instance != nullptr) {
1322
+ common_tls_context->combined_validation_context
1323
+ .validation_context_certificate_provider_instance =
1324
+ CertificateProviderInstanceParse(
1325
+ validation_context_certificate_provider_instance);
1326
+ }
1327
+ }
1328
+ auto* tls_certificate_certificate_provider_instance =
1329
+ envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_tls_certificate_certificate_provider_instance(
1330
+ common_tls_context_proto);
1331
+ if (tls_certificate_certificate_provider_instance != nullptr) {
1332
+ common_tls_context->tls_certificate_certificate_provider_instance =
1333
+ CertificateProviderInstanceParse(
1334
+ tls_certificate_certificate_provider_instance);
1335
+ }
1336
+ return GRPC_ERROR_NONE;
1337
+ }
1338
+
1339
+ grpc_error* LdsResponseParseClient(
1340
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab, upb_arena* arena,
1341
+ const envoy_config_listener_v3_ApiListener* api_listener,
1342
+ XdsApi::LdsUpdate* lds_update) {
1343
+ lds_update->type = XdsApi::LdsUpdate::ListenerType::kHttpApiListener;
1344
+ const upb_strview encoded_api_listener = google_protobuf_Any_value(
1345
+ envoy_config_listener_v3_ApiListener_api_listener(api_listener));
1346
+ const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*
1347
+ http_connection_manager =
1348
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_parse(
1349
+ encoded_api_listener.data, encoded_api_listener.size, arena);
1350
+ if (http_connection_manager == nullptr) {
1351
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1352
+ "Could not parse HttpConnectionManager config from ApiListener");
1353
+ }
1354
+ if (XdsTimeoutEnabled()) {
1355
+ // Obtain max_stream_duration from Http Protocol Options.
1356
+ const envoy_config_core_v3_HttpProtocolOptions* options =
1357
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_common_http_protocol_options(
1358
+ http_connection_manager);
1359
+ if (options != nullptr) {
1360
+ const google_protobuf_Duration* duration =
1361
+ envoy_config_core_v3_HttpProtocolOptions_max_stream_duration(options);
1362
+ if (duration != nullptr) {
1363
+ lds_update->http_max_stream_duration.seconds =
1364
+ google_protobuf_Duration_seconds(duration);
1365
+ lds_update->http_max_stream_duration.nanos =
1366
+ google_protobuf_Duration_nanos(duration);
1367
+ }
1368
+ }
1369
+ }
1370
+ // Found inlined route_config. Parse it to find the cluster_name.
1371
+ if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
1372
+ http_connection_manager)) {
1373
+ const envoy_config_route_v3_RouteConfiguration* route_config =
1374
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(
1375
+ http_connection_manager);
1376
+ XdsApi::RdsUpdate rds_update;
1377
+ grpc_error* error =
1378
+ RouteConfigParse(client, tracer, symtab, route_config, &rds_update);
1379
+ if (error != GRPC_ERROR_NONE) return error;
1380
+ lds_update->rds_update = std::move(rds_update);
1381
+ return GRPC_ERROR_NONE;
1382
+ }
1383
+ // Validate that RDS must be used to get the route_config dynamically.
1384
+ if (!envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_rds(
1385
+ http_connection_manager)) {
1386
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1387
+ "HttpConnectionManager neither has inlined route_config nor RDS.");
1388
+ }
1389
+ const envoy_extensions_filters_network_http_connection_manager_v3_Rds* rds =
1390
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(
1391
+ http_connection_manager);
1392
+ // Check that the ConfigSource specifies ADS.
1393
+ const envoy_config_core_v3_ConfigSource* config_source =
1394
+ envoy_extensions_filters_network_http_connection_manager_v3_Rds_config_source(
1395
+ rds);
1396
+ if (config_source == nullptr) {
1397
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1398
+ "HttpConnectionManager missing config_source for RDS.");
1399
+ }
1400
+ if (!envoy_config_core_v3_ConfigSource_has_ads(config_source)) {
1401
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1402
+ "HttpConnectionManager ConfigSource for RDS does not specify ADS.");
1403
+ }
1404
+ // Get the route_config_name.
1405
+ lds_update->route_config_name = UpbStringToStdString(
1406
+ envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(
1407
+ rds));
1408
+ return GRPC_ERROR_NONE;
1409
+ }
1410
+
1411
+ grpc_error* LdsResponseParseServer(
1412
+ upb_arena* arena, const envoy_config_listener_v3_Listener* listener,
1413
+ const std::string& /*listener_name*/,
1414
+ const envoy_config_core_v3_Address* /*address*/,
1415
+ XdsApi::LdsUpdate* lds_update) {
1416
+ lds_update->type = XdsApi::LdsUpdate::ListenerType::kTcpListener;
1417
+ // TODO(yashykt): Support filter chain match.
1418
+ // Right now, we are supporting and expecting only one entry in filter_chains.
1419
+ size_t size = 0;
1420
+ auto* filter_chains =
1421
+ envoy_config_listener_v3_Listener_filter_chains(listener, &size);
1422
+ if (size != 1) {
1423
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1424
+ "Only one filter_chain supported.");
1425
+ }
1426
+ // Get the DownstreamTlsContext from the match
1427
+ if (XdsSecurityEnabled()) {
1428
+ auto* transport_socket =
1429
+ envoy_config_listener_v3_FilterChain_transport_socket(filter_chains[0]);
1430
+ if (transport_socket != nullptr) {
1431
+ absl::string_view name = UpbStringToAbsl(
1432
+ envoy_config_core_v3_TransportSocket_name(transport_socket));
1433
+ if (name == "envoy.transport_sockets.tls") {
1434
+ auto* typed_config =
1435
+ envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
1436
+ if (typed_config != nullptr) {
1437
+ const upb_strview encoded_downstream_tls_context =
1438
+ google_protobuf_Any_value(typed_config);
1439
+ auto* downstream_tls_context =
1440
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_parse(
1441
+ encoded_downstream_tls_context.data,
1442
+ encoded_downstream_tls_context.size, arena);
1443
+ if (downstream_tls_context == nullptr) {
1444
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1445
+ "Can't decode downstream tls context.");
1446
+ }
1447
+ auto* common_tls_context =
1448
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_common_tls_context(
1449
+ downstream_tls_context);
1450
+ if (common_tls_context != nullptr) {
1451
+ grpc_error* error = CommonTlsContextParse(
1452
+ common_tls_context,
1453
+ &lds_update->downstream_tls_context.common_tls_context);
1454
+ if (error != GRPC_ERROR_NONE) return error;
1455
+ }
1456
+ auto* require_client_certificate =
1457
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_client_certificate(
1458
+ downstream_tls_context);
1459
+ if (require_client_certificate != nullptr) {
1460
+ lds_update->downstream_tls_context.require_client_certificate =
1461
+ google_protobuf_BoolValue_value(require_client_certificate);
1462
+ }
1463
+ }
1464
+ if (lds_update->downstream_tls_context.common_tls_context
1465
+ .tls_certificate_certificate_provider_instance.instance_name
1466
+ .empty()) {
1467
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1468
+ "TLS configuration provided but no "
1469
+ "tls_certificate_certificate_provider_instance found.");
1470
+ }
1471
+ }
1472
+ }
1473
+ }
1474
+ return GRPC_ERROR_NONE;
1475
+ }
1476
+
1608
1477
  grpc_error* LdsResponseParse(
1609
- XdsClient* client, TraceFlag* tracer,
1478
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
1610
1479
  const envoy_service_discovery_v3_DiscoveryResponse* response,
1611
- const std::string& expected_server_name,
1612
- absl::optional<XdsApi::LdsUpdate>* lds_update, upb_arena* arena) {
1480
+ const std::set<absl::string_view>& expected_listener_names,
1481
+ XdsApi::LdsUpdateMap* lds_update_map,
1482
+ std::set<std::string>* resource_names_failed, upb_arena* arena) {
1483
+ std::vector<grpc_error*> errors;
1613
1484
  // Get the resources from the response.
1614
1485
  size_t size;
1615
1486
  const google_protobuf_Any* const* resources =
@@ -1619,7 +1490,10 @@ grpc_error* LdsResponseParse(
1619
1490
  absl::string_view type_url =
1620
1491
  UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
1621
1492
  if (!IsLds(type_url)) {
1622
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not LDS.");
1493
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1494
+ absl::StrCat("resource index ", i, ": Resource is not LDS.")
1495
+ .c_str()));
1496
+ continue;
1623
1497
  }
1624
1498
  // Decode the listener.
1625
1499
  const upb_strview encoded_listener =
@@ -1628,79 +1502,74 @@ grpc_error* LdsResponseParse(
1628
1502
  envoy_config_listener_v3_Listener_parse(encoded_listener.data,
1629
1503
  encoded_listener.size, arena);
1630
1504
  if (listener == nullptr) {
1631
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode listener.");
1505
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1506
+ absl::StrCat("resource index ", i, ": Can't decode listener.")
1507
+ .c_str()));
1508
+ continue;
1632
1509
  }
1633
1510
  // Check listener name. Ignore unexpected listeners.
1634
- absl::string_view name =
1635
- UpbStringToAbsl(envoy_config_listener_v3_Listener_name(listener));
1636
- if (name != expected_server_name) continue;
1637
- // Get api_listener and decode it to http_connection_manager.
1511
+ std::string listener_name =
1512
+ UpbStringToStdString(envoy_config_listener_v3_Listener_name(listener));
1513
+ if (expected_listener_names.find(listener_name) ==
1514
+ expected_listener_names.end()) {
1515
+ continue;
1516
+ }
1517
+ // Fail if listener name is duplicated.
1518
+ if (lds_update_map->find(listener_name) != lds_update_map->end()) {
1519
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1520
+ absl::StrCat("duplicate listener name \"", listener_name, "\"")
1521
+ .c_str()));
1522
+ resource_names_failed->insert(listener_name);
1523
+ continue;
1524
+ }
1525
+ XdsApi::LdsUpdate& lds_update = (*lds_update_map)[listener_name];
1526
+ // Check whether it's a client or server listener.
1638
1527
  const envoy_config_listener_v3_ApiListener* api_listener =
1639
1528
  envoy_config_listener_v3_Listener_api_listener(listener);
1640
- if (api_listener == nullptr) {
1641
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1642
- "Listener has no ApiListener.");
1643
- }
1644
- const upb_strview encoded_api_listener = google_protobuf_Any_value(
1645
- envoy_config_listener_v3_ApiListener_api_listener(api_listener));
1646
- const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*
1647
- http_connection_manager =
1648
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_parse(
1649
- encoded_api_listener.data, encoded_api_listener.size, arena);
1650
- if (http_connection_manager == nullptr) {
1651
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1652
- "Could not parse HttpConnectionManager config from ApiListener");
1653
- }
1654
- // Found inlined route_config. Parse it to find the cluster_name.
1655
- if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
1656
- http_connection_manager)) {
1657
- const envoy_config_route_v3_RouteConfiguration* route_config =
1658
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(
1659
- http_connection_manager);
1660
- XdsApi::RdsUpdate rds_update;
1661
- grpc_error* error =
1662
- RouteConfigParse(client, tracer, route_config, &rds_update);
1663
- if (error != GRPC_ERROR_NONE) return error;
1664
- lds_update->emplace();
1665
- (*lds_update)->rds_update = std::move(rds_update);
1666
- return GRPC_ERROR_NONE;
1529
+ const envoy_config_core_v3_Address* address =
1530
+ envoy_config_listener_v3_Listener_address(listener);
1531
+ if (api_listener != nullptr && address != nullptr) {
1532
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1533
+ absl::StrCat(listener_name,
1534
+ ": Listener has both address and ApiListener")
1535
+ .c_str()));
1536
+ resource_names_failed->insert(listener_name);
1537
+ continue;
1667
1538
  }
1668
- // Validate that RDS must be used to get the route_config dynamically.
1669
- if (!envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_rds(
1670
- http_connection_manager)) {
1671
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1672
- "HttpConnectionManager neither has inlined route_config nor RDS.");
1539
+ if (api_listener == nullptr && address == nullptr) {
1540
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1541
+ absl::StrCat(listener_name,
1542
+ ": Listener has neither address nor ApiListener")
1543
+ .c_str()));
1544
+ resource_names_failed->insert(listener_name);
1545
+ continue;
1673
1546
  }
1674
- const envoy_extensions_filters_network_http_connection_manager_v3_Rds* rds =
1675
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(
1676
- http_connection_manager);
1677
- // Check that the ConfigSource specifies ADS.
1678
- const envoy_config_core_v3_ConfigSource* config_source =
1679
- envoy_extensions_filters_network_http_connection_manager_v3_Rds_config_source(
1680
- rds);
1681
- if (config_source == nullptr) {
1682
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1683
- "HttpConnectionManager missing config_source for RDS.");
1547
+ grpc_error* error = GRPC_ERROR_NONE;
1548
+ if (api_listener != nullptr) {
1549
+ error = LdsResponseParseClient(client, tracer, symtab, arena,
1550
+ api_listener, &lds_update);
1551
+ } else {
1552
+ error = LdsResponseParseServer(arena, listener, listener_name, address,
1553
+ &lds_update);
1684
1554
  }
1685
- if (!envoy_config_core_v3_ConfigSource_has_ads(config_source)) {
1686
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1687
- "HttpConnectionManager ConfigSource for RDS does not specify ADS.");
1555
+ if (error != GRPC_ERROR_NONE) {
1556
+ errors.push_back(grpc_error_add_child(
1557
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1558
+ absl::StrCat(listener_name, ": validation error").c_str()),
1559
+ error));
1560
+ resource_names_failed->insert(listener_name);
1688
1561
  }
1689
- // Get the route_config_name.
1690
- lds_update->emplace();
1691
- (*lds_update)->route_config_name = UpbStringToStdString(
1692
- envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(
1693
- rds));
1694
- return GRPC_ERROR_NONE;
1695
1562
  }
1696
- return GRPC_ERROR_NONE;
1563
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing LDS response", &errors);
1697
1564
  }
1698
1565
 
1699
1566
  grpc_error* RdsResponseParse(
1700
- XdsClient* client, TraceFlag* tracer,
1567
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
1701
1568
  const envoy_service_discovery_v3_DiscoveryResponse* response,
1702
1569
  const std::set<absl::string_view>& expected_route_configuration_names,
1703
- absl::optional<XdsApi::RdsUpdate>* rds_update, upb_arena* arena) {
1570
+ XdsApi::RdsUpdateMap* rds_update_map,
1571
+ std::set<std::string>* resource_names_failed, upb_arena* arena) {
1572
+ std::vector<grpc_error*> errors;
1704
1573
  // Get the resources from the response.
1705
1574
  size_t size;
1706
1575
  const google_protobuf_Any* const* resources =
@@ -1710,7 +1579,10 @@ grpc_error* RdsResponseParse(
1710
1579
  absl::string_view type_url =
1711
1580
  UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
1712
1581
  if (!IsRds(type_url)) {
1713
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not RDS.");
1582
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1583
+ absl::StrCat("resource index ", i, ": Resource is not RDS.")
1584
+ .c_str()));
1585
+ continue;
1714
1586
  }
1715
1587
  // Decode the route_config.
1716
1588
  const upb_strview encoded_route_config =
@@ -1719,43 +1591,63 @@ grpc_error* RdsResponseParse(
1719
1591
  envoy_config_route_v3_RouteConfiguration_parse(
1720
1592
  encoded_route_config.data, encoded_route_config.size, arena);
1721
1593
  if (route_config == nullptr) {
1722
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode route_config.");
1594
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1595
+ absl::StrCat("resource index ", i, ": Can't decode route_config.")
1596
+ .c_str()));
1597
+ continue;
1723
1598
  }
1724
1599
  // Check route_config_name. Ignore unexpected route_config.
1725
- absl::string_view route_config_name = UpbStringToAbsl(
1600
+ std::string route_config_name = UpbStringToStdString(
1726
1601
  envoy_config_route_v3_RouteConfiguration_name(route_config));
1727
1602
  if (expected_route_configuration_names.find(route_config_name) ==
1728
1603
  expected_route_configuration_names.end()) {
1729
1604
  continue;
1730
1605
  }
1606
+ // Fail if route config name is duplicated.
1607
+ if (rds_update_map->find(route_config_name) != rds_update_map->end()) {
1608
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1609
+ absl::StrCat("duplicate route config name \"", route_config_name,
1610
+ "\"")
1611
+ .c_str()));
1612
+ resource_names_failed->insert(route_config_name);
1613
+ continue;
1614
+ }
1731
1615
  // Parse the route_config.
1732
- XdsApi::RdsUpdate local_rds_update;
1616
+ XdsApi::RdsUpdate& rds_update = (*rds_update_map)[route_config_name];
1733
1617
  grpc_error* error =
1734
- RouteConfigParse(client, tracer, route_config, &local_rds_update);
1735
- if (error != GRPC_ERROR_NONE) return error;
1736
- rds_update->emplace(std::move(local_rds_update));
1737
- return GRPC_ERROR_NONE;
1618
+ RouteConfigParse(client, tracer, symtab, route_config, &rds_update);
1619
+ if (error != GRPC_ERROR_NONE) {
1620
+ errors.push_back(grpc_error_add_child(
1621
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1622
+ absl::StrCat(route_config_name, ": validation error").c_str()),
1623
+ error));
1624
+ resource_names_failed->insert(route_config_name);
1625
+ }
1738
1626
  }
1739
- return GRPC_ERROR_NONE;
1627
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing RDS response", &errors);
1740
1628
  }
1741
1629
 
1742
1630
  grpc_error* CdsResponseParse(
1743
- XdsClient* client, TraceFlag* tracer,
1631
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
1744
1632
  const envoy_service_discovery_v3_DiscoveryResponse* response,
1745
1633
  const std::set<absl::string_view>& expected_cluster_names,
1746
- XdsApi::CdsUpdateMap* cds_update_map, upb_arena* arena) {
1634
+ XdsApi::CdsUpdateMap* cds_update_map,
1635
+ std::set<std::string>* resource_names_failed, upb_arena* arena) {
1636
+ std::vector<grpc_error*> errors;
1747
1637
  // Get the resources from the response.
1748
1638
  size_t size;
1749
1639
  const google_protobuf_Any* const* resources =
1750
1640
  envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size);
1751
1641
  // Parse all the resources in the CDS response.
1752
1642
  for (size_t i = 0; i < size; ++i) {
1753
- XdsApi::CdsUpdate cds_update;
1754
1643
  // Check the type_url of the resource.
1755
1644
  absl::string_view type_url =
1756
1645
  UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
1757
1646
  if (!IsCds(type_url)) {
1758
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not CDS.");
1647
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1648
+ absl::StrCat("resource index ", i, ": Resource is not CDS.")
1649
+ .c_str()));
1650
+ continue;
1759
1651
  }
1760
1652
  // Decode the cluster.
1761
1653
  const upb_strview encoded_cluster = google_protobuf_Any_value(resources[i]);
@@ -1763,9 +1655,12 @@ grpc_error* CdsResponseParse(
1763
1655
  envoy_config_cluster_v3_Cluster_parse(encoded_cluster.data,
1764
1656
  encoded_cluster.size, arena);
1765
1657
  if (cluster == nullptr) {
1766
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode cluster.");
1658
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1659
+ absl::StrCat("resource index ", i, ": Can't decode cluster.")
1660
+ .c_str()));
1661
+ continue;
1767
1662
  }
1768
- MaybeLogCluster(client, tracer, cluster);
1663
+ MaybeLogCluster(client, tracer, symtab, cluster);
1769
1664
  // Ignore unexpected cluster names.
1770
1665
  std::string cluster_name =
1771
1666
  UpbStringToStdString(envoy_config_cluster_v3_Cluster_name(cluster));
@@ -1775,54 +1670,290 @@ grpc_error* CdsResponseParse(
1775
1670
  }
1776
1671
  // Fail on duplicate resources.
1777
1672
  if (cds_update_map->find(cluster_name) != cds_update_map->end()) {
1778
- return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1673
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1779
1674
  absl::StrCat("duplicate resource name \"", cluster_name, "\"")
1780
- .c_str());
1675
+ .c_str()));
1676
+ resource_names_failed->insert(cluster_name);
1677
+ continue;
1781
1678
  }
1679
+ XdsApi::CdsUpdate& cds_update = (*cds_update_map)[cluster_name];
1782
1680
  // Check the cluster_discovery_type.
1783
- if (!envoy_config_cluster_v3_Cluster_has_type(cluster)) {
1784
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType not found.");
1681
+ if (!envoy_config_cluster_v3_Cluster_has_type(cluster) &&
1682
+ !envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
1683
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1684
+ absl::StrCat(cluster_name, ": DiscoveryType not found.").c_str()));
1685
+ resource_names_failed->insert(cluster_name);
1686
+ continue;
1785
1687
  }
1786
- if (envoy_config_cluster_v3_Cluster_type(cluster) !=
1688
+ if (envoy_config_cluster_v3_Cluster_type(cluster) ==
1787
1689
  envoy_config_cluster_v3_Cluster_EDS) {
1788
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType is not EDS.");
1789
- }
1790
- // Check the EDS config source.
1791
- const envoy_config_cluster_v3_Cluster_EdsClusterConfig* eds_cluster_config =
1792
- envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
1793
- const envoy_config_core_v3_ConfigSource* eds_config =
1794
- envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
1795
- eds_cluster_config);
1796
- if (!envoy_config_core_v3_ConfigSource_has_ads(eds_config)) {
1797
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1798
- "EDS ConfigSource is not ADS.");
1799
- }
1800
- // Record EDS service_name (if any).
1801
- upb_strview service_name =
1802
- envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
1803
- eds_cluster_config);
1804
- if (service_name.size != 0) {
1805
- cds_update.eds_service_name = UpbStringToStdString(service_name);
1690
+ cds_update.cluster_type = XdsApi::CdsUpdate::ClusterType::EDS;
1691
+ // Check the EDS config source.
1692
+ const envoy_config_cluster_v3_Cluster_EdsClusterConfig*
1693
+ eds_cluster_config =
1694
+ envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
1695
+ const envoy_config_core_v3_ConfigSource* eds_config =
1696
+ envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
1697
+ eds_cluster_config);
1698
+ if (!envoy_config_core_v3_ConfigSource_has_ads(eds_config)) {
1699
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1700
+ absl::StrCat(cluster_name, ": EDS ConfigSource is not ADS.")
1701
+ .c_str()));
1702
+ resource_names_failed->insert(cluster_name);
1703
+ continue;
1704
+ }
1705
+ // Record EDS service_name (if any).
1706
+ upb_strview service_name =
1707
+ envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
1708
+ eds_cluster_config);
1709
+ if (service_name.size != 0) {
1710
+ cds_update.eds_service_name = UpbStringToStdString(service_name);
1711
+ }
1712
+ } else if (!XdsAggregateAndLogicalDnsClusterEnabled()) {
1713
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1714
+ absl::StrCat(cluster_name, ": DiscoveryType is not valid.").c_str()));
1715
+ resource_names_failed->insert(cluster_name);
1716
+ continue;
1717
+ } else if (envoy_config_cluster_v3_Cluster_type(cluster) ==
1718
+ envoy_config_cluster_v3_Cluster_LOGICAL_DNS) {
1719
+ cds_update.cluster_type = XdsApi::CdsUpdate::ClusterType::LOGICAL_DNS;
1720
+ } else {
1721
+ if (envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
1722
+ const envoy_config_cluster_v3_Cluster_CustomClusterType*
1723
+ custom_cluster_type =
1724
+ envoy_config_cluster_v3_Cluster_cluster_type(cluster);
1725
+ upb_strview type_name =
1726
+ envoy_config_cluster_v3_Cluster_CustomClusterType_name(
1727
+ custom_cluster_type);
1728
+ if (UpbStringToAbsl(type_name) == "envoy.clusters.aggregate") {
1729
+ cds_update.cluster_type = XdsApi::CdsUpdate::ClusterType::AGGREGATE;
1730
+ // Retrieve aggregate clusters.
1731
+ const google_protobuf_Any* typed_config =
1732
+ envoy_config_cluster_v3_Cluster_CustomClusterType_typed_config(
1733
+ custom_cluster_type);
1734
+ const upb_strview aggregate_cluster_config_upb_strview =
1735
+ google_protobuf_Any_value(typed_config);
1736
+ const envoy_extensions_clusters_aggregate_v3_ClusterConfig*
1737
+ aggregate_cluster_config =
1738
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig_parse(
1739
+ aggregate_cluster_config_upb_strview.data,
1740
+ aggregate_cluster_config_upb_strview.size, arena);
1741
+ if (aggregate_cluster_config == nullptr) {
1742
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1743
+ absl::StrCat(cluster_name, ": Can't parse aggregate cluster.")
1744
+ .c_str()));
1745
+ resource_names_failed->insert(cluster_name);
1746
+ continue;
1747
+ }
1748
+ size_t size;
1749
+ const upb_strview* clusters =
1750
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig_clusters(
1751
+ aggregate_cluster_config, &size);
1752
+ for (size_t i = 0; i < size; ++i) {
1753
+ const upb_strview cluster = clusters[i];
1754
+ cds_update.prioritized_cluster_names.emplace_back(
1755
+ UpbStringToStdString(cluster));
1756
+ }
1757
+ } else {
1758
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1759
+ absl::StrCat(cluster_name, ": DiscoveryType is not valid.")
1760
+ .c_str()));
1761
+ resource_names_failed->insert(cluster_name);
1762
+ continue;
1763
+ }
1764
+ } else {
1765
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1766
+ absl::StrCat(cluster_name, ": DiscoveryType is not valid.")
1767
+ .c_str()));
1768
+ resource_names_failed->insert(cluster_name);
1769
+ continue;
1770
+ }
1806
1771
  }
1807
1772
  // Check the LB policy.
1808
- if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) !=
1773
+ if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
1809
1774
  envoy_config_cluster_v3_Cluster_ROUND_ROBIN) {
1810
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1811
- "LB policy is not ROUND_ROBIN.");
1775
+ cds_update.lb_policy = "ROUND_ROBIN";
1776
+ } else if (XdsRingHashEnabled() &&
1777
+ envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
1778
+ envoy_config_cluster_v3_Cluster_RING_HASH) {
1779
+ cds_update.lb_policy = "RING_HASH";
1780
+ // Record ring hash lb config
1781
+ auto* ring_hash_config =
1782
+ envoy_config_cluster_v3_Cluster_ring_hash_lb_config(cluster);
1783
+ if (ring_hash_config == nullptr) {
1784
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1785
+ absl::StrCat(cluster_name,
1786
+ ": ring hash lb config required but not present.")
1787
+ .c_str()));
1788
+ resource_names_failed->insert(cluster_name);
1789
+ continue;
1790
+ }
1791
+ const google_protobuf_UInt64Value* max_ring_size =
1792
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_maximum_ring_size(
1793
+ ring_hash_config);
1794
+ if (max_ring_size != nullptr) {
1795
+ cds_update.max_ring_size =
1796
+ google_protobuf_UInt64Value_value(max_ring_size);
1797
+ if (cds_update.max_ring_size > 8388608 ||
1798
+ cds_update.max_ring_size == 0) {
1799
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1800
+ absl::StrCat(
1801
+ cluster_name,
1802
+ ": max_ring_size is not in the range of 1 to 8388608.")
1803
+ .c_str()));
1804
+ resource_names_failed->insert(cluster_name);
1805
+ continue;
1806
+ }
1807
+ }
1808
+ const google_protobuf_UInt64Value* min_ring_size =
1809
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_minimum_ring_size(
1810
+ ring_hash_config);
1811
+ if (min_ring_size != nullptr) {
1812
+ cds_update.min_ring_size =
1813
+ google_protobuf_UInt64Value_value(min_ring_size);
1814
+ if (cds_update.min_ring_size > 8388608 ||
1815
+ cds_update.min_ring_size == 0) {
1816
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1817
+ absl::StrCat(
1818
+ cluster_name,
1819
+ ": min_ring_size is not in the range of 1 to 8388608.")
1820
+ .c_str()));
1821
+ resource_names_failed->insert(cluster_name);
1822
+ continue;
1823
+ }
1824
+ if (cds_update.min_ring_size > cds_update.max_ring_size) {
1825
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1826
+ absl::StrCat(
1827
+ cluster_name,
1828
+ ": min_ring_size cannot be greater than max_ring_size.")
1829
+ .c_str()));
1830
+ resource_names_failed->insert(cluster_name);
1831
+ continue;
1832
+ }
1833
+ }
1834
+ if (envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
1835
+ ring_hash_config) ==
1836
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_XX_HASH) {
1837
+ cds_update.hash_function = XdsApi::CdsUpdate::HashFunction::XX_HASH;
1838
+ } else if (
1839
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
1840
+ ring_hash_config) ==
1841
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_MURMUR_HASH_2) {
1842
+ cds_update.hash_function =
1843
+ XdsApi::CdsUpdate::HashFunction::MURMUR_HASH_2;
1844
+ } else {
1845
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1846
+ absl::StrCat(cluster_name,
1847
+ ": ring hash lb config has invalid hash function.")
1848
+ .c_str()));
1849
+ resource_names_failed->insert(cluster_name);
1850
+ continue;
1851
+ }
1852
+ } else {
1853
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1854
+ absl::StrCat(cluster_name, ": LB policy is not supported.").c_str()));
1855
+ resource_names_failed->insert(cluster_name);
1856
+ continue;
1857
+ }
1858
+ if (XdsSecurityEnabled()) {
1859
+ // Record Upstream tls context
1860
+ auto* transport_socket =
1861
+ envoy_config_cluster_v3_Cluster_transport_socket(cluster);
1862
+ if (transport_socket != nullptr) {
1863
+ absl::string_view name = UpbStringToAbsl(
1864
+ envoy_config_core_v3_TransportSocket_name(transport_socket));
1865
+ if (name == "envoy.transport_sockets.tls") {
1866
+ auto* typed_config =
1867
+ envoy_config_core_v3_TransportSocket_typed_config(
1868
+ transport_socket);
1869
+ if (typed_config != nullptr) {
1870
+ const upb_strview encoded_upstream_tls_context =
1871
+ google_protobuf_Any_value(typed_config);
1872
+ auto* upstream_tls_context =
1873
+ envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
1874
+ encoded_upstream_tls_context.data,
1875
+ encoded_upstream_tls_context.size, arena);
1876
+ if (upstream_tls_context == nullptr) {
1877
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1878
+ absl::StrCat(cluster_name,
1879
+ ": Can't decode upstream tls context.")
1880
+ .c_str()));
1881
+ resource_names_failed->insert(cluster_name);
1882
+ continue;
1883
+ }
1884
+ auto* common_tls_context =
1885
+ envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
1886
+ upstream_tls_context);
1887
+ if (common_tls_context != nullptr) {
1888
+ grpc_error* error = CommonTlsContextParse(
1889
+ common_tls_context, &cds_update.common_tls_context);
1890
+ if (error != GRPC_ERROR_NONE) {
1891
+ errors.push_back(grpc_error_add_child(
1892
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1893
+ absl::StrCat(cluster_name, ": error in TLS context")
1894
+ .c_str()),
1895
+ error));
1896
+ resource_names_failed->insert(cluster_name);
1897
+ continue;
1898
+ }
1899
+ }
1900
+ }
1901
+ if (cds_update.common_tls_context.combined_validation_context
1902
+ .validation_context_certificate_provider_instance
1903
+ .instance_name.empty()) {
1904
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1905
+ absl::StrCat(cluster_name,
1906
+ "TLS configuration provided but no "
1907
+ "validation_context_certificate_provider_instance "
1908
+ "found.")
1909
+ .c_str()));
1910
+ resource_names_failed->insert(cluster_name);
1911
+ continue;
1912
+ }
1913
+ }
1914
+ }
1812
1915
  }
1813
1916
  // Record LRS server name (if any).
1814
1917
  const envoy_config_core_v3_ConfigSource* lrs_server =
1815
1918
  envoy_config_cluster_v3_Cluster_lrs_server(cluster);
1816
1919
  if (lrs_server != nullptr) {
1817
1920
  if (!envoy_config_core_v3_ConfigSource_has_self(lrs_server)) {
1818
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1819
- "LRS ConfigSource is not self.");
1921
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1922
+ absl::StrCat(cluster_name, ": LRS ConfigSource is not self.")
1923
+ .c_str()));
1924
+ resource_names_failed->insert(cluster_name);
1925
+ continue;
1820
1926
  }
1821
1927
  cds_update.lrs_load_reporting_server_name.emplace("");
1822
1928
  }
1823
- cds_update_map->emplace(std::move(cluster_name), std::move(cds_update));
1929
+ // The Cluster resource encodes the circuit breaking parameters in a list of
1930
+ // Thresholds messages, where each message specifies the parameters for a
1931
+ // particular RoutingPriority. we will look only at the first entry in the
1932
+ // list for priority DEFAULT and default to 1024 if not found.
1933
+ if (envoy_config_cluster_v3_Cluster_has_circuit_breakers(cluster)) {
1934
+ const envoy_config_cluster_v3_CircuitBreakers* circuit_breakers =
1935
+ envoy_config_cluster_v3_Cluster_circuit_breakers(cluster);
1936
+ size_t num_thresholds;
1937
+ const envoy_config_cluster_v3_CircuitBreakers_Thresholds* const*
1938
+ thresholds = envoy_config_cluster_v3_CircuitBreakers_thresholds(
1939
+ circuit_breakers, &num_thresholds);
1940
+ for (size_t i = 0; i < num_thresholds; ++i) {
1941
+ const auto* threshold = thresholds[i];
1942
+ if (envoy_config_cluster_v3_CircuitBreakers_Thresholds_priority(
1943
+ threshold) == envoy_config_core_v3_DEFAULT) {
1944
+ const google_protobuf_UInt32Value* max_requests =
1945
+ envoy_config_cluster_v3_CircuitBreakers_Thresholds_max_requests(
1946
+ threshold);
1947
+ if (max_requests != nullptr) {
1948
+ cds_update.max_concurrent_requests =
1949
+ google_protobuf_UInt32Value_value(max_requests);
1950
+ }
1951
+ break;
1952
+ }
1953
+ }
1954
+ }
1824
1955
  }
1825
- return GRPC_ERROR_NONE;
1956
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing CDS response", &errors);
1826
1957
  }
1827
1958
 
1828
1959
  grpc_error* ServerAddressParseAndAppend(
@@ -1858,7 +1989,7 @@ grpc_error* ServerAddressParseAndAppend(
1858
1989
 
1859
1990
  grpc_error* LocalityParse(
1860
1991
  const envoy_config_endpoint_v3_LocalityLbEndpoints* locality_lb_endpoints,
1861
- XdsApi::PriorityListUpdate::LocalityMap::Locality* output_locality) {
1992
+ XdsApi::EdsUpdate::Priority::Locality* output_locality, size_t* priority) {
1862
1993
  // Parse LB weight.
1863
1994
  const google_protobuf_UInt32Value* lb_weight =
1864
1995
  envoy_config_endpoint_v3_LocalityLbEndpoints_load_balancing_weight(
@@ -1888,25 +2019,24 @@ grpc_error* LocalityParse(
1888
2019
  locality_lb_endpoints, &size);
1889
2020
  for (size_t i = 0; i < size; ++i) {
1890
2021
  grpc_error* error = ServerAddressParseAndAppend(
1891
- lb_endpoints[i], &output_locality->serverlist);
2022
+ lb_endpoints[i], &output_locality->endpoints);
1892
2023
  if (error != GRPC_ERROR_NONE) return error;
1893
2024
  }
1894
2025
  // Parse the priority.
1895
- output_locality->priority =
1896
- envoy_config_endpoint_v3_LocalityLbEndpoints_priority(
1897
- locality_lb_endpoints);
2026
+ *priority = envoy_config_endpoint_v3_LocalityLbEndpoints_priority(
2027
+ locality_lb_endpoints);
1898
2028
  return GRPC_ERROR_NONE;
1899
2029
  }
1900
2030
 
1901
2031
  grpc_error* DropParseAndAppend(
1902
2032
  const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload*
1903
2033
  drop_overload,
1904
- XdsApi::DropConfig* drop_config) {
2034
+ XdsApi::EdsUpdate::DropConfig* drop_config) {
1905
2035
  // Get the category.
1906
2036
  std::string category = UpbStringToStdString(
1907
2037
  envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_category(
1908
2038
  drop_overload));
1909
- if (category.size() == 0) {
2039
+ if (category.empty()) {
1910
2040
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty drop category name");
1911
2041
  }
1912
2042
  // Get the drop rate (per million).
@@ -1938,21 +2068,25 @@ grpc_error* DropParseAndAppend(
1938
2068
  }
1939
2069
 
1940
2070
  grpc_error* EdsResponseParse(
1941
- XdsClient* client, TraceFlag* tracer,
2071
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
1942
2072
  const envoy_service_discovery_v3_DiscoveryResponse* response,
1943
2073
  const std::set<absl::string_view>& expected_eds_service_names,
1944
- XdsApi::EdsUpdateMap* eds_update_map, upb_arena* arena) {
2074
+ XdsApi::EdsUpdateMap* eds_update_map,
2075
+ std::set<std::string>* resource_names_failed, upb_arena* arena) {
2076
+ std::vector<grpc_error*> errors;
1945
2077
  // Get the resources from the response.
1946
2078
  size_t size;
1947
2079
  const google_protobuf_Any* const* resources =
1948
2080
  envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size);
1949
2081
  for (size_t i = 0; i < size; ++i) {
1950
- XdsApi::EdsUpdate eds_update;
1951
2082
  // Check the type_url of the resource.
1952
2083
  absl::string_view type_url =
1953
2084
  UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
1954
2085
  if (!IsEds(type_url)) {
1955
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not EDS.");
2086
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2087
+ absl::StrCat("resource index ", i, ": Resource is not EDS.")
2088
+ .c_str()));
2089
+ continue;
1956
2090
  }
1957
2091
  // Get the cluster_load_assignment.
1958
2092
  upb_strview encoded_cluster_load_assignment =
@@ -1962,10 +2096,14 @@ grpc_error* EdsResponseParse(
1962
2096
  encoded_cluster_load_assignment.data,
1963
2097
  encoded_cluster_load_assignment.size, arena);
1964
2098
  if (cluster_load_assignment == nullptr) {
1965
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1966
- "Can't parse cluster_load_assignment.");
2099
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2100
+ absl::StrCat("resource index ", i,
2101
+ ": Can't parse cluster_load_assignment.")
2102
+ .c_str()));
2103
+ continue;
1967
2104
  }
1968
- MaybeLogClusterLoadAssignment(client, tracer, cluster_load_assignment);
2105
+ MaybeLogClusterLoadAssignment(client, tracer, symtab,
2106
+ cluster_load_assignment);
1969
2107
  // Check the EDS service name. Ignore unexpected names.
1970
2108
  std::string eds_service_name = UpbStringToStdString(
1971
2109
  envoy_config_endpoint_v3_ClusterLoadAssignment_cluster_name(
@@ -1976,33 +2114,53 @@ grpc_error* EdsResponseParse(
1976
2114
  }
1977
2115
  // Fail on duplicate resources.
1978
2116
  if (eds_update_map->find(eds_service_name) != eds_update_map->end()) {
1979
- return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2117
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1980
2118
  absl::StrCat("duplicate resource name \"", eds_service_name, "\"")
1981
- .c_str());
2119
+ .c_str()));
2120
+ resource_names_failed->insert(eds_service_name);
2121
+ continue;
1982
2122
  }
2123
+ XdsApi::EdsUpdate& eds_update = (*eds_update_map)[eds_service_name];
1983
2124
  // Get the endpoints.
1984
2125
  size_t locality_size;
1985
2126
  const envoy_config_endpoint_v3_LocalityLbEndpoints* const* endpoints =
1986
2127
  envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(
1987
2128
  cluster_load_assignment, &locality_size);
2129
+ grpc_error* error = GRPC_ERROR_NONE;
1988
2130
  for (size_t j = 0; j < locality_size; ++j) {
1989
- XdsApi::PriorityListUpdate::LocalityMap::Locality locality;
1990
- grpc_error* error = LocalityParse(endpoints[j], &locality);
1991
- if (error != GRPC_ERROR_NONE) return error;
2131
+ size_t priority;
2132
+ XdsApi::EdsUpdate::Priority::Locality locality;
2133
+ error = LocalityParse(endpoints[j], &locality, &priority);
2134
+ if (error != GRPC_ERROR_NONE) break;
1992
2135
  // Filter out locality with weight 0.
1993
2136
  if (locality.lb_weight == 0) continue;
1994
- eds_update.priority_list_update.Add(locality);
2137
+ // Make sure prorities is big enough. Note that they might not
2138
+ // arrive in priority order.
2139
+ while (eds_update.priorities.size() < priority + 1) {
2140
+ eds_update.priorities.emplace_back();
2141
+ }
2142
+ eds_update.priorities[priority].localities.emplace(locality.name.get(),
2143
+ std::move(locality));
2144
+ }
2145
+ if (error != GRPC_ERROR_NONE) {
2146
+ errors.push_back(grpc_error_add_child(
2147
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2148
+ absl::StrCat(eds_service_name, ": locality validation error")
2149
+ .c_str()),
2150
+ error));
2151
+ resource_names_failed->insert(eds_service_name);
2152
+ continue;
1995
2153
  }
1996
- for (uint32_t priority = 0;
1997
- priority < eds_update.priority_list_update.size(); ++priority) {
1998
- auto* locality_map = eds_update.priority_list_update.Find(priority);
1999
- if (locality_map == nullptr || locality_map->size() == 0) {
2000
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2001
- "EDS update includes sparse priority list");
2154
+ for (const auto& priority : eds_update.priorities) {
2155
+ if (priority.localities.empty()) {
2156
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2157
+ absl::StrCat(eds_service_name, ": sparse priority list").c_str()));
2158
+ resource_names_failed->insert(eds_service_name);
2159
+ continue;
2002
2160
  }
2003
2161
  }
2004
2162
  // Get the drop config.
2005
- eds_update.drop_config = MakeRefCounted<XdsApi::DropConfig>();
2163
+ eds_update.drop_config = MakeRefCounted<XdsApi::EdsUpdate::DropConfig>();
2006
2164
  const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy* policy =
2007
2165
  envoy_config_endpoint_v3_ClusterLoadAssignment_policy(
2008
2166
  cluster_load_assignment);
@@ -2013,14 +2171,22 @@ grpc_error* EdsResponseParse(
2013
2171
  envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_drop_overloads(
2014
2172
  policy, &drop_size);
2015
2173
  for (size_t j = 0; j < drop_size; ++j) {
2016
- grpc_error* error =
2174
+ error =
2017
2175
  DropParseAndAppend(drop_overload[j], eds_update.drop_config.get());
2018
- if (error != GRPC_ERROR_NONE) return error;
2176
+ if (error != GRPC_ERROR_NONE) break;
2177
+ }
2178
+ if (error != GRPC_ERROR_NONE) {
2179
+ errors.push_back(grpc_error_add_child(
2180
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2181
+ absl::StrCat(eds_service_name, ": drop config validation error")
2182
+ .c_str()),
2183
+ error));
2184
+ resource_names_failed->insert(eds_service_name);
2185
+ continue;
2019
2186
  }
2020
2187
  }
2021
- eds_update_map->emplace(std::move(eds_service_name), std::move(eds_update));
2022
2188
  }
2023
- return GRPC_ERROR_NONE;
2189
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing EDS response", &errors);
2024
2190
  }
2025
2191
 
2026
2192
  std::string TypeUrlInternalToExternal(absl::string_view type_url) {
@@ -2036,10 +2202,20 @@ std::string TypeUrlInternalToExternal(absl::string_view type_url) {
2036
2202
  return std::string(type_url);
2037
2203
  }
2038
2204
 
2205
+ template <typename UpdateMap>
2206
+ void MoveUpdatesToFailedSet(UpdateMap* update_map,
2207
+ std::set<std::string>* resource_names_failed) {
2208
+ for (const auto& p : *update_map) {
2209
+ resource_names_failed->insert(p.first);
2210
+ }
2211
+ update_map->clear();
2212
+ }
2213
+
2039
2214
  } // namespace
2040
2215
 
2041
2216
  XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
2042
- const grpc_slice& encoded_response, const std::string& expected_server_name,
2217
+ const grpc_slice& encoded_response,
2218
+ const std::set<absl::string_view>& expected_listener_names,
2043
2219
  const std::set<absl::string_view>& expected_route_configuration_names,
2044
2220
  const std::set<absl::string_view>& expected_cluster_names,
2045
2221
  const std::set<absl::string_view>& expected_eds_service_names) {
@@ -2056,7 +2232,7 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
2056
2232
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode DiscoveryResponse.");
2057
2233
  return result;
2058
2234
  }
2059
- MaybeLogDiscoveryResponse(client_, tracer_, response);
2235
+ MaybeLogDiscoveryResponse(client_, tracer_, symtab_.ptr(), response);
2060
2236
  // Record the type_url, the version_info, and the nonce of the response.
2061
2237
  result.type_url = TypeUrlInternalToExternal(UpbStringToAbsl(
2062
2238
  envoy_service_discovery_v3_DiscoveryResponse_type_url(response)));
@@ -2066,21 +2242,38 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
2066
2242
  envoy_service_discovery_v3_DiscoveryResponse_nonce(response));
2067
2243
  // Parse the response according to the resource type.
2068
2244
  if (IsLds(result.type_url)) {
2069
- result.parse_error =
2070
- LdsResponseParse(client_, tracer_, response, expected_server_name,
2071
- &result.lds_update, arena.ptr());
2245
+ result.parse_error = LdsResponseParse(
2246
+ client_, tracer_, symtab_.ptr(), response, expected_listener_names,
2247
+ &result.lds_update_map, &result.resource_names_failed, arena.ptr());
2248
+ if (result.parse_error != GRPC_ERROR_NONE) {
2249
+ MoveUpdatesToFailedSet(&result.lds_update_map,
2250
+ &result.resource_names_failed);
2251
+ }
2072
2252
  } else if (IsRds(result.type_url)) {
2073
- result.parse_error = RdsResponseParse(client_, tracer_, response,
2074
- expected_route_configuration_names,
2075
- &result.rds_update, arena.ptr());
2253
+ result.parse_error = RdsResponseParse(
2254
+ client_, tracer_, symtab_.ptr(), response,
2255
+ expected_route_configuration_names, &result.rds_update_map,
2256
+ &result.resource_names_failed, arena.ptr());
2257
+ if (result.parse_error != GRPC_ERROR_NONE) {
2258
+ MoveUpdatesToFailedSet(&result.rds_update_map,
2259
+ &result.resource_names_failed);
2260
+ }
2076
2261
  } else if (IsCds(result.type_url)) {
2077
- result.parse_error =
2078
- CdsResponseParse(client_, tracer_, response, expected_cluster_names,
2079
- &result.cds_update_map, arena.ptr());
2262
+ result.parse_error = CdsResponseParse(
2263
+ client_, tracer_, symtab_.ptr(), response, expected_cluster_names,
2264
+ &result.cds_update_map, &result.resource_names_failed, arena.ptr());
2265
+ if (result.parse_error != GRPC_ERROR_NONE) {
2266
+ MoveUpdatesToFailedSet(&result.cds_update_map,
2267
+ &result.resource_names_failed);
2268
+ }
2080
2269
  } else if (IsEds(result.type_url)) {
2081
- result.parse_error =
2082
- EdsResponseParse(client_, tracer_, response, expected_eds_service_names,
2083
- &result.eds_update_map, arena.ptr());
2270
+ result.parse_error = EdsResponseParse(
2271
+ client_, tracer_, symtab_.ptr(), response, expected_eds_service_names,
2272
+ &result.eds_update_map, &result.resource_names_failed, arena.ptr());
2273
+ if (result.parse_error != GRPC_ERROR_NONE) {
2274
+ MoveUpdatesToFailedSet(&result.eds_update_map,
2275
+ &result.resource_names_failed);
2276
+ }
2084
2277
  }
2085
2278
  return result;
2086
2279
  }
@@ -2088,120 +2281,16 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
2088
2281
  namespace {
2089
2282
 
2090
2283
  void MaybeLogLrsRequest(
2091
- XdsClient* client, TraceFlag* tracer,
2092
- const envoy_service_load_stats_v3_LoadStatsRequest* request,
2093
- const std::string& build_version) {
2284
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
2285
+ const envoy_service_load_stats_v3_LoadStatsRequest* request) {
2094
2286
  if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
2095
2287
  gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
2096
- // TODO(roth): When we can upgrade upb, use upb textformat code to dump
2097
- // the raw proto instead of doing this manually.
2098
- std::vector<std::string> fields;
2099
- // node
2100
- const auto* node =
2101
- envoy_service_load_stats_v3_LoadStatsRequest_node(request);
2102
- if (node != nullptr) {
2103
- AddNodeLogFields(node, build_version, &fields);
2104
- }
2105
- // cluster_stats
2106
- size_t num_cluster_stats;
2107
- const struct envoy_config_endpoint_v3_ClusterStats* const* cluster_stats =
2108
- envoy_service_load_stats_v3_LoadStatsRequest_cluster_stats(
2109
- request, &num_cluster_stats);
2110
- for (size_t i = 0; i < num_cluster_stats; ++i) {
2111
- const auto* cluster_stat = cluster_stats[i];
2112
- fields.emplace_back("cluster_stats {");
2113
- // cluster_name
2114
- AddStringField(
2115
- " cluster_name",
2116
- envoy_config_endpoint_v3_ClusterStats_cluster_name(cluster_stat),
2117
- &fields);
2118
- // cluster_service_name
2119
- AddStringField(" cluster_service_name",
2120
- envoy_config_endpoint_v3_ClusterStats_cluster_service_name(
2121
- cluster_stat),
2122
- &fields);
2123
- // upstream_locality_stats
2124
- size_t num_stats;
2125
- const envoy_config_endpoint_v3_UpstreamLocalityStats* const* stats =
2126
- envoy_config_endpoint_v3_ClusterStats_upstream_locality_stats(
2127
- cluster_stat, &num_stats);
2128
- for (size_t j = 0; j < num_stats; ++j) {
2129
- const auto* stat = stats[j];
2130
- fields.emplace_back(" upstream_locality_stats {");
2131
- // locality
2132
- const auto* locality =
2133
- envoy_config_endpoint_v3_UpstreamLocalityStats_locality(stat);
2134
- if (locality != nullptr) {
2135
- fields.emplace_back(" locality {");
2136
- AddLocalityField(3, locality, &fields);
2137
- fields.emplace_back(" }");
2138
- }
2139
- // total_successful_requests
2140
- fields.emplace_back(absl::StrCat(
2141
- " total_successful_requests: ",
2142
- envoy_config_endpoint_v3_UpstreamLocalityStats_total_successful_requests(
2143
- stat)));
2144
- // total_requests_in_progress
2145
- fields.emplace_back(absl::StrCat(
2146
- " total_requests_in_progress: ",
2147
- envoy_config_endpoint_v3_UpstreamLocalityStats_total_requests_in_progress(
2148
- stat)));
2149
- // total_error_requests
2150
- fields.emplace_back(absl::StrCat(
2151
- " total_error_requests: ",
2152
- envoy_config_endpoint_v3_UpstreamLocalityStats_total_error_requests(
2153
- stat)));
2154
- // total_issued_requests
2155
- fields.emplace_back(absl::StrCat(
2156
- " total_issued_requests: ",
2157
- envoy_config_endpoint_v3_UpstreamLocalityStats_total_issued_requests(
2158
- stat)));
2159
- fields.emplace_back(" }");
2160
- }
2161
- // total_dropped_requests
2162
- fields.emplace_back(absl::StrCat(
2163
- " total_dropped_requests: ",
2164
- envoy_config_endpoint_v3_ClusterStats_total_dropped_requests(
2165
- cluster_stat)));
2166
- // dropped_requests
2167
- size_t num_drops;
2168
- const envoy_config_endpoint_v3_ClusterStats_DroppedRequests* const*
2169
- drops = envoy_config_endpoint_v3_ClusterStats_dropped_requests(
2170
- cluster_stat, &num_drops);
2171
- for (size_t j = 0; j < num_drops; ++j) {
2172
- const auto* drop = drops[j];
2173
- fields.emplace_back(" dropped_requests {");
2174
- // category
2175
- AddStringField(
2176
- " category",
2177
- envoy_config_endpoint_v3_ClusterStats_DroppedRequests_category(
2178
- drop),
2179
- &fields);
2180
- // dropped_count
2181
- fields.emplace_back(absl::StrCat(
2182
- " dropped_count: ",
2183
- envoy_config_endpoint_v3_ClusterStats_DroppedRequests_dropped_count(
2184
- drop)));
2185
- fields.emplace_back(" }");
2186
- }
2187
- // load_report_interval
2188
- const auto* load_report_interval =
2189
- envoy_config_endpoint_v3_ClusterStats_load_report_interval(
2190
- cluster_stat);
2191
- if (load_report_interval != nullptr) {
2192
- fields.emplace_back(" load_report_interval {");
2193
- fields.emplace_back(absl::StrCat(
2194
- " seconds: ",
2195
- google_protobuf_Duration_seconds(load_report_interval)));
2196
- fields.emplace_back(
2197
- absl::StrCat(" nanos: ",
2198
- google_protobuf_Duration_nanos(load_report_interval)));
2199
- fields.emplace_back(" }");
2200
- }
2201
- fields.emplace_back("}");
2202
- }
2288
+ const upb_msgdef* msg_type =
2289
+ envoy_service_load_stats_v3_LoadStatsRequest_getmsgdef(symtab);
2290
+ char buf[10240];
2291
+ upb_text_encode(request, msg_type, nullptr, 0, buf, sizeof(buf));
2203
2292
  gpr_log(GPR_DEBUG, "[xds_client %p] constructed LRS request: %s", client,
2204
- absl::StrJoin(fields, "\n").c_str());
2293
+ buf);
2205
2294
  }
2206
2295
  }
2207
2296
 
@@ -2216,7 +2305,8 @@ grpc_slice SerializeLrsRequest(
2216
2305
 
2217
2306
  } // namespace
2218
2307
 
2219
- grpc_slice XdsApi::CreateLrsInitialRequest(const std::string& server_name) {
2308
+ grpc_slice XdsApi::CreateLrsInitialRequest(
2309
+ const XdsBootstrap::XdsServer& server) {
2220
2310
  upb::Arena arena;
2221
2311
  // Create a request.
2222
2312
  envoy_service_load_stats_v3_LoadStatsRequest* request =
@@ -2225,12 +2315,12 @@ grpc_slice XdsApi::CreateLrsInitialRequest(const std::string& server_name) {
2225
2315
  envoy_config_core_v3_Node* node_msg =
2226
2316
  envoy_service_load_stats_v3_LoadStatsRequest_mutable_node(request,
2227
2317
  arena.ptr());
2228
- PopulateNode(arena.ptr(), bootstrap_, build_version_, user_agent_name_,
2229
- server_name, node_msg);
2318
+ PopulateNode(arena.ptr(), node_, server.ShouldUseV3(), build_version_,
2319
+ user_agent_name_, node_msg);
2230
2320
  envoy_config_core_v3_Node_add_client_features(
2231
2321
  node_msg, upb_strview_makez("envoy.lrs.supports_send_all_clusters"),
2232
2322
  arena.ptr());
2233
- MaybeLogLrsRequest(client_, tracer_, request, build_version_);
2323
+ MaybeLogLrsRequest(client_, tracer_, symtab_.ptr(), request);
2234
2324
  return SerializeLrsRequest(request, arena.ptr());
2235
2325
  }
2236
2326
 
@@ -2317,7 +2407,7 @@ grpc_slice XdsApi::CreateLrsRequest(
2317
2407
  }
2318
2408
  // Add dropped requests.
2319
2409
  uint64_t total_dropped_requests = 0;
2320
- for (const auto& p : load_report.dropped_requests) {
2410
+ for (const auto& p : load_report.dropped_requests.categorized_drops) {
2321
2411
  const std::string& category = p.first;
2322
2412
  const uint64_t count = p.second;
2323
2413
  envoy_config_endpoint_v3_ClusterStats_DroppedRequests* dropped_requests =
@@ -2329,6 +2419,7 @@ grpc_slice XdsApi::CreateLrsRequest(
2329
2419
  dropped_requests, count);
2330
2420
  total_dropped_requests += count;
2331
2421
  }
2422
+ total_dropped_requests += load_report.dropped_requests.uncategorized_drops;
2332
2423
  // Set total dropped requests.
2333
2424
  envoy_config_endpoint_v3_ClusterStats_set_total_dropped_requests(
2334
2425
  cluster_stats, total_dropped_requests);
@@ -2341,7 +2432,7 @@ grpc_slice XdsApi::CreateLrsRequest(
2341
2432
  google_protobuf_Duration_set_seconds(load_report_interval, timespec.tv_sec);
2342
2433
  google_protobuf_Duration_set_nanos(load_report_interval, timespec.tv_nsec);
2343
2434
  }
2344
- MaybeLogLrsRequest(client_, tracer_, request, build_version_);
2435
+ MaybeLogLrsRequest(client_, tracer_, symtab_.ptr(), request);
2345
2436
  return SerializeLrsRequest(request, arena.ptr());
2346
2437
  }
2347
2438