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
@@ -28,53 +28,115 @@
28
28
  #include "absl/strings/str_join.h"
29
29
  #include "absl/strings/string_view.h"
30
30
 
31
+ #include <grpc/grpc_security.h>
32
+
31
33
  #include "src/core/ext/xds/certificate_provider_registry.h"
32
34
  #include "src/core/ext/xds/xds_api.h"
35
+ #include "src/core/ext/xds/xds_channel_creds.h"
36
+ #include "src/core/lib/gpr/env.h"
33
37
  #include "src/core/lib/gpr/string.h"
34
38
  #include "src/core/lib/iomgr/load_file.h"
39
+ #include "src/core/lib/json/json_util.h"
35
40
  #include "src/core/lib/security/credentials/credentials.h"
36
41
  #include "src/core/lib/security/credentials/fake/fake_credentials.h"
37
42
  #include "src/core/lib/slice/slice_internal.h"
38
43
 
39
44
  namespace grpc_core {
40
45
 
41
- //
42
- // XdsChannelCredsRegistry
43
- //
46
+ namespace {
44
47
 
45
- bool XdsChannelCredsRegistry::IsSupported(const std::string& creds_type) {
46
- return creds_type == "google_default" || creds_type == "insecure" ||
47
- creds_type == "fake";
48
+ // TODO(donnadionne): check to see if federation is enabled, this will be
49
+ // removed once federation is fully integrated and enabled by default.
50
+ bool XdsFederationEnabled() {
51
+ char* value = gpr_getenv("GRPC_EXPERIMENTAL_XDS_FEDERATION");
52
+ bool parsed_value;
53
+ bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
54
+ gpr_free(value);
55
+ return parse_succeeded && parsed_value;
48
56
  }
49
57
 
50
- bool XdsChannelCredsRegistry::IsValidConfig(const std::string& /*creds_type*/,
51
- const Json& /*config*/) {
52
- // Currently, none of the creds types actually take a config, but we
53
- // ignore whatever might be specified in the bootstrap file for
54
- // forward compatibility reasons.
55
- return true;
58
+ grpc_error_handle ParseChannelCreds(const Json::Object& json, size_t idx,
59
+ XdsBootstrap::XdsServer* server) {
60
+ std::vector<grpc_error_handle> error_list;
61
+ std::string type;
62
+ ParseJsonObjectField(json, "type", &type, &error_list);
63
+ const Json::Object* config_ptr = nullptr;
64
+ ParseJsonObjectField(json, "config", &config_ptr, &error_list,
65
+ /*required=*/false);
66
+ // Select the first channel creds type that we support.
67
+ if (server->channel_creds_type.empty() &&
68
+ XdsChannelCredsRegistry::IsSupported(type)) {
69
+ Json config;
70
+ if (config_ptr != nullptr) config = *config_ptr;
71
+ if (!XdsChannelCredsRegistry::IsValidConfig(type, config)) {
72
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
73
+ "invalid config for channel creds type \"", type, "\"")));
74
+ }
75
+ server->channel_creds_type = std::move(type);
76
+ server->channel_creds_config = std::move(config);
77
+ }
78
+ return GRPC_ERROR_CREATE_FROM_VECTOR_AND_CPP_STRING(
79
+ absl::StrCat("errors parsing index ", idx), &error_list);
56
80
  }
57
81
 
58
- RefCountedPtr<grpc_channel_credentials>
59
- XdsChannelCredsRegistry::MakeChannelCreds(const std::string& creds_type,
60
- const Json& /*config*/) {
61
- if (creds_type == "google_default") {
62
- return RefCountedPtr<grpc_channel_credentials>(
63
- grpc_google_default_credentials_create(nullptr));
64
- } else if (creds_type == "insecure") {
65
- return RefCountedPtr<grpc_channel_credentials>(
66
- grpc_insecure_credentials_create());
67
- } else if (creds_type == "fake") {
68
- return RefCountedPtr<grpc_channel_credentials>(
69
- grpc_fake_transport_security_credentials_create());
82
+ grpc_error_handle ParseChannelCredsArray(const Json::Array& json,
83
+ XdsBootstrap::XdsServer* server) {
84
+ std::vector<grpc_error_handle> error_list;
85
+ for (size_t i = 0; i < json.size(); ++i) {
86
+ const Json& child = json.at(i);
87
+ if (child.type() != Json::Type::OBJECT) {
88
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
89
+ absl::StrCat("array element ", i, " is not an object")));
90
+ } else {
91
+ grpc_error_handle parse_error =
92
+ ParseChannelCreds(child.object_value(), i, server);
93
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
94
+ }
70
95
  }
71
- return nullptr;
96
+ if (server->channel_creds_type.empty()) {
97
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
98
+ "no known creds type found in \"channel_creds\""));
99
+ }
100
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing \"channel_creds\" array",
101
+ &error_list);
72
102
  }
73
103
 
104
+ } // namespace
105
+
74
106
  //
75
107
  // XdsBootstrap::XdsServer
76
108
  //
77
109
 
110
+ XdsBootstrap::XdsServer XdsBootstrap::XdsServer::Parse(
111
+ const Json& json, grpc_error_handle* error) {
112
+ std::vector<grpc_error_handle> error_list;
113
+ XdsServer server;
114
+ ParseJsonObjectField(json.object_value(), "server_uri", &server.server_uri,
115
+ &error_list);
116
+ const Json::Array* creds_array = nullptr;
117
+ ParseJsonObjectField(json.object_value(), "channel_creds", &creds_array,
118
+ &error_list);
119
+ if (creds_array != nullptr) {
120
+ grpc_error_handle parse_error =
121
+ ParseChannelCredsArray(*creds_array, &server);
122
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
123
+ }
124
+ const Json::Array* server_features_array = nullptr;
125
+ ParseJsonObjectField(json.object_value(), "server_features",
126
+ &server_features_array, &error_list, /*required=*/false);
127
+ if (server_features_array != nullptr) {
128
+ for (const Json& feature_json : *server_features_array) {
129
+ if (feature_json.type() == Json::Type::STRING &&
130
+ feature_json.string_value() == "xds_v3") {
131
+ server.server_features.insert(feature_json.string_value());
132
+ }
133
+ }
134
+ }
135
+ *error = GRPC_ERROR_CREATE_FROM_VECTOR_AND_CPP_STRING(
136
+ "errors parsing xds server", &error_list);
137
+ return server;
138
+ }
139
+
78
140
  bool XdsBootstrap::XdsServer::ShouldUseV3() const {
79
141
  return server_features.find("xds_v3") != server_features.end();
80
142
  }
@@ -112,7 +174,7 @@ XdsBootstrap::XdsBootstrap(Json json, grpc_error_handle* error) {
112
174
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
113
175
  "\"xds_servers\" field is not an array"));
114
176
  } else {
115
- grpc_error_handle parse_error = ParseXdsServerList(&it->second);
177
+ grpc_error_handle parse_error = ParseXdsServerList(&it->second, &servers_);
116
178
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
117
179
  }
118
180
  it = json.mutable_object()->find("node");
@@ -125,6 +187,30 @@ XdsBootstrap::XdsBootstrap(Json json, grpc_error_handle* error) {
125
187
  if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
126
188
  }
127
189
  }
190
+ if (XdsFederationEnabled()) {
191
+ it = json.mutable_object()->find("authorities");
192
+ if (it != json.mutable_object()->end()) {
193
+ if (it->second.type() != Json::Type::OBJECT) {
194
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
195
+ "\"authorities\" field is not an object"));
196
+ } else {
197
+ grpc_error_handle parse_error = ParseAuthorities(&it->second);
198
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
199
+ }
200
+ }
201
+ it = json.mutable_object()->find(
202
+ "client_default_listener_resource_name_template");
203
+ if (it != json.mutable_object()->end()) {
204
+ if (it->second.type() != Json::Type::STRING) {
205
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
206
+ "\"client_default_listener_resource_name_template\" field is not a "
207
+ "string"));
208
+ } else {
209
+ client_default_listener_resource_name_template_ =
210
+ std::move(*it->second.mutable_string_value());
211
+ }
212
+ }
213
+ }
128
214
  it = json.mutable_object()->find("server_listener_resource_name_template");
129
215
  if (it != json.mutable_object()->end()) {
130
216
  if (it->second.type() != Json::Type::STRING) {
@@ -149,7 +235,17 @@ XdsBootstrap::XdsBootstrap(Json json, grpc_error_handle* error) {
149
235
  &error_list);
150
236
  }
151
237
 
152
- grpc_error_handle XdsBootstrap::ParseXdsServerList(Json* json) {
238
+ const XdsBootstrap::Authority* XdsBootstrap::LookupAuthority(
239
+ const std::string& name) const {
240
+ auto it = authorities_.find(name);
241
+ if (it != authorities_.end()) {
242
+ return &it->second;
243
+ }
244
+ return nullptr;
245
+ }
246
+
247
+ grpc_error_handle XdsBootstrap::ParseXdsServerList(
248
+ Json* json, absl::InlinedVector<XdsServer, 1>* servers) {
153
249
  std::vector<grpc_error_handle> error_list;
154
250
  for (size_t i = 0; i < json->mutable_array()->size(); ++i) {
155
251
  Json& child = json->mutable_array()->at(i);
@@ -157,126 +253,73 @@ grpc_error_handle XdsBootstrap::ParseXdsServerList(Json* json) {
157
253
  error_list.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
158
254
  absl::StrCat("array element ", i, " is not an object")));
159
255
  } else {
160
- grpc_error_handle parse_error = ParseXdsServer(&child, i);
161
- if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
256
+ grpc_error_handle parse_error;
257
+ servers->emplace_back(XdsServer::Parse(child, &parse_error));
258
+ if (parse_error != GRPC_ERROR_NONE) {
259
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
260
+ absl::StrCat("errors parsing index ", i)));
261
+ error_list.push_back(parse_error);
262
+ }
162
263
  }
163
264
  }
164
265
  return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing \"xds_servers\" array",
165
266
  &error_list);
166
267
  }
167
268
 
168
- grpc_error_handle XdsBootstrap::ParseXdsServer(Json* json, size_t idx) {
269
+ grpc_error_handle XdsBootstrap::ParseAuthorities(Json* json) {
169
270
  std::vector<grpc_error_handle> error_list;
170
- servers_.emplace_back();
171
- XdsServer& server = servers_[servers_.size() - 1];
172
- auto it = json->mutable_object()->find("server_uri");
173
- if (it == json->mutable_object()->end()) {
174
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
175
- "\"server_uri\" field not present"));
176
- } else if (it->second.type() != Json::Type::STRING) {
177
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
178
- "\"server_uri\" field is not a string"));
179
- } else {
180
- server.server_uri = std::move(*it->second.mutable_string_value());
181
- }
182
- it = json->mutable_object()->find("channel_creds");
183
- if (it == json->mutable_object()->end()) {
184
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
185
- "\"channel_creds\" field not present"));
186
- } else if (it->second.type() != Json::Type::ARRAY) {
187
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
188
- "\"channel_creds\" field is not an array"));
189
- } else {
190
- grpc_error_handle parse_error =
191
- ParseChannelCredsArray(&it->second, &server);
192
- if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
193
- }
194
- it = json->mutable_object()->find("server_features");
195
- if (it != json->mutable_object()->end()) {
196
- if (it->second.type() != Json::Type::ARRAY) {
197
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
198
- "\"server_features\" field is not an array"));
199
- } else {
200
- grpc_error_handle parse_error =
201
- ParseServerFeaturesArray(&it->second, &server);
202
- if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
203
- }
204
- }
205
- return GRPC_ERROR_CREATE_FROM_VECTOR_AND_CPP_STRING(
206
- absl::StrCat("errors parsing index ", idx), &error_list);
207
- }
208
-
209
- grpc_error_handle XdsBootstrap::ParseChannelCredsArray(Json* json,
210
- XdsServer* server) {
211
- std::vector<grpc_error_handle> error_list;
212
- for (size_t i = 0; i < json->mutable_array()->size(); ++i) {
213
- Json& child = json->mutable_array()->at(i);
214
- if (child.type() != Json::Type::OBJECT) {
271
+ for (auto& p : *(json->mutable_object())) {
272
+ if (p.second.type() != Json::Type::OBJECT) {
215
273
  error_list.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
216
- absl::StrCat("array element ", i, " is not an object")));
217
- } else {
218
- grpc_error_handle parse_error = ParseChannelCreds(&child, i, server);
219
- if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
274
+ "field:authorities element error: element is not a object"));
275
+ continue;
220
276
  }
277
+ grpc_error_handle parse_error = ParseAuthority(&p.second, p.first);
278
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
221
279
  }
222
- if (server->channel_creds_type.empty()) {
223
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
224
- "no known creds type found in \"channel_creds\""));
225
- }
226
- return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing \"channel_creds\" array",
280
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing \"authorities\"",
227
281
  &error_list);
228
282
  }
229
283
 
230
- grpc_error_handle XdsBootstrap::ParseChannelCreds(Json* json, size_t idx,
231
- XdsServer* server) {
284
+ grpc_error_handle XdsBootstrap::ParseAuthority(Json* json,
285
+ const std::string& name) {
232
286
  std::vector<grpc_error_handle> error_list;
233
- std::string type;
234
- auto it = json->mutable_object()->find("type");
235
- if (it == json->mutable_object()->end()) {
236
- error_list.push_back(
237
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("\"type\" field not present"));
238
- } else if (it->second.type() != Json::Type::STRING) {
239
- error_list.push_back(
240
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("\"type\" field is not a string"));
241
- } else {
242
- type = std::move(*it->second.mutable_string_value());
243
- }
244
- Json config;
245
- it = json->mutable_object()->find("config");
287
+ Authority authority;
288
+ auto it =
289
+ json->mutable_object()->find("client_listener_resource_name_template");
246
290
  if (it != json->mutable_object()->end()) {
247
- if (it->second.type() != Json::Type::OBJECT) {
291
+ if (it->second.type() != Json::Type::STRING) {
248
292
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
249
- "\"config\" field is not an object"));
293
+ "\"client_listener_resource_name_template\" field is not a string"));
250
294
  } else {
251
- config = std::move(it->second);
295
+ std::string expected_prefix = absl::StrCat("xdstp://", name, "/");
296
+ if (!absl::StartsWith(it->second.string_value(), expected_prefix)) {
297
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
298
+ absl::StrCat("\"client_listener_resource_name_template\" field "
299
+ "must begin with \"",
300
+ expected_prefix, "\"")));
301
+ } else {
302
+ authority.client_listener_resource_name_template =
303
+ std::move(*it->second.mutable_string_value());
304
+ }
252
305
  }
253
306
  }
254
- // Select the first channel creds type that we support.
255
- if (server->channel_creds_type.empty() &&
256
- XdsChannelCredsRegistry::IsSupported(type)) {
257
- if (!XdsChannelCredsRegistry::IsValidConfig(type, config)) {
258
- error_list.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
259
- "invalid config for channel creds type \"", type, "\"")));
307
+ it = json->mutable_object()->find("xds_servers");
308
+ if (it != json->mutable_object()->end()) {
309
+ if (it->second.type() != Json::Type::ARRAY) {
310
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
311
+ "\"xds_servers\" field is not an array"));
312
+ } else {
313
+ grpc_error_handle parse_error =
314
+ ParseXdsServerList(&it->second, &authority.xds_servers);
315
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
260
316
  }
261
- server->channel_creds_type = std::move(type);
262
- server->channel_creds_config = std::move(config);
263
317
  }
264
- return GRPC_ERROR_CREATE_FROM_VECTOR_AND_CPP_STRING(
265
- absl::StrCat("errors parsing index ", idx), &error_list);
266
- }
267
-
268
- grpc_error_handle XdsBootstrap::ParseServerFeaturesArray(Json* json,
269
- XdsServer* server) {
270
- std::vector<grpc_error_handle> error_list;
271
- for (size_t i = 0; i < json->mutable_array()->size(); ++i) {
272
- Json& child = json->mutable_array()->at(i);
273
- if (child.type() == Json::Type::STRING &&
274
- child.string_value() == "xds_v3") {
275
- server->server_features.insert(std::move(*child.mutable_string_value()));
276
- }
318
+ if (error_list.empty()) {
319
+ authorities_[name] = std::move(authority);
277
320
  }
278
- return GRPC_ERROR_CREATE_FROM_VECTOR(
279
- "errors parsing \"server_features\" array", &error_list);
321
+ return GRPC_ERROR_CREATE_FROM_VECTOR_AND_CPP_STRING(
322
+ absl::StrCat("errors parsing authority ", name), &error_list);
280
323
  }
281
324
 
282
325
  grpc_error_handle XdsBootstrap::ParseNode(Json* json) {
@@ -452,11 +495,32 @@ std::string XdsBootstrap::ToString() const {
452
495
  "],\n"));
453
496
  }
454
497
  parts.push_back(" }\n],\n");
498
+ if (!client_default_listener_resource_name_template_.empty()) {
499
+ parts.push_back(absl::StrFormat(
500
+ "client_default_listener_resource_name_template=\"%s\",\n",
501
+ client_default_listener_resource_name_template_));
502
+ }
455
503
  if (!server_listener_resource_name_template_.empty()) {
456
504
  parts.push_back(
457
505
  absl::StrFormat("server_listener_resource_name_template=\"%s\",\n",
458
506
  server_listener_resource_name_template_));
459
507
  }
508
+ parts.push_back("authorities={\n");
509
+ for (const auto& entry : authorities_) {
510
+ parts.push_back(absl::StrFormat(" %s={\n", entry.first));
511
+ parts.push_back(
512
+ absl::StrFormat(" client_listener_resource_name_template=\"%s\",\n",
513
+ entry.second.client_listener_resource_name_template));
514
+ parts.push_back(
515
+ absl::StrFormat(" servers=[\n"
516
+ " {\n"
517
+ " uri=\"%s\",\n"
518
+ " creds_type=%s,\n",
519
+ entry.second.xds_servers[0].server_uri,
520
+ entry.second.xds_servers[0].channel_creds_type));
521
+ parts.push_back(" },\n");
522
+ }
523
+ parts.push_back("}");
460
524
  parts.push_back("certificate_providers={\n");
461
525
  for (const auto& entry : certificate_providers_) {
462
526
  parts.push_back(
@@ -39,14 +39,6 @@ namespace grpc_core {
39
39
 
40
40
  class XdsClient;
41
41
 
42
- class XdsChannelCredsRegistry {
43
- public:
44
- static bool IsSupported(const std::string& creds_type);
45
- static bool IsValidConfig(const std::string& creds_type, const Json& config);
46
- static RefCountedPtr<grpc_channel_credentials> MakeChannelCreds(
47
- const std::string& creds_type, const Json& config);
48
- };
49
-
50
42
  class XdsBootstrap {
51
43
  public:
52
44
  struct Node {
@@ -64,6 +56,8 @@ class XdsBootstrap {
64
56
  Json channel_creds_config;
65
57
  std::set<std::string> server_features;
66
58
 
59
+ static XdsServer Parse(const Json& json, grpc_error_handle* error);
60
+
67
61
  bool operator<(const XdsServer& other) const {
68
62
  if (server_uri < other.server_uri) return true;
69
63
  if (channel_creds_type < other.channel_creds_type) return true;
@@ -77,6 +71,11 @@ class XdsBootstrap {
77
71
  bool ShouldUseV3() const;
78
72
  };
79
73
 
74
+ struct Authority {
75
+ std::string client_listener_resource_name_template;
76
+ absl::InlinedVector<XdsServer, 1> xds_servers;
77
+ };
78
+
80
79
  // Creates bootstrap object from json_string.
81
80
  // If *error is not GRPC_ERROR_NONE after returning, then there was an
82
81
  // error parsing the contents.
@@ -92,22 +91,26 @@ class XdsBootstrap {
92
91
  // add support for fallback for the xds channel.
93
92
  const XdsServer& server() const { return servers_[0]; }
94
93
  const Node* node() const { return node_.get(); }
94
+ const std::string& client_default_listener_resource_name_template() const {
95
+ return client_default_listener_resource_name_template_;
96
+ }
95
97
  const std::string& server_listener_resource_name_template() const {
96
98
  return server_listener_resource_name_template_;
97
99
  }
98
-
100
+ const std::map<std::string, Authority>& authorities() const {
101
+ return authorities_;
102
+ }
103
+ const Authority* LookupAuthority(const std::string& name) const;
99
104
  const CertificateProviderStore::PluginDefinitionMap& certificate_providers()
100
105
  const {
101
106
  return certificate_providers_;
102
107
  }
103
108
 
104
109
  private:
105
- grpc_error_handle ParseXdsServerList(Json* json);
106
- grpc_error_handle ParseXdsServer(Json* json, size_t idx);
107
- grpc_error_handle ParseChannelCredsArray(Json* json, XdsServer* server);
108
- grpc_error_handle ParseChannelCreds(Json* json, size_t idx,
109
- XdsServer* server);
110
- grpc_error_handle ParseServerFeaturesArray(Json* json, XdsServer* server);
110
+ grpc_error_handle ParseXdsServerList(
111
+ Json* json, absl::InlinedVector<XdsServer, 1>* servers);
112
+ grpc_error_handle ParseAuthorities(Json* json);
113
+ grpc_error_handle ParseAuthority(Json* json, const std::string& name);
111
114
  grpc_error_handle ParseNode(Json* json);
112
115
  grpc_error_handle ParseLocality(Json* json);
113
116
  grpc_error_handle ParseCertificateProviders(Json* json);
@@ -116,7 +119,9 @@ class XdsBootstrap {
116
119
 
117
120
  absl::InlinedVector<XdsServer, 1> servers_;
118
121
  std::unique_ptr<Node> node_;
122
+ std::string client_default_listener_resource_name_template_;
119
123
  std::string server_listener_resource_name_template_;
124
+ std::map<std::string, Authority> authorities_;
120
125
  CertificateProviderStore::PluginDefinitionMap certificate_providers_;
121
126
  };
122
127
 
@@ -22,6 +22,7 @@
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
24
  #include "src/core/ext/xds/xds_api.h"
25
+ #include "src/core/lib/matchers/matchers.h"
25
26
  #include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h"
26
27
 
27
28
  #define GRPC_ARG_XDS_CERTIFICATE_PROVIDER \
@@ -0,0 +1,108 @@
1
+ //
2
+ // Copyright 2019 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_channel_creds.h"
20
+
21
+ #include "src/core/lib/security/credentials/fake/fake_credentials.h"
22
+
23
+ namespace grpc_core {
24
+
25
+ namespace {
26
+
27
+ using ChannelCredsMap =
28
+ std::map<absl::string_view, std::unique_ptr<XdsChannelCredsImpl>>;
29
+ ChannelCredsMap* g_creds = nullptr;
30
+
31
+ } // namespace
32
+
33
+ //
34
+ // XdsChannelCredsImpl implementations for default-supported cred types.
35
+ //
36
+
37
+ class GoogleDefaultXdsChannelCredsImpl : public XdsChannelCredsImpl {
38
+ public:
39
+ absl::string_view creds_type() const override { return "google_default"; }
40
+ RefCountedPtr<grpc_channel_credentials> CreateXdsChannelCreds(
41
+ const Json& /*config*/) const override {
42
+ return RefCountedPtr<grpc_channel_credentials>(
43
+ grpc_google_default_credentials_create(nullptr));
44
+ }
45
+ bool IsValidConfig(const Json& /*config*/) const override { return true; }
46
+ };
47
+
48
+ class InsecureXdsChannelCredsImpl : public XdsChannelCredsImpl {
49
+ public:
50
+ absl::string_view creds_type() const override { return "insecure"; }
51
+ RefCountedPtr<grpc_channel_credentials> CreateXdsChannelCreds(
52
+ const Json& /*config*/) const override {
53
+ return RefCountedPtr<grpc_channel_credentials>(
54
+ grpc_insecure_credentials_create());
55
+ }
56
+ bool IsValidConfig(const Json& /*config*/) const override { return true; }
57
+ };
58
+
59
+ class FakeXdsChannelCredsImpl : public XdsChannelCredsImpl {
60
+ public:
61
+ absl::string_view creds_type() const override { return "fake"; }
62
+ RefCountedPtr<grpc_channel_credentials> CreateXdsChannelCreds(
63
+ const Json& /*config*/) const override {
64
+ return RefCountedPtr<grpc_channel_credentials>(
65
+ grpc_fake_transport_security_credentials_create());
66
+ }
67
+ bool IsValidConfig(const Json& /*config*/) const override { return true; }
68
+ };
69
+
70
+ //
71
+ // XdsChannelCredsRegistry
72
+ //
73
+
74
+ bool XdsChannelCredsRegistry::IsSupported(const std::string& creds_type) {
75
+ return g_creds->find(creds_type) != g_creds->end();
76
+ }
77
+
78
+ bool XdsChannelCredsRegistry::IsValidConfig(const std::string& creds_type,
79
+ const Json& config) {
80
+ const auto iter = g_creds->find(creds_type);
81
+ if (iter == g_creds->cend()) return false;
82
+ return iter->second->IsValidConfig(config);
83
+ }
84
+
85
+ RefCountedPtr<grpc_channel_credentials>
86
+ XdsChannelCredsRegistry::CreateXdsChannelCreds(const std::string& creds_type,
87
+ const Json& config) {
88
+ const auto iter = g_creds->find(creds_type);
89
+ if (iter == g_creds->cend()) return nullptr;
90
+ return iter->second->CreateXdsChannelCreds(config);
91
+ }
92
+
93
+ void XdsChannelCredsRegistry::Init() {
94
+ g_creds = new ChannelCredsMap();
95
+ RegisterXdsChannelCreds(
96
+ absl::make_unique<GoogleDefaultXdsChannelCredsImpl>());
97
+ RegisterXdsChannelCreds(absl::make_unique<InsecureXdsChannelCredsImpl>());
98
+ RegisterXdsChannelCreds(absl::make_unique<FakeXdsChannelCredsImpl>());
99
+ }
100
+
101
+ void XdsChannelCredsRegistry::Shutdown() { delete g_creds; }
102
+
103
+ void XdsChannelCredsRegistry::RegisterXdsChannelCreds(
104
+ std::unique_ptr<XdsChannelCredsImpl> creds) {
105
+ (*g_creds)[creds->creds_type()] = std::move(creds);
106
+ }
107
+
108
+ } // namespace grpc_core
@@ -0,0 +1,50 @@
1
+ //
2
+ // Copyright 2022 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_CHANNEL_CREDS_H
18
+ #define GRPC_CORE_EXT_XDS_XDS_CHANNEL_CREDS_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include "src/core/lib/json/json.h"
23
+ #include "src/core/lib/security/credentials/credentials.h"
24
+
25
+ namespace grpc_core {
26
+
27
+ class XdsChannelCredsImpl {
28
+ public:
29
+ virtual ~XdsChannelCredsImpl() {}
30
+ virtual absl::string_view creds_type() const = 0;
31
+ virtual bool IsValidConfig(const Json& config) const = 0;
32
+ virtual RefCountedPtr<grpc_channel_credentials> CreateXdsChannelCreds(
33
+ const Json& config) const = 0;
34
+ };
35
+
36
+ class XdsChannelCredsRegistry {
37
+ public:
38
+ static bool IsSupported(const std::string& creds_type);
39
+ static bool IsValidConfig(const std::string& creds_type, const Json& config);
40
+ static RefCountedPtr<grpc_channel_credentials> CreateXdsChannelCreds(
41
+ const std::string& creds_type, const Json& config);
42
+ static void Init();
43
+ static void Shutdown();
44
+ static void RegisterXdsChannelCreds(
45
+ std::unique_ptr<XdsChannelCredsImpl> creds);
46
+ };
47
+
48
+ } // namespace grpc_core
49
+
50
+ #endif // GRPC_CORE_EXT_XDS_XDS_CHANNEL_CREDS_H