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
@@ -0,0 +1,130 @@
1
+ //
2
+ // Copyright 2021 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #ifndef GRPC_CORE_EXT_XDS_XDS_HTTP_FILTERS_H
18
+ #define GRPC_CORE_EXT_XDS_XDS_HTTP_FILTERS_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <memory>
23
+ #include <set>
24
+ #include <string>
25
+
26
+ #include "absl/status/statusor.h"
27
+ #include "absl/strings/str_cat.h"
28
+ #include "absl/strings/string_view.h"
29
+ #include "google/protobuf/any.upb.h"
30
+ #include "upb/def.h"
31
+
32
+ #include <grpc/grpc.h>
33
+
34
+ #include "src/core/lib/channel/channel_stack.h"
35
+ #include "src/core/lib/json/json.h"
36
+
37
+ namespace grpc_core {
38
+
39
+ extern const char* kXdsHttpRouterFilterConfigName;
40
+
41
+ class XdsHttpFilterImpl {
42
+ public:
43
+ struct FilterConfig {
44
+ absl::string_view config_proto_type_name;
45
+ Json config;
46
+
47
+ bool operator==(const FilterConfig& other) const {
48
+ return config_proto_type_name == other.config_proto_type_name &&
49
+ config == other.config;
50
+ }
51
+ std::string ToString() const {
52
+ return absl::StrCat("{config_proto_type_name=", config_proto_type_name,
53
+ " config=", config.Dump(), "}");
54
+ }
55
+ };
56
+
57
+ // Service config data for the filter, returned by GenerateServiceConfig().
58
+ struct ServiceConfigJsonEntry {
59
+ // The top-level field name in the method config.
60
+ // Filter implementations should use their primary config proto type
61
+ // name for this.
62
+ // The value of this field in the method config will be a JSON array,
63
+ // which will be populated with the elements returned by each filter
64
+ // instance.
65
+ std::string service_config_field_name;
66
+ // The element to add to the JSON array.
67
+ std::string element;
68
+ };
69
+
70
+ virtual ~XdsHttpFilterImpl() = default;
71
+
72
+ // Loads the proto message into the upb symtab.
73
+ virtual void PopulateSymtab(upb_symtab* symtab) const = 0;
74
+
75
+ // Generates a Config from the xDS filter config proto.
76
+ // Used for the top-level config in the HCM HTTP filter list.
77
+ virtual absl::StatusOr<FilterConfig> GenerateFilterConfig(
78
+ upb_strview serialized_filter_config, upb_arena* arena) const = 0;
79
+
80
+ // Generates a Config from the xDS filter config proto.
81
+ // Used for the typed_per_filter_config override in VirtualHost and Route.
82
+ virtual absl::StatusOr<FilterConfig> GenerateFilterConfigOverride(
83
+ upb_strview serialized_filter_config, upb_arena* arena) const = 0;
84
+
85
+ // C-core channel filter implementation.
86
+ virtual const grpc_channel_filter* channel_filter() const = 0;
87
+
88
+ // Modifies channel args that may affect service config parsing (not
89
+ // visible to the channel as a whole).
90
+ // Takes ownership of args. Caller takes ownership of return value.
91
+ virtual grpc_channel_args* ModifyChannelArgs(grpc_channel_args* args) const {
92
+ return args;
93
+ }
94
+
95
+ // Function to convert the Configs into a JSON string to be added to the
96
+ // per-method part of the service config.
97
+ // The hcm_filter_config comes from the HttpConnectionManager config.
98
+ // The filter_config_override comes from the first of the ClusterWeight,
99
+ // Route, or VirtualHost entries that it is found in, or null if
100
+ // there is no override in any of those locations.
101
+ virtual absl::StatusOr<ServiceConfigJsonEntry> GenerateServiceConfig(
102
+ const FilterConfig& hcm_filter_config,
103
+ const FilterConfig* filter_config_override) const = 0;
104
+
105
+ // Returns true if the filter is supported on clients; false otherwise
106
+ virtual bool IsSupportedOnClients() const = 0;
107
+
108
+ // Returns true if the filter is supported on servers; false otherwise
109
+ virtual bool IsSupportedOnServers() const = 0;
110
+ };
111
+
112
+ class XdsHttpFilterRegistry {
113
+ public:
114
+ static void RegisterFilter(
115
+ std::unique_ptr<XdsHttpFilterImpl> filter,
116
+ const std::set<absl::string_view>& config_proto_type_names);
117
+
118
+ static const XdsHttpFilterImpl* GetFilterForType(
119
+ absl::string_view proto_type_name);
120
+
121
+ static void PopulateSymtab(upb_symtab* symtab);
122
+
123
+ // Global init and shutdown.
124
+ static void Init();
125
+ static void Shutdown();
126
+ };
127
+
128
+ } // namespace grpc_core
129
+
130
+ #endif /* GRPC_CORE_EXT_XDS_XDS_HTTP_FILTERS_H */
@@ -18,32 +18,342 @@
18
18
 
19
19
  #include <grpc/support/port_platform.h>
20
20
 
21
+ #include "absl/strings/str_replace.h"
22
+
23
+ #include "src/core/ext/xds/xds_certificate_provider.h"
21
24
  #include "src/core/ext/xds/xds_client.h"
25
+ #include "src/core/lib/channel/channel_args.h"
26
+ #include "src/core/lib/gprpp/host_port.h"
27
+ #include "src/core/lib/iomgr/sockaddr.h"
28
+ #include "src/core/lib/iomgr/sockaddr_utils.h"
29
+ #include "src/core/lib/iomgr/socket_utils.h"
30
+ #include "src/core/lib/security/credentials/xds/xds_credentials.h"
22
31
  #include "src/core/lib/surface/api_trace.h"
23
32
  #include "src/core/lib/surface/server.h"
33
+ #include "src/core/lib/uri/uri_parser.h"
24
34
 
25
35
  namespace grpc_core {
36
+
37
+ TraceFlag grpc_xds_server_config_fetcher_trace(false,
38
+ "xds_server_config_fetcher");
39
+
26
40
  namespace {
27
41
 
42
+ class FilterChainMatchManager
43
+ : public grpc_server_config_fetcher::ConnectionManager {
44
+ public:
45
+ FilterChainMatchManager(
46
+ RefCountedPtr<XdsClient> xds_client,
47
+ XdsApi::LdsUpdate::FilterChainMap filter_chain_map,
48
+ absl::optional<XdsApi::LdsUpdate::FilterChainData> default_filter_chain)
49
+ : xds_client_(xds_client),
50
+ filter_chain_map_(std::move(filter_chain_map)),
51
+ default_filter_chain_(std::move(default_filter_chain)) {}
52
+
53
+ absl::StatusOr<grpc_channel_args*> UpdateChannelArgsForConnection(
54
+ grpc_channel_args* args, grpc_endpoint* tcp) override;
55
+
56
+ const XdsApi::LdsUpdate::FilterChainMap& filter_chain_map() const {
57
+ return filter_chain_map_;
58
+ }
59
+
60
+ const absl::optional<XdsApi::LdsUpdate::FilterChainData>&
61
+ default_filter_chain() const {
62
+ return default_filter_chain_;
63
+ }
64
+
65
+ private:
66
+ struct CertificateProviders {
67
+ // We need to save our own refs to the root and instance certificate
68
+ // providers since the xds certificate provider just stores a ref to their
69
+ // distributors.
70
+ RefCountedPtr<grpc_tls_certificate_provider> root;
71
+ RefCountedPtr<grpc_tls_certificate_provider> instance;
72
+ RefCountedPtr<XdsCertificateProvider> xds;
73
+ };
74
+
75
+ absl::StatusOr<RefCountedPtr<XdsCertificateProvider>>
76
+ CreateOrGetXdsCertificateProviderFromFilterChainData(
77
+ const XdsApi::LdsUpdate::FilterChainData* filter_chain);
78
+
79
+ const RefCountedPtr<XdsClient> xds_client_;
80
+ const XdsApi::LdsUpdate::FilterChainMap filter_chain_map_;
81
+ const absl::optional<XdsApi::LdsUpdate::FilterChainData>
82
+ default_filter_chain_;
83
+ Mutex mu_;
84
+ std::map<const XdsApi::LdsUpdate::FilterChainData*, CertificateProviders>
85
+ certificate_providers_map_ ABSL_GUARDED_BY(mu_);
86
+ };
87
+
88
+ bool IsLoopbackIp(const grpc_resolved_address* address) {
89
+ const grpc_sockaddr* sock_addr =
90
+ reinterpret_cast<const grpc_sockaddr*>(&address->addr);
91
+ if (sock_addr->sa_family == GRPC_AF_INET) {
92
+ const grpc_sockaddr_in* addr4 =
93
+ reinterpret_cast<const grpc_sockaddr_in*>(sock_addr);
94
+ if (addr4->sin_addr.s_addr == grpc_htonl(INADDR_LOOPBACK)) {
95
+ return true;
96
+ }
97
+ } else if (sock_addr->sa_family == GRPC_AF_INET6) {
98
+ const grpc_sockaddr_in6* addr6 =
99
+ reinterpret_cast<const grpc_sockaddr_in6*>(sock_addr);
100
+ if (memcmp(&addr6->sin6_addr, &in6addr_loopback,
101
+ sizeof(in6addr_loopback)) == 0) {
102
+ return true;
103
+ }
104
+ }
105
+ return false;
106
+ }
107
+
108
+ const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourcePort(
109
+ const XdsApi::LdsUpdate::FilterChainMap::SourcePortsMap& source_ports_map,
110
+ absl::string_view port_str) {
111
+ int port = 0;
112
+ if (!absl::SimpleAtoi(port_str, &port)) return nullptr;
113
+ auto it = source_ports_map.find(port);
114
+ if (it != source_ports_map.end()) {
115
+ return it->second.data.get();
116
+ }
117
+ // Search for the catch-all port 0 since we didn't get a direct match
118
+ it = source_ports_map.find(0);
119
+ if (it != source_ports_map.end()) {
120
+ return it->second.data.get();
121
+ }
122
+ return nullptr;
123
+ }
124
+
125
+ const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourceIp(
126
+ const XdsApi::LdsUpdate::FilterChainMap::SourceIpVector& source_ip_vector,
127
+ const grpc_resolved_address* source_ip, absl::string_view port) {
128
+ const XdsApi::LdsUpdate::FilterChainMap::SourceIp* best_match = nullptr;
129
+ for (const auto& entry : source_ip_vector) {
130
+ // Special case for catch-all
131
+ if (!entry.prefix_range.has_value()) {
132
+ if (best_match == nullptr) {
133
+ best_match = &entry;
134
+ }
135
+ continue;
136
+ }
137
+ if (best_match != nullptr && best_match->prefix_range.has_value() &&
138
+ best_match->prefix_range->prefix_len >=
139
+ entry.prefix_range->prefix_len) {
140
+ continue;
141
+ }
142
+ if (grpc_sockaddr_match_subnet(source_ip, &entry.prefix_range->address,
143
+ entry.prefix_range->prefix_len)) {
144
+ best_match = &entry;
145
+ }
146
+ }
147
+ if (best_match == nullptr) return nullptr;
148
+ return FindFilterChainDataForSourcePort(best_match->ports_map, port);
149
+ }
150
+
151
+ const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourceType(
152
+ const XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceTypesArray&
153
+ source_types_array,
154
+ grpc_endpoint* tcp, absl::string_view destination_ip) {
155
+ auto source_uri = URI::Parse(grpc_endpoint_get_peer(tcp));
156
+ if (!source_uri.ok() ||
157
+ (source_uri->scheme() != "ipv4" && source_uri->scheme() != "ipv6")) {
158
+ return nullptr;
159
+ }
160
+ std::string host;
161
+ std::string port;
162
+ if (!SplitHostPort(source_uri->path(), &host, &port)) {
163
+ return nullptr;
164
+ }
165
+ grpc_resolved_address source_addr;
166
+ grpc_string_to_sockaddr(&source_addr, host.c_str(),
167
+ 0 /* port doesn't matter here */);
168
+ // Use kAny only if kSameIporLoopback and kExternal are empty
169
+ if (source_types_array[static_cast<int>(
170
+ XdsApi::LdsUpdate::FilterChainMap::
171
+ ConnectionSourceType::kSameIpOrLoopback)]
172
+ .empty() &&
173
+ source_types_array[static_cast<int>(XdsApi::LdsUpdate::FilterChainMap::
174
+ ConnectionSourceType::kExternal)]
175
+ .empty()) {
176
+ return FindFilterChainDataForSourceIp(
177
+ source_types_array[static_cast<int>(
178
+ XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceType::kAny)],
179
+ &source_addr, port);
180
+ }
181
+ if (IsLoopbackIp(&source_addr) || host == destination_ip) {
182
+ return FindFilterChainDataForSourceIp(
183
+ source_types_array[static_cast<int>(
184
+ XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceType::
185
+ kSameIpOrLoopback)],
186
+ &source_addr, port);
187
+ } else {
188
+ return FindFilterChainDataForSourceIp(
189
+ source_types_array[static_cast<int>(
190
+ XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceType::
191
+ kExternal)],
192
+ &source_addr, port);
193
+ }
194
+ }
195
+
196
+ const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForDestinationIp(
197
+ const XdsApi::LdsUpdate::FilterChainMap::DestinationIpVector
198
+ destination_ip_vector,
199
+ grpc_endpoint* tcp) {
200
+ auto destination_uri = URI::Parse(grpc_endpoint_get_local_address(tcp));
201
+ if (!destination_uri.ok() || (destination_uri->scheme() != "ipv4" &&
202
+ destination_uri->scheme() != "ipv6")) {
203
+ return nullptr;
204
+ }
205
+ std::string host;
206
+ std::string port;
207
+ if (!SplitHostPort(destination_uri->path(), &host, &port)) {
208
+ return nullptr;
209
+ }
210
+ grpc_resolved_address destination_addr;
211
+ grpc_string_to_sockaddr(&destination_addr, host.c_str(),
212
+ 0 /* port doesn't matter here */);
213
+ const XdsApi::LdsUpdate::FilterChainMap::DestinationIp* best_match = nullptr;
214
+ for (const auto& entry : destination_ip_vector) {
215
+ // Special case for catch-all
216
+ if (!entry.prefix_range.has_value()) {
217
+ if (best_match == nullptr) {
218
+ best_match = &entry;
219
+ }
220
+ continue;
221
+ }
222
+ if (best_match != nullptr && best_match->prefix_range.has_value() &&
223
+ best_match->prefix_range->prefix_len >=
224
+ entry.prefix_range->prefix_len) {
225
+ continue;
226
+ }
227
+ if (grpc_sockaddr_match_subnet(&destination_addr,
228
+ &entry.prefix_range->address,
229
+ entry.prefix_range->prefix_len)) {
230
+ best_match = &entry;
231
+ }
232
+ }
233
+ if (best_match == nullptr) return nullptr;
234
+ return FindFilterChainDataForSourceType(best_match->source_types_array, tcp,
235
+ host);
236
+ }
237
+
238
+ absl::StatusOr<RefCountedPtr<XdsCertificateProvider>>
239
+ FilterChainMatchManager::CreateOrGetXdsCertificateProviderFromFilterChainData(
240
+ const XdsApi::LdsUpdate::FilterChainData* filter_chain) {
241
+ MutexLock lock(&mu_);
242
+ auto it = certificate_providers_map_.find(filter_chain);
243
+ if (it != certificate_providers_map_.end()) {
244
+ return it->second.xds;
245
+ }
246
+ CertificateProviders certificate_providers;
247
+ // Configure root cert.
248
+ absl::string_view root_provider_instance_name =
249
+ filter_chain->downstream_tls_context.common_tls_context
250
+ .combined_validation_context
251
+ .validation_context_certificate_provider_instance.instance_name;
252
+ absl::string_view root_provider_cert_name =
253
+ filter_chain->downstream_tls_context.common_tls_context
254
+ .combined_validation_context
255
+ .validation_context_certificate_provider_instance.certificate_name;
256
+ if (!root_provider_instance_name.empty()) {
257
+ certificate_providers.root =
258
+ xds_client_->certificate_provider_store()
259
+ .CreateOrGetCertificateProvider(root_provider_instance_name);
260
+ if (certificate_providers.root == nullptr) {
261
+ return absl::NotFoundError(
262
+ absl::StrCat("Certificate provider instance name: \"",
263
+ root_provider_instance_name, "\" not recognized."));
264
+ }
265
+ }
266
+ // Configure identity cert.
267
+ absl::string_view identity_provider_instance_name =
268
+ filter_chain->downstream_tls_context.common_tls_context
269
+ .tls_certificate_certificate_provider_instance.instance_name;
270
+ absl::string_view identity_provider_cert_name =
271
+ filter_chain->downstream_tls_context.common_tls_context
272
+ .tls_certificate_certificate_provider_instance.certificate_name;
273
+ if (!identity_provider_instance_name.empty()) {
274
+ certificate_providers.instance =
275
+ xds_client_->certificate_provider_store()
276
+ .CreateOrGetCertificateProvider(identity_provider_instance_name);
277
+ if (certificate_providers.instance == nullptr) {
278
+ return absl::NotFoundError(
279
+ absl::StrCat("Certificate provider instance name: \"",
280
+ identity_provider_instance_name, "\" not recognized."));
281
+ }
282
+ }
283
+ certificate_providers.xds = MakeRefCounted<XdsCertificateProvider>();
284
+ certificate_providers.xds->UpdateRootCertNameAndDistributor(
285
+ "", root_provider_cert_name,
286
+ certificate_providers.root == nullptr
287
+ ? nullptr
288
+ : certificate_providers.root->distributor());
289
+ certificate_providers.xds->UpdateIdentityCertNameAndDistributor(
290
+ "", identity_provider_cert_name,
291
+ certificate_providers.instance == nullptr
292
+ ? nullptr
293
+ : certificate_providers.instance->distributor());
294
+ certificate_providers.xds->UpdateRequireClientCertificate(
295
+ "", filter_chain->downstream_tls_context.require_client_certificate);
296
+ auto xds_certificate_provider = certificate_providers.xds;
297
+ certificate_providers_map_.emplace(filter_chain,
298
+ std::move(certificate_providers));
299
+ return xds_certificate_provider;
300
+ }
301
+
302
+ absl::StatusOr<grpc_channel_args*>
303
+ FilterChainMatchManager::UpdateChannelArgsForConnection(grpc_channel_args* args,
304
+ grpc_endpoint* tcp) {
305
+ const auto* filter_chain = FindFilterChainDataForDestinationIp(
306
+ filter_chain_map_.destination_ip_vector, tcp);
307
+ if (filter_chain == nullptr && default_filter_chain_.has_value()) {
308
+ filter_chain = &default_filter_chain_.value();
309
+ }
310
+ if (filter_chain == nullptr) {
311
+ grpc_channel_args_destroy(args);
312
+ return absl::UnavailableError("No matching filter chain found");
313
+ }
314
+ // Nothing to update if credentials are not xDS.
315
+ grpc_server_credentials* server_creds =
316
+ grpc_find_server_credentials_in_args(args);
317
+ if (server_creds == nullptr || server_creds->type() != kCredentialsTypeXds) {
318
+ return args;
319
+ }
320
+ absl::StatusOr<RefCountedPtr<XdsCertificateProvider>> result =
321
+ CreateOrGetXdsCertificateProviderFromFilterChainData(filter_chain);
322
+ if (!result.ok()) {
323
+ grpc_channel_args_destroy(args);
324
+ return result.status();
325
+ }
326
+ RefCountedPtr<XdsCertificateProvider> xds_certificate_provider =
327
+ std::move(*result);
328
+ GPR_ASSERT(xds_certificate_provider != nullptr);
329
+ grpc_arg arg_to_add = xds_certificate_provider->MakeChannelArg();
330
+ grpc_channel_args* updated_args =
331
+ grpc_channel_args_copy_and_add(args, &arg_to_add, 1);
332
+ grpc_channel_args_destroy(args);
333
+ return updated_args;
334
+ }
335
+
28
336
  class XdsServerConfigFetcher : public grpc_server_config_fetcher {
29
337
  public:
30
- explicit XdsServerConfigFetcher(RefCountedPtr<XdsClient> xds_client)
31
- : xds_client_(std::move(xds_client)) {
338
+ explicit XdsServerConfigFetcher(RefCountedPtr<XdsClient> xds_client,
339
+ grpc_server_xds_status_notifier notifier)
340
+ : xds_client_(std::move(xds_client)), serving_status_notifier_(notifier) {
32
341
  GPR_ASSERT(xds_client_ != nullptr);
33
342
  }
34
343
 
35
- void StartWatch(std::string listening_address,
344
+ void StartWatch(std::string listening_address, grpc_channel_args* args,
36
345
  std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
37
346
  watcher) override {
38
347
  grpc_server_config_fetcher::WatcherInterface* watcher_ptr = watcher.get();
39
- auto listener_watcher =
40
- absl::make_unique<ListenerWatcher>(std::move(watcher));
348
+ auto listener_watcher = absl::make_unique<ListenerWatcher>(
349
+ std::move(watcher), args, xds_client_, serving_status_notifier_,
350
+ listening_address);
41
351
  auto* listener_watcher_ptr = listener_watcher.get();
42
- // TODO(yashykt): Get the resource name id from bootstrap
43
- xds_client_->WatchListenerData(
44
- absl::StrCat("grpc/server?xds.resource.listening_address=",
45
- listening_address),
46
- std::move(listener_watcher));
352
+ listening_address = absl::StrReplaceAll(
353
+ xds_client_->bootstrap().server_listener_resource_name_template(),
354
+ {{"%s", listening_address}});
355
+ xds_client_->WatchListenerData(listening_address,
356
+ std::move(listener_watcher));
47
357
  MutexLock lock(&mu_);
48
358
  auto& watcher_state = watchers_[watcher_ptr];
49
359
  watcher_state.listening_address = listening_address;
@@ -73,32 +383,112 @@ class XdsServerConfigFetcher : public grpc_server_config_fetcher {
73
383
  public:
74
384
  explicit ListenerWatcher(
75
385
  std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
76
- server_config_watcher)
77
- : server_config_watcher_(std::move(server_config_watcher)) {}
386
+ server_config_watcher,
387
+ grpc_channel_args* args, RefCountedPtr<XdsClient> xds_client,
388
+ grpc_server_xds_status_notifier serving_status_notifier,
389
+ std::string listening_address)
390
+ : server_config_watcher_(std::move(server_config_watcher)),
391
+ args_(args),
392
+ xds_client_(std::move(xds_client)),
393
+ serving_status_notifier_(serving_status_notifier),
394
+ listening_address_(std::move(listening_address)) {}
395
+
396
+ ~ListenerWatcher() override { grpc_channel_args_destroy(args_); }
397
+
398
+ // Deleted due to special handling required for args_. Copy the channel args
399
+ // if we ever need these.
400
+ ListenerWatcher(const ListenerWatcher&) = delete;
401
+ ListenerWatcher& operator=(const ListenerWatcher&) = delete;
78
402
 
79
403
  void OnListenerChanged(XdsApi::LdsUpdate listener) override {
80
- // TODO(yashykt): Construct channel args according to received update
81
- server_config_watcher_->UpdateConfig(nullptr);
404
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_server_config_fetcher_trace)) {
405
+ gpr_log(
406
+ GPR_INFO,
407
+ "[ListenerWatcher %p] Received LDS update from xds client %p: %s",
408
+ this, xds_client_.get(), listener.ToString().c_str());
409
+ }
410
+ if (listener.address != listening_address_) {
411
+ OnFatalError(absl::FailedPreconditionError(
412
+ "Address in LDS update does not match listening address"));
413
+ return;
414
+ }
415
+ if (filter_chain_match_manager_ == nullptr) {
416
+ if (serving_status_notifier_.on_serving_status_change != nullptr) {
417
+ serving_status_notifier_.on_serving_status_change(
418
+ serving_status_notifier_.user_data, listening_address_.c_str(),
419
+ GRPC_STATUS_OK, "");
420
+ } else {
421
+ gpr_log(GPR_INFO,
422
+ "xDS Listener resource obtained; will start serving on %s",
423
+ listening_address_.c_str());
424
+ }
425
+ }
426
+ if (filter_chain_match_manager_ == nullptr ||
427
+ !(listener.filter_chain_map ==
428
+ filter_chain_match_manager_->filter_chain_map() &&
429
+ listener.default_filter_chain ==
430
+ filter_chain_match_manager_->default_filter_chain())) {
431
+ filter_chain_match_manager_ = MakeRefCounted<FilterChainMatchManager>(
432
+ xds_client_, std::move(listener.filter_chain_map),
433
+ std::move(listener.default_filter_chain));
434
+ server_config_watcher_->UpdateConnectionManager(
435
+ filter_chain_match_manager_);
436
+ }
82
437
  }
83
438
 
84
439
  void OnError(grpc_error* error) override {
85
- gpr_log(GPR_ERROR, "ListenerWatcher:%p XdsClient reports error: %s", this,
86
- grpc_error_string(error));
440
+ if (filter_chain_match_manager_ != nullptr) {
441
+ gpr_log(GPR_ERROR,
442
+ "ListenerWatcher:%p XdsClient reports error: %s for %s; "
443
+ "ignoring in favor of existing resource",
444
+ this, grpc_error_string(error), listening_address_.c_str());
445
+ } else {
446
+ if (serving_status_notifier_.on_serving_status_change != nullptr) {
447
+ serving_status_notifier_.on_serving_status_change(
448
+ serving_status_notifier_.user_data, listening_address_.c_str(),
449
+ GRPC_STATUS_UNAVAILABLE, grpc_error_string(error));
450
+ } else {
451
+ gpr_log(
452
+ GPR_ERROR,
453
+ "ListenerWatcher:%p error obtaining xDS Listener resource: %s; "
454
+ "not serving on %s",
455
+ this, grpc_error_string(error), listening_address_.c_str());
456
+ }
457
+ }
87
458
  GRPC_ERROR_UNREF(error);
88
- // TODO(yashykt): We might want to bubble this error to the application.
459
+ }
460
+
461
+ void OnFatalError(absl::Status status) {
462
+ gpr_log(
463
+ GPR_ERROR,
464
+ "ListenerWatcher:%p Encountered fatal error %s; not serving on %s",
465
+ this, status.ToString().c_str(), listening_address_.c_str());
466
+ if (filter_chain_match_manager_ != nullptr) {
467
+ // The server has started listening already, so we need to gracefully
468
+ // stop serving.
469
+ server_config_watcher_->StopServing();
470
+ filter_chain_match_manager_.reset();
471
+ }
472
+ if (serving_status_notifier_.on_serving_status_change != nullptr) {
473
+ serving_status_notifier_.on_serving_status_change(
474
+ serving_status_notifier_.user_data, listening_address_.c_str(),
475
+ static_cast<grpc_status_code>(status.raw_code()),
476
+ std::string(status.message()).c_str());
477
+ }
89
478
  }
90
479
 
91
480
  void OnResourceDoesNotExist() override {
92
- gpr_log(GPR_ERROR,
93
- "ListenerWatcher:%p XdsClient reports requested listener does "
94
- "not exist",
95
- this);
96
- // TODO(yashykt): We might want to bubble this error to the application.
481
+ OnFatalError(absl::NotFoundError("Requested listener does not exist"));
97
482
  }
98
483
 
99
484
  private:
100
485
  std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
101
486
  server_config_watcher_;
487
+ grpc_channel_args* args_;
488
+ RefCountedPtr<XdsClient> xds_client_;
489
+ grpc_server_xds_status_notifier serving_status_notifier_;
490
+ std::string listening_address_;
491
+ RefCountedPtr<FilterChainMatchManager> filter_chain_match_manager_;
102
492
  };
103
493
 
104
494
  struct WatcherState {
@@ -107,6 +497,7 @@ class XdsServerConfigFetcher : public grpc_server_config_fetcher {
107
497
  };
108
498
 
109
499
  RefCountedPtr<XdsClient> xds_client_;
500
+ grpc_server_xds_status_notifier serving_status_notifier_;
110
501
  Mutex mu_;
111
502
  std::map<grpc_server_config_fetcher::WatcherInterface*, WatcherState>
112
503
  watchers_;
@@ -115,7 +506,8 @@ class XdsServerConfigFetcher : public grpc_server_config_fetcher {
115
506
  } // namespace
116
507
  } // namespace grpc_core
117
508
 
118
- grpc_server_config_fetcher* grpc_server_config_fetcher_xds_create() {
509
+ grpc_server_config_fetcher* grpc_server_config_fetcher_xds_create(
510
+ grpc_server_xds_status_notifier notifier) {
119
511
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
120
512
  grpc_core::ExecCtx exec_ctx;
121
513
  GRPC_API_TRACE("grpc_server_config_fetcher_xds_create()", 0, ());
@@ -125,7 +517,16 @@ grpc_server_config_fetcher* grpc_server_config_fetcher_xds_create() {
125
517
  if (error != GRPC_ERROR_NONE) {
126
518
  gpr_log(GPR_ERROR, "Failed to create xds client: %s",
127
519
  grpc_error_string(error));
520
+ GRPC_ERROR_UNREF(error);
521
+ return nullptr;
522
+ }
523
+ if (xds_client->bootstrap()
524
+ .server_listener_resource_name_template()
525
+ .empty()) {
526
+ gpr_log(GPR_ERROR,
527
+ "server_listener_resource_name_template not provided in bootstrap "
528
+ "file.");
128
529
  return nullptr;
129
530
  }
130
- return new grpc_core::XdsServerConfigFetcher(std::move(xds_client));
531
+ return new grpc_core::XdsServerConfigFetcher(std::move(xds_client), notifier);
131
532
  }