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.
- checksums.yaml +4 -4
- data/Makefile +65 -37
- data/include/grpc/grpc.h +15 -1
- data/include/grpc/impl/codegen/port_platform.h +2 -0
- data/src/core/ext/filters/client_channel/client_channel.cc +327 -305
- data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
- data/src/core/ext/filters/client_channel/config_selector.h +8 -0
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -4
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
- data/src/core/ext/filters/client_channel/lb_policy.cc +3 -0
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +7 -22
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
- data/src/core/ext/filters/client_channel/resolver.cc +3 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +5 -9
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +18 -3
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +295 -91
- data/src/core/ext/filters/client_channel/server_address.cc +3 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +69 -146
- data/src/core/ext/filters/client_channel/subchannel.h +63 -95
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +495 -0
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
- data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +3 -2
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -2
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +457 -170
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +39 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +5 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +1 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +44 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +6 -5
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +13 -9
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
- data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +13 -7
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +21 -20
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
- data/src/core/ext/xds/xds_api.cc +1591 -279
- data/src/core/ext/xds/xds_api.h +279 -39
- data/src/core/ext/xds/xds_bootstrap.cc +21 -5
- data/src/core/ext/xds/xds_bootstrap.h +5 -1
- data/src/core/ext/xds/xds_client.cc +168 -23
- data/src/core/ext/xds/xds_client.h +26 -0
- data/src/core/ext/xds/xds_client_stats.h +2 -2
- data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
- data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
- data/src/core/ext/xds/xds_http_filters.cc +114 -0
- data/src/core/ext/xds/xds_http_filters.h +130 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +391 -126
- data/src/core/lib/channel/channel_stack.cc +12 -0
- data/src/core/lib/channel/channel_stack.h +7 -0
- data/src/core/lib/channel/channelz.cc +92 -4
- data/src/core/lib/channel/channelz.h +30 -1
- data/src/core/lib/channel/channelz_registry.cc +14 -0
- data/src/core/lib/channel/handshaker.cc +0 -39
- data/src/core/lib/channel/handshaker.h +0 -17
- data/src/core/lib/channel/status_util.cc +12 -2
- data/src/core/lib/channel/status_util.h +5 -0
- data/src/core/lib/gpr/sync_abseil.cc +3 -6
- data/src/core/lib/gpr/sync_windows.cc +2 -2
- data/src/core/lib/gprpp/atomic.h +3 -3
- data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
- data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
- data/src/core/lib/gprpp/thd.h +1 -1
- data/src/core/lib/iomgr/buffer_list.h +1 -1
- data/src/core/lib/iomgr/cfstream_handle.cc +2 -2
- data/src/core/lib/iomgr/error.h +1 -1
- data/src/core/lib/iomgr/ev_apple.cc +1 -1
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -3
- data/src/core/lib/iomgr/ev_posix.cc +3 -3
- data/src/core/lib/iomgr/exec_ctx.cc +6 -2
- data/src/core/lib/iomgr/resource_quota.cc +1 -1
- data/src/core/lib/iomgr/sockaddr_utils.cc +120 -0
- data/src/core/lib/iomgr/sockaddr_utils.h +25 -0
- data/src/core/lib/iomgr/tcp_posix.cc +1 -4
- data/src/core/lib/iomgr/tcp_uv.cc +2 -2
- data/src/core/lib/iomgr/timer_generic.cc +2 -2
- data/src/core/lib/iomgr/timer_manager.cc +1 -1
- data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
- data/src/core/lib/{security/authorization → matchers}/matchers.cc +8 -8
- data/src/core/lib/{security/authorization → matchers}/matchers.h +14 -12
- data/src/core/lib/security/security_connector/ssl_utils.cc +6 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +6 -0
- data/src/core/lib/security/transport/security_handshaker.cc +32 -2
- data/src/core/lib/slice/slice_intern.cc +6 -7
- data/src/core/lib/surface/channel.h +3 -3
- data/src/core/lib/surface/completion_queue.cc +1 -1
- data/src/core/lib/surface/lame_client.cc +38 -19
- data/src/core/lib/surface/lame_client.h +4 -3
- data/src/core/lib/surface/server.cc +40 -33
- data/src/core/lib/surface/server.h +74 -15
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/metadata_batch.cc +27 -0
- data/src/core/lib/transport/metadata_batch.h +14 -0
- data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -4
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
- data/src/core/tsi/fake_transport_security.cc +10 -1
- data/src/ruby/ext/grpc/extconf.rb +9 -1
- data/src/ruby/ext/grpc/rb_channel.c +10 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
- data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
- data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
- data/src/ruby/ext/grpc/rb_grpc.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
- data/src/ruby/ext/grpc/rb_server.c +13 -1
- data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
- data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
- data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
- data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
- data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/call_spec.rb +1 -1
- data/src/ruby/spec/channel_credentials_spec.rb +32 -0
- data/src/ruby/spec/channel_spec.rb +17 -6
- data/src/ruby/spec/client_auth_spec.rb +27 -1
- data/src/ruby/spec/errors_spec.rb +1 -1
- data/src/ruby/spec/generic/active_call_spec.rb +2 -2
- data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
- data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
- data/src/ruby/spec/server_credentials_spec.rb +25 -0
- data/src/ruby/spec/server_spec.rb +22 -0
- data/third_party/boringssl-with-bazel/err_data.c +255 -255
- data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
- data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +7 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +0 -28
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +25 -9
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -1
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +33 -19
- data/third_party/xxhash/xxhash.h +5443 -0
- metadata +93 -49
- data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
- data/src/core/lib/security/authorization/authorization_engine.h +0 -84
- data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
- data/src/core/lib/security/authorization/evaluate_args.h +0 -59
- data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
- data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
- data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
- data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -99
- data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
- data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
- data/third_party/upb/upb/json_decode.c +0 -1443
- data/third_party/upb/upb/json_decode.h +0 -23
- data/third_party/upb/upb/json_encode.c +0 -713
- 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
|
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(
|
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 */
|