grpc 1.41.0 → 1.42.0.pre1

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 (519) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -44
  3. data/etc/roots.pem +335 -326
  4. data/include/grpc/event_engine/event_engine.h +82 -42
  5. data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
  6. data/include/grpc/event_engine/memory_allocator.h +210 -0
  7. data/include/grpc/grpc.h +4 -0
  8. data/include/grpc/grpc_security.h +18 -0
  9. data/include/grpc/grpc_security_constants.h +1 -0
  10. data/include/grpc/impl/codegen/port_platform.h +7 -0
  11. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
  12. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  13. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  14. data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
  15. data/src/core/ext/filters/client_channel/client_channel.h +74 -27
  16. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  17. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
  19. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  21. data/src/core/ext/filters/client_channel/connector.h +18 -18
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
  23. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
  43. data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  45. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
  53. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  54. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  55. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  59. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  60. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  61. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  62. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  63. data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
  64. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  65. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  66. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  67. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  68. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  69. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  70. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
  72. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  73. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  74. data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
  75. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  76. data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
  77. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  78. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  79. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
  80. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  81. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  82. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  83. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  84. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  85. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  86. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  87. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
  89. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
  90. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
  92. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
  93. data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
  94. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
  95. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  96. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  97. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  98. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  99. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  100. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
  102. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
  103. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  107. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  108. data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
  109. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  110. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  111. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  112. data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
  113. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
  114. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
  119. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
  120. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
  122. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
  123. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
  124. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
  125. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
  126. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
  127. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
  128. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
  129. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
  130. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
  131. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  132. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
  133. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  134. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  135. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  136. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  137. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
  138. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
  139. data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
  140. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
  141. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
  142. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  143. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
  144. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  145. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
  146. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
  147. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
  148. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
  149. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
  150. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
  151. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
  152. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
  153. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
  154. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
  155. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  156. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
  157. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
  158. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
  159. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
  160. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
  161. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
  162. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
  163. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  164. data/src/core/ext/xds/xds_api.cc +325 -362
  165. data/src/core/ext/xds/xds_api.h +134 -82
  166. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  167. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  168. data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
  169. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  170. data/src/core/ext/xds/xds_client.cc +527 -314
  171. data/src/core/ext/xds/xds_client.h +42 -37
  172. data/src/core/ext/xds/xds_client_stats.h +1 -1
  173. data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
  174. data/src/core/lib/address_utils/parse_address.cc +2 -0
  175. data/src/core/lib/avl/avl.cc +5 -5
  176. data/src/core/lib/backoff/backoff.cc +1 -1
  177. data/src/core/lib/channel/channel_args.cc +24 -6
  178. data/src/core/lib/channel/channel_args.h +9 -0
  179. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  180. data/src/core/lib/channel/channel_trace.cc +1 -1
  181. data/src/core/lib/channel/channel_trace.h +1 -1
  182. data/src/core/lib/channel/channelz.cc +3 -3
  183. data/src/core/lib/channel/channelz.h +2 -2
  184. data/src/core/lib/channel/channelz_registry.cc +1 -1
  185. data/src/core/lib/channel/channelz_registry.h +1 -1
  186. data/src/core/lib/channel/connected_channel.cc +1 -3
  187. data/src/core/lib/channel/connected_channel.h +1 -2
  188. data/src/core/lib/compression/compression.cc +2 -2
  189. data/src/core/lib/compression/compression_args.cc +6 -4
  190. data/src/core/lib/compression/compression_internal.cc +2 -2
  191. data/src/core/lib/compression/compression_internal.h +1 -1
  192. data/src/core/lib/config/core_configuration.cc +44 -2
  193. data/src/core/lib/config/core_configuration.h +39 -1
  194. data/src/core/lib/debug/stats.cc +1 -1
  195. data/src/core/lib/debug/stats_data.cc +13 -13
  196. data/src/core/lib/gpr/atm.cc +1 -1
  197. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  198. data/src/core/lib/gpr/string.cc +2 -2
  199. data/src/core/lib/gpr/tls.h +1 -1
  200. data/src/core/lib/gpr/useful.h +79 -32
  201. data/src/core/lib/gprpp/arena.h +10 -0
  202. data/src/core/lib/gprpp/bitset.h +38 -16
  203. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  204. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  205. data/src/core/lib/gprpp/match.h +1 -1
  206. data/src/core/lib/gprpp/memory.h +6 -0
  207. data/src/core/lib/gprpp/overload.h +1 -1
  208. data/src/core/lib/gprpp/status_helper.cc +23 -3
  209. data/src/core/lib/gprpp/status_helper.h +12 -1
  210. data/src/core/lib/gprpp/table.h +411 -0
  211. data/src/core/lib/http/httpcli.cc +200 -182
  212. data/src/core/lib/http/parser.cc +2 -2
  213. data/src/core/lib/iomgr/call_combiner.cc +28 -10
  214. data/src/core/lib/iomgr/combiner.cc +6 -21
  215. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
  216. data/src/core/lib/iomgr/error.cc +113 -52
  217. data/src/core/lib/iomgr/error.h +50 -9
  218. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  222. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  223. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  224. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
  225. data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
  226. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  227. data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
  228. data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
  229. data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
  230. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  231. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  232. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  233. data/src/core/lib/iomgr/executor.cc +6 -20
  234. data/src/core/lib/iomgr/iomgr.cc +3 -1
  235. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  236. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  237. data/src/core/lib/iomgr/load_file.cc +2 -2
  238. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  239. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  240. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  242. data/src/core/lib/iomgr/resource_quota.cc +13 -11
  243. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  244. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  245. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  246. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
  247. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
  248. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
  249. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  250. data/src/core/lib/iomgr/tcp_posix.cc +4 -5
  251. data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
  252. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
  254. data/src/core/lib/iomgr/tcp_windows.cc +2 -2
  255. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  256. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  257. data/src/core/lib/json/json_util.cc +68 -0
  258. data/src/core/lib/json/json_util.h +57 -99
  259. data/src/core/lib/json/json_writer.cc +0 -3
  260. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  261. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  262. data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
  263. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
  264. data/src/core/lib/security/context/security_context.cc +4 -2
  265. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  266. data/src/core/lib/security/credentials/credentials.cc +4 -2
  267. data/src/core/lib/security/credentials/credentials.h +6 -1
  268. data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
  269. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  270. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
  272. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  273. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  274. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  275. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  276. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
  277. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
  278. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
  279. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  280. data/src/core/lib/security/transport/security_handshaker.cc +73 -43
  281. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  282. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  283. data/src/core/lib/slice/slice.cc +0 -16
  284. data/src/core/lib/slice/slice_api.cc +39 -0
  285. data/src/core/lib/slice/slice_buffer.cc +5 -5
  286. data/src/core/lib/slice/slice_intern.cc +8 -13
  287. data/src/core/lib/slice/slice_internal.h +1 -244
  288. data/src/core/lib/slice/slice_refcount.cc +17 -0
  289. data/src/core/lib/slice/slice_refcount.h +121 -0
  290. data/src/core/lib/slice/slice_refcount_base.h +173 -0
  291. data/src/core/lib/slice/slice_split.cc +100 -0
  292. data/src/core/lib/slice/slice_split.h +40 -0
  293. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  294. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  295. data/src/core/lib/slice/static_slice.cc +529 -0
  296. data/src/core/lib/slice/static_slice.h +331 -0
  297. data/src/core/lib/surface/builtins.cc +49 -0
  298. data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
  299. data/src/core/lib/surface/call.cc +103 -120
  300. data/src/core/lib/surface/call.h +0 -6
  301. data/src/core/lib/surface/channel.cc +19 -32
  302. data/src/core/lib/surface/channel.h +0 -9
  303. data/src/core/lib/surface/channel_init.cc +23 -76
  304. data/src/core/lib/surface/channel_init.h +52 -44
  305. data/src/core/lib/surface/completion_queue.cc +6 -5
  306. data/src/core/lib/surface/init.cc +0 -39
  307. data/src/core/lib/surface/init_secure.cc +17 -14
  308. data/src/core/lib/surface/lame_client.cc +18 -11
  309. data/src/core/lib/surface/lame_client.h +1 -1
  310. data/src/core/lib/surface/server.cc +25 -17
  311. data/src/core/lib/surface/server.h +17 -10
  312. data/src/core/lib/surface/validate_metadata.cc +5 -2
  313. data/src/core/lib/surface/version.cc +2 -2
  314. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  315. data/src/core/lib/transport/error_utils.cc +42 -17
  316. data/src/core/lib/transport/error_utils.h +1 -1
  317. data/src/core/lib/transport/metadata.cc +31 -10
  318. data/src/core/lib/transport/metadata.h +2 -1
  319. data/src/core/lib/transport/metadata_batch.cc +35 -371
  320. data/src/core/lib/transport/metadata_batch.h +905 -71
  321. data/src/core/lib/transport/parsed_metadata.h +263 -0
  322. data/src/core/lib/transport/pid_controller.cc +4 -4
  323. data/src/core/lib/transport/static_metadata.cc +714 -846
  324. data/src/core/lib/transport/static_metadata.h +115 -379
  325. data/src/core/lib/transport/status_metadata.cc +1 -0
  326. data/src/core/lib/transport/transport.cc +4 -5
  327. data/src/core/lib/transport/transport_op_string.cc +40 -20
  328. data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
  329. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  330. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  331. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  332. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
  333. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  335. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  336. data/src/core/tsi/fake_transport_security.cc +15 -7
  337. data/src/core/tsi/local_transport_security.cc +36 -73
  338. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  339. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  340. data/src/core/tsi/ssl_transport_security.cc +10 -2
  341. data/src/core/tsi/transport_security.cc +12 -0
  342. data/src/core/tsi/transport_security.h +16 -1
  343. data/src/core/tsi/transport_security_interface.h +26 -0
  344. data/src/ruby/ext/grpc/extconf.rb +12 -9
  345. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  346. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  349. data/src/ruby/spec/client_server_spec.rb +1 -1
  350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  351. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
  352. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  353. data/third_party/boringssl-with-bazel/err_data.c +278 -272
  354. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
  355. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  356. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
  357. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
  358. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
  359. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  360. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  365. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +38 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
  372. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
  373. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  374. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  375. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  377. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  378. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  379. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  381. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
  382. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  383. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
  384. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
  385. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  395. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  396. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  402. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  403. data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
  404. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  405. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  406. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  407. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  408. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  409. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  410. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
  411. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
  412. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
  424. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
  425. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
  426. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
  427. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
  428. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
  436. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
  437. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
  438. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
  439. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
  440. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  442. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  443. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
  444. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  445. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
  446. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +366 -227
  447. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
  448. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -4
  449. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  451. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
  452. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
  453. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  454. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
  455. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
  456. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
  457. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
  458. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
  459. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +28 -14
  460. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
  461. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +529 -91
  462. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
  463. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
  464. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
  465. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
  466. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
  467. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
  468. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
  469. data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
  470. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  471. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
  472. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
  473. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
  474. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
  475. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
  476. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
  477. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
  478. data/third_party/re2/re2/compile.cc +91 -109
  479. data/third_party/re2/re2/dfa.cc +27 -39
  480. data/third_party/re2/re2/filtered_re2.cc +18 -2
  481. data/third_party/re2/re2/filtered_re2.h +10 -5
  482. data/third_party/re2/re2/nfa.cc +1 -1
  483. data/third_party/re2/re2/parse.cc +42 -23
  484. data/third_party/re2/re2/perl_groups.cc +34 -34
  485. data/third_party/re2/re2/prefilter.cc +3 -2
  486. data/third_party/re2/re2/prog.cc +182 -4
  487. data/third_party/re2/re2/prog.h +28 -9
  488. data/third_party/re2/re2/re2.cc +87 -118
  489. data/third_party/re2/re2/re2.h +156 -141
  490. data/third_party/re2/re2/regexp.cc +12 -5
  491. data/third_party/re2/re2/regexp.h +8 -2
  492. data/third_party/re2/re2/set.cc +31 -9
  493. data/third_party/re2/re2/set.h +9 -4
  494. data/third_party/re2/re2/simplify.cc +11 -3
  495. data/third_party/re2/re2/tostring.cc +1 -1
  496. data/third_party/re2/re2/walker-inl.h +1 -1
  497. data/third_party/re2/util/mutex.h +2 -2
  498. data/third_party/re2/util/pcre.h +3 -3
  499. metadata +83 -70
  500. data/include/grpc/event_engine/slice_allocator.h +0 -71
  501. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  502. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  503. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  504. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  505. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  506. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  507. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  508. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  509. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  510. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  511. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  512. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  513. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  514. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  515. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  516. data/src/core/lib/iomgr/udp_server.cc +0 -747
  517. data/src/core/lib/iomgr/udp_server.h +0 -103
  518. data/src/core/lib/transport/authority_override.cc +0 -40
  519. data/src/core/lib/transport/authority_override.h +0 -37
@@ -82,10 +82,10 @@
82
82
  #include "google/protobuf/timestamp.upb.h"
83
83
  #include "google/protobuf/wrappers.upb.h"
84
84
  #include "google/rpc/status.upb.h"
85
- #include "udpa/type/v1/typed_struct.upb.h"
86
85
  #include "upb/text_encode.h"
87
86
  #include "upb/upb.h"
88
87
  #include "upb/upb.hpp"
88
+ #include "xds/type/v3/typed_struct.upb.h"
89
89
 
90
90
  #include <grpc/impl/codegen/log.h>
91
91
  #include <grpc/support/alloc.h>
@@ -94,12 +94,12 @@
94
94
  #include "src/core/lib/address_utils/sockaddr_utils.h"
95
95
  #include "src/core/lib/gpr/env.h"
96
96
  #include "src/core/lib/gpr/string.h"
97
- #include "src/core/lib/gpr/useful.h"
98
97
  #include "src/core/lib/gprpp/host_port.h"
99
98
  #include "src/core/lib/iomgr/error.h"
100
99
  #include "src/core/lib/iomgr/sockaddr.h"
101
100
  #include "src/core/lib/iomgr/socket_utils.h"
102
101
  #include "src/core/lib/slice/slice_utils.h"
102
+ #include "src/core/lib/uri/uri_parser.h"
103
103
 
104
104
  namespace grpc_core {
105
105
 
@@ -116,11 +116,58 @@ bool XdsAggregateAndLogicalDnsClusterEnabled() {
116
116
  return parse_succeeded && parsed_value;
117
117
  }
118
118
 
119
+ // TODO(yashykt): Remove once RBAC is no longer experimental
120
+ bool XdsRbacEnabled() {
121
+ char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_RBAC");
122
+ bool parsed_value;
123
+ bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
124
+ gpr_free(value);
125
+ return parse_succeeded && parsed_value;
126
+ }
127
+
128
+ //
129
+ // XdsApi::RetryPolicy
130
+ //
131
+
132
+ std::string XdsApi::RetryPolicy::RetryBackOff::ToString() const {
133
+ std::vector<std::string> contents;
134
+ contents.push_back(
135
+ absl::StrCat("RetryBackOff Base: ", base_interval.ToString()));
136
+ contents.push_back(
137
+ absl::StrCat("RetryBackOff max: ", max_interval.ToString()));
138
+ return absl::StrJoin(contents, ",");
139
+ }
140
+
141
+ std::string XdsApi::RetryPolicy::ToString() const {
142
+ std::vector<std::string> contents;
143
+ contents.push_back(absl::StrFormat("num_retries=%d", num_retries));
144
+ contents.push_back(retry_back_off.ToString());
145
+ return absl::StrCat("{", absl::StrJoin(contents, ","), "}");
146
+ }
147
+
148
+ //
149
+ // XdsApi::Route::Matchers
150
+ //
151
+
152
+ std::string XdsApi::Route::Matchers::ToString() const {
153
+ std::vector<std::string> contents;
154
+ contents.push_back(
155
+ absl::StrFormat("PathMatcher{%s}", path_matcher.ToString()));
156
+ for (const HeaderMatcher& header_matcher : header_matchers) {
157
+ contents.push_back(header_matcher.ToString());
158
+ }
159
+ if (fraction_per_million.has_value()) {
160
+ contents.push_back(absl::StrFormat("Fraction Per Million %d",
161
+ fraction_per_million.value()));
162
+ }
163
+ return absl::StrJoin(contents, "\n");
164
+ }
165
+
119
166
  //
120
- // XdsApi::Route::HashPolicy
167
+ // XdsApi::Route::RouteAction::HashPolicy
121
168
  //
122
169
 
123
- XdsApi::Route::HashPolicy::HashPolicy(const HashPolicy& other)
170
+ XdsApi::Route::RouteAction::HashPolicy::HashPolicy(const HashPolicy& other)
124
171
  : type(other.type),
125
172
  header_name(other.header_name),
126
173
  regex_substitution(other.regex_substitution) {
@@ -130,8 +177,8 @@ XdsApi::Route::HashPolicy::HashPolicy(const HashPolicy& other)
130
177
  }
131
178
  }
132
179
 
133
- XdsApi::Route::HashPolicy& XdsApi::Route::HashPolicy::operator=(
134
- const HashPolicy& other) {
180
+ XdsApi::Route::RouteAction::HashPolicy&
181
+ XdsApi::Route::RouteAction::HashPolicy::operator=(const HashPolicy& other) {
135
182
  type = other.type;
136
183
  header_name = other.header_name;
137
184
  if (other.regex != nullptr) {
@@ -142,14 +189,14 @@ XdsApi::Route::HashPolicy& XdsApi::Route::HashPolicy::operator=(
142
189
  return *this;
143
190
  }
144
191
 
145
- XdsApi::Route::HashPolicy::HashPolicy(HashPolicy&& other) noexcept
192
+ XdsApi::Route::RouteAction::HashPolicy::HashPolicy(HashPolicy&& other) noexcept
146
193
  : type(other.type),
147
194
  header_name(std::move(other.header_name)),
148
195
  regex(std::move(other.regex)),
149
196
  regex_substitution(std::move(other.regex_substitution)) {}
150
197
 
151
- XdsApi::Route::HashPolicy& XdsApi::Route::HashPolicy::operator=(
152
- HashPolicy&& other) noexcept {
198
+ XdsApi::Route::RouteAction::HashPolicy&
199
+ XdsApi::Route::RouteAction::HashPolicy::operator=(HashPolicy&& other) noexcept {
153
200
  type = other.type;
154
201
  header_name = std::move(other.header_name);
155
202
  regex = std::move(other.regex);
@@ -157,7 +204,7 @@ XdsApi::Route::HashPolicy& XdsApi::Route::HashPolicy::operator=(
157
204
  return *this;
158
205
  }
159
206
 
160
- bool XdsApi::Route::HashPolicy::HashPolicy::operator==(
207
+ bool XdsApi::Route::RouteAction::HashPolicy::HashPolicy::operator==(
161
208
  const HashPolicy& other) const {
162
209
  if (type != other.type) return false;
163
210
  if (type == Type::HEADER) {
@@ -173,7 +220,7 @@ bool XdsApi::Route::HashPolicy::HashPolicy::operator==(
173
220
  return true;
174
221
  }
175
222
 
176
- std::string XdsApi::Route::HashPolicy::ToString() const {
223
+ std::string XdsApi::Route::RouteAction::HashPolicy::ToString() const {
177
224
  std::vector<std::string> contents;
178
225
  switch (type) {
179
226
  case Type::HEADER:
@@ -194,43 +241,10 @@ std::string XdsApi::Route::HashPolicy::ToString() const {
194
241
  }
195
242
 
196
243
  //
197
- // XdsApi::Route::RetryPolicy
198
- //
199
- std::string XdsApi::Route::RetryPolicy::RetryBackOff::ToString() const {
200
- std::vector<std::string> contents;
201
- contents.push_back(
202
- absl::StrCat("RetryBackOff Base: ", base_interval.ToString()));
203
- contents.push_back(
204
- absl::StrCat("RetryBackOff max: ", max_interval.ToString()));
205
- return absl::StrJoin(contents, ",");
206
- }
207
-
208
- std::string XdsApi::Route::RetryPolicy::ToString() const {
209
- std::vector<std::string> contents;
210
- contents.push_back(absl::StrFormat("num_retries=%d", num_retries));
211
- contents.push_back(retry_back_off.ToString());
212
- return absl::StrJoin(contents, ",");
213
- }
214
-
215
- //
216
- // XdsApi::Route
244
+ // XdsApi::Route::RouteAction::ClusterWeight
217
245
  //
218
246
 
219
- std::string XdsApi::Route::Matchers::ToString() const {
220
- std::vector<std::string> contents;
221
- contents.push_back(
222
- absl::StrFormat("PathMatcher{%s}", path_matcher.ToString()));
223
- for (const HeaderMatcher& header_matcher : header_matchers) {
224
- contents.push_back(header_matcher.ToString());
225
- }
226
- if (fraction_per_million.has_value()) {
227
- contents.push_back(absl::StrFormat("Fraction Per Million %d",
228
- fraction_per_million.value()));
229
- }
230
- return absl::StrJoin(contents, "\n");
231
- }
232
-
233
- std::string XdsApi::Route::ClusterWeight::ToString() const {
247
+ std::string XdsApi::Route::RouteAction::ClusterWeight::ToString() const {
234
248
  std::vector<std::string> contents;
235
249
  contents.push_back(absl::StrCat("cluster=", name));
236
250
  contents.push_back(absl::StrCat("weight=", weight));
@@ -247,15 +261,17 @@ std::string XdsApi::Route::ClusterWeight::ToString() const {
247
261
  return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
248
262
  }
249
263
 
250
- std::string XdsApi::Route::ToString() const {
264
+ //
265
+ // XdsApi::Route::RouteAction
266
+ //
267
+
268
+ std::string XdsApi::Route::RouteAction::ToString() const {
251
269
  std::vector<std::string> contents;
252
- contents.push_back(matchers.ToString());
253
270
  for (const HashPolicy& hash_policy : hash_policies) {
254
271
  contents.push_back(absl::StrCat("hash_policy=", hash_policy.ToString()));
255
272
  }
256
273
  if (retry_policy.has_value()) {
257
- contents.push_back(
258
- absl::StrCat("retry_policy={", retry_policy->ToString(), "}"));
274
+ contents.push_back(absl::StrCat("retry_policy=", retry_policy->ToString()));
259
275
  }
260
276
  if (!cluster_name.empty()) {
261
277
  contents.push_back(absl::StrFormat("Cluster name: %s", cluster_name));
@@ -266,6 +282,25 @@ std::string XdsApi::Route::ToString() const {
266
282
  if (max_stream_duration.has_value()) {
267
283
  contents.push_back(max_stream_duration->ToString());
268
284
  }
285
+ return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
286
+ }
287
+
288
+ //
289
+ // XdsApi::Route
290
+ //
291
+
292
+ std::string XdsApi::Route::ToString() const {
293
+ std::vector<std::string> contents;
294
+ contents.push_back(matchers.ToString());
295
+ auto* route_action = absl::get_if<XdsApi::Route::RouteAction>(&action);
296
+ if (route_action != nullptr) {
297
+ contents.push_back(absl::StrCat("route=", route_action->ToString()));
298
+ } else if (absl::holds_alternative<XdsApi::Route::NonForwardingAction>(
299
+ action)) {
300
+ contents.push_back("non_forwarding_action={}");
301
+ } else {
302
+ contents.push_back("unknown_action={}");
303
+ }
269
304
  if (!typed_per_filter_config.empty()) {
270
305
  contents.push_back("typed_per_filter_config={");
271
306
  for (const auto& p : typed_per_filter_config) {
@@ -804,7 +839,7 @@ const char* kCdsV2TypeUrl = "type.googleapis.com/envoy.api.v2.Cluster";
804
839
  const char* kEdsV2TypeUrl =
805
840
  "type.googleapis.com/envoy.api.v2.ClusterLoadAssignment";
806
841
 
807
- bool IsLds(absl::string_view type_url, bool* is_v2 = nullptr) {
842
+ bool IsLdsInternal(absl::string_view type_url, bool* is_v2 = nullptr) {
808
843
  if (type_url == XdsApi::kLdsTypeUrl) return true;
809
844
  if (type_url == kLdsV2TypeUrl) {
810
845
  if (is_v2 != nullptr) *is_v2 = true;
@@ -813,18 +848,46 @@ bool IsLds(absl::string_view type_url, bool* is_v2 = nullptr) {
813
848
  return false;
814
849
  }
815
850
 
816
- bool IsRds(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
851
+ bool IsRdsInternal(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
817
852
  return type_url == XdsApi::kRdsTypeUrl || type_url == kRdsV2TypeUrl;
818
853
  }
819
854
 
820
- bool IsCds(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
855
+ bool IsCdsInternal(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
821
856
  return type_url == XdsApi::kCdsTypeUrl || type_url == kCdsV2TypeUrl;
822
857
  }
823
858
 
824
- bool IsEds(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
859
+ bool IsEdsInternal(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
825
860
  return type_url == XdsApi::kEdsTypeUrl || type_url == kEdsV2TypeUrl;
826
861
  }
827
862
 
863
+ absl::StatusOr<XdsApi::ResourceName> ParseResourceNameInternal(
864
+ absl::string_view name,
865
+ std::function<bool(absl::string_view, bool*)> is_expected_type) {
866
+ // Old-style names use the empty string for authority.
867
+ // ID is prefixed with "old:" to indicate that it's an old-style name.
868
+ if (!absl::StartsWith(name, "xdstp:")) {
869
+ return XdsApi::ResourceName{"", absl::StrCat("old:", name)};
870
+ }
871
+ // New style name. Parse URI.
872
+ auto uri = URI::Parse(name);
873
+ if (!uri.ok()) return uri.status();
874
+ // Split the resource type off of the path to get the id.
875
+ std::pair<absl::string_view, absl::string_view> path_parts =
876
+ absl::StrSplit(uri->path(), absl::MaxSplits('/', 1));
877
+ if (!is_expected_type(path_parts.first, nullptr)) {
878
+ return absl::InvalidArgumentError(
879
+ "xdstp URI path must indicate valid xDS resource type");
880
+ }
881
+ std::vector<std::pair<absl::string_view, absl::string_view>> query_parameters(
882
+ uri->query_parameter_map().begin(), uri->query_parameter_map().end());
883
+ std::sort(query_parameters.begin(), query_parameters.end());
884
+ return XdsApi::ResourceName{
885
+ uri->authority(),
886
+ absl::StrCat(
887
+ "xdstp:", path_parts.second, (query_parameters.empty() ? "?" : ""),
888
+ absl::StrJoin(query_parameters, "&", absl::PairFormatter("=")))};
889
+ }
890
+
828
891
  } // namespace
829
892
 
830
893
  // If gRPC is built with -DGRPC_XDS_USER_AGENT_NAME_SUFFIX="...", that string
@@ -881,6 +944,41 @@ XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
881
944
  XdsHttpFilterRegistry::PopulateSymtab(symtab_.ptr());
882
945
  }
883
946
 
947
+ bool XdsApi::IsLds(absl::string_view type_url) {
948
+ return IsLdsInternal(type_url);
949
+ }
950
+
951
+ bool XdsApi::IsRds(absl::string_view type_url) {
952
+ return IsRdsInternal(type_url);
953
+ }
954
+
955
+ bool XdsApi::IsCds(absl::string_view type_url) {
956
+ return IsCdsInternal(type_url);
957
+ }
958
+
959
+ bool XdsApi::IsEds(absl::string_view type_url) {
960
+ return IsEdsInternal(type_url);
961
+ }
962
+
963
+ absl::StatusOr<XdsApi::ResourceName> XdsApi::ParseResourceName(
964
+ absl::string_view name, bool (*is_expected_type)(absl::string_view)) {
965
+ return ParseResourceNameInternal(
966
+ name, [is_expected_type](absl::string_view type, bool*) {
967
+ return is_expected_type(type);
968
+ });
969
+ }
970
+
971
+ std::string XdsApi::ConstructFullResourceName(absl::string_view authority,
972
+ absl::string_view resource_type,
973
+ absl::string_view name) {
974
+ if (absl::StartsWith(name, "xdstp:")) {
975
+ return absl::StrCat("xdstp://", authority, "/", resource_type,
976
+ absl::StripPrefix(name, "xdstp:"));
977
+ } else {
978
+ return std::string(absl::StripPrefix(name, "old:"));
979
+ }
980
+ }
981
+
884
982
  namespace {
885
983
 
886
984
  struct EncodingContext {
@@ -1095,7 +1193,8 @@ absl::string_view TypeUrlExternalToInternal(bool use_v3,
1095
1193
 
1096
1194
  grpc_slice XdsApi::CreateAdsRequest(
1097
1195
  const XdsBootstrap::XdsServer& server, const std::string& type_url,
1098
- const std::set<absl::string_view>& resource_names,
1196
+ const std::map<absl::string_view /*authority*/,
1197
+ std::set<absl::string_view /*name*/>>& resource_names,
1099
1198
  const std::string& version, const std::string& nonce,
1100
1199
  grpc_error_handle error, bool populate_node) {
1101
1200
  upb::Arena arena;
@@ -1148,10 +1247,27 @@ grpc_slice XdsApi::CreateAdsRequest(
1148
1247
  PopulateNode(context, node_, build_version_, user_agent_name_,
1149
1248
  user_agent_version_, node_msg);
1150
1249
  }
1250
+ // A vector for temporary local storage of resource name strings.
1251
+ std::vector<std::string> resource_name_storage;
1252
+ // Make sure the vector is sized right up-front, so that reallocations
1253
+ // don't move the strings out from under the upb proto object that
1254
+ // points to them.
1255
+ size_t size = 0;
1256
+ for (const auto& p : resource_names) {
1257
+ size += p.second.size();
1258
+ }
1259
+ resource_name_storage.reserve(size);
1151
1260
  // Add resource_names.
1152
- for (const auto& resource_name : resource_names) {
1153
- envoy_service_discovery_v3_DiscoveryRequest_add_resource_names(
1154
- request, StdStringToUpbString(resource_name), arena.ptr());
1261
+ for (const auto& a : resource_names) {
1262
+ absl::string_view authority = a.first;
1263
+ for (const auto& p : a.second) {
1264
+ absl::string_view resource_id = p;
1265
+ resource_name_storage.push_back(
1266
+ ConstructFullResourceName(authority, type_url, resource_id));
1267
+ envoy_service_discovery_v3_DiscoveryRequest_add_resource_names(
1268
+ request, StdStringToUpbString(resource_name_storage.back()),
1269
+ arena.ptr());
1270
+ }
1155
1271
  }
1156
1272
  MaybeLogDiscoveryRequest(context, request);
1157
1273
  return SerializeDiscoveryRequest(context, request);
@@ -1438,16 +1554,17 @@ grpc_error_handle ExtractHttpFilterTypeName(const EncodingContext& context,
1438
1554
  const google_protobuf_Any* any,
1439
1555
  absl::string_view* filter_type) {
1440
1556
  *filter_type = UpbStringToAbsl(google_protobuf_Any_type_url(any));
1441
- if (*filter_type == "type.googleapis.com/udpa.type.v1.TypedStruct") {
1557
+ if (*filter_type == "type.googleapis.com/xds.type.v3.TypedStruct" ||
1558
+ *filter_type == "type.googleapis.com/udpa.type.v1.TypedStruct") {
1442
1559
  upb_strview any_value = google_protobuf_Any_value(any);
1443
- const auto* typed_struct = udpa_type_v1_TypedStruct_parse(
1560
+ const auto* typed_struct = xds_type_v3_TypedStruct_parse(
1444
1561
  any_value.data, any_value.size, context.arena);
1445
1562
  if (typed_struct == nullptr) {
1446
1563
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1447
1564
  "could not parse TypedStruct from filter config");
1448
1565
  }
1449
1566
  *filter_type =
1450
- UpbStringToAbsl(udpa_type_v1_TypedStruct_type_url(typed_struct));
1567
+ UpbStringToAbsl(xds_type_v3_TypedStruct_type_url(typed_struct));
1451
1568
  }
1452
1569
  *filter_type = absl::StripPrefix(*filter_type, "type.googleapis.com/");
1453
1570
  return GRPC_ERROR_NONE;
@@ -1528,9 +1645,9 @@ XdsApi::Duration DurationParse(const google_protobuf_Duration* proto_duration) {
1528
1645
  grpc_error_handle RetryPolicyParse(
1529
1646
  const EncodingContext& context,
1530
1647
  const envoy_config_route_v3_RetryPolicy* retry_policy,
1531
- absl::optional<XdsApi::Route::RetryPolicy>* retry) {
1648
+ absl::optional<XdsApi::RetryPolicy>* retry) {
1532
1649
  std::vector<grpc_error_handle> errors;
1533
- XdsApi::Route::RetryPolicy retry_to_return;
1650
+ XdsApi::RetryPolicy retry_to_return;
1534
1651
  auto retry_on = UpbStringToStdString(
1535
1652
  envoy_config_route_v3_RetryPolicy_retry_on(retry_policy));
1536
1653
  std::vector<absl::string_view> codes = absl::StrSplit(retry_on, ',');
@@ -1552,10 +1669,6 @@ grpc_error_handle RetryPolicyParse(
1552
1669
  }
1553
1670
  }
1554
1671
  }
1555
- // TODO(donnadionne): when we add support for per_try_timeout, we will need to
1556
- // return a policy if per_try_timeout is set even if retry_on specified no
1557
- // supported policies.
1558
- if (retry_to_return.retry_on.Empty()) return GRPC_ERROR_NONE;
1559
1672
  const google_protobuf_UInt32Value* num_retries =
1560
1673
  envoy_config_route_v3_RetryPolicy_num_retries(retry_policy);
1561
1674
  if (num_retries != nullptr) {
@@ -1614,11 +1727,8 @@ grpc_error_handle RetryPolicyParse(
1614
1727
 
1615
1728
  grpc_error_handle RouteActionParse(const EncodingContext& context,
1616
1729
  const envoy_config_route_v3_Route* route_msg,
1617
- XdsApi::Route* route, bool* ignore_route) {
1618
- if (!envoy_config_route_v3_Route_has_route(route_msg)) {
1619
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1620
- "No RouteAction found in route.");
1621
- }
1730
+ XdsApi::Route::RouteAction* route,
1731
+ bool* ignore_route) {
1622
1732
  const envoy_config_route_v3_RouteAction* route_action =
1623
1733
  envoy_config_route_v3_Route_route(route_msg);
1624
1734
  // Get the cluster or weighted_clusters in the RouteAction.
@@ -1647,7 +1757,7 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
1647
1757
  for (size_t j = 0; j < clusters_size; ++j) {
1648
1758
  const envoy_config_route_v3_WeightedCluster_ClusterWeight*
1649
1759
  cluster_weight = clusters[j];
1650
- XdsApi::Route::ClusterWeight cluster;
1760
+ XdsApi::Route::RouteAction::ClusterWeight cluster;
1651
1761
  cluster.name = UpbStringToStdString(
1652
1762
  envoy_config_route_v3_WeightedCluster_ClusterWeight_name(
1653
1763
  cluster_weight));
@@ -1716,7 +1826,7 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
1716
1826
  for (size_t i = 0; i < size; ++i) {
1717
1827
  const envoy_config_route_v3_RouteAction_HashPolicy* hash_policy =
1718
1828
  hash_policies[i];
1719
- XdsApi::Route::HashPolicy policy;
1829
+ XdsApi::Route::RouteAction::HashPolicy policy;
1720
1830
  policy.terminal =
1721
1831
  envoy_config_route_v3_RouteAction_HashPolicy_terminal(hash_policy);
1722
1832
  const envoy_config_route_v3_RouteAction_HashPolicy_Header* header;
@@ -1724,7 +1834,7 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
1724
1834
  filter_state;
1725
1835
  if ((header = envoy_config_route_v3_RouteAction_HashPolicy_header(
1726
1836
  hash_policy)) != nullptr) {
1727
- policy.type = XdsApi::Route::HashPolicy::Type::HEADER;
1837
+ policy.type = XdsApi::Route::RouteAction::HashPolicy::Type::HEADER;
1728
1838
  policy.header_name = UpbStringToStdString(
1729
1839
  envoy_config_route_v3_RouteAction_HashPolicy_Header_header_name(
1730
1840
  header));
@@ -1768,7 +1878,7 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
1768
1878
  envoy_config_route_v3_RouteAction_HashPolicy_FilterState_key(
1769
1879
  filter_state));
1770
1880
  if (key == "io.grpc.channel_id") {
1771
- policy.type = XdsApi::Route::HashPolicy::Type::CHANNEL_ID;
1881
+ policy.type = XdsApi::Route::RouteAction::HashPolicy::Type::CHANNEL_ID;
1772
1882
  } else {
1773
1883
  gpr_log(GPR_DEBUG,
1774
1884
  "RouteAction HashPolicy contains policy specifier "
@@ -1787,7 +1897,7 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
1787
1897
  const envoy_config_route_v3_RetryPolicy* retry_policy =
1788
1898
  envoy_config_route_v3_RouteAction_retry_policy(route_action);
1789
1899
  if (retry_policy != nullptr) {
1790
- absl::optional<XdsApi::Route::RetryPolicy> retry;
1900
+ absl::optional<XdsApi::RetryPolicy> retry;
1791
1901
  grpc_error_handle error = RetryPolicyParse(context, retry_policy, &retry);
1792
1902
  if (error != GRPC_ERROR_NONE) return error;
1793
1903
  route->retry_policy = retry;
@@ -1837,7 +1947,7 @@ grpc_error_handle RouteConfigParse(
1837
1947
  if (error != GRPC_ERROR_NONE) return error;
1838
1948
  }
1839
1949
  // Parse retry policy.
1840
- absl::optional<XdsApi::Route::RetryPolicy> virtual_host_retry_policy;
1950
+ absl::optional<XdsApi::RetryPolicy> virtual_host_retry_policy;
1841
1951
  const envoy_config_route_v3_RetryPolicy* retry_policy =
1842
1952
  envoy_config_route_v3_VirtualHost_retry_policy(virtual_hosts[i]);
1843
1953
  if (retry_policy != nullptr) {
@@ -1876,11 +1986,21 @@ grpc_error_handle RouteConfigParse(
1876
1986
  if (error != GRPC_ERROR_NONE) return error;
1877
1987
  error = RouteRuntimeFractionParse(match, &route);
1878
1988
  if (error != GRPC_ERROR_NONE) return error;
1879
- error = RouteActionParse(context, routes[j], &route, &ignore_route);
1880
- if (error != GRPC_ERROR_NONE) return error;
1881
- if (ignore_route) continue;
1882
- if (route.retry_policy == absl::nullopt && retry_policy != nullptr) {
1883
- route.retry_policy = virtual_host_retry_policy;
1989
+ if (envoy_config_route_v3_Route_has_route(routes[j])) {
1990
+ route.action.emplace<XdsApi::Route::RouteAction>();
1991
+ auto& route_action =
1992
+ absl::get<XdsApi::Route::RouteAction>(route.action);
1993
+ error =
1994
+ RouteActionParse(context, routes[j], &route_action, &ignore_route);
1995
+ if (error != GRPC_ERROR_NONE) return error;
1996
+ if (ignore_route) continue;
1997
+ if (route_action.retry_policy == absl::nullopt &&
1998
+ retry_policy != nullptr) {
1999
+ route_action.retry_policy = virtual_host_retry_policy;
2000
+ }
2001
+ } else if (envoy_config_route_v3_Route_has_non_forwarding_action(
2002
+ routes[j])) {
2003
+ route.action.emplace<XdsApi::Route::NonForwardingAction>();
1884
2004
  }
1885
2005
  if (context.use_v3) {
1886
2006
  grpc_error_handle error = ParseTypedPerFilterConfig<
@@ -2237,32 +2357,47 @@ grpc_error_handle HttpConnectionManagerParse(
2237
2357
  absl::StrFormat("Filter %s is not supported on %s", filter_type,
2238
2358
  is_client ? "clients" : "servers"));
2239
2359
  }
2240
- if (i < num_filters - 1) {
2360
+ absl::StatusOr<XdsHttpFilterImpl::FilterConfig> filter_config =
2361
+ filter_impl->GenerateFilterConfig(google_protobuf_Any_value(any),
2362
+ context.arena);
2363
+ if (!filter_config.ok()) {
2364
+ return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
2365
+ "filter config for type ", filter_type,
2366
+ " failed to parse: ", filter_config.status().ToString()));
2367
+ }
2368
+ http_connection_manager->http_filters.emplace_back(
2369
+ XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter{
2370
+ std::string(name), std::move(*filter_config)});
2371
+ }
2372
+ if (http_connection_manager->http_filters.empty()) {
2373
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2374
+ "Expected at least one HTTP filter");
2375
+ }
2376
+ // Make sure that the last filter is terminal and non-last filters are
2377
+ // non-terminal. Note that this check is being performed in a separate loop
2378
+ // to take care of the case where there are two terminal filters in the list
2379
+ // out of which only one gets added in the final list.
2380
+ for (const auto& http_filter : http_connection_manager->http_filters) {
2381
+ const XdsHttpFilterImpl* filter_impl =
2382
+ XdsHttpFilterRegistry::GetFilterForType(
2383
+ http_filter.config.config_proto_type_name);
2384
+ if (&http_filter != &http_connection_manager->http_filters.back()) {
2241
2385
  // Filters before the last filter must not be terminal.
2242
2386
  if (filter_impl->IsTerminalFilter()) {
2243
2387
  return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2244
- absl::StrCat("terminal filter for config type ", filter_type,
2388
+ absl::StrCat("terminal filter for config type ",
2389
+ http_filter.config.config_proto_type_name,
2245
2390
  " must be the last filter in the chain"));
2246
2391
  }
2247
2392
  } else {
2248
2393
  // The last filter must be terminal.
2249
2394
  if (!filter_impl->IsTerminalFilter()) {
2250
2395
  return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2251
- absl::StrCat("non-terminal filter for config type ", filter_type,
2396
+ absl::StrCat("non-terminal filter for config type ",
2397
+ http_filter.config.config_proto_type_name,
2252
2398
  " is the last filter in the chain"));
2253
2399
  }
2254
2400
  }
2255
- absl::StatusOr<XdsHttpFilterImpl::FilterConfig> filter_config =
2256
- filter_impl->GenerateFilterConfig(google_protobuf_Any_value(any),
2257
- context.arena);
2258
- if (!filter_config.ok()) {
2259
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
2260
- "filter config for type ", filter_type,
2261
- " failed to parse: ", filter_config.status().ToString()));
2262
- }
2263
- http_connection_manager->http_filters.emplace_back(
2264
- XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter{
2265
- std::string(name), std::move(*filter_config)});
2266
2401
  }
2267
2402
  } else {
2268
2403
  // If using a v2 config, we just hard-code a list containing only the
@@ -2273,7 +2408,10 @@ grpc_error_handle HttpConnectionManagerParse(
2273
2408
  XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter{
2274
2409
  "router", {kXdsHttpRouterFilterConfigName, Json()}});
2275
2410
  }
2276
- if (is_client) {
2411
+ // Guarding parsing of RouteConfig on the server side with the environmental
2412
+ // variable since that's the first feature on the server side that will be
2413
+ // using this.
2414
+ if (is_client || XdsRbacEnabled()) {
2277
2415
  // Found inlined route_config. Parse it to find the cluster_name.
2278
2416
  if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
2279
2417
  http_connection_manager_proto)) {
@@ -2508,6 +2646,8 @@ grpc_error_handle FilterChainParse(
2508
2646
  filter_chain_match, &filter_chain->filter_chain_match);
2509
2647
  if (error != GRPC_ERROR_NONE) errors.push_back(error);
2510
2648
  }
2649
+ filter_chain->filter_chain_data =
2650
+ std::make_shared<XdsApi::LdsUpdate::FilterChainData>();
2511
2651
  // Parse the filters list. Currently we only support HttpConnectionManager.
2512
2652
  size_t size = 0;
2513
2653
  auto* filters =
@@ -2543,8 +2683,6 @@ grpc_error_handle FilterChainParse(
2543
2683
  "Could not parse HttpConnectionManager config from filter "
2544
2684
  "typed_config"));
2545
2685
  } else {
2546
- filter_chain->filter_chain_data =
2547
- std::make_shared<XdsApi::LdsUpdate::FilterChainData>();
2548
2686
  grpc_error_handle error = HttpConnectionManagerParse(
2549
2687
  false /* is_client */, context, http_connection_manager, is_v2,
2550
2688
  &filter_chain->filter_chain_data->http_connection_manager);
@@ -3277,7 +3415,7 @@ grpc_error_handle DropParseAndAppend(
3277
3415
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Unknown denominator type");
3278
3416
  }
3279
3417
  // Cap numerator to 1000000.
3280
- numerator = GPR_MIN(numerator, 1000000);
3418
+ numerator = std::min(numerator, 1000000u);
3281
3419
  drop_config->AddCategory(std::move(category), numerator);
3282
3420
  return GRPC_ERROR_NONE;
3283
3421
  }
@@ -3351,10 +3489,13 @@ grpc_error_handle AdsResponseParse(
3351
3489
  ResourceTypeSelectorFunction resource_type_selector_function,
3352
3490
  ProtoLogFunction proto_log_function,
3353
3491
  ResourceParseFunction resource_parse_function,
3354
- const envoy_service_discovery_v3_DiscoveryResponse* response,
3355
3492
  const char* resource_type_string,
3356
- const std::set<absl::string_view>& expected_resource_names,
3357
- UpdateMap* update_map, std::set<std::string>* resource_names_failed) {
3493
+ const envoy_service_discovery_v3_DiscoveryResponse* response,
3494
+ const std::map<absl::string_view /*authority*/,
3495
+ std::set<absl::string_view /*name*/>>&
3496
+ subscribed_resource_names,
3497
+ UpdateMap* update_map,
3498
+ std::set<XdsApi::ResourceName>* resource_names_failed) {
3358
3499
  std::vector<grpc_error_handle> errors;
3359
3500
  // Get the resources from the response.
3360
3501
  size_t size;
@@ -3385,15 +3526,23 @@ grpc_error_handle AdsResponseParse(
3385
3526
  // Check the resource name. Ignore unexpected names.
3386
3527
  std::string resource_name =
3387
3528
  UpbStringToStdString(proto_resource_name_function(resource));
3388
- if (expected_resource_names.find(resource_name) ==
3389
- expected_resource_names.end()) {
3529
+ auto resource_name_status = ParseResourceNameInternal(
3530
+ resource_name, resource_type_selector_function);
3531
+ if (!resource_name_status.ok()) {
3532
+ errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
3533
+ "Cannot parse xDS resource name \"", resource_name, "\"")));
3534
+ continue;
3535
+ }
3536
+ auto iter = subscribed_resource_names.find(resource_name_status->authority);
3537
+ if (iter == subscribed_resource_names.end() ||
3538
+ iter->second.find(resource_name_status->id) == iter->second.end()) {
3390
3539
  continue;
3391
3540
  }
3392
3541
  // Fail on duplicate resources.
3393
- if (update_map->find(resource_name) != update_map->end()) {
3542
+ if (update_map->find(*resource_name_status) != update_map->end()) {
3394
3543
  errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
3395
3544
  absl::StrCat("duplicate resource name \"", resource_name, "\"")));
3396
- resource_names_failed->insert(resource_name);
3545
+ resource_names_failed->insert(*resource_name_status);
3397
3546
  continue;
3398
3547
  }
3399
3548
  // Validate resource.
@@ -3405,10 +3554,10 @@ grpc_error_handle AdsResponseParse(
3405
3554
  grpc_error_add_child(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
3406
3555
  resource_name, ": validation error")),
3407
3556
  error));
3408
- resource_names_failed->insert(resource_name);
3557
+ resource_names_failed->insert(*resource_name_status);
3409
3558
  } else {
3410
3559
  // Store result in update map, in both validated and serialized form.
3411
- auto& resource_data = (*update_map)[resource_name];
3560
+ auto& resource_data = (*update_map)[*resource_name_status];
3412
3561
  resource_data.resource = std::move(update);
3413
3562
  resource_data.serialized_proto =
3414
3563
  UpbStringToStdString(serialized_resource);
@@ -3455,10 +3604,18 @@ upb_strview EdsResourceName(
3455
3604
 
3456
3605
  XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
3457
3606
  const XdsBootstrap::XdsServer& server, const grpc_slice& encoded_response,
3458
- const std::set<absl::string_view>& expected_listener_names,
3459
- const std::set<absl::string_view>& expected_route_configuration_names,
3460
- const std::set<absl::string_view>& expected_cluster_names,
3461
- const std::set<absl::string_view>& expected_eds_service_names) {
3607
+ const std::map<absl::string_view /*authority*/,
3608
+ std::set<absl::string_view /*name*/>>&
3609
+ subscribed_listener_names,
3610
+ const std::map<absl::string_view /*authority*/,
3611
+ std::set<absl::string_view /*name*/>>&
3612
+ subscribed_route_config_names,
3613
+ const std::map<absl::string_view /*authority*/,
3614
+ std::set<absl::string_view /*name*/>>&
3615
+ subscribed_cluster_names,
3616
+ const std::map<absl::string_view /*authority*/,
3617
+ std::set<absl::string_view /*name*/>>&
3618
+ subscribed_eds_service_names) {
3462
3619
  AdsParseResult result;
3463
3620
  upb::Arena arena;
3464
3621
  const EncodingContext context = {client_,
@@ -3493,27 +3650,27 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
3493
3650
  if (IsLds(result.type_url)) {
3494
3651
  result.parse_error = AdsResponseParse(
3495
3652
  context, envoy_config_listener_v3_Listener_parse, LdsResourceName,
3496
- IsLds, MaybeLogListener, LdsResourceParse, response, "LDS",
3497
- expected_listener_names, &result.lds_update_map,
3653
+ IsLdsInternal, MaybeLogListener, LdsResourceParse, "LDS", response,
3654
+ subscribed_listener_names, &result.lds_update_map,
3498
3655
  &result.resource_names_failed);
3499
3656
  } else if (IsRds(result.type_url)) {
3500
3657
  result.parse_error = AdsResponseParse(
3501
3658
  context, envoy_config_route_v3_RouteConfiguration_parse,
3502
- RdsResourceName, IsRds, MaybeLogRouteConfiguration, RouteConfigParse,
3503
- response, "RDS", expected_route_configuration_names,
3659
+ RdsResourceName, IsRdsInternal, MaybeLogRouteConfiguration,
3660
+ RouteConfigParse, "RDS", response, subscribed_route_config_names,
3504
3661
  &result.rds_update_map, &result.resource_names_failed);
3505
3662
  } else if (IsCds(result.type_url)) {
3506
3663
  result.parse_error = AdsResponseParse(
3507
- context, envoy_config_cluster_v3_Cluster_parse, CdsResourceName, IsCds,
3508
- MaybeLogCluster, CdsResourceParse, response, "CDS",
3509
- expected_cluster_names, &result.cds_update_map,
3664
+ context, envoy_config_cluster_v3_Cluster_parse, CdsResourceName,
3665
+ IsCdsInternal, MaybeLogCluster, CdsResourceParse, "CDS", response,
3666
+ subscribed_cluster_names, &result.cds_update_map,
3510
3667
  &result.resource_names_failed);
3511
3668
  } else if (IsEds(result.type_url)) {
3512
3669
  result.parse_error = AdsResponseParse(
3513
3670
  context, envoy_config_endpoint_v3_ClusterLoadAssignment_parse,
3514
- EdsResourceName, IsEds, MaybeLogClusterLoadAssignment, EdsResourceParse,
3515
- response, "EDS", expected_eds_service_names, &result.eds_update_map,
3516
- &result.resource_names_failed);
3671
+ EdsResourceName, IsEdsInternal, MaybeLogClusterLoadAssignment,
3672
+ EdsResourceParse, "EDS", response, subscribed_eds_service_names,
3673
+ &result.eds_update_map, &result.resource_names_failed);
3517
3674
  }
3518
3675
  return result;
3519
3676
  }
@@ -3726,6 +3883,7 @@ grpc_error_handle XdsApi::ParseLrsResponse(
3726
3883
  }
3727
3884
 
3728
3885
  namespace {
3886
+
3729
3887
  google_protobuf_Timestamp* GrpcMillisToTimestamp(const EncodingContext& context,
3730
3888
  grpc_millis value) {
3731
3889
  google_protobuf_Timestamp* timestamp =
@@ -3736,218 +3894,6 @@ google_protobuf_Timestamp* GrpcMillisToTimestamp(const EncodingContext& context,
3736
3894
  return timestamp;
3737
3895
  }
3738
3896
 
3739
- envoy_admin_v3_UpdateFailureState* CreateUpdateFailureStateUpb(
3740
- const EncodingContext& context,
3741
- const XdsApi::ResourceMetadata* resource_metadata) {
3742
- auto* update_failure_state =
3743
- envoy_admin_v3_UpdateFailureState_new(context.arena);
3744
- envoy_admin_v3_UpdateFailureState_set_details(
3745
- update_failure_state,
3746
- StdStringToUpbString(resource_metadata->failed_details));
3747
- envoy_admin_v3_UpdateFailureState_set_version_info(
3748
- update_failure_state,
3749
- StdStringToUpbString(resource_metadata->failed_version));
3750
- envoy_admin_v3_UpdateFailureState_set_last_update_attempt(
3751
- update_failure_state,
3752
- GrpcMillisToTimestamp(context, resource_metadata->failed_update_time));
3753
- return update_failure_state;
3754
- }
3755
-
3756
- void DumpLdsConfig(const EncodingContext& context,
3757
- const XdsApi::ResourceTypeMetadata& resource_type_metadata,
3758
- envoy_service_status_v3_PerXdsConfig* per_xds_config) {
3759
- upb_strview kLdsTypeUrlUpb = upb_strview_makez(XdsApi::kLdsTypeUrl);
3760
- auto* listener_config_dump =
3761
- envoy_service_status_v3_PerXdsConfig_mutable_listener_config(
3762
- per_xds_config, context.arena);
3763
- envoy_admin_v3_ListenersConfigDump_set_version_info(
3764
- listener_config_dump,
3765
- StdStringToUpbString(resource_type_metadata.version));
3766
- for (auto& p : resource_type_metadata.resource_metadata_map) {
3767
- absl::string_view name = p.first;
3768
- const XdsApi::ResourceMetadata* meta = p.second;
3769
- const upb_strview name_upb = StdStringToUpbString(name);
3770
- auto* dynamic_listener =
3771
- envoy_admin_v3_ListenersConfigDump_add_dynamic_listeners(
3772
- listener_config_dump, context.arena);
3773
- envoy_admin_v3_ListenersConfigDump_DynamicListener_set_name(
3774
- dynamic_listener, name_upb);
3775
- envoy_admin_v3_ListenersConfigDump_DynamicListener_set_client_status(
3776
- dynamic_listener, meta->client_status);
3777
- if (!meta->serialized_proto.empty()) {
3778
- // Set in-effective listeners
3779
- auto* dynamic_listener_state =
3780
- envoy_admin_v3_ListenersConfigDump_DynamicListener_mutable_active_state(
3781
- dynamic_listener, context.arena);
3782
- envoy_admin_v3_ListenersConfigDump_DynamicListenerState_set_version_info(
3783
- dynamic_listener_state, StdStringToUpbString(meta->version));
3784
- envoy_admin_v3_ListenersConfigDump_DynamicListenerState_set_last_updated(
3785
- dynamic_listener_state,
3786
- GrpcMillisToTimestamp(context, meta->update_time));
3787
- auto* listener_any =
3788
- envoy_admin_v3_ListenersConfigDump_DynamicListenerState_mutable_listener(
3789
- dynamic_listener_state, context.arena);
3790
- google_protobuf_Any_set_type_url(listener_any, kLdsTypeUrlUpb);
3791
- google_protobuf_Any_set_value(
3792
- listener_any, StdStringToUpbString(meta->serialized_proto));
3793
- }
3794
- if (meta->client_status == XdsApi::ResourceMetadata::NACKED) {
3795
- // Set error_state if NACKED
3796
- envoy_admin_v3_ListenersConfigDump_DynamicListener_set_error_state(
3797
- dynamic_listener, CreateUpdateFailureStateUpb(context, meta));
3798
- }
3799
- }
3800
- }
3801
-
3802
- void DumpRdsConfig(const EncodingContext& context,
3803
- const XdsApi::ResourceTypeMetadata& resource_type_metadata,
3804
- envoy_service_status_v3_PerXdsConfig* per_xds_config) {
3805
- upb_strview kRdsTypeUrlUpb = upb_strview_makez(XdsApi::kRdsTypeUrl);
3806
- auto* route_config_dump =
3807
- envoy_service_status_v3_PerXdsConfig_mutable_route_config(per_xds_config,
3808
- context.arena);
3809
- for (auto& p : resource_type_metadata.resource_metadata_map) {
3810
- absl::string_view name = p.first;
3811
- const XdsApi::ResourceMetadata* meta = p.second;
3812
- const upb_strview name_upb = StdStringToUpbString(name);
3813
- auto* dynamic_route_config =
3814
- envoy_admin_v3_RoutesConfigDump_add_dynamic_route_configs(
3815
- route_config_dump, context.arena);
3816
- envoy_admin_v3_RoutesConfigDump_DynamicRouteConfig_set_client_status(
3817
- dynamic_route_config, meta->client_status);
3818
- auto* route_config_any =
3819
- envoy_admin_v3_RoutesConfigDump_DynamicRouteConfig_mutable_route_config(
3820
- dynamic_route_config, context.arena);
3821
- if (!meta->serialized_proto.empty()) {
3822
- // Set in-effective route configs
3823
- envoy_admin_v3_RoutesConfigDump_DynamicRouteConfig_set_version_info(
3824
- dynamic_route_config, StdStringToUpbString(meta->version));
3825
- envoy_admin_v3_RoutesConfigDump_DynamicRouteConfig_set_last_updated(
3826
- dynamic_route_config,
3827
- GrpcMillisToTimestamp(context, meta->update_time));
3828
- google_protobuf_Any_set_type_url(route_config_any, kRdsTypeUrlUpb);
3829
- google_protobuf_Any_set_value(
3830
- route_config_any, StdStringToUpbString(meta->serialized_proto));
3831
- } else {
3832
- // If there isn't a working route config, we still need to print the
3833
- // name.
3834
- auto* route_config =
3835
- envoy_config_route_v3_RouteConfiguration_new(context.arena);
3836
- envoy_config_route_v3_RouteConfiguration_set_name(route_config, name_upb);
3837
- size_t length;
3838
- char* bytes = envoy_config_route_v3_RouteConfiguration_serialize(
3839
- route_config, context.arena, &length);
3840
- google_protobuf_Any_set_type_url(route_config_any, kRdsTypeUrlUpb);
3841
- google_protobuf_Any_set_value(route_config_any,
3842
- upb_strview_make(bytes, length));
3843
- }
3844
- if (meta->client_status == XdsApi::ResourceMetadata::NACKED) {
3845
- // Set error_state if NACKED
3846
- envoy_admin_v3_RoutesConfigDump_DynamicRouteConfig_set_error_state(
3847
- dynamic_route_config, CreateUpdateFailureStateUpb(context, meta));
3848
- }
3849
- }
3850
- }
3851
-
3852
- void DumpCdsConfig(const EncodingContext& context,
3853
- const XdsApi::ResourceTypeMetadata& resource_type_metadata,
3854
- envoy_service_status_v3_PerXdsConfig* per_xds_config) {
3855
- upb_strview kCdsTypeUrlUpb = upb_strview_makez(XdsApi::kCdsTypeUrl);
3856
- auto* cluster_config_dump =
3857
- envoy_service_status_v3_PerXdsConfig_mutable_cluster_config(
3858
- per_xds_config, context.arena);
3859
- envoy_admin_v3_ClustersConfigDump_set_version_info(
3860
- cluster_config_dump,
3861
- StdStringToUpbString(resource_type_metadata.version));
3862
- for (auto& p : resource_type_metadata.resource_metadata_map) {
3863
- absl::string_view name = p.first;
3864
- const XdsApi::ResourceMetadata* meta = p.second;
3865
- const upb_strview name_upb = StdStringToUpbString(name);
3866
- auto* dynamic_cluster =
3867
- envoy_admin_v3_ClustersConfigDump_add_dynamic_active_clusters(
3868
- cluster_config_dump, context.arena);
3869
- envoy_admin_v3_ClustersConfigDump_DynamicCluster_set_client_status(
3870
- dynamic_cluster, meta->client_status);
3871
- auto* cluster_any =
3872
- envoy_admin_v3_ClustersConfigDump_DynamicCluster_mutable_cluster(
3873
- dynamic_cluster, context.arena);
3874
- if (!meta->serialized_proto.empty()) {
3875
- // Set in-effective clusters
3876
- envoy_admin_v3_ClustersConfigDump_DynamicCluster_set_version_info(
3877
- dynamic_cluster, StdStringToUpbString(meta->version));
3878
- envoy_admin_v3_ClustersConfigDump_DynamicCluster_set_last_updated(
3879
- dynamic_cluster, GrpcMillisToTimestamp(context, meta->update_time));
3880
- google_protobuf_Any_set_type_url(cluster_any, kCdsTypeUrlUpb);
3881
- google_protobuf_Any_set_value(
3882
- cluster_any, StdStringToUpbString(meta->serialized_proto));
3883
- } else {
3884
- // If there isn't a working cluster, we still need to print the name.
3885
- auto* cluster = envoy_config_cluster_v3_Cluster_new(context.arena);
3886
- envoy_config_cluster_v3_Cluster_set_name(cluster, name_upb);
3887
- size_t length;
3888
- char* bytes = envoy_config_cluster_v3_Cluster_serialize(
3889
- cluster, context.arena, &length);
3890
- google_protobuf_Any_set_type_url(cluster_any, kCdsTypeUrlUpb);
3891
- google_protobuf_Any_set_value(cluster_any,
3892
- upb_strview_make(bytes, length));
3893
- }
3894
- if (meta->client_status == XdsApi::ResourceMetadata::NACKED) {
3895
- // Set error_state if NACKED
3896
- envoy_admin_v3_ClustersConfigDump_DynamicCluster_set_error_state(
3897
- dynamic_cluster, CreateUpdateFailureStateUpb(context, meta));
3898
- }
3899
- }
3900
- }
3901
-
3902
- void DumpEdsConfig(const EncodingContext& context,
3903
- const XdsApi::ResourceTypeMetadata& resource_type_metadata,
3904
- envoy_service_status_v3_PerXdsConfig* per_xds_config) {
3905
- upb_strview kEdsTypeUrlUpb = upb_strview_makez(XdsApi::kEdsTypeUrl);
3906
- auto* endpoint_config_dump =
3907
- envoy_service_status_v3_PerXdsConfig_mutable_endpoint_config(
3908
- per_xds_config, context.arena);
3909
- for (auto& p : resource_type_metadata.resource_metadata_map) {
3910
- absl::string_view name = p.first;
3911
- const XdsApi::ResourceMetadata* meta = p.second;
3912
- const upb_strview name_upb = StdStringToUpbString(name);
3913
- auto* dynamic_endpoint =
3914
- envoy_admin_v3_EndpointsConfigDump_add_dynamic_endpoint_configs(
3915
- endpoint_config_dump, context.arena);
3916
- envoy_admin_v3_EndpointsConfigDump_DynamicEndpointConfig_set_client_status(
3917
- dynamic_endpoint, meta->client_status);
3918
- auto* endpoint_any =
3919
- envoy_admin_v3_EndpointsConfigDump_DynamicEndpointConfig_mutable_endpoint_config(
3920
- dynamic_endpoint, context.arena);
3921
- if (!meta->serialized_proto.empty()) {
3922
- // Set in-effective endpoints
3923
- envoy_admin_v3_EndpointsConfigDump_DynamicEndpointConfig_set_version_info(
3924
- dynamic_endpoint, StdStringToUpbString(meta->version));
3925
- envoy_admin_v3_EndpointsConfigDump_DynamicEndpointConfig_set_last_updated(
3926
- dynamic_endpoint, GrpcMillisToTimestamp(context, meta->update_time));
3927
- google_protobuf_Any_set_type_url(endpoint_any, kEdsTypeUrlUpb);
3928
- google_protobuf_Any_set_value(
3929
- endpoint_any, StdStringToUpbString(meta->serialized_proto));
3930
- } else {
3931
- // If there isn't a working endpoint, we still need to print the name.
3932
- auto* cluster_load_assignment =
3933
- envoy_config_endpoint_v3_ClusterLoadAssignment_new(context.arena);
3934
- envoy_config_endpoint_v3_ClusterLoadAssignment_set_cluster_name(
3935
- cluster_load_assignment, name_upb);
3936
- size_t length;
3937
- char* bytes = envoy_config_endpoint_v3_ClusterLoadAssignment_serialize(
3938
- cluster_load_assignment, context.arena, &length);
3939
- google_protobuf_Any_set_type_url(endpoint_any, kEdsTypeUrlUpb);
3940
- google_protobuf_Any_set_value(endpoint_any,
3941
- upb_strview_make(bytes, length));
3942
- }
3943
- if (meta->client_status == XdsApi::ResourceMetadata::NACKED) {
3944
- // Set error_state if NACKED
3945
- envoy_admin_v3_EndpointsConfigDump_DynamicEndpointConfig_set_error_state(
3946
- dynamic_endpoint, CreateUpdateFailureStateUpb(context, meta));
3947
- }
3948
- }
3949
- }
3950
-
3951
3897
  } // namespace
3952
3898
 
3953
3899
  std::string XdsApi::AssembleClientConfig(
@@ -3963,33 +3909,50 @@ std::string XdsApi::AssembleClientConfig(
3963
3909
  arena.ptr(), true, certificate_provider_definition_map_};
3964
3910
  PopulateNode(context, node_, build_version_, user_agent_name_,
3965
3911
  user_agent_version_, node);
3966
- // Dump each xDS-type config into PerXdsConfig
3967
- for (auto& p : resource_type_metadata_map) {
3912
+ // Dump each resource.
3913
+ for (const auto& p : resource_type_metadata_map) {
3968
3914
  absl::string_view type_url = p.first;
3969
- const ResourceTypeMetadata& resource_type_metadata = p.second;
3970
- if (type_url == kLdsTypeUrl) {
3971
- auto* per_xds_config =
3972
- envoy_service_status_v3_ClientConfig_add_xds_config(client_config,
3973
- context.arena);
3974
- DumpLdsConfig(context, resource_type_metadata, per_xds_config);
3975
- } else if (type_url == kRdsTypeUrl) {
3976
- auto* per_xds_config =
3977
- envoy_service_status_v3_ClientConfig_add_xds_config(client_config,
3978
- context.arena);
3979
- DumpRdsConfig(context, resource_type_metadata, per_xds_config);
3980
- } else if (type_url == kCdsTypeUrl) {
3981
- auto* per_xds_config =
3982
- envoy_service_status_v3_ClientConfig_add_xds_config(client_config,
3983
- context.arena);
3984
- DumpCdsConfig(context, resource_type_metadata, per_xds_config);
3985
- } else if (type_url == kEdsTypeUrl) {
3986
- auto* per_xds_config =
3987
- envoy_service_status_v3_ClientConfig_add_xds_config(client_config,
3988
- context.arena);
3989
- DumpEdsConfig(context, resource_type_metadata, per_xds_config);
3990
- } else {
3991
- gpr_log(GPR_ERROR, "invalid type_url %s", std::string(type_url).c_str());
3992
- return "";
3915
+ const ResourceMetadataMap& resource_metadata_map = p.second;
3916
+ for (const auto& q : resource_metadata_map) {
3917
+ absl::string_view resource_name = q.first;
3918
+ const ResourceMetadata& metadata = *q.second;
3919
+ auto* entry =
3920
+ envoy_service_status_v3_ClientConfig_add_generic_xds_configs(
3921
+ client_config, context.arena);
3922
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_type_url(
3923
+ entry, StdStringToUpbString(type_url));
3924
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_name(
3925
+ entry, StdStringToUpbString(resource_name));
3926
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_client_status(
3927
+ entry, metadata.client_status);
3928
+ if (!metadata.serialized_proto.empty()) {
3929
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_version_info(
3930
+ entry, StdStringToUpbString(metadata.version));
3931
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_last_updated(
3932
+ entry, GrpcMillisToTimestamp(context, metadata.update_time));
3933
+ auto* any_field =
3934
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_mutable_xds_config(
3935
+ entry, context.arena);
3936
+ google_protobuf_Any_set_type_url(any_field,
3937
+ StdStringToUpbString(type_url));
3938
+ google_protobuf_Any_set_value(
3939
+ any_field, StdStringToUpbString(metadata.serialized_proto));
3940
+ }
3941
+ if (metadata.client_status == XdsApi::ResourceMetadata::NACKED) {
3942
+ auto* update_failure_state =
3943
+ envoy_admin_v3_UpdateFailureState_new(context.arena);
3944
+ envoy_admin_v3_UpdateFailureState_set_details(
3945
+ update_failure_state,
3946
+ StdStringToUpbString(metadata.failed_details));
3947
+ envoy_admin_v3_UpdateFailureState_set_version_info(
3948
+ update_failure_state,
3949
+ StdStringToUpbString(metadata.failed_version));
3950
+ envoy_admin_v3_UpdateFailureState_set_last_update_attempt(
3951
+ update_failure_state,
3952
+ GrpcMillisToTimestamp(context, metadata.failed_update_time));
3953
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_error_state(
3954
+ entry, update_failure_state);
3955
+ }
3993
3956
  }
3994
3957
  }
3995
3958
  // Serialize the upb message to bytes