grpc 1.35.0.pre1 → 1.37.1

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 (507) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +121 -89
  3. data/include/grpc/grpc.h +15 -1
  4. data/include/grpc/grpc_security.h +16 -11
  5. data/include/grpc/impl/codegen/port_platform.h +2 -0
  6. data/src/core/ext/filters/client_channel/client_channel.cc +359 -331
  7. data/src/core/ext/filters/client_channel/client_channel.h +0 -2
  8. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
  9. data/src/core/ext/filters/client_channel/config_selector.h +9 -1
  10. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -4
  11. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
  12. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  13. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -2
  14. data/src/core/ext/filters/client_channel/lb_policy.cc +3 -0
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +3 -5
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +1 -1
  19. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +8 -6
  20. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  21. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +289 -170
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +5 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +8 -25
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +232 -110
  27. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  28. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  29. data/src/core/ext/filters/client_channel/resolver.cc +5 -5
  30. data/src/core/ext/filters/client_channel/resolver.h +1 -12
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -45
  32. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  33. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -1
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +34 -50
  35. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +16 -14
  36. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +18 -15
  37. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +377 -0
  38. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  39. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +307 -155
  40. data/src/core/ext/filters/client_channel/server_address.cc +9 -0
  41. data/src/core/ext/filters/client_channel/server_address.h +31 -0
  42. data/src/core/ext/filters/client_channel/subchannel.cc +69 -146
  43. data/src/core/ext/filters/client_channel/subchannel.h +63 -95
  44. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  45. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
  46. data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
  47. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +500 -0
  48. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  49. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  50. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  51. data/src/core/ext/filters/max_age/max_age_filter.cc +35 -32
  52. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
  53. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  54. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +3 -2
  55. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  56. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -2
  57. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +490 -178
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
  59. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
  60. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +1 -1
  61. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
  62. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +39 -7
  63. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  64. data/src/core/ext/transport/chttp2/transport/frame_data.cc +5 -1
  65. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  66. data/src/core/ext/transport/chttp2/transport/internal.h +1 -0
  67. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  68. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  69. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +0 -1
  70. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  71. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  72. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +11 -16
  73. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +42 -59
  74. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +3 -2
  75. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +15 -0
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -1
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +75 -0
  78. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +2 -2
  79. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +9 -9
  80. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +7 -7
  81. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +28 -13
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  84. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +0 -1
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +11 -5
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +41 -7
  87. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +0 -1
  88. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +23 -21
  89. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +122 -77
  90. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +13 -9
  91. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +37 -5
  92. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +0 -1
  93. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  94. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  95. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  96. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  97. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +11 -9
  98. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +44 -27
  99. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +57 -16
  100. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +150 -0
  101. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +0 -1
  102. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  103. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  104. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  105. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  106. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  107. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  108. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  109. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  110. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +19 -21
  111. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +64 -51
  112. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +16 -13
  114. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +50 -18
  115. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +4 -7
  116. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +0 -17
  117. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +0 -1
  118. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +30 -23
  119. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +85 -73
  120. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -3
  121. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -3
  122. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +0 -1
  123. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -2
  124. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  125. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  126. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  127. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  128. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +0 -1
  129. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  130. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  131. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +21 -4
  132. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +29 -0
  133. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  134. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  135. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/authority.upb.c +5 -5
  136. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  137. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  138. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  139. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  140. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  141. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/resource.upb.c +9 -9
  142. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  143. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  144. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  145. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  146. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  147. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  148. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  149. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +168 -171
  150. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  151. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  152. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +405 -420
  153. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +2 -2
  154. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +12 -9
  155. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +177 -171
  156. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
  157. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +88 -88
  158. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +153 -153
  159. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
  160. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
  161. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +4 -7
  162. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +33 -20
  163. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +56 -59
  164. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +116 -111
  165. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +129 -121
  166. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +21 -24
  167. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  168. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  169. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  170. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  171. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +17 -13
  172. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +753 -724
  173. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
  174. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +22 -25
  175. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  176. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  177. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  178. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  179. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  180. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  181. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  182. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  183. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +371 -377
  184. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +12 -16
  185. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +112 -108
  186. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +45 -53
  187. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +177 -180
  188. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +92 -102
  189. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +5 -0
  190. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +32 -42
  191. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +30 -40
  192. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +4 -7
  193. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +38 -44
  194. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  195. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  196. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  197. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  198. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +30 -33
  199. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  200. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  201. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +8 -7
  202. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +9 -9
  203. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +9 -8
  204. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +8 -8
  205. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +8 -8
  206. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +9 -8
  207. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +8 -8
  208. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  209. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  210. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +14 -11
  211. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  212. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  213. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  214. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  215. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  216. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  217. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  218. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  219. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  220. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  221. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  222. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  223. data/src/core/ext/xds/xds_api.cc +2149 -666
  224. data/src/core/ext/xds/xds_api.h +321 -119
  225. data/src/core/ext/xds/xds_bootstrap.cc +80 -45
  226. data/src/core/ext/xds/xds_bootstrap.h +17 -5
  227. data/src/core/ext/xds/xds_certificate_provider.cc +180 -74
  228. data/src/core/ext/xds/xds_certificate_provider.h +83 -44
  229. data/src/core/ext/xds/xds_client.cc +181 -34
  230. data/src/core/ext/xds/xds_client.h +29 -0
  231. data/src/core/ext/xds/xds_client_stats.cc +2 -1
  232. data/src/core/ext/xds/xds_client_stats.h +2 -2
  233. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  234. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  235. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  236. data/src/core/ext/xds/xds_http_filters.h +130 -0
  237. data/src/core/ext/xds/xds_server_config_fetcher.cc +425 -24
  238. data/src/core/lib/channel/channel_stack.cc +12 -0
  239. data/src/core/lib/channel/channel_stack.h +7 -0
  240. data/src/core/lib/channel/channelz.cc +92 -4
  241. data/src/core/lib/channel/channelz.h +30 -1
  242. data/src/core/lib/channel/channelz_registry.cc +14 -0
  243. data/src/core/lib/channel/handshaker.cc +2 -44
  244. data/src/core/lib/channel/handshaker.h +1 -18
  245. data/src/core/lib/channel/status_util.cc +12 -2
  246. data/src/core/lib/channel/status_util.h +5 -0
  247. data/src/core/lib/gpr/log.cc +6 -1
  248. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  249. data/src/core/lib/gpr/sync_windows.cc +2 -2
  250. data/src/core/lib/gprpp/atomic.h +3 -3
  251. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  252. data/src/core/lib/gprpp/mpscq.cc +2 -2
  253. data/src/core/lib/gprpp/ref_counted.h +1 -1
  254. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  255. data/src/core/lib/gprpp/sync.h +129 -40
  256. data/src/core/lib/gprpp/thd.h +1 -1
  257. data/src/core/lib/gprpp/time_util.cc +77 -0
  258. data/src/core/lib/gprpp/time_util.h +42 -0
  259. data/src/core/lib/http/httpcli_security_connector.cc +2 -2
  260. data/src/core/lib/iomgr/buffer_list.h +1 -1
  261. data/src/core/lib/iomgr/cfstream_handle.cc +2 -2
  262. data/src/core/lib/iomgr/error.h +1 -1
  263. data/src/core/lib/iomgr/ev_apple.cc +11 -8
  264. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -3
  265. data/src/core/lib/iomgr/ev_epollex_linux.cc +4 -4
  266. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  267. data/src/core/lib/iomgr/exec_ctx.cc +6 -2
  268. data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
  269. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
  270. data/src/core/lib/iomgr/resource_quota.cc +1 -1
  271. data/src/core/lib/iomgr/sockaddr_utils.cc +121 -1
  272. data/src/core/lib/iomgr/sockaddr_utils.h +25 -0
  273. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
  274. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  275. data/src/core/lib/iomgr/tcp_posix.cc +5 -8
  276. data/src/core/lib/iomgr/tcp_uv.cc +2 -2
  277. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  278. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  279. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  280. data/src/core/lib/matchers/matchers.cc +339 -0
  281. data/src/core/lib/matchers/matchers.h +160 -0
  282. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  283. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  284. data/src/core/lib/security/credentials/credentials.h +2 -1
  285. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +1 -1
  286. data/src/core/lib/security/credentials/external/external_account_credentials.cc +2 -2
  287. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -1
  288. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -1
  289. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -1
  290. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +7 -6
  291. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +2 -2
  292. data/src/core/lib/security/credentials/jwt/json_token.cc +0 -3
  293. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +0 -3
  294. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  295. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  296. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +2 -1
  297. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  298. data/src/core/lib/security/credentials/tls/tls_credentials.cc +2 -1
  299. data/src/core/lib/security/credentials/tls/tls_credentials.h +1 -1
  300. data/src/core/lib/security/credentials/xds/xds_credentials.cc +128 -59
  301. data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
  302. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
  303. data/src/core/lib/security/security_connector/ssl_utils.cc +9 -4
  304. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +32 -14
  305. data/src/core/lib/security/transport/security_handshaker.cc +33 -5
  306. data/src/core/lib/security/transport/server_auth_filter.cc +7 -0
  307. data/src/core/lib/slice/slice_intern.cc +5 -6
  308. data/src/core/lib/surface/channel.h +3 -3
  309. data/src/core/lib/surface/completion_queue.cc +1 -1
  310. data/src/core/lib/surface/init.cc +13 -15
  311. data/src/core/lib/surface/lame_client.cc +38 -19
  312. data/src/core/lib/surface/lame_client.h +4 -3
  313. data/src/core/lib/surface/server.cc +43 -36
  314. data/src/core/lib/surface/server.h +76 -14
  315. data/src/core/lib/surface/version.cc +2 -2
  316. data/src/core/lib/transport/metadata.cc +6 -2
  317. data/src/core/lib/transport/metadata_batch.cc +27 -0
  318. data/src/core/lib/transport/metadata_batch.h +14 -0
  319. data/src/core/plugin_registry/grpc_plugin_registry.cc +12 -0
  320. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +18 -24
  321. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +16 -21
  322. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  323. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  324. data/src/core/tsi/fake_transport_security.cc +11 -2
  325. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -3
  326. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  327. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +2 -4
  328. data/src/core/tsi/ssl_transport_security.cc +0 -3
  329. data/src/core/tsi/ssl_transport_security.h +0 -3
  330. data/src/ruby/ext/grpc/extconf.rb +9 -1
  331. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  332. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  333. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  334. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  335. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  336. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  337. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  338. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  339. data/src/ruby/ext/grpc/rb_server.c +13 -1
  340. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  341. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  342. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  343. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  344. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  345. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  346. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +7 -0
  349. data/src/ruby/spec/call_spec.rb +1 -1
  350. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  351. data/src/ruby/spec/channel_spec.rb +17 -6
  352. data/src/ruby/spec/client_auth_spec.rb +27 -1
  353. data/src/ruby/spec/errors_spec.rb +1 -1
  354. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  355. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  356. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  357. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  358. data/src/ruby/spec/server_spec.rb +22 -0
  359. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +1 -0
  360. data/third_party/boringssl-with-bazel/err_data.c +715 -713
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
  365. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -14
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
  372. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
  373. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  374. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  375. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  377. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  378. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  379. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  381. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  382. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
  383. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  384. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  385. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  386. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  387. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  388. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  389. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
  395. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  396. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +135 -43
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
  402. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +51 -32
  403. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +147 -0
  404. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +18 -29
  405. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +13 -4
  406. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  407. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  408. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  409. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  410. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
  411. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  412. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +1 -29
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +10 -7
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +8 -8
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +1 -1
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +29 -23
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +1 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +39 -4
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  424. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  425. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +11 -10
  426. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  427. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +25 -25
  428. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +40 -20
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +6 -6
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  436. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +3 -3
  437. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -545
  438. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  439. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -5
  440. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  441. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  442. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +19 -0
  443. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  444. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +56 -26
  445. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  446. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
  447. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +12 -2
  448. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
  449. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +67 -33
  451. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +27 -8
  452. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +287 -99
  453. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +139 -36
  454. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +4 -3
  455. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +11 -20
  456. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +10 -5
  457. data/third_party/boringssl-with-bazel/src/ssl/internal.h +37 -16
  458. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
  459. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -8
  460. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +20 -14
  461. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +7 -8
  462. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  463. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
  464. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +362 -50
  465. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -2
  466. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
  467. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +66 -24
  468. data/third_party/xxhash/xxhash.h +5443 -0
  469. metadata +140 -84
  470. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +0 -60
  471. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +0 -52
  472. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +0 -143
  473. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +0 -42
  474. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +0 -84
  475. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +0 -94
  476. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +0 -54
  477. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +0 -173
  478. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +0 -36
  479. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +0 -92
  480. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +0 -42
  481. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +0 -35
  482. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +0 -62
  483. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +0 -40
  484. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +0 -45
  485. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +0 -40
  486. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +0 -49
  487. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +0 -35
  488. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +0 -68
  489. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +0 -40
  490. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +0 -51
  491. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +0 -35
  492. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  493. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  494. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  495. data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
  496. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  497. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  498. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
  499. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
  500. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -97
  501. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  502. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
  503. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
  504. data/third_party/upb/upb/json_decode.c +0 -1443
  505. data/third_party/upb/upb/json_decode.h +0 -23
  506. data/third_party/upb/upb/json_encode.c +0 -713
  507. data/third_party/upb/upb/json_encode.h +0 -36
@@ -31,44 +31,34 @@ namespace grpc_core {
31
31
 
32
32
  class XdsCertificateProvider : public grpc_tls_certificate_provider {
33
33
  public:
34
- XdsCertificateProvider(
35
- absl::string_view root_cert_name,
36
- RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor,
37
- absl::string_view identity_cert_name,
38
- RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor,
39
- std::vector<XdsApi::StringMatcher> san_matchers);
40
-
34
+ XdsCertificateProvider();
41
35
  ~XdsCertificateProvider() override;
42
36
 
43
- void UpdateRootCertNameAndDistributor(
44
- absl::string_view root_cert_name,
45
- RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor);
46
- void UpdateIdentityCertNameAndDistributor(
47
- absl::string_view identity_cert_name,
48
- RefCountedPtr<grpc_tls_certificate_distributor>
49
- identity_cert_distributor);
50
- void UpdateSubjectAlternativeNameMatchers(
51
- std::vector<XdsApi::StringMatcher> matchers);
52
-
53
37
  grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor()
54
38
  const override {
55
39
  return distributor_;
56
40
  }
57
41
 
58
- bool ProvidesRootCerts() {
59
- MutexLock lock(&mu_);
60
- return root_cert_distributor_ != nullptr;
61
- }
42
+ bool ProvidesRootCerts(const std::string& cert_name);
43
+ void UpdateRootCertNameAndDistributor(
44
+ const std::string& cert_name, absl::string_view root_cert_name,
45
+ RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor);
62
46
 
63
- bool ProvidesIdentityCerts() {
64
- MutexLock lock(&mu_);
65
- return identity_cert_distributor_ != nullptr;
66
- }
47
+ bool ProvidesIdentityCerts(const std::string& cert_name);
48
+ void UpdateIdentityCertNameAndDistributor(
49
+ const std::string& cert_name, absl::string_view identity_cert_name,
50
+ RefCountedPtr<grpc_tls_certificate_distributor>
51
+ identity_cert_distributor);
67
52
 
68
- std::vector<XdsApi::StringMatcher> subject_alternative_name_matchers() {
69
- MutexLock lock(&san_matchers_mu_);
70
- return san_matchers_;
71
- }
53
+ bool GetRequireClientCertificate(const std::string& cert_name);
54
+ // Updating \a require_client_certificate for a non-existing \a cert_name has
55
+ // no effect.
56
+ void UpdateRequireClientCertificate(const std::string& cert_name,
57
+ bool require_client_certificate);
58
+
59
+ std::vector<StringMatcher> GetSanMatchers(const std::string& cluster);
60
+ void UpdateSubjectAlternativeNameMatchers(
61
+ const std::string& cluster, std::vector<StringMatcher> matchers);
72
62
 
73
63
  grpc_arg MakeChannelArg() const;
74
64
 
@@ -76,14 +66,71 @@ class XdsCertificateProvider : public grpc_tls_certificate_provider {
76
66
  const grpc_channel_args* args);
77
67
 
78
68
  private:
69
+ class ClusterCertificateState {
70
+ public:
71
+ explicit ClusterCertificateState(
72
+ XdsCertificateProvider* xds_certificate_provider)
73
+ : xds_certificate_provider_(xds_certificate_provider) {}
74
+
75
+ ~ClusterCertificateState();
76
+
77
+ // Returns true if the certs aren't being watched and there are no
78
+ // distributors configured.
79
+ bool IsSafeToRemove() const;
80
+
81
+ bool ProvidesRootCerts() const { return root_cert_distributor_ != nullptr; }
82
+ bool ProvidesIdentityCerts() const {
83
+ return identity_cert_distributor_ != nullptr;
84
+ }
85
+
86
+ void UpdateRootCertNameAndDistributor(
87
+ const std::string& cert_name, absl::string_view root_cert_name,
88
+ RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor);
89
+ void UpdateIdentityCertNameAndDistributor(
90
+ const std::string& cert_name, absl::string_view identity_cert_name,
91
+ RefCountedPtr<grpc_tls_certificate_distributor>
92
+ identity_cert_distributor);
93
+
94
+ void UpdateRootCertWatcher(
95
+ const std::string& cert_name,
96
+ grpc_tls_certificate_distributor* root_cert_distributor);
97
+ void UpdateIdentityCertWatcher(
98
+ const std::string& cert_name,
99
+ grpc_tls_certificate_distributor* identity_cert_distributor);
100
+
101
+ bool require_client_certificate() const {
102
+ return require_client_certificate_;
103
+ }
104
+ void set_require_client_certificate(bool require_client_certificate) {
105
+ require_client_certificate_ = require_client_certificate;
106
+ }
107
+
108
+ void WatchStatusCallback(const std::string& cert_name,
109
+ bool root_being_watched,
110
+ bool identity_being_watched);
111
+
112
+ private:
113
+ XdsCertificateProvider* xds_certificate_provider_;
114
+ bool watching_root_certs_ = false;
115
+ bool watching_identity_certs_ = false;
116
+ std::string root_cert_name_;
117
+ std::string identity_cert_name_;
118
+ RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor_;
119
+ RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor_;
120
+ grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
121
+ root_cert_watcher_ = nullptr;
122
+ grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
123
+ identity_cert_watcher_ = nullptr;
124
+ bool require_client_certificate_ = false;
125
+ };
126
+
79
127
  void WatchStatusCallback(std::string cert_name, bool root_being_watched,
80
128
  bool identity_being_watched);
81
- void UpdateRootCertWatcher(
82
- grpc_tls_certificate_distributor* root_cert_distributor);
83
- void UpdateIdentityCertWatcher(
84
- grpc_tls_certificate_distributor* identity_cert_distributor);
85
129
 
86
130
  Mutex mu_;
131
+ std::map<std::string /*cert_name*/, std::unique_ptr<ClusterCertificateState>>
132
+ certificate_state_map_;
133
+
87
134
  // Use a separate mutex for san_matchers_ to avoid deadlocks since
88
135
  // san_matchers_ needs to be accessed when a handshake is being done and we
89
136
  // run into a possible deadlock scenario if using the same mutex. The mutex
@@ -93,18 +140,10 @@ class XdsCertificateProvider : public grpc_tls_certificate_provider {
93
140
  // -> HandshakeManager::Add() -> SecurityHandshaker::DoHandshake() ->
94
141
  // subject_alternative_names_matchers()
95
142
  Mutex san_matchers_mu_;
96
- bool watching_root_certs_ = false;
97
- bool watching_identity_certs_ = false;
98
- std::string root_cert_name_;
99
- std::string identity_cert_name_;
100
- RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor_;
101
- RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor_;
102
- std::vector<XdsApi::StringMatcher> san_matchers_;
143
+ std::map<std::string /*cluster_name*/, std::vector<StringMatcher>>
144
+ san_matcher_map_;
145
+
103
146
  RefCountedPtr<grpc_tls_certificate_distributor> distributor_;
104
- grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
105
- root_cert_watcher_ = nullptr;
106
- grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
107
- identity_cert_watcher_ = nullptr;
108
147
  };
109
148
 
110
149
  } // namespace grpc_core
@@ -35,9 +35,11 @@
35
35
  #include "src/core/ext/filters/client_channel/client_channel.h"
36
36
  #include "src/core/ext/filters/client_channel/service_config.h"
37
37
  #include "src/core/ext/xds/xds_api.h"
38
+ #include "src/core/ext/xds/xds_bootstrap.h"
38
39
  #include "src/core/ext/xds/xds_channel_args.h"
39
40
  #include "src/core/ext/xds/xds_client.h"
40
41
  #include "src/core/ext/xds/xds_client_stats.h"
42
+ #include "src/core/ext/xds/xds_http_filters.h"
41
43
  #include "src/core/lib/backoff/backoff.h"
42
44
  #include "src/core/lib/channel/channel_args.h"
43
45
  #include "src/core/lib/channel/channel_stack.h"
@@ -72,6 +74,7 @@ namespace {
72
74
  Mutex* g_mu = nullptr;
73
75
  const grpc_channel_args* g_channel_args = nullptr;
74
76
  XdsClient* g_xds_client = nullptr;
77
+ char* g_fallback_bootstrap_config = nullptr;
75
78
 
76
79
  } // namespace
77
80
 
@@ -193,28 +196,34 @@ class XdsClient::ChannelState::AdsCallState
193
196
  "timeout obtaining resource {type=%s name=%s} from xds server",
194
197
  type_url_, name_)
195
198
  .c_str());
199
+ watcher_error = grpc_error_set_int(
200
+ watcher_error, GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
196
201
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
197
202
  gpr_log(GPR_INFO, "[xds_client %p] %s", ads_calld_->xds_client(),
198
203
  grpc_error_string(watcher_error));
199
204
  }
200
205
  if (type_url_ == XdsApi::kLdsTypeUrl) {
201
206
  ListenerState& state = ads_calld_->xds_client()->listener_map_[name_];
207
+ state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
202
208
  for (const auto& p : state.watchers) {
203
209
  p.first->OnError(GRPC_ERROR_REF(watcher_error));
204
210
  }
205
211
  } else if (type_url_ == XdsApi::kRdsTypeUrl) {
206
212
  RouteConfigState& state =
207
213
  ads_calld_->xds_client()->route_config_map_[name_];
214
+ state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
208
215
  for (const auto& p : state.watchers) {
209
216
  p.first->OnError(GRPC_ERROR_REF(watcher_error));
210
217
  }
211
218
  } else if (type_url_ == XdsApi::kCdsTypeUrl) {
212
219
  ClusterState& state = ads_calld_->xds_client()->cluster_map_[name_];
220
+ state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
213
221
  for (const auto& p : state.watchers) {
214
222
  p.first->OnError(GRPC_ERROR_REF(watcher_error));
215
223
  }
216
224
  } else if (type_url_ == XdsApi::kEdsTypeUrl) {
217
225
  EndpointState& state = ads_calld_->xds_client()->endpoint_map_[name_];
226
+ state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
218
227
  for (const auto& p : state.watchers) {
219
228
  p.first->OnError(GRPC_ERROR_REF(watcher_error));
220
229
  }
@@ -250,10 +259,14 @@ class XdsClient::ChannelState::AdsCallState
250
259
 
251
260
  void SendMessageLocked(const std::string& type_url);
252
261
 
253
- void AcceptLdsUpdate(XdsApi::LdsUpdateMap lds_update_map);
254
- void AcceptRdsUpdate(XdsApi::RdsUpdateMap rds_update_map);
255
- void AcceptCdsUpdate(XdsApi::CdsUpdateMap cds_update_map);
256
- void AcceptEdsUpdate(XdsApi::EdsUpdateMap eds_update_map);
262
+ void AcceptLdsUpdate(std::string version, grpc_millis update_time,
263
+ XdsApi::LdsUpdateMap lds_update_map);
264
+ void AcceptRdsUpdate(std::string version, grpc_millis update_time,
265
+ XdsApi::RdsUpdateMap rds_update_map);
266
+ void AcceptCdsUpdate(std::string version, grpc_millis update_time,
267
+ XdsApi::CdsUpdateMap cds_update_map);
268
+ void AcceptEdsUpdate(std::string version, grpc_millis update_time,
269
+ XdsApi::EdsUpdateMap eds_update_map);
257
270
 
258
271
  static void OnRequestSent(void* arg, grpc_error* error);
259
272
  void OnRequestSentLocked(grpc_error* error);
@@ -502,7 +515,7 @@ XdsClient::ChannelState::LrsCallState* XdsClient::ChannelState::lrs_calld()
502
515
  }
503
516
 
504
517
  bool XdsClient::ChannelState::HasActiveAdsCall() const {
505
- return ads_calld_->calld() != nullptr;
518
+ return ads_calld_ != nullptr && ads_calld_->calld() != nullptr;
506
519
  }
507
520
 
508
521
  void XdsClient::ChannelState::MaybeStartLrsCall() {
@@ -865,7 +878,24 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
865
878
  return false;
866
879
  }
867
880
 
881
+ namespace {
882
+
883
+ // Build a resource metadata struct for ADS result accepting methods and CSDS.
884
+ XdsApi::ResourceMetadata CreateResourceMetadataAcked(
885
+ std::string serialized_proto, std::string version,
886
+ grpc_millis update_time) {
887
+ XdsApi::ResourceMetadata resource_metadata;
888
+ resource_metadata.serialized_proto = std::move(serialized_proto);
889
+ resource_metadata.update_time = update_time;
890
+ resource_metadata.version = std::move(version);
891
+ resource_metadata.client_status = XdsApi::ResourceMetadata::ACKED;
892
+ return resource_metadata;
893
+ }
894
+
895
+ } // namespace
896
+
868
897
  void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
898
+ std::string version, grpc_millis update_time,
869
899
  XdsApi::LdsUpdateMap lds_update_map) {
870
900
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
871
901
  gpr_log(GPR_INFO,
@@ -877,23 +907,17 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
877
907
  std::set<std::string> rds_resource_names_seen;
878
908
  for (auto& p : lds_update_map) {
879
909
  const std::string& listener_name = p.first;
880
- XdsApi::LdsUpdate& lds_update = p.second;
910
+ XdsApi::LdsUpdate& lds_update = p.second.resource;
881
911
  auto& state = lds_state.subscribed_resources[listener_name];
882
912
  if (state != nullptr) state->Finish();
883
913
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
884
- gpr_log(GPR_INFO, "[xds_client %p] LDS resource %s: route_config_name=%s",
885
- xds_client(), listener_name.c_str(),
886
- (!lds_update.route_config_name.empty()
887
- ? lds_update.route_config_name.c_str()
888
- : "<inlined>"));
889
- if (lds_update.rds_update.has_value()) {
890
- gpr_log(GPR_INFO, "RouteConfiguration: %s",
891
- lds_update.rds_update->ToString().c_str());
892
- }
914
+ gpr_log(GPR_INFO, "[xds_client %p] LDS resource %s: %s", xds_client(),
915
+ listener_name.c_str(), lds_update.ToString().c_str());
893
916
  }
894
917
  // Record the RDS resource names seen.
895
- if (!lds_update.route_config_name.empty()) {
896
- rds_resource_names_seen.insert(lds_update.route_config_name);
918
+ if (!lds_update.http_connection_manager.route_config_name.empty()) {
919
+ rds_resource_names_seen.insert(
920
+ lds_update.http_connection_manager.route_config_name);
897
921
  }
898
922
  // Ignore identical update.
899
923
  ListenerState& listener_state = xds_client()->listener_map_[listener_name];
@@ -909,6 +933,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
909
933
  }
910
934
  // Update the listener state.
911
935
  listener_state.update = std::move(lds_update);
936
+ listener_state.meta = CreateResourceMetadataAcked(
937
+ std::move(p.second.serialized_proto), version, update_time);
912
938
  // Notify watchers.
913
939
  for (const auto& p : listener_state.watchers) {
914
940
  p.first->OnListenerChanged(*listener_state.update);
@@ -953,6 +979,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
953
979
  }
954
980
 
955
981
  void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
982
+ std::string version, grpc_millis update_time,
956
983
  XdsApi::RdsUpdateMap rds_update_map) {
957
984
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
958
985
  gpr_log(GPR_INFO,
@@ -963,7 +990,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
963
990
  auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
964
991
  for (auto& p : rds_update_map) {
965
992
  const std::string& route_config_name = p.first;
966
- XdsApi::RdsUpdate& rds_update = p.second;
993
+ XdsApi::RdsUpdate& rds_update = p.second.resource;
967
994
  auto& state = rds_state.subscribed_resources[route_config_name];
968
995
  if (state != nullptr) state->Finish();
969
996
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -984,6 +1011,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
984
1011
  }
985
1012
  // Update the cache.
986
1013
  route_config_state.update = std::move(rds_update);
1014
+ route_config_state.meta = CreateResourceMetadataAcked(
1015
+ std::move(p.second.serialized_proto), version, update_time);
987
1016
  // Notify all watchers.
988
1017
  for (const auto& p : route_config_state.watchers) {
989
1018
  p.first->OnRouteConfigChanged(*route_config_state.update);
@@ -992,6 +1021,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
992
1021
  }
993
1022
 
994
1023
  void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1024
+ std::string version, grpc_millis update_time,
995
1025
  XdsApi::CdsUpdateMap cds_update_map) {
996
1026
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
997
1027
  gpr_log(GPR_INFO,
@@ -1003,7 +1033,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1003
1033
  std::set<std::string> eds_resource_names_seen;
1004
1034
  for (auto& p : cds_update_map) {
1005
1035
  const char* cluster_name = p.first.c_str();
1006
- XdsApi::CdsUpdate& cds_update = p.second;
1036
+ XdsApi::CdsUpdate& cds_update = p.second.resource;
1007
1037
  auto& state = cds_state.subscribed_resources[cluster_name];
1008
1038
  if (state != nullptr) state->Finish();
1009
1039
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -1027,6 +1057,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1027
1057
  }
1028
1058
  // Update the cluster state.
1029
1059
  cluster_state.update = std::move(cds_update);
1060
+ cluster_state.meta = CreateResourceMetadataAcked(
1061
+ std::move(p.second.serialized_proto), version, update_time);
1030
1062
  // Notify all watchers.
1031
1063
  for (const auto& p : cluster_state.watchers) {
1032
1064
  p.first->OnClusterChanged(cluster_state.update.value());
@@ -1070,6 +1102,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1070
1102
  }
1071
1103
 
1072
1104
  void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1105
+ std::string version, grpc_millis update_time,
1073
1106
  XdsApi::EdsUpdateMap eds_update_map) {
1074
1107
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1075
1108
  gpr_log(GPR_INFO,
@@ -1080,7 +1113,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1080
1113
  auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
1081
1114
  for (auto& p : eds_update_map) {
1082
1115
  const char* eds_service_name = p.first.c_str();
1083
- XdsApi::EdsUpdate& eds_update = p.second;
1116
+ XdsApi::EdsUpdate& eds_update = p.second.resource;
1084
1117
  auto& state = eds_state.subscribed_resources[eds_service_name];
1085
1118
  if (state != nullptr) state->Finish();
1086
1119
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -1101,6 +1134,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1101
1134
  }
1102
1135
  // Update the cluster state.
1103
1136
  endpoint_state.update = std::move(eds_update);
1137
+ endpoint_state.meta = CreateResourceMetadataAcked(
1138
+ std::move(p.second.serialized_proto), version, update_time);
1104
1139
  // Notify all watchers.
1105
1140
  for (const auto& p : endpoint_state.watchers) {
1106
1141
  p.first->OnEndpointChanged(endpoint_state.update.value());
@@ -1167,7 +1202,8 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1167
1202
  recv_message_payload_ = nullptr;
1168
1203
  // Parse and validate the response.
1169
1204
  XdsApi::AdsParseResult result = xds_client()->api_.ParseAdsResponse(
1170
- response_slice, ResourceNamesForRequest(XdsApi::kLdsTypeUrl),
1205
+ chand()->server_, response_slice,
1206
+ ResourceNamesForRequest(XdsApi::kLdsTypeUrl),
1171
1207
  ResourceNamesForRequest(XdsApi::kRdsTypeUrl),
1172
1208
  ResourceNamesForRequest(XdsApi::kCdsTypeUrl),
1173
1209
  ResourceNamesForRequest(XdsApi::kEdsTypeUrl));
@@ -1179,11 +1215,14 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1179
1215
  xds_client(), grpc_error_string(result.parse_error));
1180
1216
  GRPC_ERROR_UNREF(result.parse_error);
1181
1217
  } else {
1218
+ grpc_millis update_time = grpc_core::ExecCtx::Get()->Now();
1182
1219
  // Update nonce.
1183
1220
  auto& state = state_map_[result.type_url];
1184
1221
  state.nonce = std::move(result.nonce);
1185
1222
  // NACK or ACK the response.
1186
1223
  if (result.parse_error != GRPC_ERROR_NONE) {
1224
+ xds_client()->UpdateResourceMetadataWithFailedParseResult(update_time,
1225
+ result);
1187
1226
  GRPC_ERROR_UNREF(state.error);
1188
1227
  state.error = result.parse_error;
1189
1228
  // NACK unacceptable update.
@@ -1197,13 +1236,17 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1197
1236
  seen_response_ = true;
1198
1237
  // Accept the ADS response according to the type_url.
1199
1238
  if (result.type_url == XdsApi::kLdsTypeUrl) {
1200
- AcceptLdsUpdate(std::move(result.lds_update_map));
1239
+ AcceptLdsUpdate(result.version, update_time,
1240
+ std::move(result.lds_update_map));
1201
1241
  } else if (result.type_url == XdsApi::kRdsTypeUrl) {
1202
- AcceptRdsUpdate(std::move(result.rds_update_map));
1242
+ AcceptRdsUpdate(result.version, update_time,
1243
+ std::move(result.rds_update_map));
1203
1244
  } else if (result.type_url == XdsApi::kCdsTypeUrl) {
1204
- AcceptCdsUpdate(std::move(result.cds_update_map));
1245
+ AcceptCdsUpdate(result.version, update_time,
1246
+ std::move(result.cds_update_map));
1205
1247
  } else if (result.type_url == XdsApi::kEdsTypeUrl) {
1206
- AcceptEdsUpdate(std::move(result.eds_update_map));
1248
+ AcceptEdsUpdate(result.version, update_time,
1249
+ std::move(result.eds_update_map));
1207
1250
  }
1208
1251
  xds_client()->resource_version_map_[result.type_url] =
1209
1252
  std::move(result.version);
@@ -1740,8 +1783,8 @@ XdsClient::XdsClient(grpc_error** error)
1740
1783
  : nullptr),
1741
1784
  request_timeout_(GetRequestTimeout()),
1742
1785
  interested_parties_(grpc_pollset_set_create()),
1743
- bootstrap_(
1744
- XdsBootstrap::ReadFromFile(this, &grpc_xds_client_trace, error)),
1786
+ bootstrap_(XdsBootstrap::Create(this, &grpc_xds_client_trace,
1787
+ g_fallback_bootstrap_config, error)),
1745
1788
  certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
1746
1789
  bootstrap_ == nullptr
1747
1790
  ? CertificateProviderStore::PluginDefinitionMap()
@@ -2198,25 +2241,109 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2198
2241
  return snapshot_map;
2199
2242
  }
2200
2243
 
2244
+ void XdsClient::UpdateResourceMetadataWithFailedParseResult(
2245
+ grpc_millis update_time, const XdsApi::AdsParseResult& result) {
2246
+ // ADS update is rejected and the resource names in the failed update is
2247
+ // available.
2248
+ absl::string_view details = grpc_error_string(result.parse_error);
2249
+ for (auto& name : result.resource_names_failed) {
2250
+ XdsApi::ResourceMetadata* resource_metadata = nullptr;
2251
+ if (result.type_url == XdsApi::kLdsTypeUrl) {
2252
+ auto it = listener_map_.find(name);
2253
+ if (it != listener_map_.end()) {
2254
+ resource_metadata = &it->second.meta;
2255
+ }
2256
+ } else if (result.type_url == XdsApi::kRdsTypeUrl) {
2257
+ auto it = route_config_map_.find(name);
2258
+ if (route_config_map_.find(name) != route_config_map_.end()) {
2259
+ resource_metadata = &it->second.meta;
2260
+ }
2261
+ } else if (result.type_url == XdsApi::kCdsTypeUrl) {
2262
+ auto it = cluster_map_.find(name);
2263
+ if (cluster_map_.find(name) != cluster_map_.end()) {
2264
+ resource_metadata = &it->second.meta;
2265
+ }
2266
+ } else if (result.type_url == XdsApi::kEdsTypeUrl) {
2267
+ auto it = endpoint_map_.find(name);
2268
+ if (endpoint_map_.find(name) != endpoint_map_.end()) {
2269
+ resource_metadata = &it->second.meta;
2270
+ }
2271
+ }
2272
+ if (resource_metadata == nullptr) {
2273
+ return;
2274
+ }
2275
+ resource_metadata->client_status = XdsApi::ResourceMetadata::NACKED;
2276
+ resource_metadata->failed_version = result.version;
2277
+ resource_metadata->failed_details = std::string(details);
2278
+ resource_metadata->failed_update_time = update_time;
2279
+ }
2280
+ }
2281
+
2282
+ std::string XdsClient::DumpClientConfigBinary() {
2283
+ MutexLock lock(&mu_);
2284
+ XdsApi::ResourceTypeMetadataMap resource_type_metadata_map;
2285
+ // Update per-xds-type version if available, this version corresponding to the
2286
+ // last successful ADS update version.
2287
+ for (auto& p : resource_version_map_) {
2288
+ resource_type_metadata_map[p.first].version = p.second;
2289
+ }
2290
+ // Collect resource metadata from listeners
2291
+ auto& lds_map =
2292
+ resource_type_metadata_map[XdsApi::kLdsTypeUrl].resource_metadata_map;
2293
+ for (auto& p : listener_map_) {
2294
+ lds_map[p.first] = &p.second.meta;
2295
+ }
2296
+ // Collect resource metadata from route configs
2297
+ auto& rds_map =
2298
+ resource_type_metadata_map[XdsApi::kRdsTypeUrl].resource_metadata_map;
2299
+ for (auto& p : route_config_map_) {
2300
+ rds_map[p.first] = &p.second.meta;
2301
+ }
2302
+ // Collect resource metadata from clusters
2303
+ auto& cds_map =
2304
+ resource_type_metadata_map[XdsApi::kCdsTypeUrl].resource_metadata_map;
2305
+ for (auto& p : cluster_map_) {
2306
+ cds_map[p.first] = &p.second.meta;
2307
+ }
2308
+ // Collect resource metadata from endpoints
2309
+ auto& eds_map =
2310
+ resource_type_metadata_map[XdsApi::kEdsTypeUrl].resource_metadata_map;
2311
+ for (auto& p : endpoint_map_) {
2312
+ eds_map[p.first] = &p.second.meta;
2313
+ }
2314
+ // Assemble config dump messages
2315
+ return api_.AssembleClientConfig(resource_type_metadata_map);
2316
+ }
2317
+
2201
2318
  //
2202
2319
  // accessors for global state
2203
2320
  //
2204
2321
 
2205
- void XdsClientGlobalInit() { g_mu = new Mutex; }
2322
+ void XdsClientGlobalInit() {
2323
+ g_mu = new Mutex;
2324
+ XdsHttpFilterRegistry::Init();
2325
+ }
2206
2326
 
2207
2327
  void XdsClientGlobalShutdown() {
2208
2328
  delete g_mu;
2209
2329
  g_mu = nullptr;
2330
+ gpr_free(g_fallback_bootstrap_config);
2331
+ g_fallback_bootstrap_config = nullptr;
2332
+ XdsHttpFilterRegistry::Shutdown();
2210
2333
  }
2211
2334
 
2212
2335
  RefCountedPtr<XdsClient> XdsClient::GetOrCreate(grpc_error** error) {
2213
- MutexLock lock(g_mu);
2214
- if (g_xds_client != nullptr) {
2215
- auto xds_client = g_xds_client->RefIfNonZero();
2216
- if (xds_client != nullptr) return xds_client;
2336
+ RefCountedPtr<XdsClient> xds_client;
2337
+ {
2338
+ MutexLock lock(g_mu);
2339
+ if (g_xds_client != nullptr) {
2340
+ auto xds_client = g_xds_client->RefIfNonZero();
2341
+ if (xds_client != nullptr) return xds_client;
2342
+ }
2343
+ xds_client = MakeRefCounted<XdsClient>(error);
2344
+ if (*error != GRPC_ERROR_NONE) return nullptr;
2345
+ g_xds_client = xds_client.get();
2217
2346
  }
2218
- auto xds_client = MakeRefCounted<XdsClient>(error);
2219
- g_xds_client = xds_client.get();
2220
2347
  return xds_client;
2221
2348
  }
2222
2349
 
@@ -2232,6 +2359,26 @@ void UnsetGlobalXdsClientForTest() {
2232
2359
  g_xds_client = nullptr;
2233
2360
  }
2234
2361
 
2362
+ void SetXdsFallbackBootstrapConfig(const char* config) {
2363
+ MutexLock lock(g_mu);
2364
+ gpr_free(g_fallback_bootstrap_config);
2365
+ g_fallback_bootstrap_config = gpr_strdup(config);
2366
+ }
2367
+
2235
2368
  } // namespace internal
2236
2369
 
2237
2370
  } // namespace grpc_core
2371
+
2372
+ // The returned bytes may contain NULL(0), so we can't use c-string.
2373
+ grpc_slice grpc_dump_xds_configs() {
2374
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2375
+ grpc_core::ExecCtx exec_ctx;
2376
+ grpc_error* error = GRPC_ERROR_NONE;
2377
+ auto xds_client = grpc_core::XdsClient::GetOrCreate(&error);
2378
+ if (error != GRPC_ERROR_NONE) {
2379
+ // If we isn't using xDS, just return an empty string.
2380
+ GRPC_ERROR_UNREF(error);
2381
+ return grpc_empty_slice();
2382
+ }
2383
+ return grpc_slice_from_cpp_string(xds_client->DumpClientConfigBinary());
2384
+ }