grpc 1.43.1 → 1.44.0.pre2

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 (382) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +84 -64
  3. data/include/grpc/grpc_security.h +10 -0
  4. data/include/grpc/impl/codegen/compression_types.h +0 -2
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  6. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  7. data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
  8. data/src/core/ext/filters/client_channel/client_channel.h +8 -8
  9. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  10. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  11. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
  35. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  36. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  37. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  48. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
  49. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
  51. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  52. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  53. data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
  54. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  55. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  56. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  57. data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
  58. data/src/core/ext/filters/client_channel/subchannel.h +2 -3
  59. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
  60. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
  61. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
  63. data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
  64. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
  65. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
  67. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  68. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  70. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  72. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  73. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  74. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
  75. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
  76. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  77. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
  78. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  79. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
  80. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  81. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  84. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  87. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  88. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  89. data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
  90. data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
  91. data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
  92. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  93. data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
  94. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  95. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  96. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  101. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  102. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  103. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  104. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  105. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  106. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  107. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  108. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  109. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  110. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  111. data/src/core/ext/xds/upb_utils.h +65 -0
  112. data/src/core/ext/xds/xds_api.cc +81 -3458
  113. data/src/core/ext/xds/xds_api.h +56 -611
  114. data/src/core/ext/xds/xds_bootstrap.cc +189 -125
  115. data/src/core/ext/xds/xds_bootstrap.h +20 -15
  116. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  117. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  118. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  119. data/src/core/ext/xds/xds_client.cc +584 -994
  120. data/src/core/ext/xds/xds_client.h +78 -135
  121. data/src/core/ext/xds/xds_cluster.cc +451 -0
  122. data/src/core/ext/xds/xds_cluster.h +111 -0
  123. data/src/core/ext/xds/xds_common_types.cc +388 -0
  124. data/src/core/ext/xds/xds_common_types.h +110 -0
  125. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  126. data/src/core/ext/xds/xds_endpoint.h +135 -0
  127. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  128. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  129. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  130. data/src/core/ext/xds/xds_listener.cc +1036 -0
  131. data/src/core/ext/xds/xds_listener.h +220 -0
  132. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  133. data/src/core/ext/xds/xds_resource_type.h +98 -0
  134. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  135. data/src/core/ext/xds/xds_route_config.cc +993 -0
  136. data/src/core/ext/xds/xds_route_config.h +215 -0
  137. data/src/core/ext/xds/xds_routing.cc +11 -8
  138. data/src/core/ext/xds/xds_routing.h +8 -5
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
  140. data/src/core/lib/address_utils/parse_address.cc +20 -0
  141. data/src/core/lib/address_utils/parse_address.h +5 -0
  142. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  143. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  144. data/src/core/lib/backoff/backoff.cc +4 -30
  145. data/src/core/lib/backoff/backoff.h +3 -3
  146. data/src/core/lib/channel/channel_args.cc +0 -1
  147. data/src/core/lib/channel/channel_stack.cc +8 -0
  148. data/src/core/lib/channel/channel_stack.h +1 -1
  149. data/src/core/lib/channel/channel_stack_builder.cc +5 -9
  150. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  151. data/src/core/lib/channel/channelz.cc +1 -0
  152. data/src/core/lib/compression/compression.cc +19 -111
  153. data/src/core/lib/compression/compression_internal.cc +142 -202
  154. data/src/core/lib/compression/compression_internal.h +64 -69
  155. data/src/core/lib/compression/message_compress.cc +11 -11
  156. data/src/core/lib/compression/message_compress.h +2 -2
  157. data/src/core/lib/gpr/useful.h +4 -0
  158. data/src/core/lib/gprpp/bitset.h +7 -0
  159. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  160. data/src/core/lib/gprpp/status_helper.cc +20 -28
  161. data/src/core/lib/gprpp/status_helper.h +6 -19
  162. data/src/core/lib/gprpp/table.h +11 -0
  163. data/src/core/lib/http/httpcli.cc +37 -46
  164. data/src/core/lib/http/httpcli.h +3 -15
  165. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  166. data/src/core/lib/iomgr/closure.h +29 -9
  167. data/src/core/lib/iomgr/combiner.cc +25 -3
  168. data/src/core/lib/iomgr/error.cc +2 -0
  169. data/src/core/lib/iomgr/error.h +3 -0
  170. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  171. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  172. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  173. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  174. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  175. data/src/core/lib/iomgr/exec_ctx.cc +22 -9
  176. data/src/core/lib/iomgr/executor.cc +10 -1
  177. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  178. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  179. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  180. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  181. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  182. data/src/core/lib/iomgr/port.h +2 -2
  183. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  184. data/src/core/lib/iomgr/resolve_address.h +47 -44
  185. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  186. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  187. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  188. data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
  189. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  190. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  191. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  192. data/src/core/lib/iomgr/resolved_address.h +39 -0
  193. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  194. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  198. data/src/core/lib/matchers/matchers.cc +1 -1
  199. data/src/core/lib/promise/activity.h +49 -20
  200. data/src/core/lib/promise/detail/status.h +5 -0
  201. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  202. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  203. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
  204. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
  205. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
  206. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  207. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  208. data/src/core/lib/resource_quota/api.h +0 -1
  209. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  210. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  211. data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
  212. data/src/core/lib/security/authorization/evaluate_args.h +1 -0
  213. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  214. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  215. data/src/core/lib/security/authorization/matchers.cc +227 -0
  216. data/src/core/lib/security/authorization/matchers.h +211 -0
  217. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  218. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  219. data/src/core/lib/security/context/security_context.cc +4 -2
  220. data/src/core/lib/security/context/security_context.h +1 -1
  221. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
  222. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  223. data/src/core/lib/security/credentials/credentials.h +10 -20
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
  226. data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
  227. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
  228. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  229. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  230. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
  231. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  232. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  233. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  234. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
  235. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  236. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
  237. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
  238. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  239. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  240. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  241. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
  243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
  244. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  245. data/src/core/lib/security/security_connector/security_connector.cc +0 -4
  246. data/src/core/lib/security/security_connector/security_connector.h +5 -1
  247. data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
  248. data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
  249. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
  250. data/src/core/lib/security/transport/auth_filters.h +7 -0
  251. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  252. data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
  253. data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
  254. data/src/core/{ext → lib}/service_config/service_config.h +4 -4
  255. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  256. data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
  257. data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
  258. data/src/core/lib/slice/slice.cc +3 -1
  259. data/src/core/lib/slice/slice.h +43 -13
  260. data/src/core/lib/slice/slice_intern.cc +3 -101
  261. data/src/core/lib/slice/slice_internal.h +1 -2
  262. data/src/core/lib/slice/slice_refcount.h +4 -13
  263. data/src/core/lib/slice/slice_refcount_base.h +0 -16
  264. data/src/core/lib/surface/call.cc +140 -382
  265. data/src/core/lib/surface/call.h +4 -4
  266. data/src/core/lib/surface/channel.cc +42 -44
  267. data/src/core/lib/surface/channel.h +4 -4
  268. data/src/core/lib/surface/init.cc +0 -2
  269. data/src/core/lib/surface/lame_client.cc +0 -1
  270. data/src/core/lib/surface/server.cc +12 -29
  271. data/src/core/lib/surface/server.h +2 -2
  272. data/src/core/lib/surface/version.cc +2 -2
  273. data/src/core/lib/transport/error_utils.h +14 -0
  274. data/src/core/lib/transport/metadata_batch.h +799 -717
  275. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  276. data/src/core/lib/transport/parsed_metadata.h +95 -92
  277. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  278. data/src/core/lib/transport/timeout_encoding.h +40 -10
  279. data/src/core/lib/transport/transport.h +1 -1
  280. data/src/core/lib/transport/transport_op_string.cc +6 -39
  281. data/src/core/lib/uri/uri_parser.cc +223 -53
  282. data/src/core/lib/uri/uri_parser.h +36 -23
  283. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
  284. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  285. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  286. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  287. data/src/core/tsi/ssl_transport_security.cc +53 -13
  288. data/src/core/tsi/ssl_transport_security.h +18 -6
  289. data/src/ruby/ext/grpc/extconf.rb +10 -3
  290. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  291. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  292. data/src/ruby/lib/grpc/version.rb +1 -1
  293. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  294. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  295. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  296. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  297. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  298. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  299. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  300. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  301. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  302. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  303. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  304. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  305. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  306. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  307. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  308. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  309. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  310. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  311. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  312. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  313. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  314. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  315. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  316. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  317. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  318. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  319. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  320. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  321. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  322. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  323. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  324. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  325. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  326. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  327. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  328. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  329. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  330. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  331. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  332. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  333. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  334. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  335. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  336. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  337. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  338. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  339. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  341. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  344. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  346. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  348. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  349. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  351. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  353. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  354. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  356. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  358. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  359. data/third_party/xxhash/xxhash.h +607 -352
  360. metadata +149 -77
  361. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  362. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  363. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  364. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  365. data/src/core/lib/compression/compression_args.cc +0 -140
  366. data/src/core/lib/compression/compression_args.h +0 -58
  367. data/src/core/lib/compression/stream_compression.cc +0 -81
  368. data/src/core/lib/compression/stream_compression.h +0 -117
  369. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  370. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  371. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  372. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  374. data/src/core/lib/slice/static_slice.cc +0 -377
  375. data/src/core/lib/slice/static_slice.h +0 -300
  376. data/src/core/lib/transport/metadata.cc +0 -714
  377. data/src/core/lib/transport/metadata.h +0 -449
  378. data/src/core/lib/transport/metadata_batch.cc +0 -99
  379. data/src/core/lib/transport/static_metadata.cc +0 -1032
  380. data/src/core/lib/transport/static_metadata.h +0 -322
  381. data/src/core/lib/transport/status_metadata.cc +0 -63
  382. data/src/core/lib/transport/status_metadata.h +0 -48
@@ -0,0 +1,451 @@
1
+ //
2
+ // Copyright 2018 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
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include "src/core/ext/xds/xds_cluster.h"
20
+
21
+ #include "absl/container/inlined_vector.h"
22
+ #include "absl/strings/str_cat.h"
23
+ #include "absl/strings/str_format.h"
24
+ #include "absl/strings/str_join.h"
25
+ #include "envoy/config/cluster/v3/circuit_breaker.upb.h"
26
+ #include "envoy/config/cluster/v3/cluster.upb.h"
27
+ #include "envoy/config/cluster/v3/cluster.upbdefs.h"
28
+ #include "envoy/config/core/v3/address.upb.h"
29
+ #include "envoy/config/core/v3/base.upb.h"
30
+ #include "envoy/config/core/v3/config_source.upb.h"
31
+ #include "envoy/config/endpoint/v3/endpoint.upb.h"
32
+ #include "envoy/config/endpoint/v3/endpoint_components.upb.h"
33
+ #include "envoy/extensions/clusters/aggregate/v3/cluster.upb.h"
34
+ #include "google/protobuf/any.upb.h"
35
+ #include "google/protobuf/wrappers.upb.h"
36
+
37
+ #include <grpc/support/alloc.h>
38
+
39
+ #include "src/core/lib/gpr/env.h"
40
+ #include "src/core/lib/gpr/string.h"
41
+ #include "src/core/lib/gprpp/host_port.h"
42
+
43
+ namespace grpc_core {
44
+
45
+ //
46
+ // XdsClusterResource
47
+ //
48
+
49
+ std::string XdsClusterResource::ToString() const {
50
+ absl::InlinedVector<std::string, 8> contents;
51
+ switch (cluster_type) {
52
+ case EDS:
53
+ contents.push_back("cluster_type=EDS");
54
+ if (!eds_service_name.empty()) {
55
+ contents.push_back(
56
+ absl::StrFormat("eds_service_name=%s", eds_service_name));
57
+ }
58
+ break;
59
+ case LOGICAL_DNS:
60
+ contents.push_back("cluster_type=LOGICAL_DNS");
61
+ contents.push_back(absl::StrFormat("dns_hostname=%s", dns_hostname));
62
+ break;
63
+ case AGGREGATE:
64
+ contents.push_back("cluster_type=AGGREGATE");
65
+ contents.push_back(
66
+ absl::StrFormat("prioritized_cluster_names=[%s]",
67
+ absl::StrJoin(prioritized_cluster_names, ", ")));
68
+ }
69
+ if (!common_tls_context.Empty()) {
70
+ contents.push_back(absl::StrFormat("common_tls_context=%s",
71
+ common_tls_context.ToString()));
72
+ }
73
+ if (lrs_load_reporting_server_name.has_value()) {
74
+ contents.push_back(absl::StrFormat("lrs_load_reporting_server_name=%s",
75
+ lrs_load_reporting_server_name.value()));
76
+ }
77
+ contents.push_back(absl::StrCat("lb_policy=", lb_policy));
78
+ if (lb_policy == "RING_HASH") {
79
+ contents.push_back(absl::StrCat("min_ring_size=", min_ring_size));
80
+ contents.push_back(absl::StrCat("max_ring_size=", max_ring_size));
81
+ }
82
+ contents.push_back(
83
+ absl::StrFormat("max_concurrent_requests=%d", max_concurrent_requests));
84
+ return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
85
+ }
86
+
87
+ //
88
+ // XdsClusterResourceType
89
+ //
90
+
91
+ namespace {
92
+
93
+ grpc_error_handle UpstreamTlsContextParse(
94
+ const XdsEncodingContext& context,
95
+ const envoy_config_core_v3_TransportSocket* transport_socket,
96
+ CommonTlsContext* common_tls_context) {
97
+ // Record Upstream tls context
98
+ absl::string_view name = UpbStringToAbsl(
99
+ envoy_config_core_v3_TransportSocket_name(transport_socket));
100
+ if (name != "envoy.transport_sockets.tls") {
101
+ return GRPC_ERROR_CREATE_FROM_CPP_STRING(
102
+ absl::StrCat("Unrecognized transport socket: ", name));
103
+ }
104
+ auto* typed_config =
105
+ envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
106
+ if (typed_config != nullptr) {
107
+ const upb_strview encoded_upstream_tls_context =
108
+ google_protobuf_Any_value(typed_config);
109
+ auto* upstream_tls_context =
110
+ envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
111
+ encoded_upstream_tls_context.data,
112
+ encoded_upstream_tls_context.size, context.arena);
113
+ if (upstream_tls_context == nullptr) {
114
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
115
+ "Can't decode upstream tls context.");
116
+ }
117
+ auto* common_tls_context_proto =
118
+ envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
119
+ upstream_tls_context);
120
+ if (common_tls_context_proto != nullptr) {
121
+ grpc_error_handle error = CommonTlsContext::Parse(
122
+ context, common_tls_context_proto, common_tls_context);
123
+ if (error != GRPC_ERROR_NONE) {
124
+ return grpc_error_add_child(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
125
+ "Error parsing UpstreamTlsContext"),
126
+ error);
127
+ }
128
+ }
129
+ }
130
+ if (common_tls_context->certificate_validation_context
131
+ .ca_certificate_provider_instance.instance_name.empty()) {
132
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
133
+ "UpstreamTlsContext: TLS configuration provided but no "
134
+ "ca_certificate_provider_instance found.");
135
+ }
136
+ return GRPC_ERROR_NONE;
137
+ }
138
+
139
+ grpc_error_handle CdsLogicalDnsParse(
140
+ const envoy_config_cluster_v3_Cluster* cluster,
141
+ XdsClusterResource* cds_update) {
142
+ const auto* load_assignment =
143
+ envoy_config_cluster_v3_Cluster_load_assignment(cluster);
144
+ if (load_assignment == nullptr) {
145
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
146
+ "load_assignment not present for LOGICAL_DNS cluster");
147
+ }
148
+ size_t num_localities;
149
+ const auto* const* localities =
150
+ envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(load_assignment,
151
+ &num_localities);
152
+ if (num_localities != 1) {
153
+ return GRPC_ERROR_CREATE_FROM_CPP_STRING(
154
+ absl::StrCat("load_assignment for LOGICAL_DNS cluster must have "
155
+ "exactly one locality, found ",
156
+ num_localities));
157
+ }
158
+ size_t num_endpoints;
159
+ const auto* const* endpoints =
160
+ envoy_config_endpoint_v3_LocalityLbEndpoints_lb_endpoints(localities[0],
161
+ &num_endpoints);
162
+ if (num_endpoints != 1) {
163
+ return GRPC_ERROR_CREATE_FROM_CPP_STRING(
164
+ absl::StrCat("locality for LOGICAL_DNS cluster must have "
165
+ "exactly one endpoint, found ",
166
+ num_endpoints));
167
+ }
168
+ const auto* endpoint =
169
+ envoy_config_endpoint_v3_LbEndpoint_endpoint(endpoints[0]);
170
+ if (endpoint == nullptr) {
171
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
172
+ "LbEndpoint endpoint field not set");
173
+ }
174
+ const auto* address = envoy_config_endpoint_v3_Endpoint_address(endpoint);
175
+ if (address == nullptr) {
176
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
177
+ "Endpoint address field not set");
178
+ }
179
+ const auto* socket_address =
180
+ envoy_config_core_v3_Address_socket_address(address);
181
+ if (socket_address == nullptr) {
182
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
183
+ "Address socket_address field not set");
184
+ }
185
+ if (envoy_config_core_v3_SocketAddress_resolver_name(socket_address).size !=
186
+ 0) {
187
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
188
+ "LOGICAL_DNS clusters must NOT have a custom resolver name set");
189
+ }
190
+ absl::string_view address_str = UpbStringToAbsl(
191
+ envoy_config_core_v3_SocketAddress_address(socket_address));
192
+ if (address_str.empty()) {
193
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
194
+ "SocketAddress address field not set");
195
+ }
196
+ if (!envoy_config_core_v3_SocketAddress_has_port_value(socket_address)) {
197
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
198
+ "SocketAddress port_value field not set");
199
+ }
200
+ cds_update->dns_hostname = JoinHostPort(
201
+ address_str,
202
+ envoy_config_core_v3_SocketAddress_port_value(socket_address));
203
+ return GRPC_ERROR_NONE;
204
+ }
205
+
206
+ // TODO(donnadionne): Check to see if cluster types aggregate_cluster and
207
+ // logical_dns are enabled, this will be
208
+ // removed once the cluster types are fully integration-tested and enabled by
209
+ // default.
210
+ bool XdsAggregateAndLogicalDnsClusterEnabled() {
211
+ char* value = gpr_getenv(
212
+ "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER");
213
+ bool parsed_value;
214
+ bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
215
+ gpr_free(value);
216
+ return parse_succeeded && parsed_value;
217
+ }
218
+
219
+ grpc_error_handle CdsResourceParse(
220
+ const XdsEncodingContext& context,
221
+ const envoy_config_cluster_v3_Cluster* cluster, bool /*is_v2*/,
222
+ XdsClusterResource* cds_update) {
223
+ std::vector<grpc_error_handle> errors;
224
+ // Check the cluster_discovery_type.
225
+ if (!envoy_config_cluster_v3_Cluster_has_type(cluster) &&
226
+ !envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
227
+ errors.push_back(
228
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType not found."));
229
+ } else if (envoy_config_cluster_v3_Cluster_type(cluster) ==
230
+ envoy_config_cluster_v3_Cluster_EDS) {
231
+ cds_update->cluster_type = XdsClusterResource::ClusterType::EDS;
232
+ // Check the EDS config source.
233
+ const envoy_config_cluster_v3_Cluster_EdsClusterConfig* eds_cluster_config =
234
+ envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
235
+ const envoy_config_core_v3_ConfigSource* eds_config =
236
+ envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
237
+ eds_cluster_config);
238
+ if (!envoy_config_core_v3_ConfigSource_has_ads(eds_config)) {
239
+ errors.push_back(
240
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("EDS ConfigSource is not ADS."));
241
+ }
242
+ // Record EDS service_name (if any).
243
+ upb_strview service_name =
244
+ envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
245
+ eds_cluster_config);
246
+ if (service_name.size != 0) {
247
+ cds_update->eds_service_name = UpbStringToStdString(service_name);
248
+ }
249
+ } else if (!XdsAggregateAndLogicalDnsClusterEnabled()) {
250
+ errors.push_back(
251
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType is not valid."));
252
+ } else if (envoy_config_cluster_v3_Cluster_type(cluster) ==
253
+ envoy_config_cluster_v3_Cluster_LOGICAL_DNS) {
254
+ cds_update->cluster_type = XdsClusterResource::ClusterType::LOGICAL_DNS;
255
+ grpc_error_handle error = CdsLogicalDnsParse(cluster, cds_update);
256
+ if (error != GRPC_ERROR_NONE) errors.push_back(error);
257
+ } else {
258
+ if (!envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
259
+ errors.push_back(
260
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType is not valid."));
261
+ } else {
262
+ const envoy_config_cluster_v3_Cluster_CustomClusterType*
263
+ custom_cluster_type =
264
+ envoy_config_cluster_v3_Cluster_cluster_type(cluster);
265
+ upb_strview type_name =
266
+ envoy_config_cluster_v3_Cluster_CustomClusterType_name(
267
+ custom_cluster_type);
268
+ if (UpbStringToAbsl(type_name) != "envoy.clusters.aggregate") {
269
+ errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
270
+ "DiscoveryType is not valid."));
271
+ } else {
272
+ cds_update->cluster_type = XdsClusterResource::ClusterType::AGGREGATE;
273
+ // Retrieve aggregate clusters.
274
+ const google_protobuf_Any* typed_config =
275
+ envoy_config_cluster_v3_Cluster_CustomClusterType_typed_config(
276
+ custom_cluster_type);
277
+ const upb_strview aggregate_cluster_config_upb_strview =
278
+ google_protobuf_Any_value(typed_config);
279
+ const envoy_extensions_clusters_aggregate_v3_ClusterConfig*
280
+ aggregate_cluster_config =
281
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig_parse(
282
+ aggregate_cluster_config_upb_strview.data,
283
+ aggregate_cluster_config_upb_strview.size, context.arena);
284
+ if (aggregate_cluster_config == nullptr) {
285
+ errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
286
+ "Can't parse aggregate cluster."));
287
+ } else {
288
+ size_t size;
289
+ const upb_strview* clusters =
290
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig_clusters(
291
+ aggregate_cluster_config, &size);
292
+ for (size_t i = 0; i < size; ++i) {
293
+ const upb_strview cluster = clusters[i];
294
+ cds_update->prioritized_cluster_names.emplace_back(
295
+ UpbStringToStdString(cluster));
296
+ }
297
+ }
298
+ }
299
+ }
300
+ }
301
+ // Check the LB policy.
302
+ if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
303
+ envoy_config_cluster_v3_Cluster_ROUND_ROBIN) {
304
+ cds_update->lb_policy = "ROUND_ROBIN";
305
+ } else if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
306
+ envoy_config_cluster_v3_Cluster_RING_HASH) {
307
+ cds_update->lb_policy = "RING_HASH";
308
+ // Record ring hash lb config
309
+ auto* ring_hash_config =
310
+ envoy_config_cluster_v3_Cluster_ring_hash_lb_config(cluster);
311
+ if (ring_hash_config != nullptr) {
312
+ const google_protobuf_UInt64Value* max_ring_size =
313
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_maximum_ring_size(
314
+ ring_hash_config);
315
+ if (max_ring_size != nullptr) {
316
+ cds_update->max_ring_size =
317
+ google_protobuf_UInt64Value_value(max_ring_size);
318
+ if (cds_update->max_ring_size > 8388608 ||
319
+ cds_update->max_ring_size == 0) {
320
+ errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
321
+ "max_ring_size is not in the range of 1 to 8388608."));
322
+ }
323
+ }
324
+ const google_protobuf_UInt64Value* min_ring_size =
325
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_minimum_ring_size(
326
+ ring_hash_config);
327
+ if (min_ring_size != nullptr) {
328
+ cds_update->min_ring_size =
329
+ google_protobuf_UInt64Value_value(min_ring_size);
330
+ if (cds_update->min_ring_size > 8388608 ||
331
+ cds_update->min_ring_size == 0) {
332
+ errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
333
+ "min_ring_size is not in the range of 1 to 8388608."));
334
+ }
335
+ if (cds_update->min_ring_size > cds_update->max_ring_size) {
336
+ errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
337
+ "min_ring_size cannot be greater than max_ring_size."));
338
+ }
339
+ }
340
+ if (envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
341
+ ring_hash_config) !=
342
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_XX_HASH) {
343
+ errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
344
+ "ring hash lb config has invalid hash function."));
345
+ }
346
+ }
347
+ } else {
348
+ errors.push_back(
349
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("LB policy is not supported."));
350
+ }
351
+ auto* transport_socket =
352
+ envoy_config_cluster_v3_Cluster_transport_socket(cluster);
353
+ if (transport_socket != nullptr) {
354
+ grpc_error_handle error = UpstreamTlsContextParse(
355
+ context, transport_socket, &cds_update->common_tls_context);
356
+ if (error != GRPC_ERROR_NONE) {
357
+ errors.push_back(
358
+ grpc_error_add_child(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
359
+ "Error parsing security configuration"),
360
+ error));
361
+ }
362
+ }
363
+ // Record LRS server name (if any).
364
+ const envoy_config_core_v3_ConfigSource* lrs_server =
365
+ envoy_config_cluster_v3_Cluster_lrs_server(cluster);
366
+ if (lrs_server != nullptr) {
367
+ if (!envoy_config_core_v3_ConfigSource_has_self(lrs_server)) {
368
+ errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
369
+ ": LRS ConfigSource is not self."));
370
+ }
371
+ cds_update->lrs_load_reporting_server_name.emplace("");
372
+ }
373
+ // The Cluster resource encodes the circuit breaking parameters in a list of
374
+ // Thresholds messages, where each message specifies the parameters for a
375
+ // particular RoutingPriority. we will look only at the first entry in the
376
+ // list for priority DEFAULT and default to 1024 if not found.
377
+ if (envoy_config_cluster_v3_Cluster_has_circuit_breakers(cluster)) {
378
+ const envoy_config_cluster_v3_CircuitBreakers* circuit_breakers =
379
+ envoy_config_cluster_v3_Cluster_circuit_breakers(cluster);
380
+ size_t num_thresholds;
381
+ const envoy_config_cluster_v3_CircuitBreakers_Thresholds* const*
382
+ thresholds = envoy_config_cluster_v3_CircuitBreakers_thresholds(
383
+ circuit_breakers, &num_thresholds);
384
+ for (size_t i = 0; i < num_thresholds; ++i) {
385
+ const auto* threshold = thresholds[i];
386
+ if (envoy_config_cluster_v3_CircuitBreakers_Thresholds_priority(
387
+ threshold) == envoy_config_core_v3_DEFAULT) {
388
+ const google_protobuf_UInt32Value* max_requests =
389
+ envoy_config_cluster_v3_CircuitBreakers_Thresholds_max_requests(
390
+ threshold);
391
+ if (max_requests != nullptr) {
392
+ cds_update->max_concurrent_requests =
393
+ google_protobuf_UInt32Value_value(max_requests);
394
+ }
395
+ break;
396
+ }
397
+ }
398
+ }
399
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing CDS resource", &errors);
400
+ }
401
+
402
+ void MaybeLogCluster(const XdsEncodingContext& context,
403
+ const envoy_config_cluster_v3_Cluster* cluster) {
404
+ if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
405
+ gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
406
+ const upb_msgdef* msg_type =
407
+ envoy_config_cluster_v3_Cluster_getmsgdef(context.symtab);
408
+ char buf[10240];
409
+ upb_text_encode(cluster, msg_type, nullptr, 0, buf, sizeof(buf));
410
+ gpr_log(GPR_DEBUG, "[xds_client %p] Cluster: %s", context.client, buf);
411
+ }
412
+ }
413
+
414
+ } // namespace
415
+
416
+ absl::StatusOr<XdsResourceType::DecodeResult> XdsClusterResourceType::Decode(
417
+ const XdsEncodingContext& context, absl::string_view serialized_resource,
418
+ bool is_v2) const {
419
+ // Parse serialized proto.
420
+ auto* resource = envoy_config_cluster_v3_Cluster_parse(
421
+ serialized_resource.data(), serialized_resource.size(), context.arena);
422
+ if (resource == nullptr) {
423
+ return absl::InvalidArgumentError("Can't parse Cluster resource.");
424
+ }
425
+ MaybeLogCluster(context, resource);
426
+ // Validate resource.
427
+ DecodeResult result;
428
+ result.name =
429
+ UpbStringToStdString(envoy_config_cluster_v3_Cluster_name(resource));
430
+ auto cluster_data = absl::make_unique<ResourceDataSubclass>();
431
+ grpc_error_handle error =
432
+ CdsResourceParse(context, resource, is_v2, &cluster_data->resource);
433
+ if (error != GRPC_ERROR_NONE) {
434
+ std::string error_str = grpc_error_std_string(error);
435
+ GRPC_ERROR_UNREF(error);
436
+ if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
437
+ gpr_log(GPR_ERROR, "[xds_client %p] invalid Cluster %s: %s",
438
+ context.client, result.name.c_str(), error_str.c_str());
439
+ }
440
+ result.resource = absl::InvalidArgumentError(error_str);
441
+ } else {
442
+ if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
443
+ gpr_log(GPR_INFO, "[xds_client %p] parsed Cluster %s: %s", context.client,
444
+ result.name.c_str(), cluster_data->resource.ToString().c_str());
445
+ }
446
+ result.resource = std::move(cluster_data);
447
+ }
448
+ return std::move(result);
449
+ }
450
+
451
+ } // namespace grpc_core
@@ -0,0 +1,111 @@
1
+ //
2
+ // Copyright 2018 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_CLUSTER_H
18
+ #define GRPC_CORE_EXT_XDS_XDS_CLUSTER_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <string>
23
+ #include <vector>
24
+
25
+ #include "absl/types/optional.h"
26
+ #include "envoy/config/cluster/v3/cluster.upbdefs.h"
27
+ #include "envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h"
28
+ #include "envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h"
29
+
30
+ #include "src/core/ext/xds/xds_client.h"
31
+ #include "src/core/ext/xds/xds_common_types.h"
32
+ #include "src/core/ext/xds/xds_resource_type_impl.h"
33
+
34
+ namespace grpc_core {
35
+
36
+ struct XdsClusterResource {
37
+ enum ClusterType { EDS, LOGICAL_DNS, AGGREGATE };
38
+ ClusterType cluster_type;
39
+ // For cluster type EDS.
40
+ // The name to use in the EDS request.
41
+ // If empty, the cluster name will be used.
42
+ std::string eds_service_name;
43
+ // For cluster type LOGICAL_DNS.
44
+ // The hostname to lookup in DNS.
45
+ std::string dns_hostname;
46
+ // For cluster type AGGREGATE.
47
+ // The prioritized list of cluster names.
48
+ std::vector<std::string> prioritized_cluster_names;
49
+
50
+ // Tls Context used by clients
51
+ CommonTlsContext common_tls_context;
52
+
53
+ // The LRS server to use for load reporting.
54
+ // If not set, load reporting will be disabled.
55
+ // If set to the empty string, will use the same server we obtained the CDS
56
+ // data from.
57
+ absl::optional<std::string> lrs_load_reporting_server_name;
58
+
59
+ // The LB policy to use (e.g., "ROUND_ROBIN" or "RING_HASH").
60
+ std::string lb_policy;
61
+ // Used for RING_HASH LB policy only.
62
+ uint64_t min_ring_size = 1024;
63
+ uint64_t max_ring_size = 8388608;
64
+ // Maximum number of outstanding requests can be made to the upstream
65
+ // cluster.
66
+ uint32_t max_concurrent_requests = 1024;
67
+
68
+ bool operator==(const XdsClusterResource& other) const {
69
+ return cluster_type == other.cluster_type &&
70
+ eds_service_name == other.eds_service_name &&
71
+ dns_hostname == other.dns_hostname &&
72
+ prioritized_cluster_names == other.prioritized_cluster_names &&
73
+ common_tls_context == other.common_tls_context &&
74
+ lrs_load_reporting_server_name ==
75
+ other.lrs_load_reporting_server_name &&
76
+ lb_policy == other.lb_policy &&
77
+ min_ring_size == other.min_ring_size &&
78
+ max_ring_size == other.max_ring_size &&
79
+ max_concurrent_requests == other.max_concurrent_requests;
80
+ }
81
+
82
+ std::string ToString() const;
83
+ };
84
+
85
+ class XdsClusterResourceType
86
+ : public XdsResourceTypeImpl<XdsClusterResourceType, XdsClusterResource> {
87
+ public:
88
+ absl::string_view type_url() const override {
89
+ return "envoy.config.cluster.v3.Cluster";
90
+ }
91
+ absl::string_view v2_type_url() const override {
92
+ return "envoy.api.v2.Cluster";
93
+ }
94
+
95
+ absl::StatusOr<DecodeResult> Decode(const XdsEncodingContext& context,
96
+ absl::string_view serialized_resource,
97
+ bool is_v2) const override;
98
+
99
+ bool AllResourcesRequiredInSotW() const override { return true; }
100
+
101
+ void InitUpbSymtab(upb_symtab* symtab) const override {
102
+ envoy_config_cluster_v3_Cluster_getmsgdef(symtab);
103
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig_getmsgdef(symtab);
104
+ envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_getmsgdef(
105
+ symtab);
106
+ }
107
+ };
108
+
109
+ } // namespace grpc_core
110
+
111
+ #endif // GRPC_CORE_EXT_XDS_XDS_CLUSTER_H