grpc 1.32.0 → 1.36.0
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 +1086 -3054
- data/etc/roots.pem +257 -573
- data/include/grpc/compression.h +1 -1
- data/include/grpc/grpc.h +15 -7
- data/include/grpc/grpc_security.h +227 -171
- data/include/grpc/impl/codegen/atm_windows.h +4 -0
- data/include/grpc/impl/codegen/byte_buffer.h +1 -1
- data/include/grpc/impl/codegen/grpc_types.h +10 -8
- data/include/grpc/impl/codegen/log.h +0 -2
- data/include/grpc/impl/codegen/port_platform.h +22 -55
- data/include/grpc/impl/codegen/sync_windows.h +4 -0
- data/include/grpc/slice_buffer.h +3 -3
- data/include/grpc/support/sync.h +3 -3
- data/include/grpc/support/time.h +7 -7
- data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
- data/src/core/ext/filters/client_channel/client_channel.cc +2788 -1535
- data/src/core/ext/filters/client_channel/client_channel.h +0 -6
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.cc +0 -4
- data/src/core/ext/filters/client_channel/config_selector.h +40 -8
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +186 -0
- data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +10 -7
- data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -4
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +7 -8
- data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
- data/src/core/ext/filters/client_channel/lb_policy.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy.h +6 -7
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +48 -35
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -3
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +204 -195
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +58 -26
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -5
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +14 -34
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +6 -6
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +478 -145
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +52 -24
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +29 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +810 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +722 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1384 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
- data/src/core/ext/filters/client_channel/resolver.cc +4 -5
- data/src/core/ext/filters/client_channel/resolver.h +5 -13
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +43 -59
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +443 -17
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +22 -23
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +21 -18
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +362 -0
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +37 -30
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +566 -366
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +28 -0
- data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
- data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
- data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +29 -74
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +12 -10
- data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
- data/src/core/ext/filters/client_channel/retry_throttle.h +4 -2
- data/src/core/ext/filters/client_channel/server_address.cc +86 -0
- data/src/core/ext/filters/client_channel/server_address.h +52 -36
- data/src/core/ext/filters/client_channel/service_config.cc +18 -13
- data/src/core/ext/filters/client_channel/service_config.h +8 -5
- data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/service_config_parser.cc +8 -6
- data/src/core/ext/filters/client_channel/service_config_parser.h +8 -5
- data/src/core/ext/filters/client_channel/subchannel.cc +53 -66
- data/src/core/ext/filters/client_channel/subchannel.h +14 -20
- data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -5
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -2
- data/src/core/ext/filters/deadline/deadline_filter.cc +87 -79
- data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
- data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
- data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
- data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
- data/src/core/ext/filters/max_age/max_age_filter.cc +36 -33
- data/src/core/ext/filters/message_size/message_size_filter.cc +3 -2
- data/src/core/ext/filters/message_size/message_size_filter.h +2 -1
- data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
- data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +20 -8
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +26 -14
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +226 -95
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +28 -42
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +13 -3
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -8
- data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
- data/src/core/ext/transport/chttp2/transport/parsing.cc +18 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
- data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +52 -33
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +199 -34
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +171 -98
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +625 -202
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +24 -23
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +62 -21
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +36 -24
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +133 -39
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +70 -45
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +275 -78
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +31 -24
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +107 -47
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +53 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +149 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +74 -28
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +248 -43
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +41 -41
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +172 -89
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +63 -39
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +254 -60
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +42 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +126 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -14
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +49 -27
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +204 -48
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +47 -26
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +181 -48
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -3
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -17
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +96 -33
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +15 -13
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +70 -37
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +352 -199
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +1334 -443
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +8 -7
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +34 -10
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +129 -80
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +525 -166
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +26 -24
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +121 -64
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +7 -6
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +29 -8
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +70 -29
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +296 -63
- data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +51 -34
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +188 -75
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -4
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -4
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -8
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -3
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +22 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
- data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +242 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +830 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +54 -37
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +171 -59
- data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
- data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
- data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
- data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -0
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +64 -0
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
- data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
- data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +28 -0
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +36 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
- data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
- data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
- data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
- data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +251 -0
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +543 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +136 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +272 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +135 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +228 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +80 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +43 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +68 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +107 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +195 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +193 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +59 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +101 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +938 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +285 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +61 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +504 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +44 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +170 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +97 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +246 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
- data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
- data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +142 -0
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +65 -0
- data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +73 -0
- data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +72 -0
- data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +80 -0
- data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +80 -0
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +69 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
- data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
- data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
- data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
- data/src/core/ext/{upb-generated/gogoproto/gogo.upb.h → upbdefs-generated/envoy/type/v3/http.upbdefs.h} +10 -9
- data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
- data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
- data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
- data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +39 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +40 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +40 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
- data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
- data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +310 -0
- data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
- data/src/core/ext/xds/certificate_provider_factory.h +61 -0
- data/src/core/ext/xds/certificate_provider_registry.cc +103 -0
- data/src/core/ext/xds/certificate_provider_registry.h +57 -0
- data/src/core/ext/xds/certificate_provider_store.cc +87 -0
- data/src/core/ext/xds/certificate_provider_store.h +112 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +144 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +69 -0
- data/src/core/ext/xds/xds_api.cc +1149 -1058
- data/src/core/ext/xds/xds_api.h +215 -144
- data/src/core/ext/xds/xds_bootstrap.cc +228 -62
- data/src/core/ext/xds/xds_bootstrap.h +35 -12
- data/src/core/ext/xds/xds_certificate_provider.cc +405 -0
- data/src/core/ext/xds/xds_certificate_provider.h +151 -0
- data/src/core/ext/xds/xds_channel_args.h +6 -3
- data/src/core/ext/xds/xds_client.cc +620 -495
- data/src/core/ext/xds/xds_client.h +121 -58
- data/src/core/ext/xds/xds_client_stats.cc +61 -17
- data/src/core/ext/xds/xds_client_stats.h +35 -7
- data/src/core/ext/xds/xds_server_config_fetcher.cc +267 -0
- data/src/core/lib/channel/channel_args.cc +9 -8
- data/src/core/lib/channel/channel_args.h +0 -1
- data/src/core/lib/channel/channel_trace.cc +4 -2
- data/src/core/lib/channel/channel_trace.h +1 -1
- data/src/core/lib/channel/channelz.cc +23 -59
- data/src/core/lib/channel/channelz.h +13 -22
- data/src/core/lib/channel/channelz_registry.cc +12 -11
- data/src/core/lib/channel/channelz_registry.h +3 -1
- data/src/core/lib/channel/handshaker.cc +4 -7
- data/src/core/lib/channel/handshaker.h +3 -3
- data/src/core/lib/compression/compression.cc +8 -4
- data/src/core/lib/compression/compression_args.cc +3 -2
- data/src/core/lib/compression/compression_internal.cc +10 -5
- data/src/core/lib/compression/compression_internal.h +2 -1
- data/src/core/lib/compression/stream_compression_identity.cc +1 -3
- data/src/core/lib/debug/stats.h +2 -2
- data/src/core/lib/debug/stats_data.cc +1 -0
- data/src/core/lib/debug/stats_data.h +13 -13
- data/src/core/lib/gpr/alloc.cc +3 -2
- data/src/core/lib/gpr/cpu_iphone.cc +10 -2
- data/src/core/lib/gpr/log.cc +59 -17
- data/src/core/lib/gpr/log_linux.cc +19 -3
- data/src/core/lib/gpr/log_posix.cc +15 -1
- data/src/core/lib/gpr/log_windows.cc +18 -4
- data/src/core/lib/gpr/murmur_hash.cc +1 -1
- data/src/core/lib/gpr/spinlock.h +10 -2
- data/src/core/lib/gpr/string.cc +23 -22
- data/src/core/lib/gpr/string.h +5 -6
- data/src/core/lib/gpr/sync.cc +4 -4
- data/src/core/lib/gpr/time.cc +12 -12
- data/src/core/lib/gpr/time_precise.cc +5 -2
- data/src/core/lib/gpr/time_precise.h +6 -2
- data/src/core/lib/gpr/tls.h +4 -0
- data/src/core/lib/gpr/tls_msvc.h +2 -0
- data/src/core/lib/gpr/tls_stdcpp.h +48 -0
- data/src/core/lib/gpr/useful.h +5 -4
- data/src/core/lib/gprpp/arena.h +3 -2
- data/src/core/lib/gprpp/dual_ref_counted.h +331 -0
- data/src/core/lib/gprpp/examine_stack.cc +43 -0
- data/src/core/lib/gprpp/examine_stack.h +46 -0
- data/src/core/lib/gprpp/fork.cc +2 -2
- data/src/core/lib/gprpp/manual_constructor.h +1 -1
- data/src/core/lib/gprpp/mpscq.cc +2 -2
- data/src/core/lib/gprpp/orphanable.h +4 -8
- data/src/core/lib/gprpp/ref_counted.h +91 -68
- data/src/core/lib/gprpp/ref_counted_ptr.h +166 -7
- data/src/core/lib/{security/authorization/mock_cel/statusor.h → gprpp/stat.h} +13 -25
- data/src/core/lib/gprpp/stat_posix.cc +49 -0
- data/src/core/lib/gprpp/stat_windows.cc +48 -0
- data/src/core/lib/gprpp/sync.h +129 -40
- data/src/core/lib/gprpp/thd.h +2 -2
- data/src/core/lib/gprpp/thd_posix.cc +42 -37
- data/src/core/lib/gprpp/thd_windows.cc +3 -1
- data/src/core/lib/gprpp/time_util.cc +77 -0
- data/src/core/lib/gprpp/time_util.h +42 -0
- data/src/core/lib/http/httpcli.cc +1 -1
- data/src/core/lib/http/httpcli.h +2 -3
- data/src/core/lib/http/httpcli_security_connector.cc +3 -3
- data/src/core/lib/http/parser.cc +47 -27
- data/src/core/lib/iomgr/call_combiner.cc +8 -5
- data/src/core/lib/iomgr/combiner.cc +2 -1
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -5
- data/src/core/lib/iomgr/error.cc +17 -12
- data/src/core/lib/iomgr/error_internal.h +1 -1
- data/src/core/lib/iomgr/ev_apple.cc +10 -7
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -13
- data/src/core/lib/iomgr/ev_epollex_linux.cc +29 -21
- data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
- data/src/core/lib/iomgr/exec_ctx.cc +1 -1
- data/src/core/lib/iomgr/exec_ctx.h +16 -12
- data/src/core/lib/iomgr/executor.cc +2 -1
- data/src/core/lib/iomgr/executor.h +1 -1
- data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
- data/src/core/lib/iomgr/executor/threadpool.h +4 -4
- data/src/core/lib/iomgr/iomgr.cc +1 -1
- data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
- data/src/core/lib/iomgr/load_file.h +1 -1
- data/src/core/lib/iomgr/lockfree_event.cc +19 -14
- data/src/core/lib/iomgr/lockfree_event.h +2 -2
- data/src/core/lib/iomgr/parse_address.cc +127 -43
- data/src/core/lib/iomgr/parse_address.h +32 -8
- data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
- data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
- data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
- data/src/core/lib/iomgr/python_util.h +4 -4
- data/src/core/lib/iomgr/resolve_address.cc +4 -4
- data/src/core/lib/iomgr/resolve_address_posix.cc +1 -5
- data/src/core/lib/iomgr/resource_quota.cc +4 -4
- data/src/core/lib/iomgr/sockaddr_utils.cc +11 -11
- data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
- data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
- data/src/core/lib/iomgr/socket_mutator.cc +3 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
- data/src/core/lib/iomgr/tcp_client.cc +3 -3
- data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
- data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
- data/src/core/lib/iomgr/tcp_custom.cc +22 -17
- data/src/core/lib/iomgr/tcp_posix.cc +16 -12
- data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
- data/src/core/lib/iomgr/timer_custom.cc +5 -5
- data/src/core/lib/iomgr/timer_generic.cc +3 -3
- data/src/core/lib/iomgr/timer_manager.cc +2 -2
- data/src/core/lib/iomgr/udp_server.cc +1 -2
- data/src/core/lib/iomgr/udp_server.h +1 -2
- data/src/core/lib/iomgr/unix_sockets_posix.cc +32 -21
- data/src/core/lib/iomgr/unix_sockets_posix.h +5 -0
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +7 -0
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
- data/src/core/lib/json/json.h +12 -2
- data/src/core/lib/json/json_reader.cc +8 -4
- data/src/core/lib/json/json_util.cc +58 -0
- data/src/core/lib/json/json_util.h +204 -0
- data/src/core/lib/json/json_writer.cc +2 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +5 -10
- data/src/core/lib/security/authorization/evaluate_args.h +1 -1
- data/src/core/lib/security/authorization/matchers.cc +339 -0
- data/src/core/lib/security/authorization/matchers.h +158 -0
- data/src/core/lib/security/authorization/mock_cel/activation.h +1 -1
- data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +3 -1
- data/src/core/lib/security/authorization/mock_cel/cel_expression.h +5 -4
- data/src/core/lib/security/authorization/mock_cel/cel_value.h +13 -7
- data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +6 -6
- data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +10 -9
- data/src/core/lib/security/context/security_context.cc +4 -3
- data/src/core/lib/security/context/security_context.h +3 -1
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
- data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
- data/src/core/lib/security/credentials/credentials.cc +7 -7
- data/src/core/lib/security/credentials/credentials.h +5 -4
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +213 -0
- data/src/core/lib/security/credentials/external/aws_request_signer.h +72 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +497 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.h +120 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +135 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +48 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +213 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +58 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -2
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -18
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +64 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +3 -3
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -4
- data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
- data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +39 -46
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +7 -6
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +346 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +213 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +399 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +138 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +78 -150
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +57 -187
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -13
- data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -3
- data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
- data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +244 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.h +69 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -13
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +121 -0
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +87 -0
- data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
- data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +3 -3
- data/src/core/lib/security/security_connector/security_connector.cc +4 -3
- data/src/core/lib/security/security_connector/security_connector.h +4 -2
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
- data/src/core/lib/security/security_connector/ssl_utils.cc +5 -2
- data/src/core/lib/security/security_connector/ssl_utils.h +19 -19
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +354 -279
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +105 -61
- data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
- data/src/core/lib/security/transport/security_handshaker.cc +4 -6
- data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
- data/src/core/lib/security/util/json_util.h +1 -0
- data/src/core/lib/slice/slice.cc +7 -4
- data/src/core/lib/slice/slice_buffer.cc +2 -1
- data/src/core/lib/slice/slice_intern.cc +7 -8
- data/src/core/lib/slice/slice_internal.h +2 -2
- data/src/core/lib/surface/call.cc +41 -32
- data/src/core/lib/surface/call_details.cc +8 -8
- data/src/core/lib/surface/channel.cc +25 -41
- data/src/core/lib/surface/channel.h +9 -3
- data/src/core/lib/surface/channel_init.cc +1 -1
- data/src/core/lib/surface/completion_queue.cc +30 -24
- data/src/core/lib/surface/completion_queue.h +16 -16
- data/src/core/lib/surface/init.cc +45 -29
- data/src/core/lib/surface/lame_client.cc +20 -46
- data/src/core/lib/surface/lame_client.h +4 -0
- data/src/core/lib/surface/server.cc +66 -20
- data/src/core/lib/surface/server.h +42 -7
- data/src/core/lib/surface/validate_metadata.h +3 -0
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/authority_override.cc +6 -4
- data/src/core/lib/transport/authority_override.h +7 -2
- data/src/core/lib/transport/bdp_estimator.cc +1 -1
- data/src/core/lib/transport/bdp_estimator.h +2 -1
- data/src/core/lib/transport/byte_stream.h +3 -3
- data/src/core/lib/transport/connectivity_state.h +11 -9
- data/src/core/lib/transport/error_utils.h +1 -1
- data/src/core/lib/transport/metadata.cc +16 -2
- data/src/core/lib/transport/metadata.h +2 -2
- data/src/core/lib/transport/metadata_batch.h +4 -4
- data/src/core/lib/transport/static_metadata.cc +1 -1
- data/src/core/lib/transport/status_metadata.cc +4 -3
- data/src/core/lib/transport/timeout_encoding.cc +4 -4
- data/src/core/lib/transport/transport.cc +5 -3
- data/src/core/lib/transport/transport.h +8 -8
- data/src/core/lib/uri/uri_parser.cc +131 -249
- data/src/core/lib/uri/uri_parser.h +57 -21
- data/src/core/plugin_registry/grpc_plugin_registry.cc +47 -20
- data/src/core/tsi/alts/crypt/gsec.cc +5 -4
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +18 -21
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +43 -47
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
- data/src/core/tsi/fake_transport_security.cc +7 -4
- data/src/core/tsi/local_transport_security.cc +5 -1
- data/src/core/tsi/local_transport_security.h +6 -7
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -2
- data/src/core/tsi/ssl_transport_security.cc +75 -58
- data/src/core/tsi/ssl_transport_security.h +6 -6
- data/src/core/tsi/transport_security.cc +10 -8
- data/src/core/tsi/transport_security_interface.h +1 -1
- data/src/ruby/ext/grpc/extconf.rb +1 -1
- data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +36 -16
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +70 -40
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +35 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
- data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
- data/third_party/abseil-cpp/absl/algorithm/container.h +59 -22
- data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
- data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
- data/third_party/abseil-cpp/absl/base/casts.h +9 -6
- data/third_party/abseil-cpp/absl/base/config.h +60 -17
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
- data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -0
- data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +1 -1
- data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
- data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
- data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
- data/third_party/abseil-cpp/absl/base/macros.h +36 -109
- data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
- data/third_party/abseil-cpp/absl/base/options.h +31 -4
- data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
- data/third_party/abseil-cpp/absl/container/fixed_array.h +42 -25
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +2 -1
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
- data/third_party/abseil-cpp/absl/container/internal/common.h +6 -2
- data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +49 -29
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +15 -0
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +24 -7
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -1
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +35 -11
- data/third_party/abseil-cpp/absl/container/internal/have_sse.h +10 -9
- data/third_party/abseil-cpp/absl/container/internal/layout.h +7 -5
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +55 -34
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +5 -4
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +66 -16
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +4 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +13 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +43 -24
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +12 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +10 -2
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +22 -1
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +0 -21
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +12 -1
- data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +100 -20
- data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
- data/third_party/abseil-cpp/absl/functional/function_ref.h +1 -1
- data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
- data/third_party/abseil-cpp/absl/hash/hash.h +6 -5
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +73 -65
- data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
- data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
- data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
- data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
- data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
- data/third_party/abseil-cpp/absl/status/status.cc +4 -6
- data/third_party/abseil-cpp/absl/status/status.h +502 -113
- data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +5 -10
- data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
- data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
- data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
- data/third_party/abseil-cpp/absl/strings/cord.cc +91 -112
- data/third_party/abseil-cpp/absl/strings/cord.h +360 -205
- data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +45 -23
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
- data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
- data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
- data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
- data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
- data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
- data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
- data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +4 -3
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +28 -28
- data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +4 -16
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -1
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +8 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -2
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -64
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +15 -6
- data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -9
- data/third_party/abseil-cpp/absl/time/clock.cc +3 -3
- data/third_party/abseil-cpp/absl/time/duration.cc +90 -59
- data/third_party/abseil-cpp/absl/time/format.cc +43 -36
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +26 -16
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +4 -2
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +136 -129
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +8 -7
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -6
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -1
- data/third_party/abseil-cpp/absl/time/time.h +15 -16
- data/third_party/abseil-cpp/absl/types/internal/variant.h +4 -4
- data/third_party/abseil-cpp/absl/types/optional.h +9 -9
- data/third_party/abseil-cpp/absl/types/span.h +49 -36
- data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
- data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
- data/third_party/boringssl-with-bazel/err_data.c +728 -720
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -20
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
- data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
- data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
- data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
- data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
- data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +9 -43
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +55 -4
- data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +34 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +6 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
- data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
- data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +128 -38
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +30 -10
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +107 -54
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +155 -2
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +112 -36
- data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +63 -9
- data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
- data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
- data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +118 -49
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +267 -95
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +210 -34
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +6 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +8 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +27 -21
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +32 -11
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +67 -67
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +29 -35
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +42 -25
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +9 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +10 -10
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +3 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +28 -40
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +38 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +1 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +25 -24
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +32 -28
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +42 -22
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +55 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +7 -7
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
- data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +10 -8
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -546
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +15 -7
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +21 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +62 -20
- data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +10 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +16 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
- data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +106 -27
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -8
- data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +42 -14
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +462 -163
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +593 -440
- data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
- data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +35 -0
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +22 -21
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +13 -23
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +11 -6
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +82 -26
- data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
- data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +49 -9
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +8 -9
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +87 -14
- data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +18 -22
- data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +537 -34
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -2
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +59 -21
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +194 -58
- data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
- data/third_party/upb/upb/decode.c +248 -167
- data/third_party/upb/upb/decode.h +20 -1
- data/third_party/upb/upb/decode.int.h +163 -0
- data/third_party/upb/upb/decode_fast.c +1040 -0
- data/third_party/upb/upb/decode_fast.h +126 -0
- data/third_party/upb/upb/def.c +2178 -0
- data/third_party/upb/upb/def.h +315 -0
- data/third_party/upb/upb/def.hpp +439 -0
- data/third_party/upb/upb/encode.c +227 -169
- data/third_party/upb/upb/encode.h +27 -2
- data/third_party/upb/upb/json_decode.c +1443 -0
- data/third_party/upb/upb/json_decode.h +23 -0
- data/third_party/upb/upb/json_encode.c +713 -0
- data/third_party/upb/upb/json_encode.h +36 -0
- data/third_party/upb/upb/msg.c +167 -88
- data/third_party/upb/upb/msg.h +174 -34
- data/third_party/upb/upb/port_def.inc +74 -61
- data/third_party/upb/upb/port_undef.inc +3 -7
- data/third_party/upb/upb/reflection.c +408 -0
- data/third_party/upb/upb/reflection.h +168 -0
- data/third_party/upb/upb/table.c +34 -197
- data/third_party/upb/upb/table.int.h +14 -5
- data/third_party/upb/upb/text_encode.c +421 -0
- data/third_party/upb/upb/text_encode.h +38 -0
- data/third_party/upb/upb/upb.c +18 -41
- data/third_party/upb/upb/upb.h +36 -7
- data/third_party/upb/upb/upb.hpp +4 -4
- data/third_party/upb/upb/upb.int.h +29 -0
- metadata +309 -63
- data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -946
- data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +0 -537
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +0 -1141
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -354
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -142
- data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +0 -17
- data/src/core/ext/xds/xds_channel.h +0 -46
- data/src/core/ext/xds/xds_channel_secure.cc +0 -103
- data/src/core/lib/gprpp/map.h +0 -53
- data/src/core/lib/iomgr/iomgr_posix.h +0 -26
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c +0 -110
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c +0 -274
- data/third_party/upb/upb/port.c +0 -26
@@ -0,0 +1,87 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2020 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
21
|
+
#include "src/core/ext/xds/certificate_provider_store.h"
|
22
|
+
|
23
|
+
#include "src/core/ext/xds/certificate_provider_registry.h"
|
24
|
+
|
25
|
+
namespace grpc_core {
|
26
|
+
|
27
|
+
// If a certificate provider is created, the CertificateProviderStore
|
28
|
+
// maintains a raw pointer to the created CertificateProviderWrapper so that
|
29
|
+
// future calls to `CreateOrGetCertificateProvider()` with the same key result
|
30
|
+
// in returning a ref to this created certificate provider. This entry is
|
31
|
+
// deleted when the refcount to this provider reaches zero.
|
32
|
+
RefCountedPtr<grpc_tls_certificate_provider>
|
33
|
+
CertificateProviderStore::CreateOrGetCertificateProvider(
|
34
|
+
absl::string_view key) {
|
35
|
+
RefCountedPtr<CertificateProviderWrapper> result;
|
36
|
+
MutexLock lock(&mu_);
|
37
|
+
auto it = certificate_providers_map_.find(key);
|
38
|
+
if (it == certificate_providers_map_.end()) {
|
39
|
+
result = CreateCertificateProviderLocked(key);
|
40
|
+
if (result != nullptr) {
|
41
|
+
certificate_providers_map_.insert({result->key(), result.get()});
|
42
|
+
}
|
43
|
+
} else {
|
44
|
+
result = it->second->RefIfNonZero();
|
45
|
+
if (result == nullptr) {
|
46
|
+
result = CreateCertificateProviderLocked(key);
|
47
|
+
it->second = result.get();
|
48
|
+
}
|
49
|
+
}
|
50
|
+
return result;
|
51
|
+
}
|
52
|
+
|
53
|
+
RefCountedPtr<CertificateProviderStore::CertificateProviderWrapper>
|
54
|
+
CertificateProviderStore::CreateCertificateProviderLocked(
|
55
|
+
absl::string_view key) {
|
56
|
+
auto plugin_config_it = plugin_config_map_.find(std::string(key));
|
57
|
+
if (plugin_config_it == plugin_config_map_.end()) {
|
58
|
+
return nullptr;
|
59
|
+
}
|
60
|
+
CertificateProviderFactory* factory =
|
61
|
+
CertificateProviderRegistry::LookupCertificateProviderFactory(
|
62
|
+
plugin_config_it->second.plugin_name);
|
63
|
+
if (factory == nullptr) {
|
64
|
+
// This should never happen since an entry is only inserted in the
|
65
|
+
// plugin_config_map_ if the corresponding factory was found when parsing
|
66
|
+
// the xDS bootstrap file.
|
67
|
+
gpr_log(GPR_ERROR, "Certificate provider factory %s not found",
|
68
|
+
plugin_config_it->second.plugin_name.c_str());
|
69
|
+
return nullptr;
|
70
|
+
}
|
71
|
+
return MakeRefCounted<CertificateProviderWrapper>(
|
72
|
+
factory->CreateCertificateProvider(plugin_config_it->second.config),
|
73
|
+
Ref(), plugin_config_it->first);
|
74
|
+
}
|
75
|
+
|
76
|
+
void CertificateProviderStore::ReleaseCertificateProvider(
|
77
|
+
absl::string_view key, CertificateProviderWrapper* wrapper) {
|
78
|
+
MutexLock lock(&mu_);
|
79
|
+
auto it = certificate_providers_map_.find(key);
|
80
|
+
if (it != certificate_providers_map_.end()) {
|
81
|
+
if (it->second == wrapper) {
|
82
|
+
certificate_providers_map_.erase(it);
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
} // namespace grpc_core
|
@@ -0,0 +1,112 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2020 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
|
19
|
+
#ifndef GRPC_CORE_EXT_XDS_CERTIFICATE_PROVIDER_STORE_H
|
20
|
+
#define GRPC_CORE_EXT_XDS_CERTIFICATE_PROVIDER_STORE_H
|
21
|
+
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
|
24
|
+
#include <map>
|
25
|
+
|
26
|
+
#include "absl/strings/string_view.h"
|
27
|
+
|
28
|
+
#include "src/core/ext/xds/certificate_provider_factory.h"
|
29
|
+
#include "src/core/lib/gprpp/orphanable.h"
|
30
|
+
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
31
|
+
#include "src/core/lib/gprpp/sync.h"
|
32
|
+
#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h"
|
33
|
+
|
34
|
+
namespace grpc_core {
|
35
|
+
|
36
|
+
// Map for xDS based grpc_tls_certificate_provider instances.
|
37
|
+
class CertificateProviderStore
|
38
|
+
: public InternallyRefCounted<CertificateProviderStore> {
|
39
|
+
public:
|
40
|
+
struct PluginDefinition {
|
41
|
+
std::string plugin_name;
|
42
|
+
RefCountedPtr<CertificateProviderFactory::Config> config;
|
43
|
+
};
|
44
|
+
|
45
|
+
// Maps plugin instance (opaque) name to plugin defition.
|
46
|
+
typedef std::map<std::string, PluginDefinition> PluginDefinitionMap;
|
47
|
+
|
48
|
+
explicit CertificateProviderStore(PluginDefinitionMap plugin_config_map)
|
49
|
+
: plugin_config_map_(std::move(plugin_config_map)) {}
|
50
|
+
|
51
|
+
// If a certificate provider corresponding to the instance name \a key is
|
52
|
+
// found, a ref to the grpc_tls_certificate_provider is returned. If no
|
53
|
+
// provider is found for the key, a new provider is created from the plugin
|
54
|
+
// definition map.
|
55
|
+
// Returns nullptr on failure to get or create a new certificate provider.
|
56
|
+
RefCountedPtr<grpc_tls_certificate_provider> CreateOrGetCertificateProvider(
|
57
|
+
absl::string_view key);
|
58
|
+
|
59
|
+
void Orphan() override { Unref(); }
|
60
|
+
|
61
|
+
private:
|
62
|
+
// A thin wrapper around `grpc_tls_certificate_provider` which allows removing
|
63
|
+
// the entry from the CertificateProviderStore when the refcount reaches zero.
|
64
|
+
class CertificateProviderWrapper : public grpc_tls_certificate_provider {
|
65
|
+
public:
|
66
|
+
CertificateProviderWrapper(
|
67
|
+
RefCountedPtr<grpc_tls_certificate_provider> certificate_provider,
|
68
|
+
RefCountedPtr<CertificateProviderStore> store, absl::string_view key)
|
69
|
+
: certificate_provider_(std::move(certificate_provider)),
|
70
|
+
store_(std::move(store)),
|
71
|
+
key_(key) {}
|
72
|
+
|
73
|
+
~CertificateProviderWrapper() override {
|
74
|
+
store_->ReleaseCertificateProvider(key_, this);
|
75
|
+
}
|
76
|
+
|
77
|
+
grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor()
|
78
|
+
const override {
|
79
|
+
return certificate_provider_->distributor();
|
80
|
+
}
|
81
|
+
|
82
|
+
grpc_pollset_set* interested_parties() const override {
|
83
|
+
return certificate_provider_->interested_parties();
|
84
|
+
}
|
85
|
+
|
86
|
+
absl::string_view key() const { return key_; }
|
87
|
+
|
88
|
+
private:
|
89
|
+
RefCountedPtr<grpc_tls_certificate_provider> certificate_provider_;
|
90
|
+
RefCountedPtr<CertificateProviderStore> store_;
|
91
|
+
absl::string_view key_;
|
92
|
+
};
|
93
|
+
|
94
|
+
RefCountedPtr<CertificateProviderWrapper> CreateCertificateProviderLocked(
|
95
|
+
absl::string_view key);
|
96
|
+
|
97
|
+
// Releases a previously created certificate provider from the certificate
|
98
|
+
// provider map if the value matches \a wrapper.
|
99
|
+
void ReleaseCertificateProvider(absl::string_view key,
|
100
|
+
CertificateProviderWrapper* wrapper);
|
101
|
+
|
102
|
+
Mutex mu_;
|
103
|
+
// Map of plugin configurations
|
104
|
+
PluginDefinitionMap plugin_config_map_;
|
105
|
+
// Underlying map for the providers.
|
106
|
+
std::map<absl::string_view, CertificateProviderWrapper*>
|
107
|
+
certificate_providers_map_;
|
108
|
+
};
|
109
|
+
|
110
|
+
} // namespace grpc_core
|
111
|
+
|
112
|
+
#endif // GRPC_CORE_EXT_XDS_CERTIFICATE_PROVIDER_STORE_H
|
@@ -0,0 +1,144 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2020 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
21
|
+
#include "src/core/ext/xds/file_watcher_certificate_provider_factory.h"
|
22
|
+
|
23
|
+
#include "absl/strings/str_format.h"
|
24
|
+
#include "absl/strings/str_join.h"
|
25
|
+
|
26
|
+
#include "src/core/ext/xds/certificate_provider_registry.h"
|
27
|
+
#include "src/core/lib/json/json_util.h"
|
28
|
+
|
29
|
+
namespace grpc_core {
|
30
|
+
|
31
|
+
namespace {
|
32
|
+
|
33
|
+
const char* kFileWatcherPlugin = "file_watcher";
|
34
|
+
|
35
|
+
} // namespace
|
36
|
+
|
37
|
+
//
|
38
|
+
// FileWatcherCertificateProviderFactory::Config
|
39
|
+
//
|
40
|
+
|
41
|
+
const char* FileWatcherCertificateProviderFactory::Config::name() const {
|
42
|
+
return kFileWatcherPlugin;
|
43
|
+
}
|
44
|
+
|
45
|
+
std::string FileWatcherCertificateProviderFactory::Config::ToString() const {
|
46
|
+
std::vector<std::string> parts;
|
47
|
+
parts.push_back("{");
|
48
|
+
if (!identity_cert_file_.empty()) {
|
49
|
+
parts.push_back(
|
50
|
+
absl::StrFormat("certificate_file=\"%s\", ", identity_cert_file_));
|
51
|
+
}
|
52
|
+
if (!identity_cert_file_.empty()) {
|
53
|
+
parts.push_back(
|
54
|
+
absl::StrFormat("private_key_file=\"%s\", ", private_key_file_));
|
55
|
+
}
|
56
|
+
if (!identity_cert_file_.empty()) {
|
57
|
+
parts.push_back(
|
58
|
+
absl::StrFormat("ca_certificate_file=\"%s\", ", root_cert_file_));
|
59
|
+
}
|
60
|
+
parts.push_back(
|
61
|
+
absl::StrFormat("refresh_interval=%ldms}", refresh_interval_ms_));
|
62
|
+
return absl::StrJoin(parts, "");
|
63
|
+
}
|
64
|
+
|
65
|
+
RefCountedPtr<FileWatcherCertificateProviderFactory::Config>
|
66
|
+
FileWatcherCertificateProviderFactory::Config::Parse(const Json& config_json,
|
67
|
+
grpc_error** error) {
|
68
|
+
auto config = MakeRefCounted<FileWatcherCertificateProviderFactory::Config>();
|
69
|
+
if (config_json.type() != Json::Type::OBJECT) {
|
70
|
+
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
71
|
+
"error:config type should be OBJECT.");
|
72
|
+
return nullptr;
|
73
|
+
}
|
74
|
+
std::vector<grpc_error*> error_list;
|
75
|
+
ParseJsonObjectField(config_json.object_value(), "certificate_file",
|
76
|
+
&config->identity_cert_file_, &error_list, false);
|
77
|
+
ParseJsonObjectField(config_json.object_value(), "private_key_file",
|
78
|
+
&config->private_key_file_, &error_list, false);
|
79
|
+
if (config->identity_cert_file_.empty() !=
|
80
|
+
config->private_key_file_.empty()) {
|
81
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
82
|
+
"fields \"certificate_file\" and \"private_key_file\" must be both set "
|
83
|
+
"or both unset."));
|
84
|
+
}
|
85
|
+
ParseJsonObjectField(config_json.object_value(), "ca_certificate_file",
|
86
|
+
&config->root_cert_file_, &error_list, false);
|
87
|
+
if (config->identity_cert_file_.empty() && config->root_cert_file_.empty()) {
|
88
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
89
|
+
"At least one of \"certificate_file\" and \"ca_certificate_file\" must "
|
90
|
+
"be specified."));
|
91
|
+
}
|
92
|
+
if (!ParseJsonObjectFieldAsDuration(
|
93
|
+
config_json.object_value(), "refresh_interval",
|
94
|
+
&config->refresh_interval_ms_, &error_list, false)) {
|
95
|
+
config->refresh_interval_ms_ = 10 * 60 * 1000; // 10 minutes default
|
96
|
+
}
|
97
|
+
if (!error_list.empty()) {
|
98
|
+
*error = GRPC_ERROR_CREATE_FROM_VECTOR(
|
99
|
+
"Error parsing file watcher certificate provider config", &error_list);
|
100
|
+
return nullptr;
|
101
|
+
}
|
102
|
+
return config;
|
103
|
+
}
|
104
|
+
|
105
|
+
//
|
106
|
+
// FileWatcherCertificateProviderFactory
|
107
|
+
//
|
108
|
+
|
109
|
+
const char* FileWatcherCertificateProviderFactory::name() const {
|
110
|
+
return kFileWatcherPlugin;
|
111
|
+
}
|
112
|
+
|
113
|
+
RefCountedPtr<CertificateProviderFactory::Config>
|
114
|
+
FileWatcherCertificateProviderFactory::CreateCertificateProviderConfig(
|
115
|
+
const Json& config_json, grpc_error** error) {
|
116
|
+
return FileWatcherCertificateProviderFactory::Config::Parse(config_json,
|
117
|
+
error);
|
118
|
+
}
|
119
|
+
|
120
|
+
RefCountedPtr<grpc_tls_certificate_provider>
|
121
|
+
FileWatcherCertificateProviderFactory::CreateCertificateProvider(
|
122
|
+
RefCountedPtr<CertificateProviderFactory::Config> config) {
|
123
|
+
if (config->name() != name()) {
|
124
|
+
gpr_log(GPR_ERROR, "Wrong config type Actual:%s vs Expected:%s",
|
125
|
+
config->name(), name());
|
126
|
+
return nullptr;
|
127
|
+
}
|
128
|
+
auto* file_watcher_config =
|
129
|
+
static_cast<FileWatcherCertificateProviderFactory::Config*>(config.get());
|
130
|
+
return MakeRefCounted<FileWatcherCertificateProvider>(
|
131
|
+
file_watcher_config->private_key_file(),
|
132
|
+
file_watcher_config->identity_cert_file(),
|
133
|
+
file_watcher_config->root_cert_file(),
|
134
|
+
file_watcher_config->refresh_interval_ms() / GPR_MS_PER_SEC);
|
135
|
+
}
|
136
|
+
|
137
|
+
void FileWatcherCertificateProviderInit() {
|
138
|
+
CertificateProviderRegistry::RegisterCertificateProviderFactory(
|
139
|
+
absl::make_unique<FileWatcherCertificateProviderFactory>());
|
140
|
+
}
|
141
|
+
|
142
|
+
void FileWatcherCertificateProviderShutdown() {}
|
143
|
+
|
144
|
+
} // namespace grpc_core
|
@@ -0,0 +1,69 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2020 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
|
19
|
+
#ifndef GRPC_CORE_EXT_XDS_FILE_WATCHER_CERTIFICATE_PROVIDER_FACTORY_H
|
20
|
+
#define GRPC_CORE_EXT_XDS_FILE_WATCHER_CERTIFICATE_PROVIDER_FACTORY_H
|
21
|
+
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
|
24
|
+
#include "src/core/ext/xds/certificate_provider_factory.h"
|
25
|
+
|
26
|
+
namespace grpc_core {
|
27
|
+
|
28
|
+
class FileWatcherCertificateProviderFactory
|
29
|
+
: public CertificateProviderFactory {
|
30
|
+
public:
|
31
|
+
class Config : public CertificateProviderFactory::Config {
|
32
|
+
public:
|
33
|
+
static RefCountedPtr<Config> Parse(const Json& config_json,
|
34
|
+
grpc_error** error);
|
35
|
+
|
36
|
+
const char* name() const override;
|
37
|
+
|
38
|
+
std::string ToString() const override;
|
39
|
+
|
40
|
+
const std::string& identity_cert_file() const {
|
41
|
+
return identity_cert_file_;
|
42
|
+
}
|
43
|
+
|
44
|
+
const std::string& private_key_file() const { return private_key_file_; }
|
45
|
+
|
46
|
+
const std::string& root_cert_file() const { return root_cert_file_; }
|
47
|
+
|
48
|
+
grpc_millis refresh_interval_ms() const { return refresh_interval_ms_; }
|
49
|
+
|
50
|
+
private:
|
51
|
+
std::string identity_cert_file_;
|
52
|
+
std::string private_key_file_;
|
53
|
+
std::string root_cert_file_;
|
54
|
+
grpc_millis refresh_interval_ms_;
|
55
|
+
};
|
56
|
+
|
57
|
+
const char* name() const override;
|
58
|
+
|
59
|
+
RefCountedPtr<CertificateProviderFactory::Config>
|
60
|
+
CreateCertificateProviderConfig(const Json& config_json,
|
61
|
+
grpc_error** error) override;
|
62
|
+
|
63
|
+
RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
|
64
|
+
RefCountedPtr<CertificateProviderFactory::Config> config) override;
|
65
|
+
};
|
66
|
+
|
67
|
+
} // namespace grpc_core
|
68
|
+
|
69
|
+
#endif // GRPC_CORE_EXT_XDS_FILE_WATCHER_CERTIFICATE_PROVIDER_FACTORY_H
|
data/src/core/ext/xds/xds_api.cc
CHANGED
@@ -39,29 +39,46 @@
|
|
39
39
|
#include "src/core/lib/gpr/env.h"
|
40
40
|
#include "src/core/lib/gpr/string.h"
|
41
41
|
#include "src/core/lib/gpr/useful.h"
|
42
|
+
#include "src/core/lib/gprpp/host_port.h"
|
42
43
|
#include "src/core/lib/iomgr/error.h"
|
43
44
|
#include "src/core/lib/iomgr/sockaddr_utils.h"
|
45
|
+
#include "src/core/lib/slice/slice_utils.h"
|
44
46
|
|
47
|
+
#include "envoy/config/cluster/v3/circuit_breaker.upb.h"
|
45
48
|
#include "envoy/config/cluster/v3/cluster.upb.h"
|
49
|
+
#include "envoy/config/cluster/v3/cluster.upbdefs.h"
|
46
50
|
#include "envoy/config/core/v3/address.upb.h"
|
47
51
|
#include "envoy/config/core/v3/base.upb.h"
|
48
52
|
#include "envoy/config/core/v3/config_source.upb.h"
|
49
53
|
#include "envoy/config/core/v3/health_check.upb.h"
|
54
|
+
#include "envoy/config/core/v3/protocol.upb.h"
|
50
55
|
#include "envoy/config/endpoint/v3/endpoint.upb.h"
|
56
|
+
#include "envoy/config/endpoint/v3/endpoint.upbdefs.h"
|
51
57
|
#include "envoy/config/endpoint/v3/endpoint_components.upb.h"
|
52
58
|
#include "envoy/config/endpoint/v3/load_report.upb.h"
|
53
59
|
#include "envoy/config/listener/v3/api_listener.upb.h"
|
54
60
|
#include "envoy/config/listener/v3/listener.upb.h"
|
61
|
+
#include "envoy/config/listener/v3/listener_components.upb.h"
|
55
62
|
#include "envoy/config/route/v3/route.upb.h"
|
63
|
+
#include "envoy/config/route/v3/route.upbdefs.h"
|
56
64
|
#include "envoy/config/route/v3/route_components.upb.h"
|
65
|
+
#include "envoy/extensions/clusters/aggregate/v3/cluster.upb.h"
|
57
66
|
#include "envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h"
|
67
|
+
#include "envoy/extensions/transport_sockets/tls/v3/common.upb.h"
|
68
|
+
#include "envoy/extensions/transport_sockets/tls/v3/tls.upb.h"
|
58
69
|
#include "envoy/service/cluster/v3/cds.upb.h"
|
70
|
+
#include "envoy/service/cluster/v3/cds.upbdefs.h"
|
59
71
|
#include "envoy/service/discovery/v3/discovery.upb.h"
|
72
|
+
#include "envoy/service/discovery/v3/discovery.upbdefs.h"
|
60
73
|
#include "envoy/service/endpoint/v3/eds.upb.h"
|
74
|
+
#include "envoy/service/endpoint/v3/eds.upbdefs.h"
|
61
75
|
#include "envoy/service/listener/v3/lds.upb.h"
|
62
76
|
#include "envoy/service/load_stats/v3/lrs.upb.h"
|
77
|
+
#include "envoy/service/load_stats/v3/lrs.upbdefs.h"
|
63
78
|
#include "envoy/service/route/v3/rds.upb.h"
|
79
|
+
#include "envoy/service/route/v3/rds.upbdefs.h"
|
64
80
|
#include "envoy/type/matcher/v3/regex.upb.h"
|
81
|
+
#include "envoy/type/matcher/v3/string.upb.h"
|
65
82
|
#include "envoy/type/v3/percent.upb.h"
|
66
83
|
#include "envoy/type/v3/range.upb.h"
|
67
84
|
#include "google/protobuf/any.upb.h"
|
@@ -69,156 +86,55 @@
|
|
69
86
|
#include "google/protobuf/struct.upb.h"
|
70
87
|
#include "google/protobuf/wrappers.upb.h"
|
71
88
|
#include "google/rpc/status.upb.h"
|
89
|
+
#include "upb/text_encode.h"
|
72
90
|
#include "upb/upb.h"
|
73
91
|
|
74
92
|
namespace grpc_core {
|
75
93
|
|
76
|
-
//
|
77
|
-
//
|
78
|
-
//
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
return
|
98
|
-
}
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
path_type_string = "prefix match";
|
121
|
-
break;
|
122
|
-
case PathMatcherType::REGEX:
|
123
|
-
path_type_string = "regex match";
|
124
|
-
break;
|
125
|
-
default:
|
126
|
-
break;
|
127
|
-
}
|
128
|
-
return absl::StrFormat("Path %s:%s", path_type_string,
|
129
|
-
type == PathMatcherType::REGEX
|
130
|
-
? regex_matcher->pattern()
|
131
|
-
: string_matcher);
|
132
|
-
}
|
133
|
-
|
134
|
-
//
|
135
|
-
// XdsApi::Route::Matchers::HeaderMatcher
|
136
|
-
//
|
137
|
-
|
138
|
-
XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcher(
|
139
|
-
const HeaderMatcher& other)
|
140
|
-
: name(other.name), type(other.type), invert_match(other.invert_match) {
|
141
|
-
switch (type) {
|
142
|
-
case HeaderMatcherType::REGEX:
|
143
|
-
regex_match = absl::make_unique<RE2>(other.regex_match->pattern());
|
144
|
-
break;
|
145
|
-
case HeaderMatcherType::RANGE:
|
146
|
-
range_start = other.range_start;
|
147
|
-
range_end = other.range_end;
|
148
|
-
break;
|
149
|
-
case HeaderMatcherType::PRESENT:
|
150
|
-
present_match = other.present_match;
|
151
|
-
break;
|
152
|
-
default:
|
153
|
-
string_matcher = other.string_matcher;
|
154
|
-
}
|
155
|
-
}
|
156
|
-
|
157
|
-
XdsApi::Route::Matchers::HeaderMatcher& XdsApi::Route::Matchers::HeaderMatcher::
|
158
|
-
operator=(const HeaderMatcher& other) {
|
159
|
-
name = other.name;
|
160
|
-
type = other.type;
|
161
|
-
invert_match = other.invert_match;
|
162
|
-
switch (type) {
|
163
|
-
case HeaderMatcherType::REGEX:
|
164
|
-
regex_match = absl::make_unique<RE2>(other.regex_match->pattern());
|
165
|
-
break;
|
166
|
-
case HeaderMatcherType::RANGE:
|
167
|
-
range_start = other.range_start;
|
168
|
-
range_end = other.range_end;
|
169
|
-
break;
|
170
|
-
case HeaderMatcherType::PRESENT:
|
171
|
-
present_match = other.present_match;
|
172
|
-
break;
|
173
|
-
default:
|
174
|
-
string_matcher = other.string_matcher;
|
175
|
-
}
|
176
|
-
return *this;
|
177
|
-
}
|
178
|
-
|
179
|
-
bool XdsApi::Route::Matchers::HeaderMatcher::operator==(
|
180
|
-
const HeaderMatcher& other) const {
|
181
|
-
if (name != other.name) return false;
|
182
|
-
if (type != other.type) return false;
|
183
|
-
if (invert_match != other.invert_match) return false;
|
184
|
-
switch (type) {
|
185
|
-
case HeaderMatcherType::REGEX:
|
186
|
-
return regex_match->pattern() != other.regex_match->pattern();
|
187
|
-
case HeaderMatcherType::RANGE:
|
188
|
-
return range_start != other.range_start && range_end != other.range_end;
|
189
|
-
case HeaderMatcherType::PRESENT:
|
190
|
-
return present_match != other.present_match;
|
191
|
-
default:
|
192
|
-
return string_matcher != other.string_matcher;
|
193
|
-
}
|
194
|
-
}
|
195
|
-
|
196
|
-
std::string XdsApi::Route::Matchers::HeaderMatcher::ToString() const {
|
197
|
-
switch (type) {
|
198
|
-
case HeaderMatcherType::EXACT:
|
199
|
-
return absl::StrFormat("Header exact match:%s %s:%s",
|
200
|
-
invert_match ? " not" : "", name, string_matcher);
|
201
|
-
case HeaderMatcherType::REGEX:
|
202
|
-
return absl::StrFormat("Header regex match:%s %s:%s",
|
203
|
-
invert_match ? " not" : "", name,
|
204
|
-
regex_match->pattern());
|
205
|
-
case HeaderMatcherType::RANGE:
|
206
|
-
return absl::StrFormat("Header range match:%s %s:[%d, %d)",
|
207
|
-
invert_match ? " not" : "", name, range_start,
|
208
|
-
range_end);
|
209
|
-
case HeaderMatcherType::PRESENT:
|
210
|
-
return absl::StrFormat("Header present match:%s %s:%s",
|
211
|
-
invert_match ? " not" : "", name,
|
212
|
-
present_match ? "true" : "false");
|
213
|
-
case HeaderMatcherType::PREFIX:
|
214
|
-
return absl::StrFormat("Header prefix match:%s %s:%s",
|
215
|
-
invert_match ? " not" : "", name, string_matcher);
|
216
|
-
case HeaderMatcherType::SUFFIX:
|
217
|
-
return absl::StrFormat("Header suffix match:%s %s:%s",
|
218
|
-
invert_match ? " not" : "", name, string_matcher);
|
219
|
-
default:
|
220
|
-
return "";
|
221
|
-
}
|
94
|
+
// TODO(donnadionne): Check to see if timeout is enabled, this will be
|
95
|
+
// removed once timeout feature is fully integration-tested and enabled by
|
96
|
+
// default.
|
97
|
+
bool XdsTimeoutEnabled() {
|
98
|
+
char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT");
|
99
|
+
bool parsed_value;
|
100
|
+
bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
|
101
|
+
gpr_free(value);
|
102
|
+
return parse_succeeded && parsed_value;
|
103
|
+
}
|
104
|
+
|
105
|
+
// TODO(donnadionne): Check to see if cluster types aggregate_cluster and
|
106
|
+
// logical_dns are enabled, this will be
|
107
|
+
// removed once the cluster types are fully integration-tested and enabled by
|
108
|
+
// default.
|
109
|
+
bool XdsAggregateAndLogicalDnsClusterEnabled() {
|
110
|
+
char* value = gpr_getenv(
|
111
|
+
"GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER");
|
112
|
+
bool parsed_value;
|
113
|
+
bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
|
114
|
+
gpr_free(value);
|
115
|
+
return parse_succeeded && parsed_value;
|
116
|
+
}
|
117
|
+
|
118
|
+
// TODO(donnadionne): Check to see if ring hash policy is enabled, this will be
|
119
|
+
// removed once ring hash policy is fully integration-tested and enabled by
|
120
|
+
// default.
|
121
|
+
bool XdsRingHashEnabled() {
|
122
|
+
char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
|
123
|
+
bool parsed_value;
|
124
|
+
bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
|
125
|
+
gpr_free(value);
|
126
|
+
return parse_succeeded && parsed_value;
|
127
|
+
}
|
128
|
+
|
129
|
+
// TODO(yashykt): Check to see if xDS security is enabled. This will be
|
130
|
+
// removed once this feature is fully integration-tested and enabled by
|
131
|
+
// default.
|
132
|
+
bool XdsSecurityEnabled() {
|
133
|
+
char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT");
|
134
|
+
bool parsed_value;
|
135
|
+
bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
|
136
|
+
gpr_free(value);
|
137
|
+
return parse_succeeded && parsed_value;
|
222
138
|
}
|
223
139
|
|
224
140
|
//
|
@@ -227,9 +143,10 @@ std::string XdsApi::Route::Matchers::HeaderMatcher::ToString() const {
|
|
227
143
|
|
228
144
|
std::string XdsApi::Route::Matchers::ToString() const {
|
229
145
|
std::vector<std::string> contents;
|
230
|
-
contents.push_back(
|
231
|
-
|
232
|
-
|
146
|
+
contents.push_back(
|
147
|
+
absl::StrFormat("PathMatcher{%s}", path_matcher.ToString()));
|
148
|
+
for (const HeaderMatcher& header_matcher : header_matchers) {
|
149
|
+
contents.push_back(header_matcher.ToString());
|
233
150
|
}
|
234
151
|
if (fraction_per_million.has_value()) {
|
235
152
|
contents.push_back(absl::StrFormat("Fraction Per Million %d",
|
@@ -248,8 +165,11 @@ std::string XdsApi::Route::ToString() const {
|
|
248
165
|
if (!cluster_name.empty()) {
|
249
166
|
contents.push_back(absl::StrFormat("Cluster name: %s", cluster_name));
|
250
167
|
}
|
251
|
-
for (const
|
252
|
-
contents.push_back(
|
168
|
+
for (const ClusterWeight& cluster_weight : weighted_clusters) {
|
169
|
+
contents.push_back(cluster_weight.ToString());
|
170
|
+
}
|
171
|
+
if (max_stream_duration.has_value()) {
|
172
|
+
contents.push_back(max_stream_duration->ToString());
|
253
173
|
}
|
254
174
|
return absl::StrJoin(contents, "\n");
|
255
175
|
}
|
@@ -290,9 +210,11 @@ enum MatchType {
|
|
290
210
|
};
|
291
211
|
|
292
212
|
// Returns true if match succeeds.
|
293
|
-
bool DomainMatch(MatchType match_type, std::string
|
294
|
-
std::string
|
213
|
+
bool DomainMatch(MatchType match_type, const std::string& domain_pattern_in,
|
214
|
+
const std::string& expected_host_name_in) {
|
295
215
|
// Normalize the args to lower-case. Domain matching is case-insensitive.
|
216
|
+
std::string domain_pattern = domain_pattern_in;
|
217
|
+
std::string expected_host_name = expected_host_name_in;
|
296
218
|
std::transform(domain_pattern.begin(), domain_pattern.end(),
|
297
219
|
domain_pattern.begin(),
|
298
220
|
[](unsigned char c) { return std::tolower(c); });
|
@@ -333,8 +255,8 @@ MatchType DomainPatternMatchType(const std::string& domain_pattern) {
|
|
333
255
|
|
334
256
|
} // namespace
|
335
257
|
|
336
|
-
|
337
|
-
|
258
|
+
XdsApi::RdsUpdate::VirtualHost* XdsApi::RdsUpdate::FindVirtualHostForDomain(
|
259
|
+
const std::string& domain) {
|
338
260
|
// Find the best matched virtual host.
|
339
261
|
// The search order for 4 groups of domain patterns:
|
340
262
|
// 1. Exact match.
|
@@ -344,12 +266,12 @@ XdsApi::RdsUpdate::FindVirtualHostForDomain(const std::string& domain) const {
|
|
344
266
|
// Within each group, longest match wins.
|
345
267
|
// If the same best matched domain pattern appears in multiple virtual hosts,
|
346
268
|
// the first matched virtual host wins.
|
347
|
-
|
269
|
+
VirtualHost* target_vhost = nullptr;
|
348
270
|
MatchType best_match_type = INVALID_MATCH;
|
349
271
|
size_t longest_match = 0;
|
350
272
|
// Check each domain pattern in each virtual host to determine the best
|
351
273
|
// matched virtual host.
|
352
|
-
for (
|
274
|
+
for (VirtualHost& vhost : virtual_hosts) {
|
353
275
|
for (const std::string& domain_pattern : vhost.domains) {
|
354
276
|
// Check the match type first. Skip the pattern if it's not better than
|
355
277
|
// current match.
|
@@ -375,49 +297,192 @@ XdsApi::RdsUpdate::FindVirtualHostForDomain(const std::string& domain) const {
|
|
375
297
|
}
|
376
298
|
|
377
299
|
//
|
378
|
-
// XdsApi::
|
300
|
+
// XdsApi::CommonTlsContext::CertificateValidationContext
|
379
301
|
//
|
380
302
|
|
381
|
-
|
382
|
-
const
|
383
|
-
|
384
|
-
for (
|
385
|
-
|
386
|
-
return false;
|
387
|
-
}
|
303
|
+
std::string XdsApi::CommonTlsContext::CertificateValidationContext::ToString()
|
304
|
+
const {
|
305
|
+
std::vector<std::string> contents;
|
306
|
+
for (const auto& match : match_subject_alt_names) {
|
307
|
+
contents.push_back(match.ToString());
|
388
308
|
}
|
389
|
-
return
|
309
|
+
return absl::StrFormat("{match_subject_alt_names=[%s]}",
|
310
|
+
absl::StrJoin(contents, ", "));
|
390
311
|
}
|
391
312
|
|
392
|
-
|
393
|
-
|
394
|
-
// Pad the missing priorities in case the localities are not ordered by
|
395
|
-
// priority.
|
396
|
-
if (!Contains(locality.priority)) priorities_.resize(locality.priority + 1);
|
397
|
-
LocalityMap& locality_map = priorities_[locality.priority];
|
398
|
-
locality_map.localities.emplace(locality.name, std::move(locality));
|
313
|
+
bool XdsApi::CommonTlsContext::CertificateValidationContext::Empty() const {
|
314
|
+
return match_subject_alt_names.empty();
|
399
315
|
}
|
400
316
|
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
317
|
+
//
|
318
|
+
// XdsApi::CommonTlsContext::CertificateValidationContext
|
319
|
+
//
|
320
|
+
|
321
|
+
std::string XdsApi::CommonTlsContext::CertificateProviderInstance::ToString()
|
322
|
+
const {
|
323
|
+
absl::InlinedVector<std::string, 2> contents;
|
324
|
+
if (!instance_name.empty()) {
|
325
|
+
contents.push_back(absl::StrFormat("instance_name=%s", instance_name));
|
326
|
+
}
|
327
|
+
if (!certificate_name.empty()) {
|
328
|
+
contents.push_back(
|
329
|
+
absl::StrFormat("certificate_name=%s", certificate_name));
|
330
|
+
}
|
331
|
+
return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
|
405
332
|
}
|
406
333
|
|
407
|
-
bool XdsApi::
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
334
|
+
bool XdsApi::CommonTlsContext::CertificateProviderInstance::Empty() const {
|
335
|
+
return instance_name.empty() && certificate_name.empty();
|
336
|
+
}
|
337
|
+
|
338
|
+
//
|
339
|
+
// XdsApi::CommonTlsContext::CombinedCertificateValidationContext
|
340
|
+
//
|
341
|
+
|
342
|
+
std::string
|
343
|
+
XdsApi::CommonTlsContext::CombinedCertificateValidationContext::ToString()
|
344
|
+
const {
|
345
|
+
absl::InlinedVector<std::string, 2> contents;
|
346
|
+
if (!default_validation_context.Empty()) {
|
347
|
+
contents.push_back(absl::StrFormat("default_validation_context=%s",
|
348
|
+
default_validation_context.ToString()));
|
412
349
|
}
|
413
|
-
|
350
|
+
if (!validation_context_certificate_provider_instance.Empty()) {
|
351
|
+
contents.push_back(absl::StrFormat(
|
352
|
+
"validation_context_certificate_provider_instance=%s",
|
353
|
+
validation_context_certificate_provider_instance.ToString()));
|
354
|
+
}
|
355
|
+
return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
|
356
|
+
}
|
357
|
+
|
358
|
+
bool XdsApi::CommonTlsContext::CombinedCertificateValidationContext::Empty()
|
359
|
+
const {
|
360
|
+
return default_validation_context.Empty() &&
|
361
|
+
validation_context_certificate_provider_instance.Empty();
|
362
|
+
}
|
363
|
+
|
364
|
+
//
|
365
|
+
// XdsApi::CommonTlsContext
|
366
|
+
//
|
367
|
+
|
368
|
+
std::string XdsApi::CommonTlsContext::ToString() const {
|
369
|
+
absl::InlinedVector<std::string, 2> contents;
|
370
|
+
if (!tls_certificate_certificate_provider_instance.Empty()) {
|
371
|
+
contents.push_back(absl::StrFormat(
|
372
|
+
"tls_certificate_certificate_provider_instance=%s",
|
373
|
+
tls_certificate_certificate_provider_instance.ToString()));
|
374
|
+
}
|
375
|
+
if (!combined_validation_context.Empty()) {
|
376
|
+
contents.push_back(absl::StrFormat("combined_validation_context=%s",
|
377
|
+
combined_validation_context.ToString()));
|
378
|
+
}
|
379
|
+
return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
|
380
|
+
}
|
381
|
+
|
382
|
+
bool XdsApi::CommonTlsContext::Empty() const {
|
383
|
+
return tls_certificate_certificate_provider_instance.Empty() &&
|
384
|
+
combined_validation_context.Empty();
|
414
385
|
}
|
415
386
|
|
416
387
|
//
|
417
|
-
// XdsApi::
|
388
|
+
// XdsApi::DownstreamTlsContext
|
418
389
|
//
|
419
390
|
|
420
|
-
|
391
|
+
std::string XdsApi::DownstreamTlsContext::ToString() const {
|
392
|
+
return absl::StrFormat("common_tls_context=%s, require_client_certificate=%s",
|
393
|
+
common_tls_context.ToString(),
|
394
|
+
require_client_certificate ? "true" : "false");
|
395
|
+
}
|
396
|
+
|
397
|
+
bool XdsApi::DownstreamTlsContext::Empty() const {
|
398
|
+
return common_tls_context.Empty();
|
399
|
+
}
|
400
|
+
|
401
|
+
//
|
402
|
+
// XdsApi::LdsUpdate
|
403
|
+
//
|
404
|
+
|
405
|
+
std::string XdsApi::LdsUpdate::ToString() const {
|
406
|
+
absl::InlinedVector<std::string, 3> contents;
|
407
|
+
if (type == ListenerType::kTcpListener) {
|
408
|
+
if (!downstream_tls_context.Empty()) {
|
409
|
+
contents.push_back(absl::StrFormat("downstream_tls_context=%s",
|
410
|
+
downstream_tls_context.ToString()));
|
411
|
+
}
|
412
|
+
} else if (type == ListenerType::kHttpApiListener) {
|
413
|
+
contents.push_back(absl::StrFormat(
|
414
|
+
"route_config_name=%s",
|
415
|
+
!route_config_name.empty() ? route_config_name.c_str() : "<inlined>"));
|
416
|
+
contents.push_back(absl::StrFormat("http_max_stream_duration=%s",
|
417
|
+
http_max_stream_duration.ToString()));
|
418
|
+
if (rds_update.has_value()) {
|
419
|
+
contents.push_back(
|
420
|
+
absl::StrFormat("rds_update=%s", rds_update->ToString()));
|
421
|
+
}
|
422
|
+
}
|
423
|
+
return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
|
424
|
+
}
|
425
|
+
|
426
|
+
//
|
427
|
+
// XdsApi::CdsUpdate
|
428
|
+
//
|
429
|
+
|
430
|
+
std::string XdsApi::CdsUpdate::ToString() const {
|
431
|
+
absl::InlinedVector<std::string, 4> contents;
|
432
|
+
if (!eds_service_name.empty()) {
|
433
|
+
contents.push_back(
|
434
|
+
absl::StrFormat("eds_service_name=%s", eds_service_name));
|
435
|
+
}
|
436
|
+
if (!common_tls_context.Empty()) {
|
437
|
+
contents.push_back(absl::StrFormat("common_tls_context=%s",
|
438
|
+
common_tls_context.ToString()));
|
439
|
+
}
|
440
|
+
if (lrs_load_reporting_server_name.has_value()) {
|
441
|
+
contents.push_back(absl::StrFormat("lrs_load_reporting_server_name=%s",
|
442
|
+
lrs_load_reporting_server_name.value()));
|
443
|
+
}
|
444
|
+
contents.push_back(
|
445
|
+
absl::StrFormat("max_concurrent_requests=%d", max_concurrent_requests));
|
446
|
+
return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
|
447
|
+
}
|
448
|
+
|
449
|
+
//
|
450
|
+
// XdsApi::EdsUpdate
|
451
|
+
//
|
452
|
+
|
453
|
+
std::string XdsApi::EdsUpdate::Priority::Locality::ToString() const {
|
454
|
+
std::vector<std::string> endpoint_strings;
|
455
|
+
for (const ServerAddress& endpoint : endpoints) {
|
456
|
+
endpoint_strings.emplace_back(endpoint.ToString());
|
457
|
+
}
|
458
|
+
return absl::StrCat("{name=", name->AsHumanReadableString(),
|
459
|
+
", lb_weight=", lb_weight, ", endpoints=[",
|
460
|
+
absl::StrJoin(endpoint_strings, ", "), "]}");
|
461
|
+
}
|
462
|
+
|
463
|
+
bool XdsApi::EdsUpdate::Priority::operator==(const Priority& other) const {
|
464
|
+
if (localities.size() != other.localities.size()) return false;
|
465
|
+
auto it1 = localities.begin();
|
466
|
+
auto it2 = other.localities.begin();
|
467
|
+
while (it1 != localities.end()) {
|
468
|
+
if (*it1->first != *it2->first) return false;
|
469
|
+
if (it1->second != it2->second) return false;
|
470
|
+
++it1;
|
471
|
+
++it2;
|
472
|
+
}
|
473
|
+
return true;
|
474
|
+
}
|
475
|
+
|
476
|
+
std::string XdsApi::EdsUpdate::Priority::ToString() const {
|
477
|
+
std::vector<std::string> locality_strings;
|
478
|
+
for (const auto& p : localities) {
|
479
|
+
locality_strings.emplace_back(p.second.ToString());
|
480
|
+
}
|
481
|
+
return absl::StrCat("[", absl::StrJoin(locality_strings, ", "), "]");
|
482
|
+
}
|
483
|
+
|
484
|
+
bool XdsApi::EdsUpdate::DropConfig::ShouldDrop(
|
485
|
+
const std::string** category_name) const {
|
421
486
|
for (size_t i = 0; i < drop_category_list_.size(); ++i) {
|
422
487
|
const auto& drop_category = drop_category_list_[i];
|
423
488
|
// Generate a random number in [0, 1000000).
|
@@ -430,6 +495,27 @@ bool XdsApi::DropConfig::ShouldDrop(const std::string** category_name) const {
|
|
430
495
|
return false;
|
431
496
|
}
|
432
497
|
|
498
|
+
std::string XdsApi::EdsUpdate::DropConfig::ToString() const {
|
499
|
+
std::vector<std::string> category_strings;
|
500
|
+
for (const DropCategory& category : drop_category_list_) {
|
501
|
+
category_strings.emplace_back(
|
502
|
+
absl::StrCat(category.name, "=", category.parts_per_million));
|
503
|
+
}
|
504
|
+
return absl::StrCat("{[", absl::StrJoin(category_strings, ", "),
|
505
|
+
"], drop_all=", drop_all_, "}");
|
506
|
+
}
|
507
|
+
|
508
|
+
std::string XdsApi::EdsUpdate::ToString() const {
|
509
|
+
std::vector<std::string> priority_strings;
|
510
|
+
for (size_t i = 0; i < priorities.size(); ++i) {
|
511
|
+
const Priority& priority = priorities[i];
|
512
|
+
priority_strings.emplace_back(
|
513
|
+
absl::StrCat("priority ", i, ": ", priority.ToString()));
|
514
|
+
}
|
515
|
+
return absl::StrCat("priorities=[", absl::StrJoin(priority_strings, ", "),
|
516
|
+
"], drop_config=", drop_config->ToString());
|
517
|
+
}
|
518
|
+
|
433
519
|
//
|
434
520
|
// XdsApi
|
435
521
|
//
|
@@ -471,11 +557,10 @@ bool IsEds(absl::string_view type_url) {
|
|
471
557
|
} // namespace
|
472
558
|
|
473
559
|
XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
|
474
|
-
const XdsBootstrap*
|
560
|
+
const XdsBootstrap::Node* node)
|
475
561
|
: client_(client),
|
476
562
|
tracer_(tracer),
|
477
|
-
|
478
|
-
bootstrap_(bootstrap),
|
563
|
+
node_(node),
|
479
564
|
build_version_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING, " ",
|
480
565
|
grpc_version_string())),
|
481
566
|
user_agent_name_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING)) {}
|
@@ -576,12 +661,10 @@ void PopulateBuildVersion(upb_arena* arena, envoy_config_core_v3_Node* node_msg,
|
|
576
661
|
encoded_build_version.size(), arena);
|
577
662
|
}
|
578
663
|
|
579
|
-
void PopulateNode(upb_arena* arena, const XdsBootstrap*
|
664
|
+
void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node, bool use_v3,
|
580
665
|
const std::string& build_version,
|
581
666
|
const std::string& user_agent_name,
|
582
|
-
const std::string& server_name,
|
583
667
|
envoy_config_core_v3_Node* node_msg) {
|
584
|
-
const XdsBootstrap::Node* node = bootstrap->node();
|
585
668
|
if (node != nullptr) {
|
586
669
|
if (!node->id.empty()) {
|
587
670
|
envoy_config_core_v3_Node_set_id(node_msg,
|
@@ -596,16 +679,6 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap* bootstrap,
|
|
596
679
|
envoy_config_core_v3_Node_mutable_metadata(node_msg, arena);
|
597
680
|
PopulateMetadata(arena, metadata, node->metadata.object_value());
|
598
681
|
}
|
599
|
-
if (!server_name.empty()) {
|
600
|
-
google_protobuf_Struct* metadata =
|
601
|
-
envoy_config_core_v3_Node_mutable_metadata(node_msg, arena);
|
602
|
-
google_protobuf_Value* value = google_protobuf_Value_new(arena);
|
603
|
-
google_protobuf_Value_set_string_value(value,
|
604
|
-
StdStringToUpbString(server_name));
|
605
|
-
google_protobuf_Struct_fields_set(
|
606
|
-
metadata, upb_strview_makez("PROXYLESS_CLIENT_HOSTNAME"), value,
|
607
|
-
arena);
|
608
|
-
}
|
609
682
|
if (!node->locality_region.empty() || !node->locality_zone.empty() ||
|
610
683
|
!node->locality_subzone.empty()) {
|
611
684
|
envoy_config_core_v3_Locality* locality =
|
@@ -624,7 +697,7 @@ void PopulateNode(upb_arena* arena, const XdsBootstrap* bootstrap,
|
|
624
697
|
}
|
625
698
|
}
|
626
699
|
}
|
627
|
-
if (!
|
700
|
+
if (!use_v3) {
|
628
701
|
PopulateBuildVersion(arena, node_msg, build_version);
|
629
702
|
}
|
630
703
|
envoy_config_core_v3_Node_set_user_agent_name(
|
@@ -644,172 +717,17 @@ inline std::string UpbStringToStdString(const upb_strview& str) {
|
|
644
717
|
return std::string(str.data, str.size);
|
645
718
|
}
|
646
719
|
|
647
|
-
inline void AddStringField(const char* name, const upb_strview& value,
|
648
|
-
std::vector<std::string>* fields,
|
649
|
-
bool add_if_empty = false) {
|
650
|
-
if (value.size > 0 || add_if_empty) {
|
651
|
-
fields->emplace_back(
|
652
|
-
absl::StrCat(name, ": \"", UpbStringToAbsl(value), "\""));
|
653
|
-
}
|
654
|
-
}
|
655
|
-
|
656
|
-
inline void AddUInt32ValueField(const char* name,
|
657
|
-
const google_protobuf_UInt32Value* value,
|
658
|
-
std::vector<std::string>* fields) {
|
659
|
-
if (value != nullptr) {
|
660
|
-
fields->emplace_back(absl::StrCat(
|
661
|
-
name, " { value: ", google_protobuf_UInt32Value_value(value), " }"));
|
662
|
-
}
|
663
|
-
}
|
664
|
-
|
665
|
-
inline void AddLocalityField(int indent_level,
|
666
|
-
const envoy_config_core_v3_Locality* locality,
|
667
|
-
std::vector<std::string>* fields) {
|
668
|
-
std::string indent =
|
669
|
-
absl::StrJoin(std::vector<std::string>(indent_level, " "), "");
|
670
|
-
// region
|
671
|
-
std::string field = absl::StrCat(indent, "region");
|
672
|
-
AddStringField(field.c_str(), envoy_config_core_v3_Locality_region(locality),
|
673
|
-
fields);
|
674
|
-
// zone
|
675
|
-
field = absl::StrCat(indent, "zone");
|
676
|
-
AddStringField(field.c_str(), envoy_config_core_v3_Locality_zone(locality),
|
677
|
-
fields);
|
678
|
-
// sub_zone
|
679
|
-
field = absl::StrCat(indent, "sub_zone");
|
680
|
-
AddStringField(field.c_str(),
|
681
|
-
envoy_config_core_v3_Locality_sub_zone(locality), fields);
|
682
|
-
}
|
683
|
-
|
684
|
-
void AddNodeLogFields(const envoy_config_core_v3_Node* node,
|
685
|
-
const std::string& build_version,
|
686
|
-
std::vector<std::string>* fields) {
|
687
|
-
fields->emplace_back("node {");
|
688
|
-
// id
|
689
|
-
AddStringField(" id", envoy_config_core_v3_Node_id(node), fields);
|
690
|
-
// metadata
|
691
|
-
const google_protobuf_Struct* metadata =
|
692
|
-
envoy_config_core_v3_Node_metadata(node);
|
693
|
-
if (metadata != nullptr) {
|
694
|
-
fields->emplace_back(" metadata {");
|
695
|
-
size_t entry_idx = UPB_MAP_BEGIN;
|
696
|
-
while (true) {
|
697
|
-
const google_protobuf_Struct_FieldsEntry* entry =
|
698
|
-
google_protobuf_Struct_fields_next(metadata, &entry_idx);
|
699
|
-
if (entry == nullptr) break;
|
700
|
-
fields->emplace_back(" field {");
|
701
|
-
// key
|
702
|
-
AddStringField(" key", google_protobuf_Struct_FieldsEntry_key(entry),
|
703
|
-
fields);
|
704
|
-
// value
|
705
|
-
const google_protobuf_Value* value =
|
706
|
-
google_protobuf_Struct_FieldsEntry_value(entry);
|
707
|
-
if (value != nullptr) {
|
708
|
-
std::string value_str;
|
709
|
-
if (google_protobuf_Value_has_string_value(value)) {
|
710
|
-
value_str = absl::StrCat(
|
711
|
-
"string_value: \"",
|
712
|
-
UpbStringToAbsl(google_protobuf_Value_string_value(value)), "\"");
|
713
|
-
} else if (google_protobuf_Value_has_null_value(value)) {
|
714
|
-
value_str = "null_value: NULL_VALUE";
|
715
|
-
} else if (google_protobuf_Value_has_number_value(value)) {
|
716
|
-
value_str = absl::StrCat("double_value: ",
|
717
|
-
google_protobuf_Value_number_value(value));
|
718
|
-
} else if (google_protobuf_Value_has_bool_value(value)) {
|
719
|
-
value_str = absl::StrCat("bool_value: ",
|
720
|
-
google_protobuf_Value_bool_value(value));
|
721
|
-
} else if (google_protobuf_Value_has_struct_value(value)) {
|
722
|
-
value_str = "struct_value: <not printed>";
|
723
|
-
} else if (google_protobuf_Value_has_list_value(value)) {
|
724
|
-
value_str = "list_value: <not printed>";
|
725
|
-
} else {
|
726
|
-
value_str = "<unknown>";
|
727
|
-
}
|
728
|
-
fields->emplace_back(absl::StrCat(" value { ", value_str, " }"));
|
729
|
-
}
|
730
|
-
fields->emplace_back(" }");
|
731
|
-
}
|
732
|
-
fields->emplace_back(" }");
|
733
|
-
}
|
734
|
-
// locality
|
735
|
-
const envoy_config_core_v3_Locality* locality =
|
736
|
-
envoy_config_core_v3_Node_locality(node);
|
737
|
-
if (locality != nullptr) {
|
738
|
-
fields->emplace_back(" locality {");
|
739
|
-
AddLocalityField(2, locality, fields);
|
740
|
-
fields->emplace_back(" }");
|
741
|
-
}
|
742
|
-
// build_version (doesn't exist in v3 proto; this is a horrible hack)
|
743
|
-
if (!build_version.empty()) {
|
744
|
-
fields->emplace_back(
|
745
|
-
absl::StrCat(" build_version: \"", build_version, "\""));
|
746
|
-
}
|
747
|
-
// user_agent_name
|
748
|
-
AddStringField(" user_agent_name",
|
749
|
-
envoy_config_core_v3_Node_user_agent_name(node), fields);
|
750
|
-
// user_agent_version
|
751
|
-
AddStringField(" user_agent_version",
|
752
|
-
envoy_config_core_v3_Node_user_agent_version(node), fields);
|
753
|
-
// client_features
|
754
|
-
size_t num_client_features;
|
755
|
-
const upb_strview* client_features =
|
756
|
-
envoy_config_core_v3_Node_client_features(node, &num_client_features);
|
757
|
-
for (size_t i = 0; i < num_client_features; ++i) {
|
758
|
-
AddStringField(" client_features", client_features[i], fields);
|
759
|
-
}
|
760
|
-
fields->emplace_back("}");
|
761
|
-
}
|
762
|
-
|
763
720
|
void MaybeLogDiscoveryRequest(
|
764
|
-
XdsClient* client, TraceFlag* tracer,
|
765
|
-
const envoy_service_discovery_v3_DiscoveryRequest* request
|
766
|
-
const std::string& build_version) {
|
721
|
+
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
|
722
|
+
const envoy_service_discovery_v3_DiscoveryRequest* request) {
|
767
723
|
if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
|
768
724
|
gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
AddStringField(
|
774
|
-
"version_info",
|
775
|
-
envoy_service_discovery_v3_DiscoveryRequest_version_info(request),
|
776
|
-
&fields);
|
777
|
-
// node
|
778
|
-
const envoy_config_core_v3_Node* node =
|
779
|
-
envoy_service_discovery_v3_DiscoveryRequest_node(request);
|
780
|
-
if (node != nullptr) AddNodeLogFields(node, build_version, &fields);
|
781
|
-
// resource_names
|
782
|
-
size_t num_resource_names;
|
783
|
-
const upb_strview* resource_names =
|
784
|
-
envoy_service_discovery_v3_DiscoveryRequest_resource_names(
|
785
|
-
request, &num_resource_names);
|
786
|
-
for (size_t i = 0; i < num_resource_names; ++i) {
|
787
|
-
AddStringField("resource_names", resource_names[i], &fields);
|
788
|
-
}
|
789
|
-
// type_url
|
790
|
-
AddStringField(
|
791
|
-
"type_url",
|
792
|
-
envoy_service_discovery_v3_DiscoveryRequest_type_url(request), &fields);
|
793
|
-
// response_nonce
|
794
|
-
AddStringField(
|
795
|
-
"response_nonce",
|
796
|
-
envoy_service_discovery_v3_DiscoveryRequest_response_nonce(request),
|
797
|
-
&fields);
|
798
|
-
// error_detail
|
799
|
-
const struct google_rpc_Status* error_detail =
|
800
|
-
envoy_service_discovery_v3_DiscoveryRequest_error_detail(request);
|
801
|
-
if (error_detail != nullptr) {
|
802
|
-
fields.emplace_back("error_detail {");
|
803
|
-
// code
|
804
|
-
int32_t code = google_rpc_Status_code(error_detail);
|
805
|
-
if (code != 0) fields.emplace_back(absl::StrCat(" code: ", code));
|
806
|
-
// message
|
807
|
-
AddStringField(" message", google_rpc_Status_message(error_detail),
|
808
|
-
&fields);
|
809
|
-
fields.emplace_back("}");
|
810
|
-
}
|
725
|
+
const upb_msgdef* msg_type =
|
726
|
+
envoy_service_discovery_v3_DiscoveryRequest_getmsgdef(symtab);
|
727
|
+
char buf[10240];
|
728
|
+
upb_text_encode(request, msg_type, nullptr, 0, buf, sizeof(buf));
|
811
729
|
gpr_log(GPR_DEBUG, "[xds_client %p] constructed ADS request: %s", client,
|
812
|
-
|
730
|
+
buf);
|
813
731
|
}
|
814
732
|
}
|
815
733
|
|
@@ -843,7 +761,7 @@ absl::string_view TypeUrlExternalToInternal(bool use_v3,
|
|
843
761
|
} // namespace
|
844
762
|
|
845
763
|
grpc_slice XdsApi::CreateAdsRequest(
|
846
|
-
const std::string& type_url,
|
764
|
+
const XdsBootstrap::XdsServer& server, const std::string& type_url,
|
847
765
|
const std::set<absl::string_view>& resource_names,
|
848
766
|
const std::string& version, const std::string& nonce, grpc_error* error,
|
849
767
|
bool populate_node) {
|
@@ -853,7 +771,7 @@ grpc_slice XdsApi::CreateAdsRequest(
|
|
853
771
|
envoy_service_discovery_v3_DiscoveryRequest_new(arena.ptr());
|
854
772
|
// Set type_url.
|
855
773
|
absl::string_view real_type_url =
|
856
|
-
TypeUrlExternalToInternal(
|
774
|
+
TypeUrlExternalToInternal(server.ShouldUseV3(), type_url);
|
857
775
|
envoy_service_discovery_v3_DiscoveryRequest_set_type_url(
|
858
776
|
request, StdStringToUpbString(real_type_url));
|
859
777
|
// Set version_info.
|
@@ -868,17 +786,18 @@ grpc_slice XdsApi::CreateAdsRequest(
|
|
868
786
|
}
|
869
787
|
// Set error_detail if it's a NACK.
|
870
788
|
if (error != GRPC_ERROR_NONE) {
|
871
|
-
grpc_slice error_description_slice;
|
872
|
-
GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION,
|
873
|
-
&error_description_slice));
|
874
|
-
upb_strview error_description_strview =
|
875
|
-
upb_strview_make(reinterpret_cast<const char*>(
|
876
|
-
GPR_SLICE_START_PTR(error_description_slice)),
|
877
|
-
GPR_SLICE_LENGTH(error_description_slice));
|
878
789
|
google_rpc_Status* error_detail =
|
879
790
|
envoy_service_discovery_v3_DiscoveryRequest_mutable_error_detail(
|
880
791
|
request, arena.ptr());
|
881
|
-
|
792
|
+
// Hard-code INVALID_ARGUMENT as the status code.
|
793
|
+
// TODO(roth): If at some point we decide we care about this value,
|
794
|
+
// we could attach a status code to the individual errors where we
|
795
|
+
// generate them in the parsing code, and then use that here.
|
796
|
+
google_rpc_Status_set_code(error_detail, GRPC_STATUS_INVALID_ARGUMENT);
|
797
|
+
// Error description comes from the error that was passed in.
|
798
|
+
upb_strview error_description =
|
799
|
+
StdStringToUpbString(absl::string_view(grpc_error_string(error)));
|
800
|
+
google_rpc_Status_set_message(error_detail, error_description);
|
882
801
|
GRPC_ERROR_UNREF(error);
|
883
802
|
}
|
884
803
|
// Populate node.
|
@@ -886,401 +805,87 @@ grpc_slice XdsApi::CreateAdsRequest(
|
|
886
805
|
envoy_config_core_v3_Node* node_msg =
|
887
806
|
envoy_service_discovery_v3_DiscoveryRequest_mutable_node(request,
|
888
807
|
arena.ptr());
|
889
|
-
PopulateNode(arena.ptr(),
|
890
|
-
node_msg);
|
808
|
+
PopulateNode(arena.ptr(), node_, server.ShouldUseV3(), build_version_,
|
809
|
+
user_agent_name_, node_msg);
|
891
810
|
}
|
892
811
|
// Add resource_names.
|
893
812
|
for (const auto& resource_name : resource_names) {
|
894
813
|
envoy_service_discovery_v3_DiscoveryRequest_add_resource_names(
|
895
814
|
request, StdStringToUpbString(resource_name), arena.ptr());
|
896
815
|
}
|
897
|
-
MaybeLogDiscoveryRequest(client_, tracer_,
|
816
|
+
MaybeLogDiscoveryRequest(client_, tracer_, symtab_.ptr(), request);
|
898
817
|
return SerializeDiscoveryRequest(arena.ptr(), request);
|
899
818
|
}
|
900
819
|
|
901
820
|
namespace {
|
902
821
|
|
903
822
|
void MaybeLogDiscoveryResponse(
|
904
|
-
XdsClient* client, TraceFlag* tracer,
|
823
|
+
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
|
905
824
|
const envoy_service_discovery_v3_DiscoveryResponse* response) {
|
906
825
|
if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
|
907
826
|
gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
"version_info",
|
914
|
-
envoy_service_discovery_v3_DiscoveryResponse_version_info(response),
|
915
|
-
&fields);
|
916
|
-
// resources
|
917
|
-
size_t num_resources;
|
918
|
-
envoy_service_discovery_v3_DiscoveryResponse_resources(response,
|
919
|
-
&num_resources);
|
920
|
-
fields.emplace_back(
|
921
|
-
absl::StrCat("resources: <", num_resources, " element(s)>"));
|
922
|
-
// type_url
|
923
|
-
AddStringField(
|
924
|
-
"type_url",
|
925
|
-
envoy_service_discovery_v3_DiscoveryResponse_type_url(response),
|
926
|
-
&fields);
|
927
|
-
// nonce
|
928
|
-
AddStringField("nonce",
|
929
|
-
envoy_service_discovery_v3_DiscoveryResponse_nonce(response),
|
930
|
-
&fields);
|
931
|
-
gpr_log(GPR_DEBUG, "[xds_client %p] received response: %s", client,
|
932
|
-
absl::StrJoin(fields, "\n").c_str());
|
827
|
+
const upb_msgdef* msg_type =
|
828
|
+
envoy_service_discovery_v3_DiscoveryResponse_getmsgdef(symtab);
|
829
|
+
char buf[10240];
|
830
|
+
upb_text_encode(response, msg_type, nullptr, 0, buf, sizeof(buf));
|
831
|
+
gpr_log(GPR_DEBUG, "[xds_client %p] received response: %s", client, buf);
|
933
832
|
}
|
934
833
|
}
|
935
834
|
|
936
835
|
void MaybeLogRouteConfiguration(
|
937
|
-
XdsClient* client, TraceFlag* tracer,
|
836
|
+
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
|
938
837
|
const envoy_config_route_v3_RouteConfiguration* route_config) {
|
939
838
|
if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
|
940
839
|
gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
|
941
|
-
|
942
|
-
|
943
|
-
|
944
|
-
|
945
|
-
|
946
|
-
envoy_config_route_v3_RouteConfiguration_name(route_config),
|
947
|
-
&fields);
|
948
|
-
// virtual_hosts
|
949
|
-
size_t num_virtual_hosts;
|
950
|
-
const envoy_config_route_v3_VirtualHost* const* virtual_hosts =
|
951
|
-
envoy_config_route_v3_RouteConfiguration_virtual_hosts(
|
952
|
-
route_config, &num_virtual_hosts);
|
953
|
-
for (size_t i = 0; i < num_virtual_hosts; ++i) {
|
954
|
-
const auto* virtual_host = virtual_hosts[i];
|
955
|
-
fields.push_back("virtual_hosts {");
|
956
|
-
// name
|
957
|
-
AddStringField(" name",
|
958
|
-
envoy_config_route_v3_VirtualHost_name(virtual_host),
|
959
|
-
&fields);
|
960
|
-
// domains
|
961
|
-
size_t num_domains;
|
962
|
-
const upb_strview* const domains =
|
963
|
-
envoy_config_route_v3_VirtualHost_domains(virtual_host, &num_domains);
|
964
|
-
for (size_t j = 0; j < num_domains; ++j) {
|
965
|
-
AddStringField(" domains", domains[j], &fields);
|
966
|
-
}
|
967
|
-
// routes
|
968
|
-
size_t num_routes;
|
969
|
-
const envoy_config_route_v3_Route* const* routes =
|
970
|
-
envoy_config_route_v3_VirtualHost_routes(virtual_host, &num_routes);
|
971
|
-
for (size_t j = 0; j < num_routes; ++j) {
|
972
|
-
const auto* route = routes[j];
|
973
|
-
fields.push_back(" route {");
|
974
|
-
// name
|
975
|
-
AddStringField(" name", envoy_config_route_v3_Route_name(route),
|
976
|
-
&fields);
|
977
|
-
// match
|
978
|
-
const envoy_config_route_v3_RouteMatch* match =
|
979
|
-
envoy_config_route_v3_Route_match(route);
|
980
|
-
if (match != nullptr) {
|
981
|
-
fields.emplace_back(" match {");
|
982
|
-
// path matching
|
983
|
-
if (envoy_config_route_v3_RouteMatch_has_prefix(match)) {
|
984
|
-
AddStringField(" prefix",
|
985
|
-
envoy_config_route_v3_RouteMatch_prefix(match),
|
986
|
-
&fields,
|
987
|
-
/*add_if_empty=*/true);
|
988
|
-
} else if (envoy_config_route_v3_RouteMatch_has_path(match)) {
|
989
|
-
AddStringField(" path",
|
990
|
-
envoy_config_route_v3_RouteMatch_path(match),
|
991
|
-
&fields,
|
992
|
-
/*add_if_empty=*/true);
|
993
|
-
} else if (envoy_config_route_v3_RouteMatch_has_safe_regex(match)) {
|
994
|
-
fields.emplace_back(" safe_regex: <not printed>");
|
995
|
-
} else {
|
996
|
-
fields.emplace_back(" <unknown path matching type>");
|
997
|
-
}
|
998
|
-
// header matching
|
999
|
-
size_t num_headers;
|
1000
|
-
envoy_config_route_v3_RouteMatch_headers(match, &num_headers);
|
1001
|
-
if (num_headers > 0) {
|
1002
|
-
fields.emplace_back(
|
1003
|
-
absl::StrCat(" headers: <", num_headers, " element(s)>"));
|
1004
|
-
}
|
1005
|
-
fields.emplace_back(" }");
|
1006
|
-
}
|
1007
|
-
// action
|
1008
|
-
if (envoy_config_route_v3_Route_has_route(route)) {
|
1009
|
-
const envoy_config_route_v3_RouteAction* action =
|
1010
|
-
envoy_config_route_v3_Route_route(route);
|
1011
|
-
fields.emplace_back(" route {");
|
1012
|
-
if (envoy_config_route_v3_RouteAction_has_cluster(action)) {
|
1013
|
-
AddStringField(" cluster",
|
1014
|
-
envoy_config_route_v3_RouteAction_cluster(action),
|
1015
|
-
&fields);
|
1016
|
-
} else if (envoy_config_route_v3_RouteAction_has_cluster_header(
|
1017
|
-
action)) {
|
1018
|
-
AddStringField(
|
1019
|
-
" cluster_header",
|
1020
|
-
envoy_config_route_v3_RouteAction_cluster_header(action),
|
1021
|
-
&fields);
|
1022
|
-
} else if (envoy_config_route_v3_RouteAction_has_weighted_clusters(
|
1023
|
-
action)) {
|
1024
|
-
const envoy_config_route_v3_WeightedCluster* weighted_clusters =
|
1025
|
-
envoy_config_route_v3_RouteAction_weighted_clusters(action);
|
1026
|
-
fields.emplace_back(" weighted_clusters {");
|
1027
|
-
size_t num_cluster_weights;
|
1028
|
-
const envoy_config_route_v3_WeightedCluster_ClusterWeight* const*
|
1029
|
-
cluster_weights =
|
1030
|
-
envoy_config_route_v3_WeightedCluster_clusters(
|
1031
|
-
weighted_clusters, &num_cluster_weights);
|
1032
|
-
for (size_t i = 0; i < num_cluster_weights; ++i) {
|
1033
|
-
const envoy_config_route_v3_WeightedCluster_ClusterWeight*
|
1034
|
-
cluster_weight = cluster_weights[i];
|
1035
|
-
fields.emplace_back(" clusters {");
|
1036
|
-
AddStringField(
|
1037
|
-
" name",
|
1038
|
-
envoy_config_route_v3_WeightedCluster_ClusterWeight_name(
|
1039
|
-
cluster_weight),
|
1040
|
-
&fields);
|
1041
|
-
AddUInt32ValueField(
|
1042
|
-
" weight",
|
1043
|
-
envoy_config_route_v3_WeightedCluster_ClusterWeight_weight(
|
1044
|
-
cluster_weight),
|
1045
|
-
&fields);
|
1046
|
-
fields.emplace_back(" }");
|
1047
|
-
}
|
1048
|
-
AddUInt32ValueField(
|
1049
|
-
" total_weight",
|
1050
|
-
envoy_config_route_v3_WeightedCluster_total_weight(
|
1051
|
-
weighted_clusters),
|
1052
|
-
&fields);
|
1053
|
-
fields.emplace_back(" }");
|
1054
|
-
}
|
1055
|
-
fields.emplace_back(" }");
|
1056
|
-
} else if (envoy_config_route_v3_Route_has_redirect(route)) {
|
1057
|
-
fields.emplace_back(" redirect: <not printed>");
|
1058
|
-
} else if (envoy_config_route_v3_Route_has_direct_response(route)) {
|
1059
|
-
fields.emplace_back(" direct_response: <not printed>");
|
1060
|
-
} else if (envoy_config_route_v3_Route_has_filter_action(route)) {
|
1061
|
-
fields.emplace_back(" filter_action: <not printed>");
|
1062
|
-
}
|
1063
|
-
fields.push_back(" }");
|
1064
|
-
}
|
1065
|
-
fields.push_back("}");
|
1066
|
-
}
|
1067
|
-
gpr_log(GPR_DEBUG, "[xds_client %p] RouteConfiguration: %s", client,
|
1068
|
-
absl::StrJoin(fields, "\n").c_str());
|
840
|
+
const upb_msgdef* msg_type =
|
841
|
+
envoy_config_route_v3_RouteConfiguration_getmsgdef(symtab);
|
842
|
+
char buf[10240];
|
843
|
+
upb_text_encode(route_config, msg_type, nullptr, 0, buf, sizeof(buf));
|
844
|
+
gpr_log(GPR_DEBUG, "[xds_client %p] RouteConfiguration: %s", client, buf);
|
1069
845
|
}
|
1070
846
|
}
|
1071
847
|
|
1072
|
-
void MaybeLogCluster(XdsClient* client, TraceFlag* tracer,
|
848
|
+
void MaybeLogCluster(XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
|
1073
849
|
const envoy_config_cluster_v3_Cluster* cluster) {
|
1074
850
|
if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
|
1075
851
|
gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1079
|
-
|
1080
|
-
|
1081
|
-
&fields);
|
1082
|
-
// type
|
1083
|
-
if (envoy_config_cluster_v3_Cluster_has_type(cluster)) {
|
1084
|
-
fields.emplace_back(absl::StrCat(
|
1085
|
-
"type: ", envoy_config_cluster_v3_Cluster_type(cluster)));
|
1086
|
-
} else if (envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
|
1087
|
-
fields.emplace_back("cluster_type: <not printed>");
|
1088
|
-
} else {
|
1089
|
-
fields.emplace_back("<unknown type>");
|
1090
|
-
}
|
1091
|
-
// eds_cluster_config
|
1092
|
-
const envoy_config_cluster_v3_Cluster_EdsClusterConfig* eds_cluster_config =
|
1093
|
-
envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
|
1094
|
-
if (eds_cluster_config != nullptr) {
|
1095
|
-
fields.emplace_back("eds_cluster_config {");
|
1096
|
-
// eds_config
|
1097
|
-
const struct envoy_config_core_v3_ConfigSource* eds_config =
|
1098
|
-
envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
|
1099
|
-
eds_cluster_config);
|
1100
|
-
if (eds_config != nullptr) {
|
1101
|
-
if (envoy_config_core_v3_ConfigSource_has_ads(eds_config)) {
|
1102
|
-
fields.emplace_back(" eds_config { ads {} }");
|
1103
|
-
} else {
|
1104
|
-
fields.emplace_back(" eds_config: <non-ADS type>");
|
1105
|
-
}
|
1106
|
-
}
|
1107
|
-
// service_name
|
1108
|
-
AddStringField(
|
1109
|
-
" service_name",
|
1110
|
-
envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
|
1111
|
-
eds_cluster_config),
|
1112
|
-
&fields);
|
1113
|
-
fields.emplace_back("}");
|
1114
|
-
}
|
1115
|
-
// lb_policy
|
1116
|
-
fields.emplace_back(absl::StrCat(
|
1117
|
-
"lb_policy: ", envoy_config_cluster_v3_Cluster_lb_policy(cluster)));
|
1118
|
-
// lrs_server
|
1119
|
-
const envoy_config_core_v3_ConfigSource* lrs_server =
|
1120
|
-
envoy_config_cluster_v3_Cluster_lrs_server(cluster);
|
1121
|
-
if (lrs_server != nullptr) {
|
1122
|
-
if (envoy_config_core_v3_ConfigSource_has_self(lrs_server)) {
|
1123
|
-
fields.emplace_back("lrs_server { self {} }");
|
1124
|
-
} else {
|
1125
|
-
fields.emplace_back("lrs_server: <non-self type>");
|
1126
|
-
}
|
1127
|
-
}
|
1128
|
-
gpr_log(GPR_DEBUG, "[xds_client %p] Cluster: %s", client,
|
1129
|
-
absl::StrJoin(fields, "\n").c_str());
|
852
|
+
const upb_msgdef* msg_type =
|
853
|
+
envoy_config_cluster_v3_Cluster_getmsgdef(symtab);
|
854
|
+
char buf[10240];
|
855
|
+
upb_text_encode(cluster, msg_type, nullptr, 0, buf, sizeof(buf));
|
856
|
+
gpr_log(GPR_DEBUG, "[xds_client %p] Cluster: %s", client, buf);
|
1130
857
|
}
|
1131
858
|
}
|
1132
859
|
|
1133
860
|
void MaybeLogClusterLoadAssignment(
|
1134
|
-
XdsClient* client, TraceFlag* tracer,
|
861
|
+
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
|
1135
862
|
const envoy_config_endpoint_v3_ClusterLoadAssignment* cla) {
|
1136
863
|
if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
|
1137
864
|
gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
|
1138
|
-
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
1142
|
-
AddStringField(
|
1143
|
-
"cluster_name",
|
1144
|
-
envoy_config_endpoint_v3_ClusterLoadAssignment_cluster_name(cla),
|
1145
|
-
&fields);
|
1146
|
-
// endpoints
|
1147
|
-
size_t num_localities;
|
1148
|
-
const struct envoy_config_endpoint_v3_LocalityLbEndpoints* const*
|
1149
|
-
locality_endpoints =
|
1150
|
-
envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(
|
1151
|
-
cla, &num_localities);
|
1152
|
-
for (size_t i = 0; i < num_localities; ++i) {
|
1153
|
-
const auto* locality_endpoint = locality_endpoints[i];
|
1154
|
-
fields.emplace_back("endpoints {");
|
1155
|
-
// locality
|
1156
|
-
const auto* locality =
|
1157
|
-
envoy_config_endpoint_v3_LocalityLbEndpoints_locality(
|
1158
|
-
locality_endpoint);
|
1159
|
-
if (locality != nullptr) {
|
1160
|
-
fields.emplace_back(" locality {");
|
1161
|
-
AddLocalityField(2, locality, &fields);
|
1162
|
-
fields.emplace_back(" }");
|
1163
|
-
}
|
1164
|
-
// lb_endpoints
|
1165
|
-
size_t num_lb_endpoints;
|
1166
|
-
const envoy_config_endpoint_v3_LbEndpoint* const* lb_endpoints =
|
1167
|
-
envoy_config_endpoint_v3_LocalityLbEndpoints_lb_endpoints(
|
1168
|
-
locality_endpoint, &num_lb_endpoints);
|
1169
|
-
for (size_t j = 0; j < num_lb_endpoints; ++j) {
|
1170
|
-
const auto* lb_endpoint = lb_endpoints[j];
|
1171
|
-
fields.emplace_back(" lb_endpoints {");
|
1172
|
-
// health_status
|
1173
|
-
uint32_t health_status =
|
1174
|
-
envoy_config_endpoint_v3_LbEndpoint_health_status(lb_endpoint);
|
1175
|
-
if (health_status > 0) {
|
1176
|
-
fields.emplace_back(
|
1177
|
-
absl::StrCat(" health_status: ", health_status));
|
1178
|
-
}
|
1179
|
-
// endpoint
|
1180
|
-
const envoy_config_endpoint_v3_Endpoint* endpoint =
|
1181
|
-
envoy_config_endpoint_v3_LbEndpoint_endpoint(lb_endpoint);
|
1182
|
-
if (endpoint != nullptr) {
|
1183
|
-
fields.emplace_back(" endpoint {");
|
1184
|
-
// address
|
1185
|
-
const auto* address =
|
1186
|
-
envoy_config_endpoint_v3_Endpoint_address(endpoint);
|
1187
|
-
if (address != nullptr) {
|
1188
|
-
fields.emplace_back(" address {");
|
1189
|
-
// socket_address
|
1190
|
-
const auto* socket_address =
|
1191
|
-
envoy_config_core_v3_Address_socket_address(address);
|
1192
|
-
if (socket_address != nullptr) {
|
1193
|
-
fields.emplace_back(" socket_address {");
|
1194
|
-
// address
|
1195
|
-
AddStringField(
|
1196
|
-
" address",
|
1197
|
-
envoy_config_core_v3_SocketAddress_address(socket_address),
|
1198
|
-
&fields);
|
1199
|
-
// port_value
|
1200
|
-
if (envoy_config_core_v3_SocketAddress_has_port_value(
|
1201
|
-
socket_address)) {
|
1202
|
-
fields.emplace_back(
|
1203
|
-
absl::StrCat(" port_value: ",
|
1204
|
-
envoy_config_core_v3_SocketAddress_port_value(
|
1205
|
-
socket_address)));
|
1206
|
-
} else {
|
1207
|
-
fields.emplace_back(" <non-numeric port>");
|
1208
|
-
}
|
1209
|
-
fields.emplace_back(" }");
|
1210
|
-
} else {
|
1211
|
-
fields.emplace_back(" <non-socket address>");
|
1212
|
-
}
|
1213
|
-
fields.emplace_back(" }");
|
1214
|
-
}
|
1215
|
-
fields.emplace_back(" }");
|
1216
|
-
}
|
1217
|
-
fields.emplace_back(" }");
|
1218
|
-
}
|
1219
|
-
// load_balancing_weight
|
1220
|
-
AddUInt32ValueField(
|
1221
|
-
" load_balancing_weight",
|
1222
|
-
envoy_config_endpoint_v3_LocalityLbEndpoints_load_balancing_weight(
|
1223
|
-
locality_endpoint),
|
1224
|
-
&fields);
|
1225
|
-
// priority
|
1226
|
-
uint32_t priority = envoy_config_endpoint_v3_LocalityLbEndpoints_priority(
|
1227
|
-
locality_endpoint);
|
1228
|
-
if (priority > 0) {
|
1229
|
-
fields.emplace_back(absl::StrCat(" priority: ", priority));
|
1230
|
-
}
|
1231
|
-
fields.emplace_back("}");
|
1232
|
-
}
|
1233
|
-
// policy
|
1234
|
-
const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy* policy =
|
1235
|
-
envoy_config_endpoint_v3_ClusterLoadAssignment_policy(cla);
|
1236
|
-
if (policy != nullptr) {
|
1237
|
-
fields.emplace_back("policy {");
|
1238
|
-
// drop_overloads
|
1239
|
-
size_t num_drop_overloads;
|
1240
|
-
const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload* const*
|
1241
|
-
drop_overloads =
|
1242
|
-
envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_drop_overloads(
|
1243
|
-
policy, &num_drop_overloads);
|
1244
|
-
for (size_t i = 0; i < num_drop_overloads; ++i) {
|
1245
|
-
auto* drop_overload = drop_overloads[i];
|
1246
|
-
fields.emplace_back(" drop_overloads {");
|
1247
|
-
// category
|
1248
|
-
AddStringField(
|
1249
|
-
" category",
|
1250
|
-
envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_category(
|
1251
|
-
drop_overload),
|
1252
|
-
&fields);
|
1253
|
-
// drop_percentage
|
1254
|
-
const auto* drop_percentage =
|
1255
|
-
envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_drop_percentage(
|
1256
|
-
drop_overload);
|
1257
|
-
if (drop_percentage != nullptr) {
|
1258
|
-
fields.emplace_back(" drop_percentage {");
|
1259
|
-
fields.emplace_back(absl::StrCat(
|
1260
|
-
" numerator: ",
|
1261
|
-
envoy_type_v3_FractionalPercent_numerator(drop_percentage)));
|
1262
|
-
fields.emplace_back(absl::StrCat(
|
1263
|
-
" denominator: ",
|
1264
|
-
envoy_type_v3_FractionalPercent_denominator(drop_percentage)));
|
1265
|
-
fields.emplace_back(" }");
|
1266
|
-
}
|
1267
|
-
fields.emplace_back(" }");
|
1268
|
-
}
|
1269
|
-
// overprovisioning_factor
|
1270
|
-
fields.emplace_back("}");
|
1271
|
-
}
|
865
|
+
const upb_msgdef* msg_type =
|
866
|
+
envoy_config_endpoint_v3_ClusterLoadAssignment_getmsgdef(symtab);
|
867
|
+
char buf[10240];
|
868
|
+
upb_text_encode(cla, msg_type, nullptr, 0, buf, sizeof(buf));
|
1272
869
|
gpr_log(GPR_DEBUG, "[xds_client %p] ClusterLoadAssignment: %s", client,
|
1273
|
-
|
870
|
+
buf);
|
1274
871
|
}
|
1275
872
|
}
|
1276
873
|
|
1277
874
|
grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
|
1278
875
|
XdsApi::Route* route, bool* ignore_route) {
|
876
|
+
auto* case_sensitive_ptr =
|
877
|
+
envoy_config_route_v3_RouteMatch_case_sensitive(match);
|
878
|
+
bool case_sensitive = true;
|
879
|
+
if (case_sensitive_ptr != nullptr) {
|
880
|
+
case_sensitive = google_protobuf_BoolValue_value(case_sensitive_ptr);
|
881
|
+
}
|
882
|
+
StringMatcher::Type type;
|
883
|
+
std::string match_string;
|
1279
884
|
if (envoy_config_route_v3_RouteMatch_has_prefix(match)) {
|
1280
885
|
absl::string_view prefix =
|
1281
886
|
UpbStringToAbsl(envoy_config_route_v3_RouteMatch_prefix(match));
|
1282
887
|
// Empty prefix "" is accepted.
|
1283
|
-
if (prefix.
|
888
|
+
if (!prefix.empty()) {
|
1284
889
|
// Prefix "/" is accepted.
|
1285
890
|
if (prefix[0] != '/') {
|
1286
891
|
// Prefix which does not start with a / will never match anything, so
|
@@ -1300,13 +905,12 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
|
|
1300
905
|
return GRPC_ERROR_NONE;
|
1301
906
|
}
|
1302
907
|
}
|
1303
|
-
|
1304
|
-
|
1305
|
-
route->matchers.path_matcher.string_matcher = std::string(prefix);
|
908
|
+
type = StringMatcher::Type::PREFIX;
|
909
|
+
match_string = std::string(prefix);
|
1306
910
|
} else if (envoy_config_route_v3_RouteMatch_has_path(match)) {
|
1307
911
|
absl::string_view path =
|
1308
912
|
UpbStringToAbsl(envoy_config_route_v3_RouteMatch_path(match));
|
1309
|
-
if (path.
|
913
|
+
if (path.empty()) {
|
1310
914
|
// Path that is empty will never match anything, so ignore this route.
|
1311
915
|
*ignore_route = true;
|
1312
916
|
return GRPC_ERROR_NONE;
|
@@ -1335,27 +939,28 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
|
|
1335
939
|
*ignore_route = true;
|
1336
940
|
return GRPC_ERROR_NONE;
|
1337
941
|
}
|
1338
|
-
|
1339
|
-
|
1340
|
-
route->matchers.path_matcher.string_matcher = std::string(path);
|
942
|
+
type = StringMatcher::Type::EXACT;
|
943
|
+
match_string = std::string(path);
|
1341
944
|
} else if (envoy_config_route_v3_RouteMatch_has_safe_regex(match)) {
|
1342
945
|
const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
|
1343
946
|
envoy_config_route_v3_RouteMatch_safe_regex(match);
|
1344
947
|
GPR_ASSERT(regex_matcher != nullptr);
|
1345
|
-
|
948
|
+
type = StringMatcher::Type::SAFE_REGEX;
|
949
|
+
match_string = UpbStringToStdString(
|
1346
950
|
envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
|
1347
|
-
std::unique_ptr<RE2> regex = absl::make_unique<RE2>(std::move(matcher));
|
1348
|
-
if (!regex->ok()) {
|
1349
|
-
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1350
|
-
"Invalid regex string specified in path matcher.");
|
1351
|
-
}
|
1352
|
-
route->matchers.path_matcher.type =
|
1353
|
-
XdsApi::Route::Matchers::PathMatcher::PathMatcherType::REGEX;
|
1354
|
-
route->matchers.path_matcher.regex_matcher = std::move(regex);
|
1355
951
|
} else {
|
1356
952
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1357
953
|
"Invalid route path specifier specified.");
|
1358
954
|
}
|
955
|
+
absl::StatusOr<StringMatcher> string_matcher =
|
956
|
+
StringMatcher::Create(type, match_string, case_sensitive);
|
957
|
+
if (!string_matcher.ok()) {
|
958
|
+
return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
959
|
+
absl::StrCat("path matcher: ", string_matcher.status().message())
|
960
|
+
.c_str());
|
961
|
+
;
|
962
|
+
}
|
963
|
+
route->matchers.path_matcher = std::move(string_matcher.value());
|
1359
964
|
return GRPC_ERROR_NONE;
|
1360
965
|
}
|
1361
966
|
|
@@ -1366,64 +971,62 @@ grpc_error* RouteHeaderMatchersParse(
|
|
1366
971
|
envoy_config_route_v3_RouteMatch_headers(match, &size);
|
1367
972
|
for (size_t i = 0; i < size; ++i) {
|
1368
973
|
const envoy_config_route_v3_HeaderMatcher* header = headers[i];
|
1369
|
-
|
1370
|
-
header_matcher.name =
|
974
|
+
const std::string name =
|
1371
975
|
UpbStringToStdString(envoy_config_route_v3_HeaderMatcher_name(header));
|
976
|
+
HeaderMatcher::Type type;
|
977
|
+
std::string match_string;
|
978
|
+
int64_t range_start = 0;
|
979
|
+
int64_t range_end = 0;
|
980
|
+
bool present_match = false;
|
1372
981
|
if (envoy_config_route_v3_HeaderMatcher_has_exact_match(header)) {
|
1373
|
-
|
1374
|
-
|
1375
|
-
header_matcher.string_matcher = UpbStringToStdString(
|
982
|
+
type = HeaderMatcher::Type::EXACT;
|
983
|
+
match_string = UpbStringToStdString(
|
1376
984
|
envoy_config_route_v3_HeaderMatcher_exact_match(header));
|
1377
985
|
} else if (envoy_config_route_v3_HeaderMatcher_has_safe_regex_match(
|
1378
986
|
header)) {
|
1379
987
|
const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
|
1380
988
|
envoy_config_route_v3_HeaderMatcher_safe_regex_match(header);
|
1381
989
|
GPR_ASSERT(regex_matcher != nullptr);
|
1382
|
-
|
990
|
+
type = HeaderMatcher::Type::SAFE_REGEX;
|
991
|
+
match_string = UpbStringToStdString(
|
1383
992
|
envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
|
1384
|
-
std::unique_ptr<RE2> regex = absl::make_unique<RE2>(matcher);
|
1385
|
-
if (!regex->ok()) {
|
1386
|
-
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1387
|
-
"Invalid regex string specified in header matcher.");
|
1388
|
-
}
|
1389
|
-
header_matcher.type =
|
1390
|
-
XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::REGEX;
|
1391
|
-
header_matcher.regex_match = std::move(regex);
|
1392
993
|
} else if (envoy_config_route_v3_HeaderMatcher_has_range_match(header)) {
|
1393
|
-
|
1394
|
-
XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::RANGE;
|
994
|
+
type = HeaderMatcher::Type::RANGE;
|
1395
995
|
const envoy_type_v3_Int64Range* range_matcher =
|
1396
996
|
envoy_config_route_v3_HeaderMatcher_range_match(header);
|
1397
|
-
|
1398
|
-
|
1399
|
-
header_matcher.range_end = envoy_type_v3_Int64Range_end(range_matcher);
|
1400
|
-
if (header_matcher.range_end < header_matcher.range_start) {
|
1401
|
-
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1402
|
-
"Invalid range header matcher specifier specified: end "
|
1403
|
-
"cannot be smaller than start.");
|
1404
|
-
}
|
997
|
+
range_start = envoy_type_v3_Int64Range_start(range_matcher);
|
998
|
+
range_end = envoy_type_v3_Int64Range_end(range_matcher);
|
1405
999
|
} else if (envoy_config_route_v3_HeaderMatcher_has_present_match(header)) {
|
1406
|
-
|
1407
|
-
|
1408
|
-
header_matcher.present_match =
|
1409
|
-
envoy_config_route_v3_HeaderMatcher_present_match(header);
|
1000
|
+
type = HeaderMatcher::Type::PRESENT;
|
1001
|
+
present_match = envoy_config_route_v3_HeaderMatcher_present_match(header);
|
1410
1002
|
} else if (envoy_config_route_v3_HeaderMatcher_has_prefix_match(header)) {
|
1411
|
-
|
1412
|
-
|
1413
|
-
header_matcher.string_matcher = UpbStringToStdString(
|
1003
|
+
type = HeaderMatcher::Type::PREFIX;
|
1004
|
+
match_string = UpbStringToStdString(
|
1414
1005
|
envoy_config_route_v3_HeaderMatcher_prefix_match(header));
|
1415
1006
|
} else if (envoy_config_route_v3_HeaderMatcher_has_suffix_match(header)) {
|
1416
|
-
|
1417
|
-
|
1418
|
-
header_matcher.string_matcher = UpbStringToStdString(
|
1007
|
+
type = HeaderMatcher::Type::SUFFIX;
|
1008
|
+
match_string = UpbStringToStdString(
|
1419
1009
|
envoy_config_route_v3_HeaderMatcher_suffix_match(header));
|
1010
|
+
} else if (envoy_config_route_v3_HeaderMatcher_has_contains_match(header)) {
|
1011
|
+
type = HeaderMatcher::Type::CONTAINS;
|
1012
|
+
match_string = UpbStringToStdString(
|
1013
|
+
envoy_config_route_v3_HeaderMatcher_contains_match(header));
|
1420
1014
|
} else {
|
1421
1015
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1422
1016
|
"Invalid route header matcher specified.");
|
1423
1017
|
}
|
1424
|
-
|
1018
|
+
bool invert_match =
|
1425
1019
|
envoy_config_route_v3_HeaderMatcher_invert_match(header);
|
1426
|
-
|
1020
|
+
absl::StatusOr<HeaderMatcher> header_matcher =
|
1021
|
+
HeaderMatcher::Create(name, type, match_string, range_start, range_end,
|
1022
|
+
present_match, invert_match);
|
1023
|
+
if (!header_matcher.ok()) {
|
1024
|
+
return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1025
|
+
absl::StrCat("header matcher: ", header_matcher.status().message())
|
1026
|
+
.c_str());
|
1027
|
+
}
|
1028
|
+
route->matchers.header_matchers.emplace_back(
|
1029
|
+
std::move(header_matcher.value()));
|
1427
1030
|
}
|
1428
1031
|
return GRPC_ERROR_NONE;
|
1429
1032
|
}
|
@@ -1473,7 +1076,7 @@ grpc_error* RouteActionParse(const envoy_config_route_v3_Route* route_msg,
|
|
1473
1076
|
if (envoy_config_route_v3_RouteAction_has_cluster(route_action)) {
|
1474
1077
|
route->cluster_name = UpbStringToStdString(
|
1475
1078
|
envoy_config_route_v3_RouteAction_cluster(route_action));
|
1476
|
-
if (route->cluster_name.
|
1079
|
+
if (route->cluster_name.empty()) {
|
1477
1080
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1478
1081
|
"RouteAction cluster contains empty cluster name.");
|
1479
1082
|
}
|
@@ -1512,6 +1115,7 @@ grpc_error* RouteActionParse(const envoy_config_route_v3_Route* route_msg,
|
|
1512
1115
|
"RouteAction weighted_cluster cluster missing weight");
|
1513
1116
|
}
|
1514
1117
|
cluster.weight = google_protobuf_UInt32Value_value(weight);
|
1118
|
+
if (cluster.weight == 0) continue;
|
1515
1119
|
sum_of_weights += cluster.weight;
|
1516
1120
|
route->weighted_clusters.emplace_back(std::move(cluster));
|
1517
1121
|
}
|
@@ -1526,16 +1130,36 @@ grpc_error* RouteActionParse(const envoy_config_route_v3_Route* route_msg,
|
|
1526
1130
|
} else {
|
1527
1131
|
// No cluster or weighted_clusters found in RouteAction, ignore this route.
|
1528
1132
|
*ignore_route = true;
|
1529
|
-
|
1133
|
+
}
|
1134
|
+
if (XdsTimeoutEnabled() && !*ignore_route) {
|
1135
|
+
const envoy_config_route_v3_RouteAction_MaxStreamDuration*
|
1136
|
+
max_stream_duration =
|
1137
|
+
envoy_config_route_v3_RouteAction_max_stream_duration(route_action);
|
1138
|
+
if (max_stream_duration != nullptr) {
|
1139
|
+
const google_protobuf_Duration* duration =
|
1140
|
+
envoy_config_route_v3_RouteAction_MaxStreamDuration_grpc_timeout_header_max(
|
1141
|
+
max_stream_duration);
|
1142
|
+
if (duration == nullptr) {
|
1143
|
+
duration =
|
1144
|
+
envoy_config_route_v3_RouteAction_MaxStreamDuration_max_stream_duration(
|
1145
|
+
max_stream_duration);
|
1146
|
+
}
|
1147
|
+
if (duration != nullptr) {
|
1148
|
+
XdsApi::Duration duration_in_route;
|
1149
|
+
duration_in_route.seconds = google_protobuf_Duration_seconds(duration);
|
1150
|
+
duration_in_route.nanos = google_protobuf_Duration_nanos(duration);
|
1151
|
+
route->max_stream_duration = duration_in_route;
|
1152
|
+
}
|
1153
|
+
}
|
1530
1154
|
}
|
1531
1155
|
return GRPC_ERROR_NONE;
|
1532
1156
|
}
|
1533
1157
|
|
1534
1158
|
grpc_error* RouteConfigParse(
|
1535
|
-
XdsClient* client, TraceFlag* tracer,
|
1159
|
+
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
|
1536
1160
|
const envoy_config_route_v3_RouteConfiguration* route_config,
|
1537
1161
|
XdsApi::RdsUpdate* rds_update) {
|
1538
|
-
MaybeLogRouteConfiguration(client, tracer, route_config);
|
1162
|
+
MaybeLogRouteConfiguration(client, tracer, symtab, route_config);
|
1539
1163
|
// Get the virtual hosts.
|
1540
1164
|
size_t size;
|
1541
1165
|
const envoy_config_route_v3_VirtualHost* const* virtual_hosts =
|
@@ -1552,7 +1176,9 @@ grpc_error* RouteConfigParse(
|
|
1552
1176
|
std::string domain_pattern = UpbStringToStdString(domains[j]);
|
1553
1177
|
const MatchType match_type = DomainPatternMatchType(domain_pattern);
|
1554
1178
|
if (match_type == INVALID_MATCH) {
|
1555
|
-
return
|
1179
|
+
return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1180
|
+
absl::StrCat("Invalid domain pattern \"", domain_pattern, "\".")
|
1181
|
+
.c_str());
|
1556
1182
|
}
|
1557
1183
|
vhost.domains.emplace_back(std::move(domain_pattern));
|
1558
1184
|
}
|
@@ -1589,13 +1215,6 @@ grpc_error* RouteConfigParse(
|
|
1589
1215
|
error = RouteActionParse(routes[j], &route, &ignore_route);
|
1590
1216
|
if (error != GRPC_ERROR_NONE) return error;
|
1591
1217
|
if (ignore_route) continue;
|
1592
|
-
const google_protobuf_BoolValue* case_sensitive =
|
1593
|
-
envoy_config_route_v3_RouteMatch_case_sensitive(match);
|
1594
|
-
if (case_sensitive != nullptr &&
|
1595
|
-
!google_protobuf_BoolValue_value(case_sensitive)) {
|
1596
|
-
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1597
|
-
"case_sensitive if set must be set to true.");
|
1598
|
-
}
|
1599
1218
|
vhost.routes.emplace_back(std::move(route));
|
1600
1219
|
}
|
1601
1220
|
if (vhost.routes.empty()) {
|
@@ -1605,11 +1224,263 @@ grpc_error* RouteConfigParse(
|
|
1605
1224
|
return GRPC_ERROR_NONE;
|
1606
1225
|
}
|
1607
1226
|
|
1227
|
+
XdsApi::CommonTlsContext::CertificateProviderInstance
|
1228
|
+
CertificateProviderInstanceParse(
|
1229
|
+
const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance*
|
1230
|
+
certificate_provider_instance_proto) {
|
1231
|
+
return {
|
1232
|
+
UpbStringToStdString(
|
1233
|
+
envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_instance_name(
|
1234
|
+
certificate_provider_instance_proto)),
|
1235
|
+
UpbStringToStdString(
|
1236
|
+
envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_certificate_name(
|
1237
|
+
certificate_provider_instance_proto))};
|
1238
|
+
}
|
1239
|
+
|
1240
|
+
grpc_error* CommonTlsContextParse(
|
1241
|
+
const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext*
|
1242
|
+
common_tls_context_proto,
|
1243
|
+
XdsApi::CommonTlsContext* common_tls_context) GRPC_MUST_USE_RESULT;
|
1244
|
+
grpc_error* CommonTlsContextParse(
|
1245
|
+
const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext*
|
1246
|
+
common_tls_context_proto,
|
1247
|
+
XdsApi::CommonTlsContext* common_tls_context) {
|
1248
|
+
auto* combined_validation_context =
|
1249
|
+
envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_combined_validation_context(
|
1250
|
+
common_tls_context_proto);
|
1251
|
+
if (combined_validation_context != nullptr) {
|
1252
|
+
auto* default_validation_context =
|
1253
|
+
envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CombinedCertificateValidationContext_default_validation_context(
|
1254
|
+
combined_validation_context);
|
1255
|
+
if (default_validation_context != nullptr) {
|
1256
|
+
size_t len = 0;
|
1257
|
+
auto* subject_alt_names_matchers =
|
1258
|
+
envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_match_subject_alt_names(
|
1259
|
+
default_validation_context, &len);
|
1260
|
+
for (size_t i = 0; i < len; ++i) {
|
1261
|
+
StringMatcher::Type type;
|
1262
|
+
std::string matcher;
|
1263
|
+
if (envoy_type_matcher_v3_StringMatcher_has_exact(
|
1264
|
+
subject_alt_names_matchers[i])) {
|
1265
|
+
type = StringMatcher::Type::EXACT;
|
1266
|
+
matcher =
|
1267
|
+
UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_exact(
|
1268
|
+
subject_alt_names_matchers[i]));
|
1269
|
+
} else if (envoy_type_matcher_v3_StringMatcher_has_prefix(
|
1270
|
+
subject_alt_names_matchers[i])) {
|
1271
|
+
type = StringMatcher::Type::PREFIX;
|
1272
|
+
matcher =
|
1273
|
+
UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_prefix(
|
1274
|
+
subject_alt_names_matchers[i]));
|
1275
|
+
} else if (envoy_type_matcher_v3_StringMatcher_has_suffix(
|
1276
|
+
subject_alt_names_matchers[i])) {
|
1277
|
+
type = StringMatcher::Type::SUFFIX;
|
1278
|
+
matcher =
|
1279
|
+
UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_suffix(
|
1280
|
+
subject_alt_names_matchers[i]));
|
1281
|
+
} else if (envoy_type_matcher_v3_StringMatcher_has_contains(
|
1282
|
+
subject_alt_names_matchers[i])) {
|
1283
|
+
type = StringMatcher::Type::CONTAINS;
|
1284
|
+
matcher =
|
1285
|
+
UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_contains(
|
1286
|
+
subject_alt_names_matchers[i]));
|
1287
|
+
} else if (envoy_type_matcher_v3_StringMatcher_has_safe_regex(
|
1288
|
+
subject_alt_names_matchers[i])) {
|
1289
|
+
type = StringMatcher::Type::SAFE_REGEX;
|
1290
|
+
auto* regex_matcher = envoy_type_matcher_v3_StringMatcher_safe_regex(
|
1291
|
+
subject_alt_names_matchers[i]);
|
1292
|
+
matcher = UpbStringToStdString(
|
1293
|
+
envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
|
1294
|
+
} else {
|
1295
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1296
|
+
"Invalid StringMatcher specified");
|
1297
|
+
}
|
1298
|
+
bool ignore_case = envoy_type_matcher_v3_StringMatcher_ignore_case(
|
1299
|
+
subject_alt_names_matchers[i]);
|
1300
|
+
absl::StatusOr<StringMatcher> string_matcher =
|
1301
|
+
StringMatcher::Create(type, matcher,
|
1302
|
+
/*case_sensitive=*/!ignore_case);
|
1303
|
+
if (!string_matcher.ok()) {
|
1304
|
+
return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1305
|
+
absl::StrCat("string matcher: ",
|
1306
|
+
string_matcher.status().message())
|
1307
|
+
.c_str());
|
1308
|
+
}
|
1309
|
+
if (type == StringMatcher::Type::SAFE_REGEX && ignore_case) {
|
1310
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1311
|
+
"StringMatcher: ignore_case has no effect for SAFE_REGEX.");
|
1312
|
+
}
|
1313
|
+
common_tls_context->combined_validation_context
|
1314
|
+
.default_validation_context.match_subject_alt_names.push_back(
|
1315
|
+
std::move(string_matcher.value()));
|
1316
|
+
}
|
1317
|
+
}
|
1318
|
+
auto* validation_context_certificate_provider_instance =
|
1319
|
+
envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CombinedCertificateValidationContext_validation_context_certificate_provider_instance(
|
1320
|
+
combined_validation_context);
|
1321
|
+
if (validation_context_certificate_provider_instance != nullptr) {
|
1322
|
+
common_tls_context->combined_validation_context
|
1323
|
+
.validation_context_certificate_provider_instance =
|
1324
|
+
CertificateProviderInstanceParse(
|
1325
|
+
validation_context_certificate_provider_instance);
|
1326
|
+
}
|
1327
|
+
}
|
1328
|
+
auto* tls_certificate_certificate_provider_instance =
|
1329
|
+
envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_tls_certificate_certificate_provider_instance(
|
1330
|
+
common_tls_context_proto);
|
1331
|
+
if (tls_certificate_certificate_provider_instance != nullptr) {
|
1332
|
+
common_tls_context->tls_certificate_certificate_provider_instance =
|
1333
|
+
CertificateProviderInstanceParse(
|
1334
|
+
tls_certificate_certificate_provider_instance);
|
1335
|
+
}
|
1336
|
+
return GRPC_ERROR_NONE;
|
1337
|
+
}
|
1338
|
+
|
1339
|
+
grpc_error* LdsResponseParseClient(
|
1340
|
+
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab, upb_arena* arena,
|
1341
|
+
const envoy_config_listener_v3_ApiListener* api_listener,
|
1342
|
+
XdsApi::LdsUpdate* lds_update) {
|
1343
|
+
lds_update->type = XdsApi::LdsUpdate::ListenerType::kHttpApiListener;
|
1344
|
+
const upb_strview encoded_api_listener = google_protobuf_Any_value(
|
1345
|
+
envoy_config_listener_v3_ApiListener_api_listener(api_listener));
|
1346
|
+
const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*
|
1347
|
+
http_connection_manager =
|
1348
|
+
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_parse(
|
1349
|
+
encoded_api_listener.data, encoded_api_listener.size, arena);
|
1350
|
+
if (http_connection_manager == nullptr) {
|
1351
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1352
|
+
"Could not parse HttpConnectionManager config from ApiListener");
|
1353
|
+
}
|
1354
|
+
if (XdsTimeoutEnabled()) {
|
1355
|
+
// Obtain max_stream_duration from Http Protocol Options.
|
1356
|
+
const envoy_config_core_v3_HttpProtocolOptions* options =
|
1357
|
+
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_common_http_protocol_options(
|
1358
|
+
http_connection_manager);
|
1359
|
+
if (options != nullptr) {
|
1360
|
+
const google_protobuf_Duration* duration =
|
1361
|
+
envoy_config_core_v3_HttpProtocolOptions_max_stream_duration(options);
|
1362
|
+
if (duration != nullptr) {
|
1363
|
+
lds_update->http_max_stream_duration.seconds =
|
1364
|
+
google_protobuf_Duration_seconds(duration);
|
1365
|
+
lds_update->http_max_stream_duration.nanos =
|
1366
|
+
google_protobuf_Duration_nanos(duration);
|
1367
|
+
}
|
1368
|
+
}
|
1369
|
+
}
|
1370
|
+
// Found inlined route_config. Parse it to find the cluster_name.
|
1371
|
+
if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
|
1372
|
+
http_connection_manager)) {
|
1373
|
+
const envoy_config_route_v3_RouteConfiguration* route_config =
|
1374
|
+
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(
|
1375
|
+
http_connection_manager);
|
1376
|
+
XdsApi::RdsUpdate rds_update;
|
1377
|
+
grpc_error* error =
|
1378
|
+
RouteConfigParse(client, tracer, symtab, route_config, &rds_update);
|
1379
|
+
if (error != GRPC_ERROR_NONE) return error;
|
1380
|
+
lds_update->rds_update = std::move(rds_update);
|
1381
|
+
return GRPC_ERROR_NONE;
|
1382
|
+
}
|
1383
|
+
// Validate that RDS must be used to get the route_config dynamically.
|
1384
|
+
if (!envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_rds(
|
1385
|
+
http_connection_manager)) {
|
1386
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1387
|
+
"HttpConnectionManager neither has inlined route_config nor RDS.");
|
1388
|
+
}
|
1389
|
+
const envoy_extensions_filters_network_http_connection_manager_v3_Rds* rds =
|
1390
|
+
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(
|
1391
|
+
http_connection_manager);
|
1392
|
+
// Check that the ConfigSource specifies ADS.
|
1393
|
+
const envoy_config_core_v3_ConfigSource* config_source =
|
1394
|
+
envoy_extensions_filters_network_http_connection_manager_v3_Rds_config_source(
|
1395
|
+
rds);
|
1396
|
+
if (config_source == nullptr) {
|
1397
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1398
|
+
"HttpConnectionManager missing config_source for RDS.");
|
1399
|
+
}
|
1400
|
+
if (!envoy_config_core_v3_ConfigSource_has_ads(config_source)) {
|
1401
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1402
|
+
"HttpConnectionManager ConfigSource for RDS does not specify ADS.");
|
1403
|
+
}
|
1404
|
+
// Get the route_config_name.
|
1405
|
+
lds_update->route_config_name = UpbStringToStdString(
|
1406
|
+
envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(
|
1407
|
+
rds));
|
1408
|
+
return GRPC_ERROR_NONE;
|
1409
|
+
}
|
1410
|
+
|
1411
|
+
grpc_error* LdsResponseParseServer(
|
1412
|
+
upb_arena* arena, const envoy_config_listener_v3_Listener* listener,
|
1413
|
+
const std::string& /*listener_name*/,
|
1414
|
+
const envoy_config_core_v3_Address* /*address*/,
|
1415
|
+
XdsApi::LdsUpdate* lds_update) {
|
1416
|
+
lds_update->type = XdsApi::LdsUpdate::ListenerType::kTcpListener;
|
1417
|
+
// TODO(yashykt): Support filter chain match.
|
1418
|
+
// Right now, we are supporting and expecting only one entry in filter_chains.
|
1419
|
+
size_t size = 0;
|
1420
|
+
auto* filter_chains =
|
1421
|
+
envoy_config_listener_v3_Listener_filter_chains(listener, &size);
|
1422
|
+
if (size != 1) {
|
1423
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1424
|
+
"Only one filter_chain supported.");
|
1425
|
+
}
|
1426
|
+
// Get the DownstreamTlsContext from the match
|
1427
|
+
if (XdsSecurityEnabled()) {
|
1428
|
+
auto* transport_socket =
|
1429
|
+
envoy_config_listener_v3_FilterChain_transport_socket(filter_chains[0]);
|
1430
|
+
if (transport_socket != nullptr) {
|
1431
|
+
absl::string_view name = UpbStringToAbsl(
|
1432
|
+
envoy_config_core_v3_TransportSocket_name(transport_socket));
|
1433
|
+
if (name == "envoy.transport_sockets.tls") {
|
1434
|
+
auto* typed_config =
|
1435
|
+
envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
|
1436
|
+
if (typed_config != nullptr) {
|
1437
|
+
const upb_strview encoded_downstream_tls_context =
|
1438
|
+
google_protobuf_Any_value(typed_config);
|
1439
|
+
auto* downstream_tls_context =
|
1440
|
+
envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_parse(
|
1441
|
+
encoded_downstream_tls_context.data,
|
1442
|
+
encoded_downstream_tls_context.size, arena);
|
1443
|
+
if (downstream_tls_context == nullptr) {
|
1444
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1445
|
+
"Can't decode downstream tls context.");
|
1446
|
+
}
|
1447
|
+
auto* common_tls_context =
|
1448
|
+
envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_common_tls_context(
|
1449
|
+
downstream_tls_context);
|
1450
|
+
if (common_tls_context != nullptr) {
|
1451
|
+
grpc_error* error = CommonTlsContextParse(
|
1452
|
+
common_tls_context,
|
1453
|
+
&lds_update->downstream_tls_context.common_tls_context);
|
1454
|
+
if (error != GRPC_ERROR_NONE) return error;
|
1455
|
+
}
|
1456
|
+
auto* require_client_certificate =
|
1457
|
+
envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_client_certificate(
|
1458
|
+
downstream_tls_context);
|
1459
|
+
if (require_client_certificate != nullptr) {
|
1460
|
+
lds_update->downstream_tls_context.require_client_certificate =
|
1461
|
+
google_protobuf_BoolValue_value(require_client_certificate);
|
1462
|
+
}
|
1463
|
+
}
|
1464
|
+
if (lds_update->downstream_tls_context.common_tls_context
|
1465
|
+
.tls_certificate_certificate_provider_instance.instance_name
|
1466
|
+
.empty()) {
|
1467
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1468
|
+
"TLS configuration provided but no "
|
1469
|
+
"tls_certificate_certificate_provider_instance found.");
|
1470
|
+
}
|
1471
|
+
}
|
1472
|
+
}
|
1473
|
+
}
|
1474
|
+
return GRPC_ERROR_NONE;
|
1475
|
+
}
|
1476
|
+
|
1608
1477
|
grpc_error* LdsResponseParse(
|
1609
|
-
XdsClient* client, TraceFlag* tracer,
|
1478
|
+
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
|
1610
1479
|
const envoy_service_discovery_v3_DiscoveryResponse* response,
|
1611
|
-
const std::
|
1612
|
-
|
1480
|
+
const std::set<absl::string_view>& expected_listener_names,
|
1481
|
+
XdsApi::LdsUpdateMap* lds_update_map,
|
1482
|
+
std::set<std::string>* resource_names_failed, upb_arena* arena) {
|
1483
|
+
std::vector<grpc_error*> errors;
|
1613
1484
|
// Get the resources from the response.
|
1614
1485
|
size_t size;
|
1615
1486
|
const google_protobuf_Any* const* resources =
|
@@ -1619,7 +1490,10 @@ grpc_error* LdsResponseParse(
|
|
1619
1490
|
absl::string_view type_url =
|
1620
1491
|
UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
|
1621
1492
|
if (!IsLds(type_url)) {
|
1622
|
-
|
1493
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1494
|
+
absl::StrCat("resource index ", i, ": Resource is not LDS.")
|
1495
|
+
.c_str()));
|
1496
|
+
continue;
|
1623
1497
|
}
|
1624
1498
|
// Decode the listener.
|
1625
1499
|
const upb_strview encoded_listener =
|
@@ -1628,79 +1502,74 @@ grpc_error* LdsResponseParse(
|
|
1628
1502
|
envoy_config_listener_v3_Listener_parse(encoded_listener.data,
|
1629
1503
|
encoded_listener.size, arena);
|
1630
1504
|
if (listener == nullptr) {
|
1631
|
-
|
1505
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1506
|
+
absl::StrCat("resource index ", i, ": Can't decode listener.")
|
1507
|
+
.c_str()));
|
1508
|
+
continue;
|
1632
1509
|
}
|
1633
1510
|
// Check listener name. Ignore unexpected listeners.
|
1634
|
-
|
1635
|
-
|
1636
|
-
if (
|
1637
|
-
|
1511
|
+
std::string listener_name =
|
1512
|
+
UpbStringToStdString(envoy_config_listener_v3_Listener_name(listener));
|
1513
|
+
if (expected_listener_names.find(listener_name) ==
|
1514
|
+
expected_listener_names.end()) {
|
1515
|
+
continue;
|
1516
|
+
}
|
1517
|
+
// Fail if listener name is duplicated.
|
1518
|
+
if (lds_update_map->find(listener_name) != lds_update_map->end()) {
|
1519
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1520
|
+
absl::StrCat("duplicate listener name \"", listener_name, "\"")
|
1521
|
+
.c_str()));
|
1522
|
+
resource_names_failed->insert(listener_name);
|
1523
|
+
continue;
|
1524
|
+
}
|
1525
|
+
XdsApi::LdsUpdate& lds_update = (*lds_update_map)[listener_name];
|
1526
|
+
// Check whether it's a client or server listener.
|
1638
1527
|
const envoy_config_listener_v3_ApiListener* api_listener =
|
1639
1528
|
envoy_config_listener_v3_Listener_api_listener(listener);
|
1640
|
-
|
1641
|
-
|
1642
|
-
|
1643
|
-
|
1644
|
-
|
1645
|
-
|
1646
|
-
|
1647
|
-
|
1648
|
-
|
1649
|
-
encoded_api_listener.data, encoded_api_listener.size, arena);
|
1650
|
-
if (http_connection_manager == nullptr) {
|
1651
|
-
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1652
|
-
"Could not parse HttpConnectionManager config from ApiListener");
|
1653
|
-
}
|
1654
|
-
// Found inlined route_config. Parse it to find the cluster_name.
|
1655
|
-
if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
|
1656
|
-
http_connection_manager)) {
|
1657
|
-
const envoy_config_route_v3_RouteConfiguration* route_config =
|
1658
|
-
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(
|
1659
|
-
http_connection_manager);
|
1660
|
-
XdsApi::RdsUpdate rds_update;
|
1661
|
-
grpc_error* error =
|
1662
|
-
RouteConfigParse(client, tracer, route_config, &rds_update);
|
1663
|
-
if (error != GRPC_ERROR_NONE) return error;
|
1664
|
-
lds_update->emplace();
|
1665
|
-
(*lds_update)->rds_update = std::move(rds_update);
|
1666
|
-
return GRPC_ERROR_NONE;
|
1529
|
+
const envoy_config_core_v3_Address* address =
|
1530
|
+
envoy_config_listener_v3_Listener_address(listener);
|
1531
|
+
if (api_listener != nullptr && address != nullptr) {
|
1532
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1533
|
+
absl::StrCat(listener_name,
|
1534
|
+
": Listener has both address and ApiListener")
|
1535
|
+
.c_str()));
|
1536
|
+
resource_names_failed->insert(listener_name);
|
1537
|
+
continue;
|
1667
1538
|
}
|
1668
|
-
|
1669
|
-
|
1670
|
-
|
1671
|
-
|
1672
|
-
|
1539
|
+
if (api_listener == nullptr && address == nullptr) {
|
1540
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1541
|
+
absl::StrCat(listener_name,
|
1542
|
+
": Listener has neither address nor ApiListener")
|
1543
|
+
.c_str()));
|
1544
|
+
resource_names_failed->insert(listener_name);
|
1545
|
+
continue;
|
1673
1546
|
}
|
1674
|
-
|
1675
|
-
|
1676
|
-
|
1677
|
-
|
1678
|
-
|
1679
|
-
|
1680
|
-
|
1681
|
-
if (config_source == nullptr) {
|
1682
|
-
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1683
|
-
"HttpConnectionManager missing config_source for RDS.");
|
1547
|
+
grpc_error* error = GRPC_ERROR_NONE;
|
1548
|
+
if (api_listener != nullptr) {
|
1549
|
+
error = LdsResponseParseClient(client, tracer, symtab, arena,
|
1550
|
+
api_listener, &lds_update);
|
1551
|
+
} else {
|
1552
|
+
error = LdsResponseParseServer(arena, listener, listener_name, address,
|
1553
|
+
&lds_update);
|
1684
1554
|
}
|
1685
|
-
if (
|
1686
|
-
|
1687
|
-
|
1555
|
+
if (error != GRPC_ERROR_NONE) {
|
1556
|
+
errors.push_back(grpc_error_add_child(
|
1557
|
+
GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1558
|
+
absl::StrCat(listener_name, ": validation error").c_str()),
|
1559
|
+
error));
|
1560
|
+
resource_names_failed->insert(listener_name);
|
1688
1561
|
}
|
1689
|
-
// Get the route_config_name.
|
1690
|
-
lds_update->emplace();
|
1691
|
-
(*lds_update)->route_config_name = UpbStringToStdString(
|
1692
|
-
envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(
|
1693
|
-
rds));
|
1694
|
-
return GRPC_ERROR_NONE;
|
1695
1562
|
}
|
1696
|
-
return
|
1563
|
+
return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing LDS response", &errors);
|
1697
1564
|
}
|
1698
1565
|
|
1699
1566
|
grpc_error* RdsResponseParse(
|
1700
|
-
XdsClient* client, TraceFlag* tracer,
|
1567
|
+
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
|
1701
1568
|
const envoy_service_discovery_v3_DiscoveryResponse* response,
|
1702
1569
|
const std::set<absl::string_view>& expected_route_configuration_names,
|
1703
|
-
|
1570
|
+
XdsApi::RdsUpdateMap* rds_update_map,
|
1571
|
+
std::set<std::string>* resource_names_failed, upb_arena* arena) {
|
1572
|
+
std::vector<grpc_error*> errors;
|
1704
1573
|
// Get the resources from the response.
|
1705
1574
|
size_t size;
|
1706
1575
|
const google_protobuf_Any* const* resources =
|
@@ -1710,7 +1579,10 @@ grpc_error* RdsResponseParse(
|
|
1710
1579
|
absl::string_view type_url =
|
1711
1580
|
UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
|
1712
1581
|
if (!IsRds(type_url)) {
|
1713
|
-
|
1582
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1583
|
+
absl::StrCat("resource index ", i, ": Resource is not RDS.")
|
1584
|
+
.c_str()));
|
1585
|
+
continue;
|
1714
1586
|
}
|
1715
1587
|
// Decode the route_config.
|
1716
1588
|
const upb_strview encoded_route_config =
|
@@ -1719,43 +1591,63 @@ grpc_error* RdsResponseParse(
|
|
1719
1591
|
envoy_config_route_v3_RouteConfiguration_parse(
|
1720
1592
|
encoded_route_config.data, encoded_route_config.size, arena);
|
1721
1593
|
if (route_config == nullptr) {
|
1722
|
-
|
1594
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1595
|
+
absl::StrCat("resource index ", i, ": Can't decode route_config.")
|
1596
|
+
.c_str()));
|
1597
|
+
continue;
|
1723
1598
|
}
|
1724
1599
|
// Check route_config_name. Ignore unexpected route_config.
|
1725
|
-
|
1600
|
+
std::string route_config_name = UpbStringToStdString(
|
1726
1601
|
envoy_config_route_v3_RouteConfiguration_name(route_config));
|
1727
1602
|
if (expected_route_configuration_names.find(route_config_name) ==
|
1728
1603
|
expected_route_configuration_names.end()) {
|
1729
1604
|
continue;
|
1730
1605
|
}
|
1606
|
+
// Fail if route config name is duplicated.
|
1607
|
+
if (rds_update_map->find(route_config_name) != rds_update_map->end()) {
|
1608
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1609
|
+
absl::StrCat("duplicate route config name \"", route_config_name,
|
1610
|
+
"\"")
|
1611
|
+
.c_str()));
|
1612
|
+
resource_names_failed->insert(route_config_name);
|
1613
|
+
continue;
|
1614
|
+
}
|
1731
1615
|
// Parse the route_config.
|
1732
|
-
XdsApi::RdsUpdate
|
1616
|
+
XdsApi::RdsUpdate& rds_update = (*rds_update_map)[route_config_name];
|
1733
1617
|
grpc_error* error =
|
1734
|
-
RouteConfigParse(client, tracer, route_config, &
|
1735
|
-
if (error != GRPC_ERROR_NONE)
|
1736
|
-
|
1737
|
-
|
1618
|
+
RouteConfigParse(client, tracer, symtab, route_config, &rds_update);
|
1619
|
+
if (error != GRPC_ERROR_NONE) {
|
1620
|
+
errors.push_back(grpc_error_add_child(
|
1621
|
+
GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1622
|
+
absl::StrCat(route_config_name, ": validation error").c_str()),
|
1623
|
+
error));
|
1624
|
+
resource_names_failed->insert(route_config_name);
|
1625
|
+
}
|
1738
1626
|
}
|
1739
|
-
return
|
1627
|
+
return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing RDS response", &errors);
|
1740
1628
|
}
|
1741
1629
|
|
1742
1630
|
grpc_error* CdsResponseParse(
|
1743
|
-
XdsClient* client, TraceFlag* tracer,
|
1631
|
+
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
|
1744
1632
|
const envoy_service_discovery_v3_DiscoveryResponse* response,
|
1745
1633
|
const std::set<absl::string_view>& expected_cluster_names,
|
1746
|
-
XdsApi::CdsUpdateMap* cds_update_map,
|
1634
|
+
XdsApi::CdsUpdateMap* cds_update_map,
|
1635
|
+
std::set<std::string>* resource_names_failed, upb_arena* arena) {
|
1636
|
+
std::vector<grpc_error*> errors;
|
1747
1637
|
// Get the resources from the response.
|
1748
1638
|
size_t size;
|
1749
1639
|
const google_protobuf_Any* const* resources =
|
1750
1640
|
envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size);
|
1751
1641
|
// Parse all the resources in the CDS response.
|
1752
1642
|
for (size_t i = 0; i < size; ++i) {
|
1753
|
-
XdsApi::CdsUpdate cds_update;
|
1754
1643
|
// Check the type_url of the resource.
|
1755
1644
|
absl::string_view type_url =
|
1756
1645
|
UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
|
1757
1646
|
if (!IsCds(type_url)) {
|
1758
|
-
|
1647
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1648
|
+
absl::StrCat("resource index ", i, ": Resource is not CDS.")
|
1649
|
+
.c_str()));
|
1650
|
+
continue;
|
1759
1651
|
}
|
1760
1652
|
// Decode the cluster.
|
1761
1653
|
const upb_strview encoded_cluster = google_protobuf_Any_value(resources[i]);
|
@@ -1763,9 +1655,12 @@ grpc_error* CdsResponseParse(
|
|
1763
1655
|
envoy_config_cluster_v3_Cluster_parse(encoded_cluster.data,
|
1764
1656
|
encoded_cluster.size, arena);
|
1765
1657
|
if (cluster == nullptr) {
|
1766
|
-
|
1658
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1659
|
+
absl::StrCat("resource index ", i, ": Can't decode cluster.")
|
1660
|
+
.c_str()));
|
1661
|
+
continue;
|
1767
1662
|
}
|
1768
|
-
MaybeLogCluster(client, tracer, cluster);
|
1663
|
+
MaybeLogCluster(client, tracer, symtab, cluster);
|
1769
1664
|
// Ignore unexpected cluster names.
|
1770
1665
|
std::string cluster_name =
|
1771
1666
|
UpbStringToStdString(envoy_config_cluster_v3_Cluster_name(cluster));
|
@@ -1775,54 +1670,290 @@ grpc_error* CdsResponseParse(
|
|
1775
1670
|
}
|
1776
1671
|
// Fail on duplicate resources.
|
1777
1672
|
if (cds_update_map->find(cluster_name) != cds_update_map->end()) {
|
1778
|
-
|
1673
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1779
1674
|
absl::StrCat("duplicate resource name \"", cluster_name, "\"")
|
1780
|
-
.c_str());
|
1675
|
+
.c_str()));
|
1676
|
+
resource_names_failed->insert(cluster_name);
|
1677
|
+
continue;
|
1781
1678
|
}
|
1679
|
+
XdsApi::CdsUpdate& cds_update = (*cds_update_map)[cluster_name];
|
1782
1680
|
// Check the cluster_discovery_type.
|
1783
|
-
if (!envoy_config_cluster_v3_Cluster_has_type(cluster)
|
1784
|
-
|
1681
|
+
if (!envoy_config_cluster_v3_Cluster_has_type(cluster) &&
|
1682
|
+
!envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
|
1683
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1684
|
+
absl::StrCat(cluster_name, ": DiscoveryType not found.").c_str()));
|
1685
|
+
resource_names_failed->insert(cluster_name);
|
1686
|
+
continue;
|
1785
1687
|
}
|
1786
|
-
if (envoy_config_cluster_v3_Cluster_type(cluster)
|
1688
|
+
if (envoy_config_cluster_v3_Cluster_type(cluster) ==
|
1787
1689
|
envoy_config_cluster_v3_Cluster_EDS) {
|
1788
|
-
|
1789
|
-
|
1790
|
-
|
1791
|
-
|
1792
|
-
|
1793
|
-
|
1794
|
-
|
1795
|
-
|
1796
|
-
|
1797
|
-
|
1798
|
-
|
1799
|
-
|
1800
|
-
|
1801
|
-
|
1802
|
-
|
1803
|
-
|
1804
|
-
|
1805
|
-
|
1690
|
+
cds_update.cluster_type = XdsApi::CdsUpdate::ClusterType::EDS;
|
1691
|
+
// Check the EDS config source.
|
1692
|
+
const envoy_config_cluster_v3_Cluster_EdsClusterConfig*
|
1693
|
+
eds_cluster_config =
|
1694
|
+
envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
|
1695
|
+
const envoy_config_core_v3_ConfigSource* eds_config =
|
1696
|
+
envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
|
1697
|
+
eds_cluster_config);
|
1698
|
+
if (!envoy_config_core_v3_ConfigSource_has_ads(eds_config)) {
|
1699
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1700
|
+
absl::StrCat(cluster_name, ": EDS ConfigSource is not ADS.")
|
1701
|
+
.c_str()));
|
1702
|
+
resource_names_failed->insert(cluster_name);
|
1703
|
+
continue;
|
1704
|
+
}
|
1705
|
+
// Record EDS service_name (if any).
|
1706
|
+
upb_strview service_name =
|
1707
|
+
envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
|
1708
|
+
eds_cluster_config);
|
1709
|
+
if (service_name.size != 0) {
|
1710
|
+
cds_update.eds_service_name = UpbStringToStdString(service_name);
|
1711
|
+
}
|
1712
|
+
} else if (!XdsAggregateAndLogicalDnsClusterEnabled()) {
|
1713
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1714
|
+
absl::StrCat(cluster_name, ": DiscoveryType is not valid.").c_str()));
|
1715
|
+
resource_names_failed->insert(cluster_name);
|
1716
|
+
continue;
|
1717
|
+
} else if (envoy_config_cluster_v3_Cluster_type(cluster) ==
|
1718
|
+
envoy_config_cluster_v3_Cluster_LOGICAL_DNS) {
|
1719
|
+
cds_update.cluster_type = XdsApi::CdsUpdate::ClusterType::LOGICAL_DNS;
|
1720
|
+
} else {
|
1721
|
+
if (envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
|
1722
|
+
const envoy_config_cluster_v3_Cluster_CustomClusterType*
|
1723
|
+
custom_cluster_type =
|
1724
|
+
envoy_config_cluster_v3_Cluster_cluster_type(cluster);
|
1725
|
+
upb_strview type_name =
|
1726
|
+
envoy_config_cluster_v3_Cluster_CustomClusterType_name(
|
1727
|
+
custom_cluster_type);
|
1728
|
+
if (UpbStringToAbsl(type_name) == "envoy.clusters.aggregate") {
|
1729
|
+
cds_update.cluster_type = XdsApi::CdsUpdate::ClusterType::AGGREGATE;
|
1730
|
+
// Retrieve aggregate clusters.
|
1731
|
+
const google_protobuf_Any* typed_config =
|
1732
|
+
envoy_config_cluster_v3_Cluster_CustomClusterType_typed_config(
|
1733
|
+
custom_cluster_type);
|
1734
|
+
const upb_strview aggregate_cluster_config_upb_strview =
|
1735
|
+
google_protobuf_Any_value(typed_config);
|
1736
|
+
const envoy_extensions_clusters_aggregate_v3_ClusterConfig*
|
1737
|
+
aggregate_cluster_config =
|
1738
|
+
envoy_extensions_clusters_aggregate_v3_ClusterConfig_parse(
|
1739
|
+
aggregate_cluster_config_upb_strview.data,
|
1740
|
+
aggregate_cluster_config_upb_strview.size, arena);
|
1741
|
+
if (aggregate_cluster_config == nullptr) {
|
1742
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1743
|
+
absl::StrCat(cluster_name, ": Can't parse aggregate cluster.")
|
1744
|
+
.c_str()));
|
1745
|
+
resource_names_failed->insert(cluster_name);
|
1746
|
+
continue;
|
1747
|
+
}
|
1748
|
+
size_t size;
|
1749
|
+
const upb_strview* clusters =
|
1750
|
+
envoy_extensions_clusters_aggregate_v3_ClusterConfig_clusters(
|
1751
|
+
aggregate_cluster_config, &size);
|
1752
|
+
for (size_t i = 0; i < size; ++i) {
|
1753
|
+
const upb_strview cluster = clusters[i];
|
1754
|
+
cds_update.prioritized_cluster_names.emplace_back(
|
1755
|
+
UpbStringToStdString(cluster));
|
1756
|
+
}
|
1757
|
+
} else {
|
1758
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1759
|
+
absl::StrCat(cluster_name, ": DiscoveryType is not valid.")
|
1760
|
+
.c_str()));
|
1761
|
+
resource_names_failed->insert(cluster_name);
|
1762
|
+
continue;
|
1763
|
+
}
|
1764
|
+
} else {
|
1765
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1766
|
+
absl::StrCat(cluster_name, ": DiscoveryType is not valid.")
|
1767
|
+
.c_str()));
|
1768
|
+
resource_names_failed->insert(cluster_name);
|
1769
|
+
continue;
|
1770
|
+
}
|
1806
1771
|
}
|
1807
1772
|
// Check the LB policy.
|
1808
|
-
if (envoy_config_cluster_v3_Cluster_lb_policy(cluster)
|
1773
|
+
if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
|
1809
1774
|
envoy_config_cluster_v3_Cluster_ROUND_ROBIN) {
|
1810
|
-
|
1811
|
-
|
1775
|
+
cds_update.lb_policy = "ROUND_ROBIN";
|
1776
|
+
} else if (XdsRingHashEnabled() &&
|
1777
|
+
envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
|
1778
|
+
envoy_config_cluster_v3_Cluster_RING_HASH) {
|
1779
|
+
cds_update.lb_policy = "RING_HASH";
|
1780
|
+
// Record ring hash lb config
|
1781
|
+
auto* ring_hash_config =
|
1782
|
+
envoy_config_cluster_v3_Cluster_ring_hash_lb_config(cluster);
|
1783
|
+
if (ring_hash_config == nullptr) {
|
1784
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1785
|
+
absl::StrCat(cluster_name,
|
1786
|
+
": ring hash lb config required but not present.")
|
1787
|
+
.c_str()));
|
1788
|
+
resource_names_failed->insert(cluster_name);
|
1789
|
+
continue;
|
1790
|
+
}
|
1791
|
+
const google_protobuf_UInt64Value* max_ring_size =
|
1792
|
+
envoy_config_cluster_v3_Cluster_RingHashLbConfig_maximum_ring_size(
|
1793
|
+
ring_hash_config);
|
1794
|
+
if (max_ring_size != nullptr) {
|
1795
|
+
cds_update.max_ring_size =
|
1796
|
+
google_protobuf_UInt64Value_value(max_ring_size);
|
1797
|
+
if (cds_update.max_ring_size > 8388608 ||
|
1798
|
+
cds_update.max_ring_size == 0) {
|
1799
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1800
|
+
absl::StrCat(
|
1801
|
+
cluster_name,
|
1802
|
+
": max_ring_size is not in the range of 1 to 8388608.")
|
1803
|
+
.c_str()));
|
1804
|
+
resource_names_failed->insert(cluster_name);
|
1805
|
+
continue;
|
1806
|
+
}
|
1807
|
+
}
|
1808
|
+
const google_protobuf_UInt64Value* min_ring_size =
|
1809
|
+
envoy_config_cluster_v3_Cluster_RingHashLbConfig_minimum_ring_size(
|
1810
|
+
ring_hash_config);
|
1811
|
+
if (min_ring_size != nullptr) {
|
1812
|
+
cds_update.min_ring_size =
|
1813
|
+
google_protobuf_UInt64Value_value(min_ring_size);
|
1814
|
+
if (cds_update.min_ring_size > 8388608 ||
|
1815
|
+
cds_update.min_ring_size == 0) {
|
1816
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1817
|
+
absl::StrCat(
|
1818
|
+
cluster_name,
|
1819
|
+
": min_ring_size is not in the range of 1 to 8388608.")
|
1820
|
+
.c_str()));
|
1821
|
+
resource_names_failed->insert(cluster_name);
|
1822
|
+
continue;
|
1823
|
+
}
|
1824
|
+
if (cds_update.min_ring_size > cds_update.max_ring_size) {
|
1825
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1826
|
+
absl::StrCat(
|
1827
|
+
cluster_name,
|
1828
|
+
": min_ring_size cannot be greater than max_ring_size.")
|
1829
|
+
.c_str()));
|
1830
|
+
resource_names_failed->insert(cluster_name);
|
1831
|
+
continue;
|
1832
|
+
}
|
1833
|
+
}
|
1834
|
+
if (envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
|
1835
|
+
ring_hash_config) ==
|
1836
|
+
envoy_config_cluster_v3_Cluster_RingHashLbConfig_XX_HASH) {
|
1837
|
+
cds_update.hash_function = XdsApi::CdsUpdate::HashFunction::XX_HASH;
|
1838
|
+
} else if (
|
1839
|
+
envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
|
1840
|
+
ring_hash_config) ==
|
1841
|
+
envoy_config_cluster_v3_Cluster_RingHashLbConfig_MURMUR_HASH_2) {
|
1842
|
+
cds_update.hash_function =
|
1843
|
+
XdsApi::CdsUpdate::HashFunction::MURMUR_HASH_2;
|
1844
|
+
} else {
|
1845
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1846
|
+
absl::StrCat(cluster_name,
|
1847
|
+
": ring hash lb config has invalid hash function.")
|
1848
|
+
.c_str()));
|
1849
|
+
resource_names_failed->insert(cluster_name);
|
1850
|
+
continue;
|
1851
|
+
}
|
1852
|
+
} else {
|
1853
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1854
|
+
absl::StrCat(cluster_name, ": LB policy is not supported.").c_str()));
|
1855
|
+
resource_names_failed->insert(cluster_name);
|
1856
|
+
continue;
|
1857
|
+
}
|
1858
|
+
if (XdsSecurityEnabled()) {
|
1859
|
+
// Record Upstream tls context
|
1860
|
+
auto* transport_socket =
|
1861
|
+
envoy_config_cluster_v3_Cluster_transport_socket(cluster);
|
1862
|
+
if (transport_socket != nullptr) {
|
1863
|
+
absl::string_view name = UpbStringToAbsl(
|
1864
|
+
envoy_config_core_v3_TransportSocket_name(transport_socket));
|
1865
|
+
if (name == "envoy.transport_sockets.tls") {
|
1866
|
+
auto* typed_config =
|
1867
|
+
envoy_config_core_v3_TransportSocket_typed_config(
|
1868
|
+
transport_socket);
|
1869
|
+
if (typed_config != nullptr) {
|
1870
|
+
const upb_strview encoded_upstream_tls_context =
|
1871
|
+
google_protobuf_Any_value(typed_config);
|
1872
|
+
auto* upstream_tls_context =
|
1873
|
+
envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
|
1874
|
+
encoded_upstream_tls_context.data,
|
1875
|
+
encoded_upstream_tls_context.size, arena);
|
1876
|
+
if (upstream_tls_context == nullptr) {
|
1877
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1878
|
+
absl::StrCat(cluster_name,
|
1879
|
+
": Can't decode upstream tls context.")
|
1880
|
+
.c_str()));
|
1881
|
+
resource_names_failed->insert(cluster_name);
|
1882
|
+
continue;
|
1883
|
+
}
|
1884
|
+
auto* common_tls_context =
|
1885
|
+
envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
|
1886
|
+
upstream_tls_context);
|
1887
|
+
if (common_tls_context != nullptr) {
|
1888
|
+
grpc_error* error = CommonTlsContextParse(
|
1889
|
+
common_tls_context, &cds_update.common_tls_context);
|
1890
|
+
if (error != GRPC_ERROR_NONE) {
|
1891
|
+
errors.push_back(grpc_error_add_child(
|
1892
|
+
GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1893
|
+
absl::StrCat(cluster_name, ": error in TLS context")
|
1894
|
+
.c_str()),
|
1895
|
+
error));
|
1896
|
+
resource_names_failed->insert(cluster_name);
|
1897
|
+
continue;
|
1898
|
+
}
|
1899
|
+
}
|
1900
|
+
}
|
1901
|
+
if (cds_update.common_tls_context.combined_validation_context
|
1902
|
+
.validation_context_certificate_provider_instance
|
1903
|
+
.instance_name.empty()) {
|
1904
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1905
|
+
absl::StrCat(cluster_name,
|
1906
|
+
"TLS configuration provided but no "
|
1907
|
+
"validation_context_certificate_provider_instance "
|
1908
|
+
"found.")
|
1909
|
+
.c_str()));
|
1910
|
+
resource_names_failed->insert(cluster_name);
|
1911
|
+
continue;
|
1912
|
+
}
|
1913
|
+
}
|
1914
|
+
}
|
1812
1915
|
}
|
1813
1916
|
// Record LRS server name (if any).
|
1814
1917
|
const envoy_config_core_v3_ConfigSource* lrs_server =
|
1815
1918
|
envoy_config_cluster_v3_Cluster_lrs_server(cluster);
|
1816
1919
|
if (lrs_server != nullptr) {
|
1817
1920
|
if (!envoy_config_core_v3_ConfigSource_has_self(lrs_server)) {
|
1818
|
-
|
1819
|
-
"LRS ConfigSource is not self.")
|
1921
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1922
|
+
absl::StrCat(cluster_name, ": LRS ConfigSource is not self.")
|
1923
|
+
.c_str()));
|
1924
|
+
resource_names_failed->insert(cluster_name);
|
1925
|
+
continue;
|
1820
1926
|
}
|
1821
1927
|
cds_update.lrs_load_reporting_server_name.emplace("");
|
1822
1928
|
}
|
1823
|
-
|
1929
|
+
// The Cluster resource encodes the circuit breaking parameters in a list of
|
1930
|
+
// Thresholds messages, where each message specifies the parameters for a
|
1931
|
+
// particular RoutingPriority. we will look only at the first entry in the
|
1932
|
+
// list for priority DEFAULT and default to 1024 if not found.
|
1933
|
+
if (envoy_config_cluster_v3_Cluster_has_circuit_breakers(cluster)) {
|
1934
|
+
const envoy_config_cluster_v3_CircuitBreakers* circuit_breakers =
|
1935
|
+
envoy_config_cluster_v3_Cluster_circuit_breakers(cluster);
|
1936
|
+
size_t num_thresholds;
|
1937
|
+
const envoy_config_cluster_v3_CircuitBreakers_Thresholds* const*
|
1938
|
+
thresholds = envoy_config_cluster_v3_CircuitBreakers_thresholds(
|
1939
|
+
circuit_breakers, &num_thresholds);
|
1940
|
+
for (size_t i = 0; i < num_thresholds; ++i) {
|
1941
|
+
const auto* threshold = thresholds[i];
|
1942
|
+
if (envoy_config_cluster_v3_CircuitBreakers_Thresholds_priority(
|
1943
|
+
threshold) == envoy_config_core_v3_DEFAULT) {
|
1944
|
+
const google_protobuf_UInt32Value* max_requests =
|
1945
|
+
envoy_config_cluster_v3_CircuitBreakers_Thresholds_max_requests(
|
1946
|
+
threshold);
|
1947
|
+
if (max_requests != nullptr) {
|
1948
|
+
cds_update.max_concurrent_requests =
|
1949
|
+
google_protobuf_UInt32Value_value(max_requests);
|
1950
|
+
}
|
1951
|
+
break;
|
1952
|
+
}
|
1953
|
+
}
|
1954
|
+
}
|
1824
1955
|
}
|
1825
|
-
return
|
1956
|
+
return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing CDS response", &errors);
|
1826
1957
|
}
|
1827
1958
|
|
1828
1959
|
grpc_error* ServerAddressParseAndAppend(
|
@@ -1858,7 +1989,7 @@ grpc_error* ServerAddressParseAndAppend(
|
|
1858
1989
|
|
1859
1990
|
grpc_error* LocalityParse(
|
1860
1991
|
const envoy_config_endpoint_v3_LocalityLbEndpoints* locality_lb_endpoints,
|
1861
|
-
XdsApi::
|
1992
|
+
XdsApi::EdsUpdate::Priority::Locality* output_locality, size_t* priority) {
|
1862
1993
|
// Parse LB weight.
|
1863
1994
|
const google_protobuf_UInt32Value* lb_weight =
|
1864
1995
|
envoy_config_endpoint_v3_LocalityLbEndpoints_load_balancing_weight(
|
@@ -1888,25 +2019,24 @@ grpc_error* LocalityParse(
|
|
1888
2019
|
locality_lb_endpoints, &size);
|
1889
2020
|
for (size_t i = 0; i < size; ++i) {
|
1890
2021
|
grpc_error* error = ServerAddressParseAndAppend(
|
1891
|
-
lb_endpoints[i], &output_locality->
|
2022
|
+
lb_endpoints[i], &output_locality->endpoints);
|
1892
2023
|
if (error != GRPC_ERROR_NONE) return error;
|
1893
2024
|
}
|
1894
2025
|
// Parse the priority.
|
1895
|
-
|
1896
|
-
|
1897
|
-
locality_lb_endpoints);
|
2026
|
+
*priority = envoy_config_endpoint_v3_LocalityLbEndpoints_priority(
|
2027
|
+
locality_lb_endpoints);
|
1898
2028
|
return GRPC_ERROR_NONE;
|
1899
2029
|
}
|
1900
2030
|
|
1901
2031
|
grpc_error* DropParseAndAppend(
|
1902
2032
|
const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload*
|
1903
2033
|
drop_overload,
|
1904
|
-
XdsApi::DropConfig* drop_config) {
|
2034
|
+
XdsApi::EdsUpdate::DropConfig* drop_config) {
|
1905
2035
|
// Get the category.
|
1906
2036
|
std::string category = UpbStringToStdString(
|
1907
2037
|
envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_category(
|
1908
2038
|
drop_overload));
|
1909
|
-
if (category.
|
2039
|
+
if (category.empty()) {
|
1910
2040
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty drop category name");
|
1911
2041
|
}
|
1912
2042
|
// Get the drop rate (per million).
|
@@ -1938,21 +2068,25 @@ grpc_error* DropParseAndAppend(
|
|
1938
2068
|
}
|
1939
2069
|
|
1940
2070
|
grpc_error* EdsResponseParse(
|
1941
|
-
XdsClient* client, TraceFlag* tracer,
|
2071
|
+
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
|
1942
2072
|
const envoy_service_discovery_v3_DiscoveryResponse* response,
|
1943
2073
|
const std::set<absl::string_view>& expected_eds_service_names,
|
1944
|
-
XdsApi::EdsUpdateMap* eds_update_map,
|
2074
|
+
XdsApi::EdsUpdateMap* eds_update_map,
|
2075
|
+
std::set<std::string>* resource_names_failed, upb_arena* arena) {
|
2076
|
+
std::vector<grpc_error*> errors;
|
1945
2077
|
// Get the resources from the response.
|
1946
2078
|
size_t size;
|
1947
2079
|
const google_protobuf_Any* const* resources =
|
1948
2080
|
envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size);
|
1949
2081
|
for (size_t i = 0; i < size; ++i) {
|
1950
|
-
XdsApi::EdsUpdate eds_update;
|
1951
2082
|
// Check the type_url of the resource.
|
1952
2083
|
absl::string_view type_url =
|
1953
2084
|
UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
|
1954
2085
|
if (!IsEds(type_url)) {
|
1955
|
-
|
2086
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
2087
|
+
absl::StrCat("resource index ", i, ": Resource is not EDS.")
|
2088
|
+
.c_str()));
|
2089
|
+
continue;
|
1956
2090
|
}
|
1957
2091
|
// Get the cluster_load_assignment.
|
1958
2092
|
upb_strview encoded_cluster_load_assignment =
|
@@ -1962,10 +2096,14 @@ grpc_error* EdsResponseParse(
|
|
1962
2096
|
encoded_cluster_load_assignment.data,
|
1963
2097
|
encoded_cluster_load_assignment.size, arena);
|
1964
2098
|
if (cluster_load_assignment == nullptr) {
|
1965
|
-
|
1966
|
-
"
|
2099
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
2100
|
+
absl::StrCat("resource index ", i,
|
2101
|
+
": Can't parse cluster_load_assignment.")
|
2102
|
+
.c_str()));
|
2103
|
+
continue;
|
1967
2104
|
}
|
1968
|
-
MaybeLogClusterLoadAssignment(client, tracer,
|
2105
|
+
MaybeLogClusterLoadAssignment(client, tracer, symtab,
|
2106
|
+
cluster_load_assignment);
|
1969
2107
|
// Check the EDS service name. Ignore unexpected names.
|
1970
2108
|
std::string eds_service_name = UpbStringToStdString(
|
1971
2109
|
envoy_config_endpoint_v3_ClusterLoadAssignment_cluster_name(
|
@@ -1976,33 +2114,53 @@ grpc_error* EdsResponseParse(
|
|
1976
2114
|
}
|
1977
2115
|
// Fail on duplicate resources.
|
1978
2116
|
if (eds_update_map->find(eds_service_name) != eds_update_map->end()) {
|
1979
|
-
|
2117
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1980
2118
|
absl::StrCat("duplicate resource name \"", eds_service_name, "\"")
|
1981
|
-
.c_str());
|
2119
|
+
.c_str()));
|
2120
|
+
resource_names_failed->insert(eds_service_name);
|
2121
|
+
continue;
|
1982
2122
|
}
|
2123
|
+
XdsApi::EdsUpdate& eds_update = (*eds_update_map)[eds_service_name];
|
1983
2124
|
// Get the endpoints.
|
1984
2125
|
size_t locality_size;
|
1985
2126
|
const envoy_config_endpoint_v3_LocalityLbEndpoints* const* endpoints =
|
1986
2127
|
envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(
|
1987
2128
|
cluster_load_assignment, &locality_size);
|
2129
|
+
grpc_error* error = GRPC_ERROR_NONE;
|
1988
2130
|
for (size_t j = 0; j < locality_size; ++j) {
|
1989
|
-
|
1990
|
-
|
1991
|
-
|
2131
|
+
size_t priority;
|
2132
|
+
XdsApi::EdsUpdate::Priority::Locality locality;
|
2133
|
+
error = LocalityParse(endpoints[j], &locality, &priority);
|
2134
|
+
if (error != GRPC_ERROR_NONE) break;
|
1992
2135
|
// Filter out locality with weight 0.
|
1993
2136
|
if (locality.lb_weight == 0) continue;
|
1994
|
-
|
2137
|
+
// Make sure prorities is big enough. Note that they might not
|
2138
|
+
// arrive in priority order.
|
2139
|
+
while (eds_update.priorities.size() < priority + 1) {
|
2140
|
+
eds_update.priorities.emplace_back();
|
2141
|
+
}
|
2142
|
+
eds_update.priorities[priority].localities.emplace(locality.name.get(),
|
2143
|
+
std::move(locality));
|
2144
|
+
}
|
2145
|
+
if (error != GRPC_ERROR_NONE) {
|
2146
|
+
errors.push_back(grpc_error_add_child(
|
2147
|
+
GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
2148
|
+
absl::StrCat(eds_service_name, ": locality validation error")
|
2149
|
+
.c_str()),
|
2150
|
+
error));
|
2151
|
+
resource_names_failed->insert(eds_service_name);
|
2152
|
+
continue;
|
1995
2153
|
}
|
1996
|
-
for (
|
1997
|
-
|
1998
|
-
|
1999
|
-
|
2000
|
-
|
2001
|
-
|
2154
|
+
for (const auto& priority : eds_update.priorities) {
|
2155
|
+
if (priority.localities.empty()) {
|
2156
|
+
errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
2157
|
+
absl::StrCat(eds_service_name, ": sparse priority list").c_str()));
|
2158
|
+
resource_names_failed->insert(eds_service_name);
|
2159
|
+
continue;
|
2002
2160
|
}
|
2003
2161
|
}
|
2004
2162
|
// Get the drop config.
|
2005
|
-
eds_update.drop_config = MakeRefCounted<XdsApi::DropConfig>();
|
2163
|
+
eds_update.drop_config = MakeRefCounted<XdsApi::EdsUpdate::DropConfig>();
|
2006
2164
|
const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy* policy =
|
2007
2165
|
envoy_config_endpoint_v3_ClusterLoadAssignment_policy(
|
2008
2166
|
cluster_load_assignment);
|
@@ -2013,14 +2171,22 @@ grpc_error* EdsResponseParse(
|
|
2013
2171
|
envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_drop_overloads(
|
2014
2172
|
policy, &drop_size);
|
2015
2173
|
for (size_t j = 0; j < drop_size; ++j) {
|
2016
|
-
|
2174
|
+
error =
|
2017
2175
|
DropParseAndAppend(drop_overload[j], eds_update.drop_config.get());
|
2018
|
-
if (error != GRPC_ERROR_NONE)
|
2176
|
+
if (error != GRPC_ERROR_NONE) break;
|
2177
|
+
}
|
2178
|
+
if (error != GRPC_ERROR_NONE) {
|
2179
|
+
errors.push_back(grpc_error_add_child(
|
2180
|
+
GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
2181
|
+
absl::StrCat(eds_service_name, ": drop config validation error")
|
2182
|
+
.c_str()),
|
2183
|
+
error));
|
2184
|
+
resource_names_failed->insert(eds_service_name);
|
2185
|
+
continue;
|
2019
2186
|
}
|
2020
2187
|
}
|
2021
|
-
eds_update_map->emplace(std::move(eds_service_name), std::move(eds_update));
|
2022
2188
|
}
|
2023
|
-
return
|
2189
|
+
return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing EDS response", &errors);
|
2024
2190
|
}
|
2025
2191
|
|
2026
2192
|
std::string TypeUrlInternalToExternal(absl::string_view type_url) {
|
@@ -2036,10 +2202,20 @@ std::string TypeUrlInternalToExternal(absl::string_view type_url) {
|
|
2036
2202
|
return std::string(type_url);
|
2037
2203
|
}
|
2038
2204
|
|
2205
|
+
template <typename UpdateMap>
|
2206
|
+
void MoveUpdatesToFailedSet(UpdateMap* update_map,
|
2207
|
+
std::set<std::string>* resource_names_failed) {
|
2208
|
+
for (const auto& p : *update_map) {
|
2209
|
+
resource_names_failed->insert(p.first);
|
2210
|
+
}
|
2211
|
+
update_map->clear();
|
2212
|
+
}
|
2213
|
+
|
2039
2214
|
} // namespace
|
2040
2215
|
|
2041
2216
|
XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
|
2042
|
-
const grpc_slice& encoded_response,
|
2217
|
+
const grpc_slice& encoded_response,
|
2218
|
+
const std::set<absl::string_view>& expected_listener_names,
|
2043
2219
|
const std::set<absl::string_view>& expected_route_configuration_names,
|
2044
2220
|
const std::set<absl::string_view>& expected_cluster_names,
|
2045
2221
|
const std::set<absl::string_view>& expected_eds_service_names) {
|
@@ -2056,7 +2232,7 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
|
|
2056
2232
|
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode DiscoveryResponse.");
|
2057
2233
|
return result;
|
2058
2234
|
}
|
2059
|
-
MaybeLogDiscoveryResponse(client_, tracer_, response);
|
2235
|
+
MaybeLogDiscoveryResponse(client_, tracer_, symtab_.ptr(), response);
|
2060
2236
|
// Record the type_url, the version_info, and the nonce of the response.
|
2061
2237
|
result.type_url = TypeUrlInternalToExternal(UpbStringToAbsl(
|
2062
2238
|
envoy_service_discovery_v3_DiscoveryResponse_type_url(response)));
|
@@ -2066,21 +2242,38 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
|
|
2066
2242
|
envoy_service_discovery_v3_DiscoveryResponse_nonce(response));
|
2067
2243
|
// Parse the response according to the resource type.
|
2068
2244
|
if (IsLds(result.type_url)) {
|
2069
|
-
result.parse_error =
|
2070
|
-
|
2071
|
-
|
2245
|
+
result.parse_error = LdsResponseParse(
|
2246
|
+
client_, tracer_, symtab_.ptr(), response, expected_listener_names,
|
2247
|
+
&result.lds_update_map, &result.resource_names_failed, arena.ptr());
|
2248
|
+
if (result.parse_error != GRPC_ERROR_NONE) {
|
2249
|
+
MoveUpdatesToFailedSet(&result.lds_update_map,
|
2250
|
+
&result.resource_names_failed);
|
2251
|
+
}
|
2072
2252
|
} else if (IsRds(result.type_url)) {
|
2073
|
-
result.parse_error = RdsResponseParse(
|
2074
|
-
|
2075
|
-
|
2253
|
+
result.parse_error = RdsResponseParse(
|
2254
|
+
client_, tracer_, symtab_.ptr(), response,
|
2255
|
+
expected_route_configuration_names, &result.rds_update_map,
|
2256
|
+
&result.resource_names_failed, arena.ptr());
|
2257
|
+
if (result.parse_error != GRPC_ERROR_NONE) {
|
2258
|
+
MoveUpdatesToFailedSet(&result.rds_update_map,
|
2259
|
+
&result.resource_names_failed);
|
2260
|
+
}
|
2076
2261
|
} else if (IsCds(result.type_url)) {
|
2077
|
-
result.parse_error =
|
2078
|
-
|
2079
|
-
|
2262
|
+
result.parse_error = CdsResponseParse(
|
2263
|
+
client_, tracer_, symtab_.ptr(), response, expected_cluster_names,
|
2264
|
+
&result.cds_update_map, &result.resource_names_failed, arena.ptr());
|
2265
|
+
if (result.parse_error != GRPC_ERROR_NONE) {
|
2266
|
+
MoveUpdatesToFailedSet(&result.cds_update_map,
|
2267
|
+
&result.resource_names_failed);
|
2268
|
+
}
|
2080
2269
|
} else if (IsEds(result.type_url)) {
|
2081
|
-
result.parse_error =
|
2082
|
-
|
2083
|
-
|
2270
|
+
result.parse_error = EdsResponseParse(
|
2271
|
+
client_, tracer_, symtab_.ptr(), response, expected_eds_service_names,
|
2272
|
+
&result.eds_update_map, &result.resource_names_failed, arena.ptr());
|
2273
|
+
if (result.parse_error != GRPC_ERROR_NONE) {
|
2274
|
+
MoveUpdatesToFailedSet(&result.eds_update_map,
|
2275
|
+
&result.resource_names_failed);
|
2276
|
+
}
|
2084
2277
|
}
|
2085
2278
|
return result;
|
2086
2279
|
}
|
@@ -2088,120 +2281,16 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
|
|
2088
2281
|
namespace {
|
2089
2282
|
|
2090
2283
|
void MaybeLogLrsRequest(
|
2091
|
-
XdsClient* client, TraceFlag* tracer,
|
2092
|
-
const envoy_service_load_stats_v3_LoadStatsRequest* request
|
2093
|
-
const std::string& build_version) {
|
2284
|
+
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
|
2285
|
+
const envoy_service_load_stats_v3_LoadStatsRequest* request) {
|
2094
2286
|
if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
|
2095
2287
|
gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
|
2096
|
-
|
2097
|
-
|
2098
|
-
|
2099
|
-
|
2100
|
-
const auto* node =
|
2101
|
-
envoy_service_load_stats_v3_LoadStatsRequest_node(request);
|
2102
|
-
if (node != nullptr) {
|
2103
|
-
AddNodeLogFields(node, build_version, &fields);
|
2104
|
-
}
|
2105
|
-
// cluster_stats
|
2106
|
-
size_t num_cluster_stats;
|
2107
|
-
const struct envoy_config_endpoint_v3_ClusterStats* const* cluster_stats =
|
2108
|
-
envoy_service_load_stats_v3_LoadStatsRequest_cluster_stats(
|
2109
|
-
request, &num_cluster_stats);
|
2110
|
-
for (size_t i = 0; i < num_cluster_stats; ++i) {
|
2111
|
-
const auto* cluster_stat = cluster_stats[i];
|
2112
|
-
fields.emplace_back("cluster_stats {");
|
2113
|
-
// cluster_name
|
2114
|
-
AddStringField(
|
2115
|
-
" cluster_name",
|
2116
|
-
envoy_config_endpoint_v3_ClusterStats_cluster_name(cluster_stat),
|
2117
|
-
&fields);
|
2118
|
-
// cluster_service_name
|
2119
|
-
AddStringField(" cluster_service_name",
|
2120
|
-
envoy_config_endpoint_v3_ClusterStats_cluster_service_name(
|
2121
|
-
cluster_stat),
|
2122
|
-
&fields);
|
2123
|
-
// upstream_locality_stats
|
2124
|
-
size_t num_stats;
|
2125
|
-
const envoy_config_endpoint_v3_UpstreamLocalityStats* const* stats =
|
2126
|
-
envoy_config_endpoint_v3_ClusterStats_upstream_locality_stats(
|
2127
|
-
cluster_stat, &num_stats);
|
2128
|
-
for (size_t j = 0; j < num_stats; ++j) {
|
2129
|
-
const auto* stat = stats[j];
|
2130
|
-
fields.emplace_back(" upstream_locality_stats {");
|
2131
|
-
// locality
|
2132
|
-
const auto* locality =
|
2133
|
-
envoy_config_endpoint_v3_UpstreamLocalityStats_locality(stat);
|
2134
|
-
if (locality != nullptr) {
|
2135
|
-
fields.emplace_back(" locality {");
|
2136
|
-
AddLocalityField(3, locality, &fields);
|
2137
|
-
fields.emplace_back(" }");
|
2138
|
-
}
|
2139
|
-
// total_successful_requests
|
2140
|
-
fields.emplace_back(absl::StrCat(
|
2141
|
-
" total_successful_requests: ",
|
2142
|
-
envoy_config_endpoint_v3_UpstreamLocalityStats_total_successful_requests(
|
2143
|
-
stat)));
|
2144
|
-
// total_requests_in_progress
|
2145
|
-
fields.emplace_back(absl::StrCat(
|
2146
|
-
" total_requests_in_progress: ",
|
2147
|
-
envoy_config_endpoint_v3_UpstreamLocalityStats_total_requests_in_progress(
|
2148
|
-
stat)));
|
2149
|
-
// total_error_requests
|
2150
|
-
fields.emplace_back(absl::StrCat(
|
2151
|
-
" total_error_requests: ",
|
2152
|
-
envoy_config_endpoint_v3_UpstreamLocalityStats_total_error_requests(
|
2153
|
-
stat)));
|
2154
|
-
// total_issued_requests
|
2155
|
-
fields.emplace_back(absl::StrCat(
|
2156
|
-
" total_issued_requests: ",
|
2157
|
-
envoy_config_endpoint_v3_UpstreamLocalityStats_total_issued_requests(
|
2158
|
-
stat)));
|
2159
|
-
fields.emplace_back(" }");
|
2160
|
-
}
|
2161
|
-
// total_dropped_requests
|
2162
|
-
fields.emplace_back(absl::StrCat(
|
2163
|
-
" total_dropped_requests: ",
|
2164
|
-
envoy_config_endpoint_v3_ClusterStats_total_dropped_requests(
|
2165
|
-
cluster_stat)));
|
2166
|
-
// dropped_requests
|
2167
|
-
size_t num_drops;
|
2168
|
-
const envoy_config_endpoint_v3_ClusterStats_DroppedRequests* const*
|
2169
|
-
drops = envoy_config_endpoint_v3_ClusterStats_dropped_requests(
|
2170
|
-
cluster_stat, &num_drops);
|
2171
|
-
for (size_t j = 0; j < num_drops; ++j) {
|
2172
|
-
const auto* drop = drops[j];
|
2173
|
-
fields.emplace_back(" dropped_requests {");
|
2174
|
-
// category
|
2175
|
-
AddStringField(
|
2176
|
-
" category",
|
2177
|
-
envoy_config_endpoint_v3_ClusterStats_DroppedRequests_category(
|
2178
|
-
drop),
|
2179
|
-
&fields);
|
2180
|
-
// dropped_count
|
2181
|
-
fields.emplace_back(absl::StrCat(
|
2182
|
-
" dropped_count: ",
|
2183
|
-
envoy_config_endpoint_v3_ClusterStats_DroppedRequests_dropped_count(
|
2184
|
-
drop)));
|
2185
|
-
fields.emplace_back(" }");
|
2186
|
-
}
|
2187
|
-
// load_report_interval
|
2188
|
-
const auto* load_report_interval =
|
2189
|
-
envoy_config_endpoint_v3_ClusterStats_load_report_interval(
|
2190
|
-
cluster_stat);
|
2191
|
-
if (load_report_interval != nullptr) {
|
2192
|
-
fields.emplace_back(" load_report_interval {");
|
2193
|
-
fields.emplace_back(absl::StrCat(
|
2194
|
-
" seconds: ",
|
2195
|
-
google_protobuf_Duration_seconds(load_report_interval)));
|
2196
|
-
fields.emplace_back(
|
2197
|
-
absl::StrCat(" nanos: ",
|
2198
|
-
google_protobuf_Duration_nanos(load_report_interval)));
|
2199
|
-
fields.emplace_back(" }");
|
2200
|
-
}
|
2201
|
-
fields.emplace_back("}");
|
2202
|
-
}
|
2288
|
+
const upb_msgdef* msg_type =
|
2289
|
+
envoy_service_load_stats_v3_LoadStatsRequest_getmsgdef(symtab);
|
2290
|
+
char buf[10240];
|
2291
|
+
upb_text_encode(request, msg_type, nullptr, 0, buf, sizeof(buf));
|
2203
2292
|
gpr_log(GPR_DEBUG, "[xds_client %p] constructed LRS request: %s", client,
|
2204
|
-
|
2293
|
+
buf);
|
2205
2294
|
}
|
2206
2295
|
}
|
2207
2296
|
|
@@ -2216,7 +2305,8 @@ grpc_slice SerializeLrsRequest(
|
|
2216
2305
|
|
2217
2306
|
} // namespace
|
2218
2307
|
|
2219
|
-
grpc_slice XdsApi::CreateLrsInitialRequest(
|
2308
|
+
grpc_slice XdsApi::CreateLrsInitialRequest(
|
2309
|
+
const XdsBootstrap::XdsServer& server) {
|
2220
2310
|
upb::Arena arena;
|
2221
2311
|
// Create a request.
|
2222
2312
|
envoy_service_load_stats_v3_LoadStatsRequest* request =
|
@@ -2225,12 +2315,12 @@ grpc_slice XdsApi::CreateLrsInitialRequest(const std::string& server_name) {
|
|
2225
2315
|
envoy_config_core_v3_Node* node_msg =
|
2226
2316
|
envoy_service_load_stats_v3_LoadStatsRequest_mutable_node(request,
|
2227
2317
|
arena.ptr());
|
2228
|
-
PopulateNode(arena.ptr(),
|
2229
|
-
|
2318
|
+
PopulateNode(arena.ptr(), node_, server.ShouldUseV3(), build_version_,
|
2319
|
+
user_agent_name_, node_msg);
|
2230
2320
|
envoy_config_core_v3_Node_add_client_features(
|
2231
2321
|
node_msg, upb_strview_makez("envoy.lrs.supports_send_all_clusters"),
|
2232
2322
|
arena.ptr());
|
2233
|
-
MaybeLogLrsRequest(client_, tracer_,
|
2323
|
+
MaybeLogLrsRequest(client_, tracer_, symtab_.ptr(), request);
|
2234
2324
|
return SerializeLrsRequest(request, arena.ptr());
|
2235
2325
|
}
|
2236
2326
|
|
@@ -2317,7 +2407,7 @@ grpc_slice XdsApi::CreateLrsRequest(
|
|
2317
2407
|
}
|
2318
2408
|
// Add dropped requests.
|
2319
2409
|
uint64_t total_dropped_requests = 0;
|
2320
|
-
for (const auto& p : load_report.dropped_requests) {
|
2410
|
+
for (const auto& p : load_report.dropped_requests.categorized_drops) {
|
2321
2411
|
const std::string& category = p.first;
|
2322
2412
|
const uint64_t count = p.second;
|
2323
2413
|
envoy_config_endpoint_v3_ClusterStats_DroppedRequests* dropped_requests =
|
@@ -2329,6 +2419,7 @@ grpc_slice XdsApi::CreateLrsRequest(
|
|
2329
2419
|
dropped_requests, count);
|
2330
2420
|
total_dropped_requests += count;
|
2331
2421
|
}
|
2422
|
+
total_dropped_requests += load_report.dropped_requests.uncategorized_drops;
|
2332
2423
|
// Set total dropped requests.
|
2333
2424
|
envoy_config_endpoint_v3_ClusterStats_set_total_dropped_requests(
|
2334
2425
|
cluster_stats, total_dropped_requests);
|
@@ -2341,7 +2432,7 @@ grpc_slice XdsApi::CreateLrsRequest(
|
|
2341
2432
|
google_protobuf_Duration_set_seconds(load_report_interval, timespec.tv_sec);
|
2342
2433
|
google_protobuf_Duration_set_nanos(load_report_interval, timespec.tv_nsec);
|
2343
2434
|
}
|
2344
|
-
MaybeLogLrsRequest(client_, tracer_,
|
2435
|
+
MaybeLogLrsRequest(client_, tracer_, symtab_.ptr(), request);
|
2345
2436
|
return SerializeLrsRequest(request, arena.ptr());
|
2346
2437
|
}
|
2347
2438
|
|