grpc 1.36.0 → 1.38.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 (680) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +126 -92
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/channel_args.h +28 -0
  5. data/include/grpc/event_engine/event_engine.h +336 -0
  6. data/include/grpc/event_engine/port.h +39 -0
  7. data/include/grpc/event_engine/slice_allocator.h +81 -0
  8. data/include/grpc/grpc.h +15 -1
  9. data/include/grpc/grpc_security_constants.h +14 -0
  10. data/include/grpc/impl/codegen/grpc_types.h +11 -0
  11. data/include/grpc/impl/codegen/port_platform.h +7 -0
  12. data/include/grpc/module.modulemap +14 -14
  13. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  14. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  15. data/src/core/ext/filters/client_channel/client_channel.cc +715 -3166
  16. data/src/core/ext/filters/client_channel/client_channel.h +489 -55
  17. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +9 -1
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +18 -14
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  24. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  26. data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
  27. data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
  28. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  29. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -1
  30. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  36. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
  37. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  39. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
  40. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  41. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +29 -44
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +32 -47
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +86 -63
  46. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  47. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  48. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  49. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  50. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  51. data/src/core/ext/filters/client_channel/resolver.cc +3 -0
  52. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +17 -15
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +38 -33
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  62. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
  63. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  64. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  65. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +31 -14
  66. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  67. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +334 -114
  68. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  69. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  70. data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
  71. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  72. data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
  73. data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
  74. data/src/core/ext/filters/client_channel/server_address.cc +4 -1
  75. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  76. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  77. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  78. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  79. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  80. data/src/core/ext/filters/client_channel/subchannel.cc +86 -162
  81. data/src/core/ext/filters/client_channel/subchannel.h +68 -99
  82. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  83. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
  84. data/src/core/ext/filters/client_idle/client_idle_filter.cc +17 -16
  85. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  86. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +501 -0
  87. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  88. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  89. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  90. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  91. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  92. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  93. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  94. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  95. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  96. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  97. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  98. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +5 -4
  99. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +8 -8
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +5 -4
  102. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +2 -2
  103. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -5
  104. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +485 -199
  105. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  106. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  107. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +3 -3
  108. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  109. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +167 -122
  110. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  111. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  112. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  113. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  114. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  115. data/src/core/ext/transport/chttp2/transport/frame_data.cc +13 -9
  116. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  117. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  118. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  120. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  122. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  124. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  125. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  126. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  127. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  128. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  129. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  130. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  131. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  132. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  133. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  134. data/src/core/ext/transport/chttp2/transport/internal.h +32 -27
  135. data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  137. data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
  138. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  139. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  140. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  141. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  144. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  145. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  146. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  147. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  148. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -0
  149. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +44 -0
  150. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  151. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  152. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  153. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  154. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  155. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  156. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +6 -5
  157. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +13 -9
  158. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  159. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  160. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  161. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  162. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  163. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  164. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  165. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  166. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  167. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  168. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  169. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  170. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
  171. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
  172. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  173. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  174. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  175. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  176. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +13 -7
  177. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  178. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  179. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  180. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  181. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  182. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  183. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  184. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +21 -20
  185. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  186. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  187. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  188. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  189. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  190. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  191. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  192. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  193. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  194. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  195. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  196. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  197. data/src/core/ext/xds/xds_api.cc +1649 -329
  198. data/src/core/ext/xds/xds_api.h +284 -44
  199. data/src/core/ext/xds/xds_bootstrap.cc +110 -156
  200. data/src/core/ext/xds/xds_bootstrap.h +24 -25
  201. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  202. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  203. data/src/core/ext/xds/xds_channel_args.h +5 -2
  204. data/src/core/ext/xds/xds_client.cc +454 -177
  205. data/src/core/ext/xds/xds_client.h +62 -22
  206. data/src/core/ext/xds/xds_client_stats.h +5 -4
  207. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  208. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  209. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  210. data/src/core/ext/xds/xds_http_filters.h +130 -0
  211. data/src/core/ext/xds/xds_server_config_fetcher.cc +410 -131
  212. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  213. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  214. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +107 -4
  215. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +26 -6
  216. data/src/core/lib/channel/channel_stack.cc +22 -9
  217. data/src/core/lib/channel/channel_stack.h +17 -9
  218. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  219. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  220. data/src/core/lib/channel/channelz.cc +108 -12
  221. data/src/core/lib/channel/channelz.h +30 -1
  222. data/src/core/lib/channel/channelz_registry.cc +14 -0
  223. data/src/core/lib/channel/connected_channel.cc +4 -4
  224. data/src/core/lib/channel/handshaker.cc +7 -45
  225. data/src/core/lib/channel/handshaker.h +5 -22
  226. data/src/core/lib/channel/status_util.cc +12 -2
  227. data/src/core/lib/channel/status_util.h +5 -0
  228. data/src/core/lib/event_engine/slice_allocator.cc +59 -0
  229. data/src/core/lib/event_engine/sockaddr.cc +38 -0
  230. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  231. data/src/core/lib/gpr/sync_windows.cc +2 -2
  232. data/src/core/lib/gprpp/atomic.h +3 -3
  233. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  234. data/src/core/lib/gprpp/ref_counted.h +28 -14
  235. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  236. data/src/core/lib/gprpp/status_helper.cc +407 -0
  237. data/src/core/lib/gprpp/status_helper.h +180 -0
  238. data/src/core/lib/gprpp/thd.h +1 -1
  239. data/src/core/lib/http/httpcli.cc +11 -11
  240. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  241. data/src/core/lib/http/parser.cc +16 -16
  242. data/src/core/lib/http/parser.h +4 -4
  243. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  244. data/src/core/lib/iomgr/buffer_list.h +5 -6
  245. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  246. data/src/core/lib/iomgr/call_combiner.h +12 -14
  247. data/src/core/lib/iomgr/cfstream_handle.cc +5 -5
  248. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  249. data/src/core/lib/iomgr/closure.h +7 -6
  250. data/src/core/lib/iomgr/combiner.cc +14 -12
  251. data/src/core/lib/iomgr/combiner.h +2 -2
  252. data/src/core/lib/iomgr/endpoint.cc +1 -1
  253. data/src/core/lib/iomgr/endpoint.h +2 -2
  254. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  255. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  256. data/src/core/lib/iomgr/error.cc +167 -61
  257. data/src/core/lib/iomgr/error.h +218 -107
  258. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  259. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  260. data/src/core/lib/iomgr/error_internal.h +5 -1
  261. data/src/core/lib/iomgr/ev_apple.cc +6 -6
  262. data/src/core/lib/iomgr/ev_epoll1_linux.cc +22 -22
  263. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  264. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  265. data/src/core/lib/iomgr/ev_posix.cc +12 -11
  266. data/src/core/lib/iomgr/ev_posix.h +9 -9
  267. data/src/core/lib/iomgr/exec_ctx.cc +10 -6
  268. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  269. data/src/core/lib/iomgr/executor.cc +8 -8
  270. data/src/core/lib/iomgr/executor.h +2 -2
  271. data/src/core/lib/iomgr/iomgr.cc +1 -1
  272. data/src/core/lib/iomgr/iomgr.h +1 -1
  273. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  274. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  275. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  276. data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
  277. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  278. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  279. data/src/core/lib/iomgr/load_file.cc +4 -4
  280. data/src/core/lib/iomgr/load_file.h +2 -2
  281. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  282. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  283. data/src/core/lib/iomgr/pollset.cc +5 -5
  284. data/src/core/lib/iomgr/pollset.h +9 -9
  285. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  286. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  287. data/src/core/lib/iomgr/port.h +1 -1
  288. data/src/core/lib/iomgr/python_util.h +1 -1
  289. data/src/core/lib/iomgr/resolve_address.cc +3 -3
  290. data/src/core/lib/iomgr/resolve_address.h +6 -6
  291. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  292. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  293. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  294. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  295. data/src/core/lib/iomgr/resource_quota.cc +12 -11
  296. data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
  297. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  298. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  299. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  300. data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
  301. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  302. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  303. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  304. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  305. data/src/core/lib/iomgr/tcp_posix.cc +37 -38
  306. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  307. data/src/core/lib/iomgr/tcp_server.h +12 -11
  308. data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
  309. data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
  310. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  311. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
  312. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  313. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  314. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  315. data/src/core/lib/iomgr/tcp_uv.cc +27 -25
  316. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  317. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  318. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  319. data/src/core/lib/iomgr/timer_custom.h +1 -1
  320. data/src/core/lib/iomgr/timer_generic.cc +8 -8
  321. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  322. data/src/core/lib/iomgr/udp_server.cc +21 -20
  323. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  324. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  325. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  326. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  327. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  328. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  329. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  330. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  331. data/src/core/lib/iomgr/work_serializer.h +17 -1
  332. data/src/core/lib/json/json.h +1 -1
  333. data/src/core/lib/json/json_reader.cc +4 -4
  334. data/src/core/lib/{security/authorization → matchers}/matchers.cc +47 -47
  335. data/src/core/lib/{security/authorization → matchers}/matchers.h +42 -40
  336. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  337. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  338. data/src/core/lib/security/credentials/credentials.h +2 -2
  339. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  340. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  341. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  342. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  343. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  344. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  345. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  346. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  347. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  348. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  349. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  350. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  351. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
  352. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  353. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  354. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  355. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  356. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  357. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  358. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  359. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  360. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  361. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  362. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  363. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  364. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  365. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  366. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  367. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  368. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  369. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  370. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  371. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  372. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
  373. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  374. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  375. data/src/core/lib/security/security_connector/ssl_utils.cc +28 -8
  376. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  377. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +62 -60
  378. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  379. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  380. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  381. data/src/core/lib/security/transport/security_handshaker.cc +65 -34
  382. data/src/core/lib/security/transport/server_auth_filter.cc +24 -11
  383. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  384. data/src/core/lib/security/transport/tsi_error.h +2 -1
  385. data/src/core/lib/security/util/json_util.cc +2 -2
  386. data/src/core/lib/security/util/json_util.h +1 -1
  387. data/src/core/lib/slice/slice_intern.cc +6 -7
  388. data/src/core/lib/surface/call.cc +46 -45
  389. data/src/core/lib/surface/call.h +2 -2
  390. data/src/core/lib/surface/channel.cc +6 -6
  391. data/src/core/lib/surface/channel.h +6 -5
  392. data/src/core/lib/surface/channel_ping.cc +1 -1
  393. data/src/core/lib/surface/completion_queue.cc +46 -47
  394. data/src/core/lib/surface/completion_queue.h +2 -1
  395. data/src/core/lib/surface/lame_client.cc +43 -24
  396. data/src/core/lib/surface/lame_client.h +4 -3
  397. data/src/core/lib/surface/server.cc +68 -55
  398. data/src/core/lib/surface/server.h +89 -29
  399. data/src/core/lib/surface/validate_metadata.cc +7 -7
  400. data/src/core/lib/surface/validate_metadata.h +3 -2
  401. data/src/core/lib/surface/version.cc +4 -2
  402. data/src/core/lib/transport/byte_stream.cc +5 -5
  403. data/src/core/lib/transport/byte_stream.h +8 -8
  404. data/src/core/lib/transport/connectivity_state.cc +1 -1
  405. data/src/core/lib/transport/error_utils.cc +19 -8
  406. data/src/core/lib/transport/error_utils.h +11 -5
  407. data/src/core/lib/transport/metadata_batch.cc +64 -37
  408. data/src/core/lib/transport/metadata_batch.h +33 -18
  409. data/src/core/lib/transport/transport.cc +4 -3
  410. data/src/core/lib/transport/transport.h +4 -4
  411. data/src/core/lib/transport/transport_op_string.cc +5 -5
  412. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  413. data/src/core/tsi/alts/crypt/gsec.h +4 -0
  414. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +6 -8
  415. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  416. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  417. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  418. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  419. data/src/core/tsi/fake_transport_security.cc +10 -1
  420. data/src/core/tsi/ssl_transport_security.cc +32 -14
  421. data/src/core/tsi/ssl_transport_security.h +3 -4
  422. data/src/ruby/bin/math_services_pb.rb +1 -1
  423. data/src/ruby/ext/grpc/extconf.rb +9 -1
  424. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  425. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  426. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  427. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  428. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  429. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  430. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  431. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  432. data/src/ruby/ext/grpc/rb_server.c +13 -1
  433. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  434. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  435. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  436. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  437. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  438. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  439. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  440. data/src/ruby/lib/grpc/version.rb +1 -1
  441. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  442. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  443. data/src/ruby/spec/call_spec.rb +1 -1
  444. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  445. data/src/ruby/spec/channel_spec.rb +17 -6
  446. data/src/ruby/spec/client_auth_spec.rb +27 -1
  447. data/src/ruby/spec/errors_spec.rb +1 -1
  448. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  449. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  450. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  451. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  452. data/src/ruby/spec/server_spec.rb +22 -0
  453. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  454. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  455. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  456. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  457. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  458. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  459. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  460. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  461. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  462. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  463. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  464. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  465. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  466. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  467. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  468. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  469. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  470. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  471. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  472. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  473. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  474. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  475. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  476. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  477. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  478. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  479. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  480. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  481. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  482. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  483. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  484. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  485. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  486. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  487. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  488. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  489. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  490. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  491. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  492. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  493. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  494. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  495. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  496. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  497. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  498. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  499. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  500. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  501. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  502. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  503. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  504. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  505. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  506. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  507. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  508. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  509. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  510. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  511. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  512. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  513. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  514. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  515. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  516. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  517. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  518. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  519. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  520. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  521. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  522. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  525. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  526. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  527. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  529. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  530. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  535. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  536. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  537. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  538. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  539. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  540. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  541. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  542. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  543. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  544. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  545. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  546. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  547. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  548. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  549. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  550. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  551. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  552. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  553. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  554. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  555. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  556. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  557. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  558. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  559. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  560. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  561. data/third_party/boringssl-with-bazel/err_data.c +478 -462
  562. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  563. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
  564. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  565. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  566. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  567. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  568. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  569. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  570. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  571. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  572. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  573. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  574. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  575. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  576. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  577. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +32 -16
  578. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  579. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  580. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
  581. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  582. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  583. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  584. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  585. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  586. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
  587. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
  588. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  589. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  590. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  591. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  592. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  593. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  594. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +7 -5
  595. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  596. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  597. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  598. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
  599. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
  600. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
  601. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
  602. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
  603. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  604. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  605. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  606. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
  607. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  608. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  609. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  610. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
  611. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  612. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  613. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -30
  614. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
  615. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  616. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
  617. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  618. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +21 -34
  619. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  620. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  621. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  622. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
  623. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  624. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  625. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  626. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
  627. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  628. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
  629. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -4
  630. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  631. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  632. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  633. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
  634. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  635. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
  636. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  637. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  638. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
  639. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  640. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  641. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +210 -26
  642. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  643. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -122
  644. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
  645. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
  646. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
  647. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
  648. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
  649. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
  650. data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
  651. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
  652. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  653. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  654. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
  655. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +131 -83
  656. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
  657. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
  658. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  659. data/third_party/xxhash/xxhash.h +5443 -0
  660. metadata +128 -61
  661. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  662. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  663. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  664. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  665. data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
  666. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  667. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  668. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
  669. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
  670. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -99
  671. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  672. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
  673. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  674. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
  675. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  676. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
  677. data/third_party/upb/upb/json_decode.c +0 -1443
  678. data/third_party/upb/upb/json_decode.h +0 -23
  679. data/third_party/upb/upb/json_encode.c +0 -713
  680. data/third_party/upb/upb/json_encode.h +0 -36
@@ -33,10 +33,12 @@
33
33
 
34
34
  #include <grpc/slice_buffer.h>
35
35
 
36
+ #include "envoy/admin/v3/config_dump.upb.h"
36
37
  #include "src/core/ext/filters/client_channel/server_address.h"
37
38
  #include "src/core/ext/xds/xds_bootstrap.h"
38
39
  #include "src/core/ext/xds/xds_client_stats.h"
39
- #include "src/core/lib/security/authorization/matchers.h"
40
+ #include "src/core/ext/xds/xds_http_filters.h"
41
+ #include "src/core/lib/matchers/matchers.h"
40
42
 
41
43
  namespace grpc_core {
42
44
 
@@ -58,13 +60,16 @@ class XdsApi {
58
60
  int64_t seconds = 0;
59
61
  int32_t nanos = 0;
60
62
  bool operator==(const Duration& other) const {
61
- return (seconds == other.seconds && nanos == other.nanos);
63
+ return seconds == other.seconds && nanos == other.nanos;
62
64
  }
63
65
  std::string ToString() const {
64
66
  return absl::StrFormat("Duration seconds: %ld, nanos %d", seconds, nanos);
65
67
  }
66
68
  };
67
69
 
70
+ using TypedPerFilterConfig =
71
+ std::map<std::string, XdsHttpFilterImpl::FilterConfig>;
72
+
68
73
  // TODO(donnadionne): When we can use absl::variant<>, consider using that
69
74
  // for: PathMatcher, HeaderMatcher, cluster_name and weighted_clusters
70
75
  struct Route {
@@ -75,14 +80,38 @@ class XdsApi {
75
80
  absl::optional<uint32_t> fraction_per_million;
76
81
 
77
82
  bool operator==(const Matchers& other) const {
78
- return (path_matcher == other.path_matcher &&
79
- header_matchers == other.header_matchers &&
80
- fraction_per_million == other.fraction_per_million);
83
+ return path_matcher == other.path_matcher &&
84
+ header_matchers == other.header_matchers &&
85
+ fraction_per_million == other.fraction_per_million;
81
86
  }
82
87
  std::string ToString() const;
83
88
  };
84
89
 
90
+ struct HashPolicy {
91
+ enum Type { HEADER, CHANNEL_ID };
92
+ Type type;
93
+ bool terminal = false;
94
+ // Fields used for type HEADER.
95
+ std::string header_name;
96
+ std::unique_ptr<RE2> regex = nullptr;
97
+ std::string regex_substitution;
98
+
99
+ HashPolicy() {}
100
+
101
+ // Copyable.
102
+ HashPolicy(const HashPolicy& other);
103
+ HashPolicy& operator=(const HashPolicy& other);
104
+
105
+ // Moveable.
106
+ HashPolicy(HashPolicy&& other) noexcept;
107
+ HashPolicy& operator=(HashPolicy&& other) noexcept;
108
+
109
+ bool operator==(const HashPolicy& other) const;
110
+ std::string ToString() const;
111
+ };
112
+
85
113
  Matchers matchers;
114
+ std::vector<HashPolicy> hash_policies;
86
115
 
87
116
  // Action for this route.
88
117
  // TODO(roth): When we can use absl::variant<>, consider using that
@@ -91,8 +120,11 @@ class XdsApi {
91
120
  struct ClusterWeight {
92
121
  std::string name;
93
122
  uint32_t weight;
123
+ TypedPerFilterConfig typed_per_filter_config;
124
+
94
125
  bool operator==(const ClusterWeight& other) const {
95
- return (name == other.name && weight == other.weight);
126
+ return name == other.name && weight == other.weight &&
127
+ typed_per_filter_config == other.typed_per_filter_config;
96
128
  }
97
129
  std::string ToString() const;
98
130
  };
@@ -103,11 +135,13 @@ class XdsApi {
103
135
  // not set.
104
136
  absl::optional<Duration> max_stream_duration;
105
137
 
138
+ TypedPerFilterConfig typed_per_filter_config;
139
+
106
140
  bool operator==(const Route& other) const {
107
- return (matchers == other.matchers &&
108
- cluster_name == other.cluster_name &&
109
- weighted_clusters == other.weighted_clusters &&
110
- max_stream_duration == other.max_stream_duration);
141
+ return matchers == other.matchers && cluster_name == other.cluster_name &&
142
+ weighted_clusters == other.weighted_clusters &&
143
+ max_stream_duration == other.max_stream_duration &&
144
+ typed_per_filter_config == other.typed_per_filter_config;
111
145
  }
112
146
  std::string ToString() const;
113
147
  };
@@ -116,9 +150,11 @@ class XdsApi {
116
150
  struct VirtualHost {
117
151
  std::vector<std::string> domains;
118
152
  std::vector<Route> routes;
153
+ TypedPerFilterConfig typed_per_filter_config;
119
154
 
120
155
  bool operator==(const VirtualHost& other) const {
121
- return domains == other.domains && routes == other.routes;
156
+ return domains == other.domains && routes == other.routes &&
157
+ typed_per_filter_config == other.typed_per_filter_config;
122
158
  }
123
159
  };
124
160
 
@@ -204,29 +240,157 @@ class XdsApi {
204
240
  kTcpListener = 0,
205
241
  kHttpApiListener,
206
242
  } type;
207
- DownstreamTlsContext downstream_tls_context;
208
- // The name to use in the RDS request.
209
- std::string route_config_name;
210
- // Storing the Http Connection Manager Common Http Protocol Option
211
- // max_stream_duration
212
- Duration http_max_stream_duration;
213
- // The RouteConfiguration to use for this listener.
214
- // Present only if it is inlined in the LDS response.
215
- absl::optional<RdsUpdate> rds_update;
243
+
244
+ struct HttpConnectionManager {
245
+ // The name to use in the RDS request.
246
+ std::string route_config_name;
247
+ // Storing the Http Connection Manager Common Http Protocol Option
248
+ // max_stream_duration
249
+ Duration http_max_stream_duration;
250
+ // The RouteConfiguration to use for this listener.
251
+ // Present only if it is inlined in the LDS response.
252
+ absl::optional<RdsUpdate> rds_update;
253
+
254
+ struct HttpFilter {
255
+ std::string name;
256
+ XdsHttpFilterImpl::FilterConfig config;
257
+
258
+ bool operator==(const HttpFilter& other) const {
259
+ return name == other.name && config == other.config;
260
+ }
261
+
262
+ std::string ToString() const;
263
+ };
264
+ std::vector<HttpFilter> http_filters;
265
+
266
+ bool operator==(const HttpConnectionManager& other) const {
267
+ return route_config_name == other.route_config_name &&
268
+ http_max_stream_duration == other.http_max_stream_duration &&
269
+ rds_update == other.rds_update &&
270
+ http_filters == other.http_filters;
271
+ }
272
+
273
+ std::string ToString() const;
274
+ };
275
+
276
+ // Populated for type=kHttpApiListener.
277
+ HttpConnectionManager http_connection_manager;
278
+
279
+ // Populated for type=kTcpListener.
280
+ // host:port listening_address set when type is kTcpListener
281
+ std::string address;
282
+
283
+ struct FilterChainData {
284
+ DownstreamTlsContext downstream_tls_context;
285
+ // This is in principle the filter list.
286
+ // We currently require exactly one filter, which is the HCM.
287
+ HttpConnectionManager http_connection_manager;
288
+
289
+ bool operator==(const FilterChainData& other) const {
290
+ return downstream_tls_context == other.downstream_tls_context &&
291
+ http_connection_manager == other.http_connection_manager;
292
+ }
293
+
294
+ std::string ToString() const;
295
+ } filter_chain_data;
296
+
297
+ // A multi-level map used to determine which filter chain to use for a given
298
+ // incoming connection. Determining the right filter chain for a given
299
+ // connection checks the following properties, in order:
300
+ // - destination port (never matched, so not present in map)
301
+ // - destination IP address
302
+ // - server name (never matched, so not present in map)
303
+ // - transport protocol (allows only "raw_buffer" or unset, prefers the
304
+ // former, so only one of those two types is present in map)
305
+ // - application protocol (never matched, so not present in map)
306
+ // - connection source type (any, local or external)
307
+ // - source IP address
308
+ // - source port
309
+ // https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/listener/v3/listener_components.proto#config-listener-v3-filterchainmatch
310
+ // for more details
311
+ struct FilterChainMap {
312
+ struct FilterChainDataSharedPtr {
313
+ std::shared_ptr<FilterChainData> data;
314
+ bool operator==(const FilterChainDataSharedPtr& other) const {
315
+ return *data == *other.data;
316
+ }
317
+ };
318
+ struct CidrRange {
319
+ grpc_resolved_address address;
320
+ uint32_t prefix_len;
321
+
322
+ bool operator==(const CidrRange& other) const {
323
+ return memcmp(&address, &other.address, sizeof(address)) == 0 &&
324
+ prefix_len == other.prefix_len;
325
+ }
326
+
327
+ std::string ToString() const;
328
+ };
329
+ using SourcePortsMap = std::map<uint16_t, FilterChainDataSharedPtr>;
330
+ struct SourceIp {
331
+ absl::optional<CidrRange> prefix_range;
332
+ SourcePortsMap ports_map;
333
+
334
+ bool operator==(const SourceIp& other) const {
335
+ return prefix_range == other.prefix_range &&
336
+ ports_map == other.ports_map;
337
+ }
338
+ };
339
+ using SourceIpVector = std::vector<SourceIp>;
340
+ enum class ConnectionSourceType {
341
+ kAny = 0,
342
+ kSameIpOrLoopback,
343
+ kExternal
344
+ };
345
+ using ConnectionSourceTypesArray = std::array<SourceIpVector, 3>;
346
+ struct DestinationIp {
347
+ absl::optional<CidrRange> prefix_range;
348
+ // We always fail match on server name, so those filter chains are not
349
+ // included here.
350
+ ConnectionSourceTypesArray source_types_array;
351
+
352
+ bool operator==(const DestinationIp& other) const {
353
+ return prefix_range == other.prefix_range &&
354
+ source_types_array == other.source_types_array;
355
+ }
356
+ };
357
+ // We always fail match on destination ports map
358
+ using DestinationIpVector = std::vector<DestinationIp>;
359
+ DestinationIpVector destination_ip_vector;
360
+
361
+ bool operator==(const FilterChainMap& other) const {
362
+ return destination_ip_vector == other.destination_ip_vector;
363
+ }
364
+
365
+ std::string ToString() const;
366
+ } filter_chain_map;
367
+
368
+ absl::optional<FilterChainData> default_filter_chain;
216
369
 
217
370
  bool operator==(const LdsUpdate& other) const {
218
- return downstream_tls_context == other.downstream_tls_context &&
219
- route_config_name == other.route_config_name &&
220
- rds_update == other.rds_update &&
221
- http_max_stream_duration == other.http_max_stream_duration;
371
+ return http_connection_manager == other.http_connection_manager &&
372
+ address == other.address &&
373
+ filter_chain_map == other.filter_chain_map &&
374
+ default_filter_chain == other.default_filter_chain;
222
375
  }
223
376
 
224
377
  std::string ToString() const;
225
378
  };
226
379
 
227
- using LdsUpdateMap = std::map<std::string /*server_name*/, LdsUpdate>;
380
+ struct LdsResourceData {
381
+ LdsUpdate resource;
382
+ std::string serialized_proto;
383
+ };
384
+
385
+ using LdsUpdateMap = std::map<std::string /*server_name*/, LdsResourceData>;
386
+
387
+ struct RdsResourceData {
388
+ RdsUpdate resource;
389
+ std::string serialized_proto;
390
+ };
228
391
 
229
- using RdsUpdateMap = std::map<std::string /*route_config_name*/, RdsUpdate>;
392
+ using RdsUpdateMap =
393
+ std::map<std::string /*route_config_name*/, RdsResourceData>;
230
394
 
231
395
  struct CdsUpdate {
232
396
  enum ClusterType { EDS, LOGICAL_DNS, AGGREGATE };
@@ -269,7 +433,12 @@ class XdsApi {
269
433
  std::string ToString() const;
270
434
  };
271
435
 
272
- using CdsUpdateMap = std::map<std::string /*cluster_name*/, CdsUpdate>;
436
+ struct CdsResourceData {
437
+ CdsUpdate resource;
438
+ std::string serialized_proto;
439
+ };
440
+
441
+ using CdsUpdateMap = std::map<std::string /*cluster_name*/, CdsResourceData>;
273
442
 
274
443
  struct EdsUpdate {
275
444
  struct Priority {
@@ -353,7 +522,13 @@ class XdsApi {
353
522
  std::string ToString() const;
354
523
  };
355
524
 
356
- using EdsUpdateMap = std::map<std::string /*eds_service_name*/, EdsUpdate>;
525
+ struct EdsResourceData {
526
+ EdsUpdate resource;
527
+ std::string serialized_proto;
528
+ };
529
+
530
+ using EdsUpdateMap =
531
+ std::map<std::string /*eds_service_name*/, EdsResourceData>;
357
532
 
358
533
  struct ClusterLoadReport {
359
534
  XdsClusterDropStats::Snapshot dropped_requests;
@@ -366,18 +541,66 @@ class XdsApi {
366
541
  std::pair<std::string /*cluster_name*/, std::string /*eds_service_name*/>,
367
542
  ClusterLoadReport>;
368
543
 
369
- XdsApi(XdsClient* client, TraceFlag* tracer, const XdsBootstrap::Node* node);
544
+ // The metadata of the xDS resource; used by the xDS config dump.
545
+ struct ResourceMetadata {
546
+ // Resource status from the view of a xDS client, which tells the
547
+ // synchronization status between the xDS client and the xDS server.
548
+ enum ClientResourceStatus {
549
+ // Client requested this resource but hasn't received any update from
550
+ // management server. The client will not fail requests, but will queue
551
+ // them
552
+ // until update arrives or the client times out waiting for the resource.
553
+ REQUESTED = 1,
554
+ // This resource has been requested by the client but has either not been
555
+ // delivered by the server or was previously delivered by the server and
556
+ // then subsequently removed from resources provided by the server.
557
+ DOES_NOT_EXIST,
558
+ // Client received this resource and replied with ACK.
559
+ ACKED,
560
+ // Client received this resource and replied with NACK.
561
+ NACKED
562
+ };
370
563
 
371
- // Creates an ADS request.
372
- // Takes ownership of \a error.
373
- grpc_slice CreateAdsRequest(const XdsBootstrap::XdsServer& server,
374
- const std::string& type_url,
375
- const std::set<absl::string_view>& resource_names,
376
- const std::string& version,
377
- const std::string& nonce, grpc_error* error,
378
- bool populate_node);
564
+ // The client status of this resource.
565
+ ClientResourceStatus client_status = REQUESTED;
566
+ // The serialized bytes of the last successfully updated raw xDS resource.
567
+ std::string serialized_proto;
568
+ // The timestamp when the resource was last successfully updated.
569
+ grpc_millis update_time = 0;
570
+ // The last successfully updated version of the resource.
571
+ std::string version;
572
+ // The rejected version string of the last failed update attempt.
573
+ std::string failed_version;
574
+ // Details about the last failed update attempt.
575
+ std::string failed_details;
576
+ // Timestamp of the last failed update attempt.
577
+ grpc_millis failed_update_time = 0;
578
+ };
579
+ using ResourceMetadataMap =
580
+ std::map<absl::string_view /*resource_name*/, const ResourceMetadata*>;
581
+ struct ResourceTypeMetadata {
582
+ absl::string_view version;
583
+ ResourceMetadataMap resource_metadata_map;
584
+ };
585
+ using ResourceTypeMetadataMap =
586
+ std::map<absl::string_view /*type_url*/, ResourceTypeMetadata>;
587
+ static_assert(static_cast<ResourceMetadata::ClientResourceStatus>(
588
+ envoy_admin_v3_REQUESTED) ==
589
+ ResourceMetadata::ClientResourceStatus::REQUESTED,
590
+ "");
591
+ static_assert(static_cast<ResourceMetadata::ClientResourceStatus>(
592
+ envoy_admin_v3_DOES_NOT_EXIST) ==
593
+ ResourceMetadata::ClientResourceStatus::DOES_NOT_EXIST,
594
+ "");
595
+ static_assert(static_cast<ResourceMetadata::ClientResourceStatus>(
596
+ envoy_admin_v3_ACKED) ==
597
+ ResourceMetadata::ClientResourceStatus::ACKED,
598
+ "");
599
+ static_assert(static_cast<ResourceMetadata::ClientResourceStatus>(
600
+ envoy_admin_v3_NACKED) ==
601
+ ResourceMetadata::ClientResourceStatus::NACKED,
602
+ "");
379
603
 
380
- // Parses an ADS response.
381
604
  // If the response can't be parsed at the top level, the resulting
382
605
  // type_url will be empty.
383
606
  // If there is any other type of validation error, the parse_error
@@ -386,7 +609,7 @@ class XdsApi {
386
609
  // Otherwise, one of the *_update_map fields will be populated, based
387
610
  // on the type_url field.
388
611
  struct AdsParseResult {
389
- grpc_error* parse_error = GRPC_ERROR_NONE;
612
+ grpc_error_handle parse_error = GRPC_ERROR_NONE;
390
613
  std::string version;
391
614
  std::string nonce;
392
615
  std::string type_url;
@@ -396,8 +619,21 @@ class XdsApi {
396
619
  EdsUpdateMap eds_update_map;
397
620
  std::set<std::string> resource_names_failed;
398
621
  };
622
+
623
+ XdsApi(XdsClient* client, TraceFlag* tracer, const XdsBootstrap::Node* node);
624
+
625
+ // Creates an ADS request.
626
+ // Takes ownership of \a error.
627
+ grpc_slice CreateAdsRequest(const XdsBootstrap::XdsServer& server,
628
+ const std::string& type_url,
629
+ const std::set<absl::string_view>& resource_names,
630
+ const std::string& version,
631
+ const std::string& nonce, grpc_error_handle error,
632
+ bool populate_node);
633
+
634
+ // Parses an ADS response.
399
635
  AdsParseResult ParseAdsResponse(
400
- const grpc_slice& encoded_response,
636
+ const XdsBootstrap::XdsServer& server, const grpc_slice& encoded_response,
401
637
  const std::set<absl::string_view>& expected_listener_names,
402
638
  const std::set<absl::string_view>& expected_route_configuration_names,
403
639
  const std::set<absl::string_view>& expected_cluster_names,
@@ -412,10 +648,14 @@ class XdsApi {
412
648
  // Parses the LRS response and returns \a
413
649
  // load_reporting_interval for client-side load reporting. If there is any
414
650
  // error, the output config is invalid.
415
- grpc_error* ParseLrsResponse(const grpc_slice& encoded_response,
416
- bool* send_all_clusters,
417
- std::set<std::string>* cluster_names,
418
- grpc_millis* load_reporting_interval);
651
+ grpc_error_handle ParseLrsResponse(const grpc_slice& encoded_response,
652
+ bool* send_all_clusters,
653
+ std::set<std::string>* cluster_names,
654
+ grpc_millis* load_reporting_interval);
655
+
656
+ // Assemble the client config proto message and return the serialized result.
657
+ std::string AssembleClientConfig(
658
+ const ResourceTypeMetadataMap& resource_type_metadata_map);
419
659
 
420
660
  private:
421
661
  XdsClient* client_;
@@ -30,7 +30,6 @@
30
30
 
31
31
  #include "src/core/ext/xds/certificate_provider_registry.h"
32
32
  #include "src/core/ext/xds/xds_api.h"
33
- #include "src/core/lib/gpr/env.h"
34
33
  #include "src/core/lib/gpr/string.h"
35
34
  #include "src/core/lib/iomgr/load_file.h"
36
35
  #include "src/core/lib/security/credentials/credentials.h"
@@ -81,136 +80,27 @@ bool XdsBootstrap::XdsServer::ShouldUseV3() const {
81
80
  // XdsBootstrap
82
81
  //
83
82
 
84
- namespace {
85
-
86
- std::string BootstrapString(const XdsBootstrap& bootstrap) {
87
- std::vector<std::string> parts;
88
- if (bootstrap.node() != nullptr) {
89
- parts.push_back(absl::StrFormat(
90
- "node={\n"
91
- " id=\"%s\",\n"
92
- " cluster=\"%s\",\n"
93
- " locality={\n"
94
- " region=\"%s\",\n"
95
- " zone=\"%s\",\n"
96
- " subzone=\"%s\"\n"
97
- " },\n"
98
- " metadata=%s,\n"
99
- "},\n",
100
- bootstrap.node()->id, bootstrap.node()->cluster,
101
- bootstrap.node()->locality_region, bootstrap.node()->locality_zone,
102
- bootstrap.node()->locality_subzone, bootstrap.node()->metadata.Dump()));
103
- }
104
- parts.push_back(absl::StrFormat(
105
- "servers=[\n"
106
- " {\n"
107
- " uri=\"%s\",\n"
108
- " creds_type=%s,\n",
109
- bootstrap.server().server_uri, bootstrap.server().channel_creds_type));
110
- if (bootstrap.server().channel_creds_config.type() != Json::Type::JSON_NULL) {
111
- parts.push_back(
112
- absl::StrFormat(" creds_config=%s,",
113
- bootstrap.server().channel_creds_config.Dump()));
114
- }
115
- if (!bootstrap.server().server_features.empty()) {
116
- parts.push_back(absl::StrCat(
117
- " server_features=[",
118
- absl::StrJoin(bootstrap.server().server_features, ", "), "],\n"));
119
- }
120
- parts.push_back(" }\n],\n");
121
- parts.push_back("certificate_providers={\n");
122
- for (const auto& entry : bootstrap.certificate_providers()) {
123
- parts.push_back(
124
- absl::StrFormat(" %s={\n"
125
- " plugin_name=%s\n"
126
- " config=%s\n"
127
- " },\n",
128
- entry.first, entry.second.plugin_name,
129
- entry.second.config->ToString()));
130
- }
131
- parts.push_back("}");
132
- return absl::StrJoin(parts, "");
133
- }
134
-
135
- std::unique_ptr<XdsBootstrap> ParseJsonAndCreate(
136
- XdsClient* client, TraceFlag* tracer, absl::string_view json_string,
137
- absl::string_view bootstrap_source, grpc_error** error) {
83
+ std::unique_ptr<XdsBootstrap> XdsBootstrap::Create(
84
+ absl::string_view json_string, grpc_error_handle* error) {
138
85
  Json json = Json::Parse(json_string, error);
139
86
  if (*error != GRPC_ERROR_NONE) {
140
- grpc_error* error_out = GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(
141
- absl::StrCat("Failed to parse bootstrap from ", bootstrap_source)
142
- .c_str(),
143
- error, 1);
87
+ grpc_error_handle error_out =
88
+ GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
89
+ "Failed to parse bootstrap JSON string", error, 1);
144
90
  GRPC_ERROR_UNREF(*error);
145
91
  *error = error_out;
146
92
  return nullptr;
147
93
  }
148
- std::unique_ptr<XdsBootstrap> result =
149
- absl::make_unique<XdsBootstrap>(std::move(json), error);
150
- if (*error == GRPC_ERROR_NONE && GRPC_TRACE_FLAG_ENABLED(*tracer)) {
151
- gpr_log(GPR_INFO,
152
- "[xds_client %p] Bootstrap config for creating xds client:\n%s",
153
- client, BootstrapString(*result).c_str());
154
- }
155
- return result;
156
- }
157
-
158
- } // namespace
159
-
160
- std::unique_ptr<XdsBootstrap> XdsBootstrap::Create(XdsClient* client,
161
- TraceFlag* tracer,
162
- const char* fallback_config,
163
- grpc_error** error) {
164
- // First, try GRPC_XDS_BOOTSTRAP env var.
165
- grpc_core::UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
166
- if (path != nullptr) {
167
- if (GRPC_TRACE_FLAG_ENABLED(*tracer)) {
168
- gpr_log(GPR_INFO,
169
- "[xds_client %p] Got bootstrap file location from "
170
- "GRPC_XDS_BOOTSTRAP environment variable: %s",
171
- client, path.get());
172
- }
173
- grpc_slice contents;
174
- *error =
175
- grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
176
- if (*error != GRPC_ERROR_NONE) return nullptr;
177
- absl::string_view contents_str_view = StringViewFromSlice(contents);
178
- if (GRPC_TRACE_FLAG_ENABLED(*tracer)) {
179
- gpr_log(GPR_DEBUG, "[xds_client %p] Bootstrap file contents: %s", client,
180
- std::string(contents_str_view).c_str());
181
- }
182
- std::string bootstrap_source = absl::StrCat("file ", path.get());
183
- auto result = ParseJsonAndCreate(client, tracer, contents_str_view,
184
- bootstrap_source, error);
185
- grpc_slice_unref_internal(contents);
186
- return result;
187
- }
188
- // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
189
- grpc_core::UniquePtr<char> env_config(
190
- gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
191
- if (env_config != nullptr) {
192
- return ParseJsonAndCreate(client, tracer, env_config.get(),
193
- "GRPC_XDS_BOOTSTRAP_CONFIG env var", error);
194
- }
195
- // Finally, try fallback config.
196
- if (fallback_config != nullptr) {
197
- return ParseJsonAndCreate(client, tracer, fallback_config,
198
- "fallback config", error);
199
- }
200
- // No bootstrap config found.
201
- *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
202
- "Environment variables GRPC_XDS_BOOTSTRAP or GRPC_XDS_BOOTSTRAP_CONFIG "
203
- "not defined");
204
- return nullptr;
94
+ return absl::make_unique<XdsBootstrap>(std::move(json), error);
205
95
  }
206
96
 
207
- XdsBootstrap::XdsBootstrap(Json json, grpc_error** error) {
97
+ XdsBootstrap::XdsBootstrap(Json json, grpc_error_handle* error) {
208
98
  if (json.type() != Json::Type::OBJECT) {
209
99
  *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
210
100
  "malformed JSON in bootstrap file");
211
101
  return;
212
102
  }
213
- std::vector<grpc_error*> error_list;
103
+ std::vector<grpc_error_handle> error_list;
214
104
  auto it = json.mutable_object()->find("xds_servers");
215
105
  if (it == json.mutable_object()->end()) {
216
106
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
@@ -219,7 +109,7 @@ XdsBootstrap::XdsBootstrap(Json json, grpc_error** error) {
219
109
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
220
110
  "\"xds_servers\" field is not an array"));
221
111
  } else {
222
- grpc_error* parse_error = ParseXdsServerList(&it->second);
112
+ grpc_error_handle parse_error = ParseXdsServerList(&it->second);
223
113
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
224
114
  }
225
115
  it = json.mutable_object()->find("node");
@@ -228,10 +118,20 @@ XdsBootstrap::XdsBootstrap(Json json, grpc_error** error) {
228
118
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
229
119
  "\"node\" field is not an object"));
230
120
  } else {
231
- grpc_error* parse_error = ParseNode(&it->second);
121
+ grpc_error_handle parse_error = ParseNode(&it->second);
232
122
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
233
123
  }
234
124
  }
125
+ it = json.mutable_object()->find("server_listener_resource_name_template");
126
+ if (it != json.mutable_object()->end()) {
127
+ if (it->second.type() != Json::Type::STRING) {
128
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
129
+ "\"server_listener_resource_name_template\" field is not a string"));
130
+ } else {
131
+ server_listener_resource_name_template_ =
132
+ std::move(*it->second.mutable_string_value());
133
+ }
134
+ }
235
135
  if (XdsSecurityEnabled()) {
236
136
  it = json.mutable_object()->find("certificate_providers");
237
137
  if (it != json.mutable_object()->end()) {
@@ -239,7 +139,7 @@ XdsBootstrap::XdsBootstrap(Json json, grpc_error** error) {
239
139
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
240
140
  "\"certificate_providers\" field is not an object"));
241
141
  } else {
242
- grpc_error* parse_error = ParseCertificateProviders(&it->second);
142
+ grpc_error_handle parse_error = ParseCertificateProviders(&it->second);
243
143
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
244
144
  }
245
145
  }
@@ -248,15 +148,15 @@ XdsBootstrap::XdsBootstrap(Json json, grpc_error** error) {
248
148
  &error_list);
249
149
  }
250
150
 
251
- grpc_error* XdsBootstrap::ParseXdsServerList(Json* json) {
252
- std::vector<grpc_error*> error_list;
151
+ grpc_error_handle XdsBootstrap::ParseXdsServerList(Json* json) {
152
+ std::vector<grpc_error_handle> error_list;
253
153
  for (size_t i = 0; i < json->mutable_array()->size(); ++i) {
254
154
  Json& child = json->mutable_array()->at(i);
255
155
  if (child.type() != Json::Type::OBJECT) {
256
156
  error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
257
157
  absl::StrCat("array element ", i, " is not an object").c_str()));
258
158
  } else {
259
- grpc_error* parse_error = ParseXdsServer(&child, i);
159
+ grpc_error_handle parse_error = ParseXdsServer(&child, i);
260
160
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
261
161
  }
262
162
  }
@@ -264,8 +164,8 @@ grpc_error* XdsBootstrap::ParseXdsServerList(Json* json) {
264
164
  &error_list);
265
165
  }
266
166
 
267
- grpc_error* XdsBootstrap::ParseXdsServer(Json* json, size_t idx) {
268
- std::vector<grpc_error*> error_list;
167
+ grpc_error_handle XdsBootstrap::ParseXdsServer(Json* json, size_t idx) {
168
+ std::vector<grpc_error_handle> error_list;
269
169
  servers_.emplace_back();
270
170
  XdsServer& server = servers_[servers_.size() - 1];
271
171
  auto it = json->mutable_object()->find("server_uri");
@@ -286,7 +186,8 @@ grpc_error* XdsBootstrap::ParseXdsServer(Json* json, size_t idx) {
286
186
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
287
187
  "\"channel_creds\" field is not an array"));
288
188
  } else {
289
- grpc_error* parse_error = ParseChannelCredsArray(&it->second, &server);
189
+ grpc_error_handle parse_error =
190
+ ParseChannelCredsArray(&it->second, &server);
290
191
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
291
192
  }
292
193
  it = json->mutable_object()->find("server_features");
@@ -295,14 +196,15 @@ grpc_error* XdsBootstrap::ParseXdsServer(Json* json, size_t idx) {
295
196
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
296
197
  "\"server_features\" field is not an array"));
297
198
  } else {
298
- grpc_error* parse_error = ParseServerFeaturesArray(&it->second, &server);
199
+ grpc_error_handle parse_error =
200
+ ParseServerFeaturesArray(&it->second, &server);
299
201
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
300
202
  }
301
203
  }
302
204
  // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
303
205
  // string is not static in this case.
304
206
  if (error_list.empty()) return GRPC_ERROR_NONE;
305
- grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
207
+ grpc_error_handle error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
306
208
  absl::StrCat("errors parsing index ", idx).c_str());
307
209
  for (size_t i = 0; i < error_list.size(); ++i) {
308
210
  error = grpc_error_add_child(error, error_list[i]);
@@ -310,16 +212,16 @@ grpc_error* XdsBootstrap::ParseXdsServer(Json* json, size_t idx) {
310
212
  return error;
311
213
  }
312
214
 
313
- grpc_error* XdsBootstrap::ParseChannelCredsArray(Json* json,
314
- XdsServer* server) {
315
- std::vector<grpc_error*> error_list;
215
+ grpc_error_handle XdsBootstrap::ParseChannelCredsArray(Json* json,
216
+ XdsServer* server) {
217
+ std::vector<grpc_error_handle> error_list;
316
218
  for (size_t i = 0; i < json->mutable_array()->size(); ++i) {
317
219
  Json& child = json->mutable_array()->at(i);
318
220
  if (child.type() != Json::Type::OBJECT) {
319
221
  error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
320
222
  absl::StrCat("array element ", i, " is not an object").c_str()));
321
223
  } else {
322
- grpc_error* parse_error = ParseChannelCreds(&child, i, server);
224
+ grpc_error_handle parse_error = ParseChannelCreds(&child, i, server);
323
225
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
324
226
  }
325
227
  }
@@ -331,9 +233,9 @@ grpc_error* XdsBootstrap::ParseChannelCredsArray(Json* json,
331
233
  &error_list);
332
234
  }
333
235
 
334
- grpc_error* XdsBootstrap::ParseChannelCreds(Json* json, size_t idx,
335
- XdsServer* server) {
336
- std::vector<grpc_error*> error_list;
236
+ grpc_error_handle XdsBootstrap::ParseChannelCreds(Json* json, size_t idx,
237
+ XdsServer* server) {
238
+ std::vector<grpc_error_handle> error_list;
337
239
  std::string type;
338
240
  auto it = json->mutable_object()->find("type");
339
241
  if (it == json->mutable_object()->end()) {
@@ -369,7 +271,7 @@ grpc_error* XdsBootstrap::ParseChannelCreds(Json* json, size_t idx,
369
271
  // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
370
272
  // string is not static in this case.
371
273
  if (error_list.empty()) return GRPC_ERROR_NONE;
372
- grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
274
+ grpc_error_handle error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
373
275
  absl::StrCat("errors parsing index ", idx).c_str());
374
276
  for (size_t i = 0; i < error_list.size(); ++i) {
375
277
  error = grpc_error_add_child(error, error_list[i]);
@@ -377,9 +279,9 @@ grpc_error* XdsBootstrap::ParseChannelCreds(Json* json, size_t idx,
377
279
  return error;
378
280
  }
379
281
 
380
- grpc_error* XdsBootstrap::ParseServerFeaturesArray(Json* json,
381
- XdsServer* server) {
382
- std::vector<grpc_error*> error_list;
282
+ grpc_error_handle XdsBootstrap::ParseServerFeaturesArray(Json* json,
283
+ XdsServer* server) {
284
+ std::vector<grpc_error_handle> error_list;
383
285
  for (size_t i = 0; i < json->mutable_array()->size(); ++i) {
384
286
  Json& child = json->mutable_array()->at(i);
385
287
  if (child.type() == Json::Type::STRING &&
@@ -391,8 +293,8 @@ grpc_error* XdsBootstrap::ParseServerFeaturesArray(Json* json,
391
293
  "errors parsing \"server_features\" array", &error_list);
392
294
  }
393
295
 
394
- grpc_error* XdsBootstrap::ParseNode(Json* json) {
395
- std::vector<grpc_error*> error_list;
296
+ grpc_error_handle XdsBootstrap::ParseNode(Json* json) {
297
+ std::vector<grpc_error_handle> error_list;
396
298
  node_ = absl::make_unique<Node>();
397
299
  auto it = json->mutable_object()->find("id");
398
300
  if (it != json->mutable_object()->end()) {
@@ -418,7 +320,7 @@ grpc_error* XdsBootstrap::ParseNode(Json* json) {
418
320
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
419
321
  "\"locality\" field is not an object"));
420
322
  } else {
421
- grpc_error* parse_error = ParseLocality(&it->second);
323
+ grpc_error_handle parse_error = ParseLocality(&it->second);
422
324
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
423
325
  }
424
326
  }
@@ -435,8 +337,8 @@ grpc_error* XdsBootstrap::ParseNode(Json* json) {
435
337
  &error_list);
436
338
  }
437
339
 
438
- grpc_error* XdsBootstrap::ParseLocality(Json* json) {
439
- std::vector<grpc_error*> error_list;
340
+ grpc_error_handle XdsBootstrap::ParseLocality(Json* json) {
341
+ std::vector<grpc_error_handle> error_list;
440
342
  auto it = json->mutable_object()->find("region");
441
343
  if (it != json->mutable_object()->end()) {
442
344
  if (it->second.type() != Json::Type::STRING) {
@@ -455,21 +357,21 @@ grpc_error* XdsBootstrap::ParseLocality(Json* json) {
455
357
  node_->locality_zone = std::move(*it->second.mutable_string_value());
456
358
  }
457
359
  }
458
- it = json->mutable_object()->find("subzone");
360
+ it = json->mutable_object()->find("sub_zone");
459
361
  if (it != json->mutable_object()->end()) {
460
362
  if (it->second.type() != Json::Type::STRING) {
461
363
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
462
- "\"subzone\" field is not a string"));
364
+ "\"sub_zone\" field is not a string"));
463
365
  } else {
464
- node_->locality_subzone = std::move(*it->second.mutable_string_value());
366
+ node_->locality_sub_zone = std::move(*it->second.mutable_string_value());
465
367
  }
466
368
  }
467
369
  return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing \"locality\" object",
468
370
  &error_list);
469
371
  }
470
372
 
471
- grpc_error* XdsBootstrap::ParseCertificateProviders(Json* json) {
472
- std::vector<grpc_error*> error_list;
373
+ grpc_error_handle XdsBootstrap::ParseCertificateProviders(Json* json) {
374
+ std::vector<grpc_error_handle> error_list;
473
375
  for (auto& certificate_provider : *(json->mutable_object())) {
474
376
  if (certificate_provider.second.type() != Json::Type::OBJECT) {
475
377
  error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
@@ -477,7 +379,7 @@ grpc_error* XdsBootstrap::ParseCertificateProviders(Json* json) {
477
379
  "\" is not an object")
478
380
  .c_str()));
479
381
  } else {
480
- grpc_error* parse_error = ParseCertificateProvider(
382
+ grpc_error_handle parse_error = ParseCertificateProvider(
481
383
  certificate_provider.first, &certificate_provider.second);
482
384
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
483
385
  }
@@ -486,9 +388,9 @@ grpc_error* XdsBootstrap::ParseCertificateProviders(Json* json) {
486
388
  "errors parsing \"certificate_providers\" object", &error_list);
487
389
  }
488
390
 
489
- grpc_error* XdsBootstrap::ParseCertificateProvider(
391
+ grpc_error_handle XdsBootstrap::ParseCertificateProvider(
490
392
  const std::string& instance_name, Json* certificate_provider_json) {
491
- std::vector<grpc_error*> error_list;
393
+ std::vector<grpc_error_handle> error_list;
492
394
  auto it = certificate_provider_json->mutable_object()->find("plugin_name");
493
395
  if (it == certificate_provider_json->mutable_object()->end()) {
494
396
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
@@ -509,14 +411,14 @@ grpc_error* XdsBootstrap::ParseCertificateProvider(
509
411
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
510
412
  "\"config\" field is not an object"));
511
413
  } else {
512
- grpc_error* parse_error = GRPC_ERROR_NONE;
414
+ grpc_error_handle parse_error = GRPC_ERROR_NONE;
513
415
  config = factory->CreateCertificateProviderConfig(it->second,
514
416
  &parse_error);
515
417
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
516
418
  }
517
419
  } else {
518
420
  // "config" is an optional field, so create an empty JSON object.
519
- grpc_error* parse_error = GRPC_ERROR_NONE;
421
+ grpc_error_handle parse_error = GRPC_ERROR_NONE;
520
422
  config = factory->CreateCertificateProviderConfig(Json::Object(),
521
423
  &parse_error);
522
424
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
@@ -528,7 +430,7 @@ grpc_error* XdsBootstrap::ParseCertificateProvider(
528
430
  // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
529
431
  // string is not static in this case.
530
432
  if (error_list.empty()) return GRPC_ERROR_NONE;
531
- grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
433
+ grpc_error_handle error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
532
434
  absl::StrCat("errors parsing element \"", instance_name, "\"").c_str());
533
435
  for (size_t i = 0; i < error_list.size(); ++i) {
534
436
  error = grpc_error_add_child(error, error_list[i]);
@@ -536,4 +438,56 @@ grpc_error* XdsBootstrap::ParseCertificateProvider(
536
438
  return error;
537
439
  }
538
440
 
441
+ std::string XdsBootstrap::ToString() const {
442
+ std::vector<std::string> parts;
443
+ if (node_ != nullptr) {
444
+ parts.push_back(absl::StrFormat(
445
+ "node={\n"
446
+ " id=\"%s\",\n"
447
+ " cluster=\"%s\",\n"
448
+ " locality={\n"
449
+ " region=\"%s\",\n"
450
+ " zone=\"%s\",\n"
451
+ " sub_zone=\"%s\"\n"
452
+ " },\n"
453
+ " metadata=%s,\n"
454
+ "},\n",
455
+ node_->id, node_->cluster, node_->locality_region, node_->locality_zone,
456
+ node_->locality_sub_zone, node_->metadata.Dump()));
457
+ }
458
+ parts.push_back(
459
+ absl::StrFormat("servers=[\n"
460
+ " {\n"
461
+ " uri=\"%s\",\n"
462
+ " creds_type=%s,\n",
463
+ server().server_uri, server().channel_creds_type));
464
+ if (server().channel_creds_config.type() != Json::Type::JSON_NULL) {
465
+ parts.push_back(absl::StrFormat(" creds_config=%s,",
466
+ server().channel_creds_config.Dump()));
467
+ }
468
+ if (!server().server_features.empty()) {
469
+ parts.push_back(absl::StrCat(" server_features=[",
470
+ absl::StrJoin(server().server_features, ", "),
471
+ "],\n"));
472
+ }
473
+ parts.push_back(" }\n],\n");
474
+ if (!server_listener_resource_name_template_.empty()) {
475
+ parts.push_back(
476
+ absl::StrFormat("server_listener_resource_name_template=\"%s\",\n",
477
+ server_listener_resource_name_template_));
478
+ }
479
+ parts.push_back("certificate_providers={\n");
480
+ for (const auto& entry : certificate_providers_) {
481
+ parts.push_back(
482
+ absl::StrFormat(" %s={\n"
483
+ " plugin_name=%s\n"
484
+ " config=%s\n"
485
+ " },\n",
486
+ entry.first, entry.second.plugin_name,
487
+ entry.second.config->ToString()));
488
+ }
489
+ parts.push_back("}");
490
+ return absl::StrJoin(parts, "");
491
+ }
492
+
539
493
  } // namespace grpc_core