From fa975bd4891d8caaf3abfdb47eab8368108badf1 Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Mon, 12 Oct 2020 16:13:18 +0000 Subject: [PATCH 01/11] add files Signed-off-by: Yuchen Dai --- .../upstreams/http/cluster_sensitive/BUILD | 54 ++++++++ .../http/cluster_sensitive/config.cc | 25 ++++ .../upstreams/http/cluster_sensitive/config.h | 40 ++++++ .../cluster_sensitive/upstream_request.cc | 75 +++++++++++ .../http/cluster_sensitive/upstream_request.h | 122 ++++++++++++++++++ 5 files changed, 316 insertions(+) create mode 100644 source/extensions/upstreams/http/cluster_sensitive/BUILD create mode 100644 source/extensions/upstreams/http/cluster_sensitive/config.cc create mode 100644 source/extensions/upstreams/http/cluster_sensitive/config.h create mode 100644 source/extensions/upstreams/http/cluster_sensitive/upstream_request.cc create mode 100644 source/extensions/upstreams/http/cluster_sensitive/upstream_request.h diff --git a/source/extensions/upstreams/http/cluster_sensitive/BUILD b/source/extensions/upstreams/http/cluster_sensitive/BUILD new file mode 100644 index 0000000000000..4c0b5be394b94 --- /dev/null +++ b/source/extensions/upstreams/http/cluster_sensitive/BUILD @@ -0,0 +1,54 @@ +load( + "//bazel:envoy_build_system.bzl", + "envoy_cc_extension", + "envoy_cc_library", + "envoy_extension_package", +) + +licenses(["notice"]) # Apache 2 + +envoy_extension_package() + +envoy_cc_extension( + name = "config", + srcs = [ + "config.cc", + ], + hdrs = [ + "config.h", + ], + security_posture = "robust_to_untrusted_downstream", + visibility = ["//visibility:public"], + deps = [ + ":upstream_request_lib", + "@envoy_api//envoy/extensions/upstreams/http/http/v3:pkg_cc_proto", + ], +) + +envoy_cc_library( + name = "upstream_request_lib", + srcs = [ + "upstream_request.cc", + ], + hdrs = [ + "upstream_request.h", + ], + deps = [ + "//include/envoy/http:codes_interface", + "//include/envoy/http:conn_pool_interface", + "//include/envoy/http:filter_interface", + "//include/envoy/upstream:cluster_manager_interface", + "//include/envoy/upstream:upstream_interface", + "//source/common/common:assert_lib", + "//source/common/common:minimal_logger_lib", + "//source/common/http:codes_lib", + "//source/common/http:header_map_lib", + "//source/common/http:headers_lib", + "//source/common/http:message_lib", + "//source/common/network:application_protocol_lib", + "//source/common/network:transport_socket_options_lib", + "//source/common/router:router_lib", + "//source/common/upstream:load_balancer_lib", + "//source/extensions/common/proxy_protocol:proxy_protocol_header_lib", + ], +) diff --git a/source/extensions/upstreams/http/cluster_sensitive/config.cc b/source/extensions/upstreams/http/cluster_sensitive/config.cc new file mode 100644 index 0000000000000..df5098aeef6d1 --- /dev/null +++ b/source/extensions/upstreams/http/cluster_sensitive/config.cc @@ -0,0 +1,25 @@ +#include "extensions/upstreams/http/cluster_sensitive/config.h" + +#include "extensions/upstreams/http/cluster_sensitive/upstream_request.h" + +namespace Envoy { +namespace Extensions { +namespace Upstreams { +namespace Http { +namespace ClusterSensitive { + +Router::GenericConnPoolPtr ClusterSensitiveGenericConnPoolFactory::createGenericConnPool( + Upstream::ClusterManager& cm, bool is_connect, const Router::RouteEntry& route_entry, + absl::optional downstream_protocol, + Upstream::LoadBalancerContext* ctx) const { + auto ret = std::make_unique(cm, is_connect, route_entry, downstream_protocol, ctx); + return (ret->valid() ? std::move(ret) : nullptr); +} + +REGISTER_FACTORY(ClusterSensitiveGenericConnPoolFactory, Router::GenericConnPoolFactory); + +} // namespace ClusterSensitive +} // namespace Http +} // namespace Upstreams +} // namespace Extensions +} // namespace Envoy diff --git a/source/extensions/upstreams/http/cluster_sensitive/config.h b/source/extensions/upstreams/http/cluster_sensitive/config.h new file mode 100644 index 0000000000000..a1231380fdbe2 --- /dev/null +++ b/source/extensions/upstreams/http/cluster_sensitive/config.h @@ -0,0 +1,40 @@ +#pragma once + +#include "envoy/extensions/upstreams/http/http/v3/http_connection_pool.pb.h" +#include "envoy/registry/registry.h" +#include "envoy/router/router.h" + +namespace Envoy { +namespace Extensions { +namespace Upstreams { +namespace Http { +namespace ClusterSensitive { + +/** + * Config registration for the HttpConnPool. @see Router::GenericConnPoolFactory + */ +class ClusterSensitiveGenericConnPoolFactory : public Router::GenericConnPoolFactory { +public: + std::string name() const override { + return "envoy.filters.connection_pools.http.cluster_senstive"; + } + std::string category() const override { return "envoy.upstreams"; } + Router::GenericConnPoolPtr + createGenericConnPool(Upstream::ClusterManager& cm, bool is_connect, + const Router::RouteEntry& route_entry, + absl::optional downstream_protocol, + Upstream::LoadBalancerContext* ctx) const override; + + ProtobufTypes::MessagePtr createEmptyConfigProto() override { + return std::make_unique< + envoy::extensions::upstreams::http::http::v3::HttpConnectionPoolProto>(); + } +}; + +DECLARE_FACTORY(ClusterSensitiveGenericConnPoolFactory); + +} // namespace ClusterSensitive +} // namespace Http +} // namespace Upstreams +} // namespace Extensions +} // namespace Envoy diff --git a/source/extensions/upstreams/http/cluster_sensitive/upstream_request.cc b/source/extensions/upstreams/http/cluster_sensitive/upstream_request.cc new file mode 100644 index 0000000000000..88ac12b91b0ea --- /dev/null +++ b/source/extensions/upstreams/http/cluster_sensitive/upstream_request.cc @@ -0,0 +1,75 @@ +#include "extensions/upstreams/http/cluster_sensitive/upstream_request.h" + +#include +#include + +#include "envoy/event/dispatcher.h" +#include "envoy/event/timer.h" +#include "envoy/grpc/status.h" +#include "envoy/http/conn_pool.h" +#include "envoy/upstream/cluster_manager.h" +#include "envoy/upstream/upstream.h" + +#include "common/common/assert.h" +#include "common/common/utility.h" +#include "common/http/codes.h" +#include "common/http/header_map_impl.h" +#include "common/http/headers.h" +#include "common/http/message_impl.h" +#include "common/http/utility.h" +#include "common/router/router.h" + +using Envoy::Router::GenericConnectionPoolCallbacks; + +namespace Envoy { +namespace Extensions { +namespace Upstreams { +namespace Http { +namespace ClusterSensitive { + +void HttpConnPool::newStream(GenericConnectionPoolCallbacks* callbacks) { + callbacks_ = callbacks; + // It's possible for a reset to happen inline within the newStream() call. In this case, we + // might get deleted inline as well. Only write the returned handle out if it is not nullptr to + // deal with this case. + Envoy::Http::ConnectionPool::Cancellable* handle = + conn_pool_->newStream(callbacks->upstreamToDownstream(), *this); + if (handle) { + conn_pool_stream_handle_ = handle; + } +} + +bool HttpConnPool::cancelAnyPendingStream() { + if (conn_pool_stream_handle_) { + conn_pool_stream_handle_->cancel(ConnectionPool::CancelPolicy::Default); + conn_pool_stream_handle_ = nullptr; + return true; + } + return false; +} + +absl::optional HttpConnPool::protocol() const { + return conn_pool_->protocol(); +} + +void HttpConnPool::onPoolFailure(ConnectionPool::PoolFailureReason reason, + absl::string_view transport_failure_reason, + Upstream::HostDescriptionConstSharedPtr host) { + callbacks_->onPoolFailure(reason, transport_failure_reason, host); +} + +void HttpConnPool::onPoolReady(Envoy::Http::RequestEncoder& request_encoder, + Upstream::HostDescriptionConstSharedPtr host, + const StreamInfo::StreamInfo& info) { + conn_pool_stream_handle_ = nullptr; + auto upstream = + std::make_unique(callbacks_->upstreamToDownstream(), &request_encoder, host); + callbacks_->onPoolReady(std::move(upstream), host, + request_encoder.getStream().connectionLocalAddress(), info); +} + +} // namespace ClusterSensitive +} // namespace Http +} // namespace Upstreams +} // namespace Extensions +} // namespace Envoy diff --git a/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h b/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h new file mode 100644 index 0000000000000..3a674e2800a6c --- /dev/null +++ b/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h @@ -0,0 +1,122 @@ +#pragma once + +#include +#include +#include +#include + +#include "envoy/http/codes.h" +#include "envoy/http/conn_pool.h" + +#include "common/common/logger.h" +#include "common/config/well_known_names.h" +#include "common/http/header_map_impl.h" +#include "common/router/upstream_request.h" + +namespace Envoy { +namespace Extensions { +namespace Upstreams { +namespace Http { +namespace ClusterSensitive { + +class HttpConnPool : public Router::GenericConnPool, public Envoy::Http::ConnectionPool::Callbacks { +public: + // GenericConnPool + HttpConnPool(Upstream::ClusterManager& cm, bool is_connect, const Router::RouteEntry& route_entry, + absl::optional downstream_protocol, + Upstream::LoadBalancerContext* ctx) { + ASSERT(!is_connect); + conn_pool_ = cm.httpConnPoolForCluster(route_entry.clusterName(), route_entry.priority(), + downstream_protocol, ctx); + } + void newStream(Router::GenericConnectionPoolCallbacks* callbacks) override; + bool cancelAnyPendingStream() override; + absl::optional protocol() const override; + + // Http::ConnectionPool::Callbacks + void onPoolFailure(ConnectionPool::PoolFailureReason reason, + absl::string_view transport_failure_reason, + Upstream::HostDescriptionConstSharedPtr host) override; + void onPoolReady(Envoy::Http::RequestEncoder& callbacks_encoder, + Upstream::HostDescriptionConstSharedPtr host, + const StreamInfo::StreamInfo& info) override; + Upstream::HostDescriptionConstSharedPtr host() const override { return conn_pool_->host(); } + + bool valid() { return conn_pool_ != nullptr; } + +private: + // Points to the actual connection pool to create streams from. + Envoy::Http::ConnectionPool::Instance* conn_pool_{}; + Envoy::Http::ConnectionPool::Cancellable* conn_pool_stream_handle_{}; + Router::GenericConnectionPoolCallbacks* callbacks_{}; +}; + +class HttpUpstream : public Router::GenericUpstream, public Envoy::Http::StreamCallbacks { +public: + HttpUpstream(Router::UpstreamToDownstream& upstream_request, Envoy::Http::RequestEncoder* encoder, + Upstream::HostDescriptionConstSharedPtr host) + : upstream_request_(upstream_request), request_encoder_(encoder), host_(host) { + request_encoder_->getStream().addCallbacks(*this); + } + + // GenericUpstream + void encodeData(Buffer::Instance& data, bool end_stream) override { + request_encoder_->encodeData(data, end_stream); + } + void encodeMetadata(const Envoy::Http::MetadataMapVector& metadata_map_vector) override { + request_encoder_->encodeMetadata(metadata_map_vector); + } + void encodeHeaders(const Envoy::Http::RequestHeaderMap& headers, bool end_stream) override { + auto dup = Envoy::Http::RequestHeaderMapImpl::create(); + Envoy::Http::HeaderMapImpl::copyFrom(*dup, headers); + // Sanitize original port header. + dup->remove(Envoy::Http::LowerCaseString("X-istio-original-port")); + if (auto filter_metadata = host_->cluster().metadata().filter_metadata().find("istio"); + filter_metadata != host_->cluster().metadata().filter_metadata().end()) { + const ProtobufWkt::Struct& data_struct = filter_metadata->second; + const auto& fields = data_struct.fields(); + if (auto iter = fields.find("original_port"); iter != fields.end()) { + if (iter->second.kind_case() == google::protobuf::Value::kStringValue) { + dup->setCopy(Envoy::Http::LowerCaseString("X-istio-original-port"), + iter->second.string_value()); + } + } + } + request_encoder_->encodeHeaders(*dup, end_stream); + } + void encodeTrailers(const Envoy::Http::RequestTrailerMap& trailers) override { + request_encoder_->encodeTrailers(trailers); + } + + void readDisable(bool disable) override { request_encoder_->getStream().readDisable(disable); } + + void resetStream() override { + request_encoder_->getStream().removeCallbacks(*this); + request_encoder_->getStream().resetStream(Envoy::Http::StreamResetReason::LocalReset); + } + + // Http::StreamCallbacks + void onResetStream(Envoy::Http::StreamResetReason reason, + absl::string_view transport_failure_reason) override { + upstream_request_.onResetStream(reason, transport_failure_reason); + } + + void onAboveWriteBufferHighWatermark() override { + upstream_request_.onAboveWriteBufferHighWatermark(); + } + + void onBelowWriteBufferLowWatermark() override { + upstream_request_.onBelowWriteBufferLowWatermark(); + } + +private: + Router::UpstreamToDownstream& upstream_request_; + Envoy::Http::RequestEncoder* request_encoder_{}; + Upstream::HostDescriptionConstSharedPtr host_{}; +}; + +} // namespace ClusterSensitive +} // namespace Http +} // namespace Upstreams +} // namespace Extensions +} // namespace Envoy From fac35bf82e93bb2a34be3bed8f1d14edf6496cf4 Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Wed, 14 Oct 2020 07:57:52 +0000 Subject: [PATCH 02/11] extension build Signed-off-by: Yuchen Dai --- api/BUILD | 1 + .../upstreams/http/cluster_sensitive/v3/BUILD | 9 +++++++++ .../v3/http_connection_pool.proto | 17 +++++++++++++++++ api/versioning/BUILD | 1 + source/extensions/extensions_build_config.bzl | 1 + .../upstreams/http/cluster_sensitive/BUILD | 2 +- .../upstreams/http/cluster_sensitive/config.h | 4 ++-- .../http/cluster_sensitive/upstream_request.h | 2 +- 8 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 api/envoy/extensions/upstreams/http/cluster_sensitive/v3/BUILD create mode 100644 api/envoy/extensions/upstreams/http/cluster_sensitive/v3/http_connection_pool.proto diff --git a/api/BUILD b/api/BUILD index ed8743b793e39..c1c0c4f025be6 100644 --- a/api/BUILD +++ b/api/BUILD @@ -244,6 +244,7 @@ proto_library( "//envoy/extensions/transport_sockets/raw_buffer/v3:pkg", "//envoy/extensions/transport_sockets/tap/v3:pkg", "//envoy/extensions/transport_sockets/tls/v3:pkg", + "//envoy/extensions/upstreams/http/cluster_sensitive/v3:pkg", "//envoy/extensions/upstreams/http/generic/v3:pkg", "//envoy/extensions/upstreams/http/http/v3:pkg", "//envoy/extensions/upstreams/http/tcp/v3:pkg", diff --git a/api/envoy/extensions/upstreams/http/cluster_sensitive/v3/BUILD b/api/envoy/extensions/upstreams/http/cluster_sensitive/v3/BUILD new file mode 100644 index 0000000000000..ee92fb652582e --- /dev/null +++ b/api/envoy/extensions/upstreams/http/cluster_sensitive/v3/BUILD @@ -0,0 +1,9 @@ +# DO NOT EDIT. This file is generated by tools/proto_format/proto_sync.py. + +load("@envoy_api//bazel:api_build_system.bzl", "api_proto_package") + +licenses(["notice"]) # Apache 2 + +api_proto_package( + deps = ["@com_github_cncf_udpa//udpa/annotations:pkg"], +) diff --git a/api/envoy/extensions/upstreams/http/cluster_sensitive/v3/http_connection_pool.proto b/api/envoy/extensions/upstreams/http/cluster_sensitive/v3/http_connection_pool.proto new file mode 100644 index 0000000000000..bfed129ff9ddd --- /dev/null +++ b/api/envoy/extensions/upstreams/http/cluster_sensitive/v3/http_connection_pool.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +package envoy.extensions.upstreams.http.cluster_sensitive.v3; + +import "udpa/annotations/status.proto"; + +option java_package = "io.envoyproxy.envoy.extensions.upstreams.http.cluster_sensitive.v3"; +option java_outer_classname = "HttpConnectionPoolProtoOuterClass"; +option java_multiple_files = true; +option (udpa.annotations.file_status).package_version_status = ACTIVE; + +// [#protodoc-title: Http Connection Pool] + +// A connection pool which forwards downstream HTTP as HTTP to upstream. +// [#extension: envoy.upstreams.http.cluster_sensitive] +message HttpConnectionPoolProto { +} diff --git a/api/versioning/BUILD b/api/versioning/BUILD index d44a54640ca4a..ea388d43f9808 100644 --- a/api/versioning/BUILD +++ b/api/versioning/BUILD @@ -127,6 +127,7 @@ proto_library( "//envoy/extensions/transport_sockets/raw_buffer/v3:pkg", "//envoy/extensions/transport_sockets/tap/v3:pkg", "//envoy/extensions/transport_sockets/tls/v3:pkg", + "//envoy/extensions/upstreams/http/cluster_sensitive/v3:pkg", "//envoy/extensions/upstreams/http/generic/v3:pkg", "//envoy/extensions/upstreams/http/http/v3:pkg", "//envoy/extensions/upstreams/http/tcp/v3:pkg", diff --git a/source/extensions/extensions_build_config.bzl b/source/extensions/extensions_build_config.bzl index ddc3dc9a0d508..0e2e35f52bff3 100644 --- a/source/extensions/extensions_build_config.bzl +++ b/source/extensions/extensions_build_config.bzl @@ -209,6 +209,7 @@ EXTENSIONS = { # "envoy.upstreams.http.http": "//source/extensions/upstreams/http/http:config", "envoy.upstreams.http.tcp": "//source/extensions/upstreams/http/tcp:config", + "envoy.upstreams.http.cluster_sensitive": "//source/extensions/upstreams/http/cluster_sensitive:config", # # Watchdog actions diff --git a/source/extensions/upstreams/http/cluster_sensitive/BUILD b/source/extensions/upstreams/http/cluster_sensitive/BUILD index 4c0b5be394b94..82cdc8f5f2484 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/BUILD +++ b/source/extensions/upstreams/http/cluster_sensitive/BUILD @@ -21,7 +21,7 @@ envoy_cc_extension( visibility = ["//visibility:public"], deps = [ ":upstream_request_lib", - "@envoy_api//envoy/extensions/upstreams/http/http/v3:pkg_cc_proto", + "@envoy_api//envoy/extensions/upstreams/http/cluster_sensitive/v3:pkg_cc_proto", ], ) diff --git a/source/extensions/upstreams/http/cluster_sensitive/config.h b/source/extensions/upstreams/http/cluster_sensitive/config.h index a1231380fdbe2..d8747e5c7650d 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/config.h +++ b/source/extensions/upstreams/http/cluster_sensitive/config.h @@ -1,6 +1,6 @@ #pragma once -#include "envoy/extensions/upstreams/http/http/v3/http_connection_pool.pb.h" +#include "envoy/extensions/upstreams/http/cluster_sensitive/v3/http_connection_pool.pb.h" #include "envoy/registry/registry.h" #include "envoy/router/router.h" @@ -27,7 +27,7 @@ class ClusterSensitiveGenericConnPoolFactory : public Router::GenericConnPoolFac ProtobufTypes::MessagePtr createEmptyConfigProto() override { return std::make_unique< - envoy::extensions::upstreams::http::http::v3::HttpConnectionPoolProto>(); + envoy::extensions::upstreams::http::cluster_sensitive::v3::HttpConnectionPoolProto>(); } }; diff --git a/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h b/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h index 3a674e2800a6c..d2abb2cfa4188 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h +++ b/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h @@ -76,7 +76,7 @@ class HttpUpstream : public Router::GenericUpstream, public Envoy::Http::StreamC const ProtobufWkt::Struct& data_struct = filter_metadata->second; const auto& fields = data_struct.fields(); if (auto iter = fields.find("original_port"); iter != fields.end()) { - if (iter->second.kind_case() == google::protobuf::Value::kStringValue) { + if (iter->second.kind_case() == ProtobufWkt::Value::kStringValue) { dup->setCopy(Envoy::Http::LowerCaseString("X-istio-original-port"), iter->second.string_value()); } From 5eacb328072604536c6c5ff5f28bbdd614568a9a Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Wed, 14 Oct 2020 08:38:59 +0000 Subject: [PATCH 03/11] another sample Signed-off-by: Yuchen Dai --- .../upstreams/http/cluster_sensitive/upstream_request.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h b/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h index d2abb2cfa4188..e3a847e632f61 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h +++ b/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h @@ -69,10 +69,12 @@ class HttpUpstream : public Router::GenericUpstream, public Envoy::Http::StreamC void encodeHeaders(const Envoy::Http::RequestHeaderMap& headers, bool end_stream) override { auto dup = Envoy::Http::RequestHeaderMapImpl::create(); Envoy::Http::HeaderMapImpl::copyFrom(*dup, headers); + dup->setCopy(Envoy::Http::LowerCaseString("X-istio-test"), "lambdai"); // Sanitize original port header. dup->remove(Envoy::Http::LowerCaseString("X-istio-original-port")); if (auto filter_metadata = host_->cluster().metadata().filter_metadata().find("istio"); filter_metadata != host_->cluster().metadata().filter_metadata().end()) { + ENVOY_LOG_MISC(warn, "lambdai: find filter_metadata from {}", host_->cluster().metadata().DebugString()); const ProtobufWkt::Struct& data_struct = filter_metadata->second; const auto& fields = data_struct.fields(); if (auto iter = fields.find("original_port"); iter != fields.end()) { From de8c2cfaa74e42c837e3cb0dec78fa6b1e52f09e Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Mon, 19 Oct 2020 03:57:32 +0000 Subject: [PATCH 04/11] adding generic to cluster_sensitive Signed-off-by: Yuchen Dai --- .../upstreams/http/cluster_sensitive/BUILD | 12 ++++++++++-- .../upstreams/http/cluster_sensitive/config.cc | 2 +- .../upstreams/http/cluster_sensitive/config.h | 2 +- ...{upstream_request.cc => http_upstream_request.cc} | 2 +- .../{upstream_request.h => http_upstream_request.h} | 3 ++- 5 files changed, 15 insertions(+), 6 deletions(-) rename source/extensions/upstreams/http/cluster_sensitive/{upstream_request.cc => http_upstream_request.cc} (96%) rename source/extensions/upstreams/http/cluster_sensitive/{upstream_request.h => http_upstream_request.h} (98%) diff --git a/source/extensions/upstreams/http/cluster_sensitive/BUILD b/source/extensions/upstreams/http/cluster_sensitive/BUILD index 82cdc8f5f2484..1254679e8e02d 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/BUILD +++ b/source/extensions/upstreams/http/cluster_sensitive/BUILD @@ -27,11 +27,19 @@ envoy_cc_extension( envoy_cc_library( name = "upstream_request_lib", + + deps = [ + ":http_upstream_request_lib", + ] +) + +envoy_cc_library( + name = "http_upstream_request_lib", srcs = [ - "upstream_request.cc", + "http_upstream_request.cc", ], hdrs = [ - "upstream_request.h", + "http_upstream_request.h", ], deps = [ "//include/envoy/http:codes_interface", diff --git a/source/extensions/upstreams/http/cluster_sensitive/config.cc b/source/extensions/upstreams/http/cluster_sensitive/config.cc index df5098aeef6d1..2bd0099455276 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/config.cc +++ b/source/extensions/upstreams/http/cluster_sensitive/config.cc @@ -1,6 +1,6 @@ #include "extensions/upstreams/http/cluster_sensitive/config.h" -#include "extensions/upstreams/http/cluster_sensitive/upstream_request.h" +#include "extensions/upstreams/http/cluster_sensitive/http_upstream_request.h" namespace Envoy { namespace Extensions { diff --git a/source/extensions/upstreams/http/cluster_sensitive/config.h b/source/extensions/upstreams/http/cluster_sensitive/config.h index d8747e5c7650d..4a4d90fd809ad 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/config.h +++ b/source/extensions/upstreams/http/cluster_sensitive/config.h @@ -16,7 +16,7 @@ namespace ClusterSensitive { class ClusterSensitiveGenericConnPoolFactory : public Router::GenericConnPoolFactory { public: std::string name() const override { - return "envoy.filters.connection_pools.http.cluster_senstive"; + return "envoy.filters.connection_pools.http.cluster_sensitive"; } std::string category() const override { return "envoy.upstreams"; } Router::GenericConnPoolPtr diff --git a/source/extensions/upstreams/http/cluster_sensitive/upstream_request.cc b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.cc similarity index 96% rename from source/extensions/upstreams/http/cluster_sensitive/upstream_request.cc rename to source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.cc index 88ac12b91b0ea..6f945205a703c 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/upstream_request.cc +++ b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.cc @@ -1,4 +1,4 @@ -#include "extensions/upstreams/http/cluster_sensitive/upstream_request.h" +#include "extensions/upstreams/http/cluster_sensitive/http_upstream_request.h" #include #include diff --git a/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h similarity index 98% rename from source/extensions/upstreams/http/cluster_sensitive/upstream_request.h rename to source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h index e3a847e632f61..35be060ae0f01 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/upstream_request.h +++ b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h @@ -74,7 +74,8 @@ class HttpUpstream : public Router::GenericUpstream, public Envoy::Http::StreamC dup->remove(Envoy::Http::LowerCaseString("X-istio-original-port")); if (auto filter_metadata = host_->cluster().metadata().filter_metadata().find("istio"); filter_metadata != host_->cluster().metadata().filter_metadata().end()) { - ENVOY_LOG_MISC(warn, "lambdai: find filter_metadata from {}", host_->cluster().metadata().DebugString()); + ENVOY_LOG_MISC(warn, "lambdai: find filter_metadata from {}", + host_->cluster().metadata().DebugString()); const ProtobufWkt::Struct& data_struct = filter_metadata->second; const auto& fields = data_struct.fields(); if (auto iter = fields.find("original_port"); iter != fields.end()) { From 7818090b6b622cb1878fe160cddbb226fddc0dec Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Mon, 19 Oct 2020 03:58:03 +0000 Subject: [PATCH 05/11] to be revert: default cluster sensitive Signed-off-by: Yuchen Dai --- docs/generate_extension_db.py | 2 ++ source/common/router/router.cc | 2 +- source/server/BUILD | 1 + test/common/http/BUILD | 1 + test/common/router/BUILD | 2 ++ test/extensions/filters/http/common/fuzz/BUILD | 1 + test/integration/BUILD | 1 + tools/envoy_headersplit/code_corpus/fake_build | 1 + 8 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/generate_extension_db.py b/docs/generate_extension_db.py index fe7b5aa70c98d..f037bc7afe214 100755 --- a/docs/generate_extension_db.py +++ b/docs/generate_extension_db.py @@ -61,5 +61,7 @@ def GetExtensionMetadata(target): '//source/extensions/transport_sockets/tls:config') extension_db['envoy.upstreams.http.generic'] = GetExtensionMetadata( '//source/extensions/upstreams/http/generic:config') + extension_db['envoy.upstreams.http.cluster_sensitive'] = GetExtensionMetadata( + '//source/extensions/upstreams/http/cluster_sensitive:config') pathlib.Path(output_path).write_text(json.dumps(extension_db)) diff --git a/source/common/router/router.cc b/source/common/router/router.cc index 5e6702c3cb750..789690d59b12f 100644 --- a/source/common/router/router.cc +++ b/source/common/router/router.cc @@ -606,7 +606,7 @@ std::unique_ptr Filter::createConnPool() { cluster_->upstreamConfig().value()); } else { factory = &Envoy::Config::Utility::getAndCheckFactoryByName( - "envoy.filters.connection_pools.http.generic"); + "envoy.filters.connection_pools.http.cluster_sensitive"); } const bool should_tcp_proxy = route_entry_->connectConfig().has_value() && diff --git a/source/server/BUILD b/source/server/BUILD index 6c587d9d95d7b..544bb20aea75b 100644 --- a/source/server/BUILD +++ b/source/server/BUILD @@ -337,6 +337,7 @@ envoy_cc_library( "//source/extensions/filters/listener:well_known_names", "//source/extensions/filters/network/http_connection_manager:config", "//source/extensions/transport_sockets:well_known_names", + "//source/extensions/upstreams/http/cluster_sensitive:config", "//source/extensions/upstreams/http/generic:config", "@envoy_api//envoy/admin/v3:pkg_cc_proto", "@envoy_api//envoy/api/v2:pkg_cc_proto", diff --git a/test/common/http/BUILD b/test/common/http/BUILD index 7b19f269bbdd1..b5e1482718694 100644 --- a/test/common/http/BUILD +++ b/test/common/http/BUILD @@ -24,6 +24,7 @@ envoy_cc_test( "//source/common/http:headers_lib", "//source/common/http:utility_lib", "//source/extensions/upstreams/http/generic:config", + "//source/extensions/upstreams/http/cluster_sensitive:config", "//test/mocks:common_lib", "//test/mocks/buffer:buffer_mocks", "//test/mocks/http:http_mocks", diff --git a/test/common/router/BUILD b/test/common/router/BUILD index 51121e73b8a4b..757c5f701bf83 100644 --- a/test/common/router/BUILD +++ b/test/common/router/BUILD @@ -290,6 +290,7 @@ envoy_cc_test( "//source/common/stream_info:uint32_accessor_lib", "//source/common/upstream:upstream_includes", "//source/common/upstream:upstream_lib", + "//source/extensions/upstreams/http/cluster_sensitive:config", "//source/extensions/upstreams/http/generic:config", "//source/extensions/upstreams/http/http:config", "//source/extensions/upstreams/http/tcp:config", @@ -325,6 +326,7 @@ envoy_cc_test( "//source/common/upstream:upstream_includes", "//source/common/upstream:upstream_lib", "//source/extensions/access_loggers/file:config", + "//source/extensions/upstreams/http/cluster_sensitive:config", "//source/extensions/upstreams/http/generic:config", "//test/common/http:common_lib", "//test/mocks/access_log:access_log_mocks", diff --git a/test/extensions/filters/http/common/fuzz/BUILD b/test/extensions/filters/http/common/fuzz/BUILD index ffc67eb4a2321..36ca528a84a45 100644 --- a/test/extensions/filters/http/common/fuzz/BUILD +++ b/test/extensions/filters/http/common/fuzz/BUILD @@ -73,6 +73,7 @@ envoy_cc_fuzz_test( "//source/common/config:utility_lib", "//source/common/protobuf:utility_lib", "//source/extensions/upstreams/http/generic:config", + "//source/extensions/upstreams/http/cluster_sensitive:config", "//test/config:utility_lib", "@envoy_api//envoy/service/auth/v3:pkg_cc_proto", "@envoy_api//envoy/service/auth/v2alpha:pkg_cc_proto", diff --git a/test/integration/BUILD b/test/integration/BUILD index e3dbfb5d8731e..d87909b876985 100644 --- a/test/integration/BUILD +++ b/test/integration/BUILD @@ -1011,6 +1011,7 @@ envoy_cc_test( coverage = False, deps = [ ":http_protocol_integration_lib", + "//source/extensions/upstreams/http/cluster_sensitive:config", "@envoy_api//envoy/config/bootstrap/v3:pkg_cc_proto", ], ) diff --git a/tools/envoy_headersplit/code_corpus/fake_build b/tools/envoy_headersplit/code_corpus/fake_build index bce4828828a09..15389dcec1656 100644 --- a/tools/envoy_headersplit/code_corpus/fake_build +++ b/tools/envoy_headersplit/code_corpus/fake_build @@ -8,6 +8,7 @@ envoy_cc_test( "//source/common/http:context_lib", "//source/common/http:headers_lib", "//source/common/http:utility_lib", + "//source/extensions/upstreams/http/cluster_sensitive:config", "//source/extensions/upstreams/http/generic:config", "//test/mocks:common_lib", "//test/mocks/buffer:buffer_mocks", From 6785f9ac91a9576c89ecc746d557eb9c88bb5d94 Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Mon, 19 Oct 2020 20:12:56 +0000 Subject: [PATCH 06/11] use sub upstream Signed-off-by: Yuchen Dai --- .../upstreams/http/cluster_sensitive/BUILD | 10 +++-- .../cluster_sensitive/http_upstream_request.h | 38 ++++++------------- 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/source/extensions/upstreams/http/cluster_sensitive/BUILD b/source/extensions/upstreams/http/cluster_sensitive/BUILD index 1254679e8e02d..139d900cd7bdc 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/BUILD +++ b/source/extensions/upstreams/http/cluster_sensitive/BUILD @@ -21,16 +21,19 @@ envoy_cc_extension( visibility = ["//visibility:public"], deps = [ ":upstream_request_lib", + "//source/extensions/upstreams/http/http:upstream_request_lib", + "//source/extensions/upstreams/http/tcp:upstream_request_lib", "@envoy_api//envoy/extensions/upstreams/http/cluster_sensitive/v3:pkg_cc_proto", ], ) +# "upstream_request_lib" is the name convention. +# Will add tcp_upstream_request lib. envoy_cc_library( name = "upstream_request_lib", - deps = [ ":http_upstream_request_lib", - ] + ], ) envoy_cc_library( @@ -58,5 +61,6 @@ envoy_cc_library( "//source/common/router:router_lib", "//source/common/upstream:load_balancer_lib", "//source/extensions/common/proxy_protocol:proxy_protocol_header_lib", + "//source/extensions/upstreams/http/http:upstream_request_lib", ], -) +) \ No newline at end of file diff --git a/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h index 35be060ae0f01..ff4b28536927b 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h +++ b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h @@ -12,6 +12,7 @@ #include "common/config/well_known_names.h" #include "common/http/header_map_impl.h" #include "common/router/upstream_request.h" +#include "extensions/upstreams/http/http/upstream_request.h" namespace Envoy { namespace Extensions { @@ -36,7 +37,7 @@ class HttpConnPool : public Router::GenericConnPool, public Envoy::Http::Connect // Http::ConnectionPool::Callbacks void onPoolFailure(ConnectionPool::PoolFailureReason reason, absl::string_view transport_failure_reason, - Upstream::HostDescriptionConstSharedPtr host) override; + Upstream::HostDescriptionConstSharedPtr host) override; void onPoolReady(Envoy::Http::RequestEncoder& callbacks_encoder, Upstream::HostDescriptionConstSharedPtr host, const StreamInfo::StreamInfo& info) override; @@ -51,20 +52,19 @@ class HttpConnPool : public Router::GenericConnPool, public Envoy::Http::Connect Router::GenericConnectionPoolCallbacks* callbacks_{}; }; -class HttpUpstream : public Router::GenericUpstream, public Envoy::Http::StreamCallbacks { +class HttpUpstream : public Router::GenericUpstream { public: HttpUpstream(Router::UpstreamToDownstream& upstream_request, Envoy::Http::RequestEncoder* encoder, Upstream::HostDescriptionConstSharedPtr host) - : upstream_request_(upstream_request), request_encoder_(encoder), host_(host) { - request_encoder_->getStream().addCallbacks(*this); + : sub_upstream_(upstream_request, encoder), host_(host) { } // GenericUpstream void encodeData(Buffer::Instance& data, bool end_stream) override { - request_encoder_->encodeData(data, end_stream); + sub_upstream_.encodeData(data, end_stream); } void encodeMetadata(const Envoy::Http::MetadataMapVector& metadata_map_vector) override { - request_encoder_->encodeMetadata(metadata_map_vector); + sub_upstream_.encodeMetadata(metadata_map_vector); } void encodeHeaders(const Envoy::Http::RequestHeaderMap& headers, bool end_stream) override { auto dup = Envoy::Http::RequestHeaderMapImpl::create(); @@ -85,36 +85,22 @@ class HttpUpstream : public Router::GenericUpstream, public Envoy::Http::StreamC } } } - request_encoder_->encodeHeaders(*dup, end_stream); + sub_upstream_.encodeHeaders(*dup, end_stream); } void encodeTrailers(const Envoy::Http::RequestTrailerMap& trailers) override { - request_encoder_->encodeTrailers(trailers); + sub_upstream_.encodeTrailers(trailers); } - void readDisable(bool disable) override { request_encoder_->getStream().readDisable(disable); } + void readDisable(bool disable) override { sub_upstream_.readDisable(disable); } void resetStream() override { - request_encoder_->getStream().removeCallbacks(*this); - request_encoder_->getStream().resetStream(Envoy::Http::StreamResetReason::LocalReset); + sub_upstream_.resetStream(); } - // Http::StreamCallbacks - void onResetStream(Envoy::Http::StreamResetReason reason, - absl::string_view transport_failure_reason) override { - upstream_request_.onResetStream(reason, transport_failure_reason); - } - - void onAboveWriteBufferHighWatermark() override { - upstream_request_.onAboveWriteBufferHighWatermark(); - } - - void onBelowWriteBufferLowWatermark() override { - upstream_request_.onBelowWriteBufferLowWatermark(); - } private: - Router::UpstreamToDownstream& upstream_request_; - Envoy::Http::RequestEncoder* request_encoder_{}; + + Upstreams::Http::Http::HttpUpstream sub_upstream_; Upstream::HostDescriptionConstSharedPtr host_{}; }; From a5f75a068838119b44c4aa59538e1b6024f04a32 Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Mon, 19 Oct 2020 20:47:38 +0000 Subject: [PATCH 07/11] to be revert Signed-off-by: Yuchen Dai --- test/common/http/BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/common/http/BUILD b/test/common/http/BUILD index b5e1482718694..ab887db80d33b 100644 --- a/test/common/http/BUILD +++ b/test/common/http/BUILD @@ -23,8 +23,8 @@ envoy_cc_test( "//source/common/http:context_lib", "//source/common/http:headers_lib", "//source/common/http:utility_lib", - "//source/extensions/upstreams/http/generic:config", "//source/extensions/upstreams/http/cluster_sensitive:config", + "//source/extensions/upstreams/http/generic:config", "//test/mocks:common_lib", "//test/mocks/buffer:buffer_mocks", "//test/mocks/http:http_mocks", From 550cbf9ab61e91a1a423c6018b1640de5c0afeca Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Mon, 19 Oct 2020 20:48:14 +0000 Subject: [PATCH 08/11] make cluster_sensitive generic Signed-off-by: Yuchen Dai --- .../upstreams/http/cluster_sensitive/BUILD | 12 +++++++++--- .../upstreams/http/cluster_sensitive/config.cc | 9 ++++++++- .../http/cluster_sensitive/http_upstream_request.h | 12 ++++-------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/source/extensions/upstreams/http/cluster_sensitive/BUILD b/source/extensions/upstreams/http/cluster_sensitive/BUILD index 139d900cd7bdc..bf86f594ae40f 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/BUILD +++ b/source/extensions/upstreams/http/cluster_sensitive/BUILD @@ -27,12 +27,11 @@ envoy_cc_extension( ], ) -# "upstream_request_lib" is the name convention. -# Will add tcp_upstream_request lib. envoy_cc_library( name = "upstream_request_lib", deps = [ ":http_upstream_request_lib", + ":tcp_upstream_request_lib", ], ) @@ -63,4 +62,11 @@ envoy_cc_library( "//source/extensions/common/proxy_protocol:proxy_protocol_header_lib", "//source/extensions/upstreams/http/http:upstream_request_lib", ], -) \ No newline at end of file +) + +envoy_cc_library( + name = "tcp_upstream_request_lib", + deps = [ + "//source/extensions/upstreams/http/http:upstream_request_lib", + ], +) diff --git a/source/extensions/upstreams/http/cluster_sensitive/config.cc b/source/extensions/upstreams/http/cluster_sensitive/config.cc index 2bd0099455276..4feb29546e096 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/config.cc +++ b/source/extensions/upstreams/http/cluster_sensitive/config.cc @@ -1,6 +1,7 @@ #include "extensions/upstreams/http/cluster_sensitive/config.h" #include "extensions/upstreams/http/cluster_sensitive/http_upstream_request.h" +#include "extensions/upstreams/http/tcp/upstream_request.h" namespace Envoy { namespace Extensions { @@ -12,7 +13,13 @@ Router::GenericConnPoolPtr ClusterSensitiveGenericConnPoolFactory::createGeneric Upstream::ClusterManager& cm, bool is_connect, const Router::RouteEntry& route_entry, absl::optional downstream_protocol, Upstream::LoadBalancerContext* ctx) const { - auto ret = std::make_unique(cm, is_connect, route_entry, downstream_protocol, ctx); + if (is_connect) { + auto ret = std::make_unique(cm, is_connect, route_entry, + downstream_protocol, ctx); + return (ret->valid() ? std::move(ret) : nullptr); + } + auto ret = std::make_unique( + cm, is_connect, route_entry, downstream_protocol, ctx); return (ret->valid() ? std::move(ret) : nullptr); } diff --git a/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h index ff4b28536927b..09391218bd3ec 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h +++ b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h @@ -12,6 +12,7 @@ #include "common/config/well_known_names.h" #include "common/http/header_map_impl.h" #include "common/router/upstream_request.h" + #include "extensions/upstreams/http/http/upstream_request.h" namespace Envoy { @@ -37,7 +38,7 @@ class HttpConnPool : public Router::GenericConnPool, public Envoy::Http::Connect // Http::ConnectionPool::Callbacks void onPoolFailure(ConnectionPool::PoolFailureReason reason, absl::string_view transport_failure_reason, - Upstream::HostDescriptionConstSharedPtr host) override; + Upstream::HostDescriptionConstSharedPtr host) override; void onPoolReady(Envoy::Http::RequestEncoder& callbacks_encoder, Upstream::HostDescriptionConstSharedPtr host, const StreamInfo::StreamInfo& info) override; @@ -56,8 +57,7 @@ class HttpUpstream : public Router::GenericUpstream { public: HttpUpstream(Router::UpstreamToDownstream& upstream_request, Envoy::Http::RequestEncoder* encoder, Upstream::HostDescriptionConstSharedPtr host) - : sub_upstream_(upstream_request, encoder), host_(host) { - } + : sub_upstream_(upstream_request, encoder), host_(host) {} // GenericUpstream void encodeData(Buffer::Instance& data, bool end_stream) override { @@ -93,13 +93,9 @@ class HttpUpstream : public Router::GenericUpstream { void readDisable(bool disable) override { sub_upstream_.readDisable(disable); } - void resetStream() override { - sub_upstream_.resetStream(); - } - + void resetStream() override { sub_upstream_.resetStream(); } private: - Upstreams::Http::Http::HttpUpstream sub_upstream_; Upstream::HostDescriptionConstSharedPtr host_{}; }; From fb5138deecb37bf6bec420fcda521a653dfd8a11 Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Tue, 20 Oct 2020 09:49:15 +0000 Subject: [PATCH 09/11] add cluster sensitive upstream test Signed-off-by: Yuchen Dai --- .../cluster_sensitive/http_upstream_request.h | 3 + .../upstreams/http/cluster_sensitive/BUILD | 33 +++ .../upstream_request_test.cc | 222 ++++++++++++++++++ 3 files changed, 258 insertions(+) create mode 100644 test/extensions/upstreams/http/cluster_sensitive/BUILD create mode 100644 test/extensions/upstreams/http/cluster_sensitive/upstream_request_test.cc diff --git a/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h index 09391218bd3ec..e9577be6fdfc4 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h +++ b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h @@ -63,9 +63,11 @@ class HttpUpstream : public Router::GenericUpstream { void encodeData(Buffer::Instance& data, bool end_stream) override { sub_upstream_.encodeData(data, end_stream); } + void encodeMetadata(const Envoy::Http::MetadataMapVector& metadata_map_vector) override { sub_upstream_.encodeMetadata(metadata_map_vector); } + void encodeHeaders(const Envoy::Http::RequestHeaderMap& headers, bool end_stream) override { auto dup = Envoy::Http::RequestHeaderMapImpl::create(); Envoy::Http::HeaderMapImpl::copyFrom(*dup, headers); @@ -87,6 +89,7 @@ class HttpUpstream : public Router::GenericUpstream { } sub_upstream_.encodeHeaders(*dup, end_stream); } + void encodeTrailers(const Envoy::Http::RequestTrailerMap& trailers) override { sub_upstream_.encodeTrailers(trailers); } diff --git a/test/extensions/upstreams/http/cluster_sensitive/BUILD b/test/extensions/upstreams/http/cluster_sensitive/BUILD new file mode 100644 index 0000000000000..bac965b7dd537 --- /dev/null +++ b/test/extensions/upstreams/http/cluster_sensitive/BUILD @@ -0,0 +1,33 @@ +load( + "//bazel:envoy_build_system.bzl", + "envoy_cc_test", + "envoy_package", +) + +licenses(["notice"]) # Apache 2 + +envoy_package() + +envoy_cc_test( + name = "upstream_request_test", + srcs = ["upstream_request_test.cc"], + deps = [ + "//source/common/buffer:buffer_lib", + "//source/common/network:address_lib", + "//source/common/router:router_lib", + "//source/common/upstream:upstream_includes", + "//source/common/upstream:upstream_lib", + "//source/extensions/upstreams/http/cluster_sensitive:upstream_request_lib", + "//test/common/http:common_lib", + "//test/mocks:common_lib", + "//test/mocks/network:network_mocks", + "//test/mocks/router:router_filter_interface", + "//test/mocks/router:router_mocks", + "//test/mocks/server:factory_context_mocks", + "//test/mocks/server:instance_mocks", + "//test/mocks/upstream:upstream_mocks", + "//test/test_common:environment_lib", + "//test/test_common:simulated_time_system_lib", + "//test/test_common:utility_lib", + ], +) diff --git a/test/extensions/upstreams/http/cluster_sensitive/upstream_request_test.cc b/test/extensions/upstreams/http/cluster_sensitive/upstream_request_test.cc new file mode 100644 index 0000000000000..73e6670c3e95d --- /dev/null +++ b/test/extensions/upstreams/http/cluster_sensitive/upstream_request_test.cc @@ -0,0 +1,222 @@ +#include "common/buffer/buffer_impl.h" +#include "common/network/address_impl.h" +#include "common/router/config_impl.h" +#include "common/router/router.h" +#include "common/router/upstream_request.h" + +#include "extensions/upstreams/http/cluster_sensitive/http_upstream_request.h" + +#include "test/common/http/common.h" +#include "test/mocks/common.h" +#include "test/mocks/router/mocks.h" +#include "test/mocks/router/router_filter_interface.h" +#include "test/mocks/server/factory_context.h" +#include "test/mocks/server/instance.h" +#include "test/mocks/tcp/mocks.h" +#include "test/test_common/utility.h" +#include "test/mocks/upstream/host.h" +#include "test/mocks/http/stream_encoder.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +using Envoy::Http::TestRequestHeaderMapImpl; +using Envoy::Router::UpstreamRequest; +using testing::_; +using testing::AnyNumber; +using testing::NiceMock; +using testing::Return; +using testing::ReturnRef; + +namespace Envoy { +namespace Extensions { +namespace Upstreams { +namespace Http { +namespace ClusterSensitive { + +// class ClusterSensitiveConnPoolTest : public ::testing::Test { +// public: +// ClusterSensitiveConnPoolTest() : host_(std::make_shared>()) { +// NiceMock route_entry; +// NiceMock cm; +// EXPECT_CALL(cm, tcpConnPoolForCluster(_, _, _)).WillOnce(Return(&mock_pool_)); +// conn_pool_ = std::make_unique(cm, true, route_entry, +// Envoy::Http::Protocol::Http11, nullptr); +// } + +// std::unique_ptr conn_pool_; +// Envoy::Tcp::ConnectionPool::MockInstance mock_pool_; +// Router::MockGenericConnectionPoolCallbacks mock_generic_callbacks_; +// std::shared_ptr> host_; +// NiceMock cancellable_; +// }; + +// TEST_F(ClusterSensitiveConnPoolTest, Basic) { +// NiceMock connection; + +// EXPECT_CALL(mock_pool_, newConnection(_)).WillOnce(Return(&cancellable_)); +// conn_pool_->newStream(&mock_generic_callbacks_); + +// EXPECT_CALL(mock_generic_callbacks_, upstreamToDownstream()); +// EXPECT_CALL(mock_generic_callbacks_, onPoolReady(_, _, _, _)); +// auto data = std::make_unique>(); +// EXPECT_CALL(*data, connection()).Times(AnyNumber()).WillRepeatedly(ReturnRef(connection)); +// conn_pool_->onPoolReady(std::move(data), host_); +// } + +// TEST_F(ClusterSensitiveConnPoolTest, OnPoolFailure) { +// EXPECT_CALL(mock_pool_, newConnection(_)).WillOnce(Return(&cancellable_)); +// conn_pool_->newStream(&mock_generic_callbacks_); + +// EXPECT_CALL(mock_generic_callbacks_, onPoolFailure(_, _, _)); +// conn_pool_->onPoolFailure(Envoy::Tcp::ConnectionPool::PoolFailureReason::LocalConnectionFailure, +// host_); + +// // Make sure that the pool failure nulled out the pending request. +// EXPECT_FALSE(conn_pool_->cancelAnyPendingStream()); +// } + +// TEST_F(ClusterSensitiveConnPoolTest, Cancel) { +// // Initially cancel should fail as there is no pending request. +// EXPECT_FALSE(conn_pool_->cancelAnyPendingStream()); + +// EXPECT_CALL(mock_pool_, newConnection(_)).WillOnce(Return(&cancellable_)); +// conn_pool_->newStream(&mock_generic_callbacks_); + +// // Canceling should now return true as there was an active request. +// EXPECT_TRUE(conn_pool_->cancelAnyPendingStream()); + +// // A second cancel should return false as there is not a pending request. +// EXPECT_FALSE(conn_pool_->cancelAnyPendingStream()); +// } + +class HttpUpstreamTest : public ::testing::Test { +public: + HttpUpstreamTest() { + cluster_metadata_ = std::make_shared( + TestUtility::parseYaml( + R"EOF( + filter_metadata: + istio: + original_port: "80" + )EOF")); + } + + ~HttpUpstreamTest() override {} + +protected: + Router::MockUpstreamToDownstream mock_upstream_to_downstream_; + // NiceMock mock_router_filter_; + // std::unique_ptr http_upstream_; + TestRequestHeaderMapImpl request_{{":method", "CONNECT"}, + {":path", "/"}, + {":protocol", "bytestream"}, + {":scheme", "https"}, + {":authority", "host"}}; + std::shared_ptr cluster_metadata_; +}; + +TEST_F(HttpUpstreamTest, TestAddedHeader) { + NiceMock encoder; + std::shared_ptr> host = + std::make_shared>(); + std::shared_ptr info{ + new ::testing::NiceMock()}; + ON_CALL(*host, cluster()).WillByDefault(ReturnRef(*info)); + Envoy::Http::TestRequestHeaderMapImpl headers{}; + HttpTestUtility::addDefaultHeaders(headers); + auto http_upstream = std::make_unique(mock_upstream_to_downstream_, &encoder, host); + EXPECT_CALL(encoder, encodeHeaders(HeaderHasValueRef("x-istio-test", "lambdai"), false)); + http_upstream->encodeHeaders(headers, false); +} + +TEST_F(HttpUpstreamTest, TestAddClusterInfo) { + NiceMock encoder; + std::shared_ptr> host = + std::make_shared>(); + std::shared_ptr info{ + new ::testing::NiceMock()}; + ON_CALL(*host, cluster()).WillByDefault(ReturnRef(*info)); + ON_CALL(*info, metadata()).WillByDefault(ReturnRef(*cluster_metadata_)); + auto http_upstream = std::make_unique(mock_upstream_to_downstream_, &encoder, host); + Envoy::Http::TestRequestHeaderMapImpl headers{}; + HttpTestUtility::addDefaultHeaders(headers); + EXPECT_CALL(encoder, encodeHeaders(HeaderHasValueRef("X-istio-original-port", "80"), false)); + http_upstream->encodeHeaders(headers, false); +} + +TEST_F(HttpUpstreamTest, TestBasicFlow) { + NiceMock encoder; + std::shared_ptr> host = + std::make_shared>(); + std::shared_ptr info{ + new ::testing::NiceMock()}; + ON_CALL(*host, cluster()).WillByDefault(ReturnRef(*info)); + Envoy::Http::TestRequestHeaderMapImpl headers{}; + HttpTestUtility::addDefaultHeaders(headers); + auto http_upstream = std::make_unique(mock_upstream_to_downstream_, &encoder, host); + { + EXPECT_CALL(encoder, encodeHeaders(HeaderHasValueRef("x-istio-test", "lambdai"), false)); + http_upstream->encodeHeaders(headers, false); + + auto metadata_map_ptr = std::make_unique(); + metadata_map_ptr->emplace("key", "value"); + Envoy::Http::MetadataMapVector metadata_map_vector; + metadata_map_vector.push_back(std::move(metadata_map_ptr)); + EXPECT_CALL(encoder, encodeMetadata(testing::Ref(metadata_map_vector))); + http_upstream->encodeMetadata(metadata_map_vector); + + Buffer::OwnedImpl body("abc"); + EXPECT_CALL(encoder, encodeData(BufferEqual(&body), false)); + http_upstream->encodeData(body, false); + + Envoy::Http::TestRequestTrailerMapImpl trailers{{"some", "request_trailer"}}; + EXPECT_CALL(encoder, encodeTrailers(HeaderMapEqualRef(&trailers))); + http_upstream->encodeTrailers(trailers); + } +} + +TEST_F(HttpUpstreamTest, TestReadDisable) { + + NiceMock encoder; + std::shared_ptr> host = + std::make_shared>(); + std::shared_ptr info{ + new ::testing::NiceMock()}; + ON_CALL(*host, cluster()).WillByDefault(ReturnRef(*info)); + Envoy::Http::TestRequestHeaderMapImpl headers{}; + HttpTestUtility::addDefaultHeaders(headers); + auto http_upstream = std::make_unique(mock_upstream_to_downstream_, &encoder, host); + + Envoy::Http::MockStream stream; + ON_CALL(encoder, getStream()).WillByDefault(ReturnRef(stream)); + EXPECT_CALL(stream, readDisable(true)); + http_upstream->readDisable(true); + + EXPECT_CALL(stream, readDisable(false)); + http_upstream->readDisable(false); +} + +TEST_F(HttpUpstreamTest, TestResetStream) { + NiceMock encoder; + std::shared_ptr> host = + std::make_shared>(); + std::shared_ptr info{ + new ::testing::NiceMock()}; + ON_CALL(*host, cluster()).WillByDefault(ReturnRef(*info)); + Envoy::Http::TestRequestHeaderMapImpl headers{}; + HttpTestUtility::addDefaultHeaders(headers); + auto http_upstream = std::make_unique(mock_upstream_to_downstream_, &encoder, host); + + Envoy::Http::MockStream stream; + ON_CALL(encoder, getStream()).WillByDefault(ReturnRef(stream)); + + EXPECT_CALL(stream, removeCallbacks(_)); + EXPECT_CALL(stream, resetStream(Envoy::Http::StreamResetReason::LocalReset)); + http_upstream->resetStream(); +} +} // namespace ClusterSensitive +} // namespace Http +} // namespace Upstreams +} // namespace Extensions +} // namespace Envoy From 0425700f6853a5ce76894c56fa130ae8a07b3807 Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Tue, 20 Oct 2020 09:55:11 +0000 Subject: [PATCH 10/11] fix format Signed-off-by: Yuchen Dai --- .../upstreams/http/cluster_sensitive/http_upstream_request.h | 2 +- .../upstreams/http/cluster_sensitive/upstream_request_test.cc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h index e9577be6fdfc4..ca78d280e64d0 100644 --- a/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h +++ b/source/extensions/upstreams/http/cluster_sensitive/http_upstream_request.h @@ -67,7 +67,7 @@ class HttpUpstream : public Router::GenericUpstream { void encodeMetadata(const Envoy::Http::MetadataMapVector& metadata_map_vector) override { sub_upstream_.encodeMetadata(metadata_map_vector); } - + void encodeHeaders(const Envoy::Http::RequestHeaderMap& headers, bool end_stream) override { auto dup = Envoy::Http::RequestHeaderMapImpl::create(); Envoy::Http::HeaderMapImpl::copyFrom(*dup, headers); diff --git a/test/extensions/upstreams/http/cluster_sensitive/upstream_request_test.cc b/test/extensions/upstreams/http/cluster_sensitive/upstream_request_test.cc index 73e6670c3e95d..9bd8c9b4dba4f 100644 --- a/test/extensions/upstreams/http/cluster_sensitive/upstream_request_test.cc +++ b/test/extensions/upstreams/http/cluster_sensitive/upstream_request_test.cc @@ -8,14 +8,14 @@ #include "test/common/http/common.h" #include "test/mocks/common.h" +#include "test/mocks/http/stream_encoder.h" #include "test/mocks/router/mocks.h" #include "test/mocks/router/router_filter_interface.h" #include "test/mocks/server/factory_context.h" #include "test/mocks/server/instance.h" #include "test/mocks/tcp/mocks.h" -#include "test/test_common/utility.h" #include "test/mocks/upstream/host.h" -#include "test/mocks/http/stream_encoder.h" +#include "test/test_common/utility.h" #include "gmock/gmock.h" #include "gtest/gtest.h" From ed09565952c88dbba956986048c7516a39985216 Mon Sep 17 00:00:00 2001 From: Yuchen Dai Date: Tue, 20 Oct 2020 09:58:30 +0000 Subject: [PATCH 11/11] doc Signed-off-by: Yuchen Dai --- docs/generate_extension_db.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/generate_extension_db.py b/docs/generate_extension_db.py index f037bc7afe214..fe7b5aa70c98d 100755 --- a/docs/generate_extension_db.py +++ b/docs/generate_extension_db.py @@ -61,7 +61,5 @@ def GetExtensionMetadata(target): '//source/extensions/transport_sockets/tls:config') extension_db['envoy.upstreams.http.generic'] = GetExtensionMetadata( '//source/extensions/upstreams/http/generic:config') - extension_db['envoy.upstreams.http.cluster_sensitive'] = GetExtensionMetadata( - '//source/extensions/upstreams/http/cluster_sensitive:config') pathlib.Path(output_path).write_text(json.dumps(extension_db))