grpc 1.36.0 → 1.37.0.pre1

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 (221) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +65 -37
  3. data/include/grpc/grpc.h +15 -1
  4. data/include/grpc/impl/codegen/port_platform.h +2 -0
  5. data/src/core/ext/filters/client_channel/client_channel.cc +327 -305
  6. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
  7. data/src/core/ext/filters/client_channel/config_selector.h +8 -0
  8. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -4
  9. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
  10. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  11. data/src/core/ext/filters/client_channel/lb_policy.cc +3 -0
  12. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  13. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  14. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +7 -22
  15. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
  16. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +2 -2
  17. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  18. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  19. data/src/core/ext/filters/client_channel/resolver.cc +3 -0
  20. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  21. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -1
  22. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +5 -9
  23. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +18 -3
  24. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +295 -91
  25. data/src/core/ext/filters/client_channel/server_address.cc +3 -0
  26. data/src/core/ext/filters/client_channel/subchannel.cc +69 -146
  27. data/src/core/ext/filters/client_channel/subchannel.h +63 -95
  28. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  29. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
  30. data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
  31. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +495 -0
  32. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  33. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  34. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  35. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
  36. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
  37. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +3 -2
  38. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  39. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -2
  40. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +457 -170
  41. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +1 -1
  42. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +39 -7
  43. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  44. data/src/core/ext/transport/chttp2/transport/frame_data.cc +5 -1
  45. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  46. data/src/core/ext/transport/chttp2/transport/internal.h +1 -0
  47. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  48. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  49. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  50. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  51. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
  52. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  53. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  54. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  55. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  56. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  57. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -0
  58. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +44 -0
  59. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  60. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  61. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  62. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  63. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  64. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  65. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +6 -5
  66. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +13 -9
  67. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  68. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  69. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  70. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  71. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  72. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  73. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  74. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  75. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  76. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  77. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  78. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  79. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
  80. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
  81. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  82. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  83. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  84. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  85. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +13 -7
  86. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  87. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  88. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  89. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  90. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  91. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  92. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  93. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +21 -20
  94. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  95. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  96. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  97. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  98. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  99. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  100. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  101. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  102. data/src/core/ext/xds/xds_api.cc +1591 -279
  103. data/src/core/ext/xds/xds_api.h +279 -39
  104. data/src/core/ext/xds/xds_bootstrap.cc +21 -5
  105. data/src/core/ext/xds/xds_bootstrap.h +5 -1
  106. data/src/core/ext/xds/xds_client.cc +168 -23
  107. data/src/core/ext/xds/xds_client.h +26 -0
  108. data/src/core/ext/xds/xds_client_stats.h +2 -2
  109. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  110. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  111. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  112. data/src/core/ext/xds/xds_http_filters.h +130 -0
  113. data/src/core/ext/xds/xds_server_config_fetcher.cc +391 -126
  114. data/src/core/lib/channel/channel_stack.cc +12 -0
  115. data/src/core/lib/channel/channel_stack.h +7 -0
  116. data/src/core/lib/channel/channelz.cc +92 -4
  117. data/src/core/lib/channel/channelz.h +30 -1
  118. data/src/core/lib/channel/channelz_registry.cc +14 -0
  119. data/src/core/lib/channel/handshaker.cc +0 -39
  120. data/src/core/lib/channel/handshaker.h +0 -17
  121. data/src/core/lib/channel/status_util.cc +12 -2
  122. data/src/core/lib/channel/status_util.h +5 -0
  123. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  124. data/src/core/lib/gpr/sync_windows.cc +2 -2
  125. data/src/core/lib/gprpp/atomic.h +3 -3
  126. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  127. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  128. data/src/core/lib/gprpp/thd.h +1 -1
  129. data/src/core/lib/iomgr/buffer_list.h +1 -1
  130. data/src/core/lib/iomgr/cfstream_handle.cc +2 -2
  131. data/src/core/lib/iomgr/error.h +1 -1
  132. data/src/core/lib/iomgr/ev_apple.cc +1 -1
  133. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -3
  134. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  135. data/src/core/lib/iomgr/exec_ctx.cc +6 -2
  136. data/src/core/lib/iomgr/resource_quota.cc +1 -1
  137. data/src/core/lib/iomgr/sockaddr_utils.cc +120 -0
  138. data/src/core/lib/iomgr/sockaddr_utils.h +25 -0
  139. data/src/core/lib/iomgr/tcp_posix.cc +1 -4
  140. data/src/core/lib/iomgr/tcp_uv.cc +2 -2
  141. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  142. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  143. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  144. data/src/core/lib/{security/authorization → matchers}/matchers.cc +8 -8
  145. data/src/core/lib/{security/authorization → matchers}/matchers.h +14 -12
  146. data/src/core/lib/security/security_connector/ssl_utils.cc +6 -4
  147. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +6 -0
  148. data/src/core/lib/security/transport/security_handshaker.cc +32 -2
  149. data/src/core/lib/slice/slice_intern.cc +6 -7
  150. data/src/core/lib/surface/channel.h +3 -3
  151. data/src/core/lib/surface/completion_queue.cc +1 -1
  152. data/src/core/lib/surface/lame_client.cc +38 -19
  153. data/src/core/lib/surface/lame_client.h +4 -3
  154. data/src/core/lib/surface/server.cc +40 -33
  155. data/src/core/lib/surface/server.h +74 -15
  156. data/src/core/lib/surface/version.cc +1 -1
  157. data/src/core/lib/transport/metadata_batch.cc +27 -0
  158. data/src/core/lib/transport/metadata_batch.h +14 -0
  159. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  160. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -4
  161. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  162. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  163. data/src/core/tsi/fake_transport_security.cc +10 -1
  164. data/src/ruby/ext/grpc/extconf.rb +9 -1
  165. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  166. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  167. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  168. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  169. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  170. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  171. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  172. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  173. data/src/ruby/ext/grpc/rb_server.c +13 -1
  174. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  175. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  176. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  177. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  178. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  179. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  180. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  181. data/src/ruby/lib/grpc/version.rb +1 -1
  182. data/src/ruby/spec/call_spec.rb +1 -1
  183. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  184. data/src/ruby/spec/channel_spec.rb +17 -6
  185. data/src/ruby/spec/client_auth_spec.rb +27 -1
  186. data/src/ruby/spec/errors_spec.rb +1 -1
  187. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  188. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  189. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  190. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  191. data/src/ruby/spec/server_spec.rb +22 -0
  192. data/third_party/boringssl-with-bazel/err_data.c +255 -255
  193. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  194. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  195. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
  196. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +7 -5
  197. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +0 -28
  198. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
  199. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
  200. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +4 -0
  201. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  202. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +25 -9
  203. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -1
  204. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +33 -19
  205. data/third_party/xxhash/xxhash.h +5443 -0
  206. metadata +93 -49
  207. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  208. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  209. data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
  210. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  211. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  212. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
  213. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
  214. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -99
  215. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  216. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
  217. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
  218. data/third_party/upb/upb/json_decode.c +0 -1443
  219. data/third_party/upb/upb/json_decode.h +0 -23
  220. data/third_party/upb/upb/json_encode.c +0 -713
  221. data/third_party/upb/upb/json_encode.h +0 -36
@@ -56,10 +56,10 @@ class XdsLocalityName : public RefCounted<XdsLocalityName> {
56
56
  }
57
57
  };
58
58
 
59
- XdsLocalityName(std::string region, std::string zone, std::string subzone)
59
+ XdsLocalityName(std::string region, std::string zone, std::string sub_zone)
60
60
  : region_(std::move(region)),
61
61
  zone_(std::move(zone)),
62
- sub_zone_(std::move(subzone)) {}
62
+ sub_zone_(std::move(sub_zone)) {}
63
63
 
64
64
  bool operator==(const XdsLocalityName& other) const {
65
65
  return region_ == other.region_ && zone_ == other.zone_ &&
@@ -0,0 +1,226 @@
1
+ //
2
+ // Copyright 2021 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include "src/core/ext/xds/xds_http_fault_filter.h"
20
+
21
+ #include <grpc/grpc.h>
22
+
23
+ #include <string>
24
+
25
+ #include "absl/status/statusor.h"
26
+ #include "absl/strings/str_cat.h"
27
+ #include "absl/strings/str_format.h"
28
+ #include "absl/strings/string_view.h"
29
+ #include "envoy/extensions/filters/common/fault/v3/fault.upb.h"
30
+ #include "envoy/extensions/filters/http/fault/v3/fault.upb.h"
31
+ #include "envoy/extensions/filters/http/fault/v3/fault.upbdefs.h"
32
+ #include "envoy/type/v3/percent.upb.h"
33
+ #include "google/protobuf/any.upb.h"
34
+ #include "google/protobuf/duration.upb.h"
35
+ #include "google/protobuf/wrappers.upb.h"
36
+ #include "src/core/ext/filters/fault_injection/fault_injection_filter.h"
37
+ #include "src/core/ext/xds/xds_http_filters.h"
38
+ #include "src/core/lib/channel/channel_args.h"
39
+ #include "src/core/lib/channel/channel_stack.h"
40
+ #include "src/core/lib/channel/status_util.h"
41
+ #include "src/core/lib/json/json.h"
42
+ #include "src/core/lib/transport/status_conversion.h"
43
+ #include "upb/def.h"
44
+
45
+ namespace grpc_core {
46
+
47
+ const char* kXdsHttpFaultFilterConfigName =
48
+ "envoy.extensions.filters.http.fault.v3.HTTPFault";
49
+
50
+ namespace {
51
+
52
+ uint32_t GetDenominator(const envoy_type_v3_FractionalPercent* fraction) {
53
+ if (fraction != nullptr) {
54
+ const auto denominator =
55
+ static_cast<envoy_type_v3_FractionalPercent_DenominatorType>(
56
+ envoy_type_v3_FractionalPercent_denominator(fraction));
57
+ switch (denominator) {
58
+ case envoy_type_v3_FractionalPercent_MILLION:
59
+ return 1000000;
60
+ case envoy_type_v3_FractionalPercent_TEN_THOUSAND:
61
+ return 10000;
62
+ case envoy_type_v3_FractionalPercent_HUNDRED:
63
+ default:
64
+ return 100;
65
+ }
66
+ }
67
+ // Use 100 as the default denominator
68
+ return 100;
69
+ }
70
+
71
+ absl::StatusOr<Json> ParseHttpFaultIntoJson(upb_strview serialized_http_fault,
72
+ upb_arena* arena) {
73
+ auto* http_fault = envoy_extensions_filters_http_fault_v3_HTTPFault_parse(
74
+ serialized_http_fault.data, serialized_http_fault.size, arena);
75
+ if (http_fault == nullptr) {
76
+ return absl::InvalidArgumentError(
77
+ "could not parse fault injection filter config");
78
+ }
79
+ // NOTE(lidiz): Here, we are manually translating the upb messages into the
80
+ // JSON form of the filter config as part of method config, which will be
81
+ // directly used later by service config. In this way, we can validate the
82
+ // filter configs, and NACK if needed. It also allows the service config to
83
+ // function independently without xDS, but not the other way around.
84
+ // NOTE(lidiz): please refer to FaultInjectionPolicy for ground truth
85
+ // definitions, located at:
86
+ // src/core/ext/filters/fault_injection/service_config_parser.h
87
+ Json::Object fault_injection_policy_json;
88
+ // Section 1: Parse the abort injection config
89
+ const auto* fault_abort =
90
+ envoy_extensions_filters_http_fault_v3_HTTPFault_abort(http_fault);
91
+ if (fault_abort != nullptr) {
92
+ grpc_status_code abort_grpc_status_code = GRPC_STATUS_OK;
93
+ // Try if gRPC status code is set first
94
+ int abort_grpc_status_code_raw =
95
+ envoy_extensions_filters_http_fault_v3_FaultAbort_grpc_status(
96
+ fault_abort);
97
+ if (abort_grpc_status_code_raw != 0) {
98
+ if (!grpc_status_code_from_int(abort_grpc_status_code_raw,
99
+ &abort_grpc_status_code)) {
100
+ return absl::InvalidArgumentError(absl::StrCat(
101
+ "invalid gRPC status code: ", abort_grpc_status_code_raw));
102
+ }
103
+ } else {
104
+ // if gRPC status code is empty, check http status
105
+ int abort_http_status_code =
106
+ envoy_extensions_filters_http_fault_v3_FaultAbort_http_status(
107
+ fault_abort);
108
+ if (abort_http_status_code != 0 and abort_http_status_code != 200) {
109
+ abort_grpc_status_code =
110
+ grpc_http2_status_to_grpc_status(abort_http_status_code);
111
+ }
112
+ }
113
+ // Set the abort_code, even if it's OK
114
+ fault_injection_policy_json["abortCode"] =
115
+ grpc_status_code_to_string(abort_grpc_status_code);
116
+ // Set the headers if we enabled header abort injection control
117
+ if (envoy_extensions_filters_http_fault_v3_FaultAbort_has_header_abort(
118
+ fault_abort)) {
119
+ fault_injection_policy_json["abortCodeHeader"] =
120
+ "x-envoy-fault-abort-grpc-request";
121
+ fault_injection_policy_json["abortPercentageHeader"] =
122
+ "x-envoy-fault-abort-percentage";
123
+ }
124
+ // Set the fraction percent
125
+ auto* percent =
126
+ envoy_extensions_filters_http_fault_v3_FaultAbort_percentage(
127
+ fault_abort);
128
+ fault_injection_policy_json["abortPercentageNumerator"] =
129
+ Json(envoy_type_v3_FractionalPercent_numerator(percent));
130
+ fault_injection_policy_json["abortPercentageDenominator"] =
131
+ Json(GetDenominator(percent));
132
+ }
133
+ // Section 2: Parse the delay injection config
134
+ const auto* fault_delay =
135
+ envoy_extensions_filters_http_fault_v3_HTTPFault_delay(http_fault);
136
+ if (fault_delay != nullptr) {
137
+ // Parse the delay duration
138
+ const auto* delay_duration =
139
+ envoy_extensions_filters_common_fault_v3_FaultDelay_fixed_delay(
140
+ fault_delay);
141
+ if (delay_duration != nullptr) {
142
+ fault_injection_policy_json["delay"] = absl::StrFormat(
143
+ "%d.%09ds", google_protobuf_Duration_seconds(delay_duration),
144
+ google_protobuf_Duration_nanos(delay_duration));
145
+ }
146
+ // Set the headers if we enabled header delay injection control
147
+ if (envoy_extensions_filters_common_fault_v3_FaultDelay_has_header_delay(
148
+ fault_delay)) {
149
+ fault_injection_policy_json["delayHeader"] =
150
+ "x-envoy-fault-delay-request";
151
+ fault_injection_policy_json["delayPercentageHeader"] =
152
+ "x-envoy-fault-delay-request-percentage";
153
+ }
154
+ // Set the fraction percent
155
+ auto* percent =
156
+ envoy_extensions_filters_common_fault_v3_FaultDelay_percentage(
157
+ fault_delay);
158
+ fault_injection_policy_json["delayPercentageNumerator"] =
159
+ Json(envoy_type_v3_FractionalPercent_numerator(percent));
160
+ fault_injection_policy_json["delayPercentageDenominator"] =
161
+ Json(GetDenominator(percent));
162
+ }
163
+ // Section 3: Parse the maximum active faults
164
+ const auto* max_fault_wrapper =
165
+ envoy_extensions_filters_http_fault_v3_HTTPFault_max_active_faults(
166
+ http_fault);
167
+ if (max_fault_wrapper != nullptr) {
168
+ fault_injection_policy_json["maxFaults"] =
169
+ google_protobuf_UInt32Value_value(max_fault_wrapper);
170
+ }
171
+ return fault_injection_policy_json;
172
+ }
173
+
174
+ } // namespace
175
+
176
+ void XdsHttpFaultFilter::PopulateSymtab(upb_symtab* symtab) const {
177
+ envoy_extensions_filters_http_fault_v3_HTTPFault_getmsgdef(symtab);
178
+ }
179
+
180
+ absl::StatusOr<XdsHttpFilterImpl::FilterConfig>
181
+ XdsHttpFaultFilter::GenerateFilterConfig(upb_strview serialized_filter_config,
182
+ upb_arena* arena) const {
183
+ absl::StatusOr<Json> parse_result =
184
+ ParseHttpFaultIntoJson(serialized_filter_config, arena);
185
+ if (!parse_result.ok()) {
186
+ return parse_result.status();
187
+ }
188
+ return FilterConfig{kXdsHttpFaultFilterConfigName, std::move(*parse_result)};
189
+ }
190
+
191
+ absl::StatusOr<XdsHttpFilterImpl::FilterConfig>
192
+ XdsHttpFaultFilter::GenerateFilterConfigOverride(
193
+ upb_strview serialized_filter_config, upb_arena* arena) const {
194
+ // HTTPFault filter has the same message type in HTTP connection manager's
195
+ // filter config and in overriding filter config field.
196
+ return GenerateFilterConfig(serialized_filter_config, arena);
197
+ }
198
+
199
+ const grpc_channel_filter* XdsHttpFaultFilter::channel_filter() const {
200
+ return &FaultInjectionFilterVtable;
201
+ }
202
+
203
+ grpc_channel_args* XdsHttpFaultFilter::ModifyChannelArgs(
204
+ grpc_channel_args* args) const {
205
+ grpc_arg args_to_add = grpc_channel_arg_integer_create(
206
+ const_cast<char*>(GRPC_ARG_PARSE_FAULT_INJECTION_METHOD_CONFIG), 1);
207
+ grpc_channel_args* new_args =
208
+ grpc_channel_args_copy_and_add(args, &args_to_add, 1);
209
+ // Since this function takes the ownership of the channel args, it needs to
210
+ // deallocate the old ones to prevent leak.
211
+ grpc_channel_args_destroy(args);
212
+ return new_args;
213
+ }
214
+
215
+ absl::StatusOr<XdsHttpFilterImpl::ServiceConfigJsonEntry>
216
+ XdsHttpFaultFilter::GenerateServiceConfig(
217
+ const FilterConfig& hcm_filter_config,
218
+ const FilterConfig* filter_config_override) const {
219
+ Json policy_json = filter_config_override != nullptr
220
+ ? filter_config_override->config
221
+ : hcm_filter_config.config;
222
+ // The policy JSON may be empty, that's allowed.
223
+ return ServiceConfigJsonEntry{"faultInjectionPolicy", policy_json.Dump()};
224
+ }
225
+
226
+ } // namespace grpc_core
@@ -0,0 +1,63 @@
1
+ //
2
+ // Copyright 2021 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #ifndef GRPC_CORE_EXT_XDS_XDS_HTTP_FAULT_FILTER_H
18
+ #define GRPC_CORE_EXT_XDS_XDS_HTTP_FAULT_FILTER_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <grpc/grpc.h>
23
+
24
+ #include "absl/status/statusor.h"
25
+ #include "src/core/ext/xds/xds_http_filters.h"
26
+ #include "upb/def.h"
27
+
28
+ namespace grpc_core {
29
+
30
+ extern const char* kXdsHttpFaultFilterConfigName;
31
+
32
+ class XdsHttpFaultFilter : public XdsHttpFilterImpl {
33
+ public:
34
+ // Overrides the PopulateSymtab method
35
+ void PopulateSymtab(upb_symtab* symtab) const override;
36
+
37
+ // Overrides the GenerateFilterConfig method
38
+ absl::StatusOr<FilterConfig> GenerateFilterConfig(
39
+ upb_strview serialized_filter_config, upb_arena* arena) const override;
40
+
41
+ // Overrides the GenerateFilterConfigOverride method
42
+ absl::StatusOr<FilterConfig> GenerateFilterConfigOverride(
43
+ upb_strview serialized_filter_config, upb_arena* arena) const override;
44
+
45
+ // Overrides the channel_filter method
46
+ const grpc_channel_filter* channel_filter() const override;
47
+
48
+ // Overrides the ModifyChannelArgs method
49
+ grpc_channel_args* ModifyChannelArgs(grpc_channel_args* args) const override;
50
+
51
+ // Overrides the GenerateServiceConfig method
52
+ absl::StatusOr<ServiceConfigJsonEntry> GenerateServiceConfig(
53
+ const FilterConfig& hcm_filter_config,
54
+ const FilterConfig* filter_config_override) const override;
55
+
56
+ bool IsSupportedOnClients() const override { return true; }
57
+
58
+ bool IsSupportedOnServers() const override { return false; }
59
+ };
60
+
61
+ } // namespace grpc_core
62
+
63
+ #endif /* GRPC_CORE_EXT_XDS_XDS_HTTP_FAULT_FILTER_H */
@@ -0,0 +1,114 @@
1
+ //
2
+ // Copyright 2021 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include "src/core/ext/xds/xds_http_filters.h"
20
+
21
+ #include "envoy/extensions/filters/http/router/v3/router.upb.h"
22
+ #include "envoy/extensions/filters/http/router/v3/router.upbdefs.h"
23
+ #include "src/core/ext/xds/xds_http_fault_filter.h"
24
+
25
+ namespace grpc_core {
26
+
27
+ const char* kXdsHttpRouterFilterConfigName =
28
+ "envoy.extensions.filters.http.router.v3.Router";
29
+
30
+ namespace {
31
+
32
+ class XdsHttpRouterFilter : public XdsHttpFilterImpl {
33
+ public:
34
+ void PopulateSymtab(upb_symtab* symtab) const override {
35
+ envoy_extensions_filters_http_router_v3_Router_getmsgdef(symtab);
36
+ }
37
+
38
+ absl::StatusOr<FilterConfig> GenerateFilterConfig(
39
+ upb_strview serialized_filter_config, upb_arena* arena) const override {
40
+ if (envoy_extensions_filters_http_router_v3_Router_parse(
41
+ serialized_filter_config.data, serialized_filter_config.size,
42
+ arena) == nullptr) {
43
+ return absl::InvalidArgumentError("could not parse router filter config");
44
+ }
45
+ return FilterConfig{kXdsHttpRouterFilterConfigName, Json()};
46
+ }
47
+
48
+ absl::StatusOr<FilterConfig> GenerateFilterConfigOverride(
49
+ upb_strview /*serialized_filter_config*/,
50
+ upb_arena* /*arena*/) const override {
51
+ return absl::InvalidArgumentError(
52
+ "router filter does not support config override");
53
+ }
54
+
55
+ // No-op -- this filter is special-cased by the xds resolver.
56
+ const grpc_channel_filter* channel_filter() const override { return nullptr; }
57
+
58
+ // No-op -- this filter is special-cased by the xds resolver.
59
+ absl::StatusOr<ServiceConfigJsonEntry> GenerateServiceConfig(
60
+ const FilterConfig& /*hcm_filter_config*/,
61
+ const FilterConfig* /*filter_config_override*/) const override {
62
+ return absl::UnimplementedError("router filter should never be called");
63
+ }
64
+
65
+ bool IsSupportedOnClients() const override { return true; }
66
+
67
+ bool IsSupportedOnServers() const override { return true; }
68
+ };
69
+
70
+ using FilterOwnerList = std::vector<std::unique_ptr<XdsHttpFilterImpl>>;
71
+ using FilterRegistryMap = std::map<absl::string_view, XdsHttpFilterImpl*>;
72
+
73
+ FilterOwnerList* g_filters = nullptr;
74
+ FilterRegistryMap* g_filter_registry = nullptr;
75
+
76
+ } // namespace
77
+
78
+ void XdsHttpFilterRegistry::RegisterFilter(
79
+ std::unique_ptr<XdsHttpFilterImpl> filter,
80
+ const std::set<absl::string_view>& config_proto_type_names) {
81
+ for (auto config_proto_type_name : config_proto_type_names) {
82
+ (*g_filter_registry)[config_proto_type_name] = filter.get();
83
+ }
84
+ g_filters->push_back(std::move(filter));
85
+ }
86
+
87
+ const XdsHttpFilterImpl* XdsHttpFilterRegistry::GetFilterForType(
88
+ absl::string_view proto_type_name) {
89
+ auto it = g_filter_registry->find(proto_type_name);
90
+ if (it == g_filter_registry->end()) return nullptr;
91
+ return it->second;
92
+ }
93
+
94
+ void XdsHttpFilterRegistry::PopulateSymtab(upb_symtab* symtab) {
95
+ for (const auto& filter : *g_filters) {
96
+ filter->PopulateSymtab(symtab);
97
+ }
98
+ }
99
+
100
+ void XdsHttpFilterRegistry::Init() {
101
+ g_filters = new FilterOwnerList;
102
+ g_filter_registry = new FilterRegistryMap;
103
+ RegisterFilter(absl::make_unique<XdsHttpRouterFilter>(),
104
+ {kXdsHttpRouterFilterConfigName});
105
+ RegisterFilter(absl::make_unique<XdsHttpFaultFilter>(),
106
+ {kXdsHttpFaultFilterConfigName});
107
+ }
108
+
109
+ void XdsHttpFilterRegistry::Shutdown() {
110
+ delete g_filter_registry;
111
+ delete g_filters;
112
+ }
113
+
114
+ } // namespace grpc_core
@@ -0,0 +1,130 @@
1
+ //
2
+ // Copyright 2021 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #ifndef GRPC_CORE_EXT_XDS_XDS_HTTP_FILTERS_H
18
+ #define GRPC_CORE_EXT_XDS_XDS_HTTP_FILTERS_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <memory>
23
+ #include <set>
24
+ #include <string>
25
+
26
+ #include "absl/status/statusor.h"
27
+ #include "absl/strings/str_cat.h"
28
+ #include "absl/strings/string_view.h"
29
+ #include "google/protobuf/any.upb.h"
30
+ #include "upb/def.h"
31
+
32
+ #include <grpc/grpc.h>
33
+
34
+ #include "src/core/lib/channel/channel_stack.h"
35
+ #include "src/core/lib/json/json.h"
36
+
37
+ namespace grpc_core {
38
+
39
+ extern const char* kXdsHttpRouterFilterConfigName;
40
+
41
+ class XdsHttpFilterImpl {
42
+ public:
43
+ struct FilterConfig {
44
+ absl::string_view config_proto_type_name;
45
+ Json config;
46
+
47
+ bool operator==(const FilterConfig& other) const {
48
+ return config_proto_type_name == other.config_proto_type_name &&
49
+ config == other.config;
50
+ }
51
+ std::string ToString() const {
52
+ return absl::StrCat("{config_proto_type_name=", config_proto_type_name,
53
+ " config=", config.Dump(), "}");
54
+ }
55
+ };
56
+
57
+ // Service config data for the filter, returned by GenerateServiceConfig().
58
+ struct ServiceConfigJsonEntry {
59
+ // The top-level field name in the method config.
60
+ // Filter implementations should use their primary config proto type
61
+ // name for this.
62
+ // The value of this field in the method config will be a JSON array,
63
+ // which will be populated with the elements returned by each filter
64
+ // instance.
65
+ std::string service_config_field_name;
66
+ // The element to add to the JSON array.
67
+ std::string element;
68
+ };
69
+
70
+ virtual ~XdsHttpFilterImpl() = default;
71
+
72
+ // Loads the proto message into the upb symtab.
73
+ virtual void PopulateSymtab(upb_symtab* symtab) const = 0;
74
+
75
+ // Generates a Config from the xDS filter config proto.
76
+ // Used for the top-level config in the HCM HTTP filter list.
77
+ virtual absl::StatusOr<FilterConfig> GenerateFilterConfig(
78
+ upb_strview serialized_filter_config, upb_arena* arena) const = 0;
79
+
80
+ // Generates a Config from the xDS filter config proto.
81
+ // Used for the typed_per_filter_config override in VirtualHost and Route.
82
+ virtual absl::StatusOr<FilterConfig> GenerateFilterConfigOverride(
83
+ upb_strview serialized_filter_config, upb_arena* arena) const = 0;
84
+
85
+ // C-core channel filter implementation.
86
+ virtual const grpc_channel_filter* channel_filter() const = 0;
87
+
88
+ // Modifies channel args that may affect service config parsing (not
89
+ // visible to the channel as a whole).
90
+ // Takes ownership of args. Caller takes ownership of return value.
91
+ virtual grpc_channel_args* ModifyChannelArgs(grpc_channel_args* args) const {
92
+ return args;
93
+ }
94
+
95
+ // Function to convert the Configs into a JSON string to be added to the
96
+ // per-method part of the service config.
97
+ // The hcm_filter_config comes from the HttpConnectionManager config.
98
+ // The filter_config_override comes from the first of the ClusterWeight,
99
+ // Route, or VirtualHost entries that it is found in, or null if
100
+ // there is no override in any of those locations.
101
+ virtual absl::StatusOr<ServiceConfigJsonEntry> GenerateServiceConfig(
102
+ const FilterConfig& hcm_filter_config,
103
+ const FilterConfig* filter_config_override) const = 0;
104
+
105
+ // Returns true if the filter is supported on clients; false otherwise
106
+ virtual bool IsSupportedOnClients() const = 0;
107
+
108
+ // Returns true if the filter is supported on servers; false otherwise
109
+ virtual bool IsSupportedOnServers() const = 0;
110
+ };
111
+
112
+ class XdsHttpFilterRegistry {
113
+ public:
114
+ static void RegisterFilter(
115
+ std::unique_ptr<XdsHttpFilterImpl> filter,
116
+ const std::set<absl::string_view>& config_proto_type_names);
117
+
118
+ static const XdsHttpFilterImpl* GetFilterForType(
119
+ absl::string_view proto_type_name);
120
+
121
+ static void PopulateSymtab(upb_symtab* symtab);
122
+
123
+ // Global init and shutdown.
124
+ static void Init();
125
+ static void Shutdown();
126
+ };
127
+
128
+ } // namespace grpc_core
129
+
130
+ #endif /* GRPC_CORE_EXT_XDS_XDS_HTTP_FILTERS_H */