Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
5c04df2
internal listener: add metadata passthrough
kyessenov Jan 6, 2022
2d97b10
fix
kyessenov Jan 7, 2022
4b48cf8
fix
kyessenov Jan 7, 2022
cad2834
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov Jan 12, 2022
9210c0d
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov Jan 14, 2022
20ef02a
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov Jan 24, 2022
c179148
review
kyessenov Jan 24, 2022
de4bb84
oops
kyessenov Jan 25, 2022
2a0baae
impl
kyessenov Jan 26, 2022
28a8a95
impl
kyessenov Jan 26, 2022
a0eedce
fix metadata
kyessenov Jan 26, 2022
942a0de
wire server
kyessenov Jan 26, 2022
1901fbb
docs broke
kyessenov Jan 26, 2022
71c4177
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov Jan 26, 2022
4f6402f
fix a bug and validate
kyessenov Jan 27, 2022
c645110
fix docs
kyessenov Jan 27, 2022
8373eff
fix static initialization
kyessenov Jan 27, 2022
168b782
fix build
kyessenov Jan 27, 2022
ff75d61
typo
kyessenov Jan 27, 2022
fabb13e
fix test
kyessenov Jan 27, 2022
5b54ed1
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov Feb 3, 2022
3b2201f
fix
kyessenov Mar 3, 2022
961cfb7
merge main
kyessenov Mar 3, 2022
4fb2e84
try CI
kyessenov Mar 3, 2022
d3a6fad
support filter state
kyessenov Mar 4, 2022
d9d8690
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov Mar 7, 2022
3e9c0f2
rollback
kyessenov Mar 7, 2022
5799114
fixes
kyessenov Mar 7, 2022
f1525f4
fix proto
kyessenov Mar 7, 2022
eb69dde
fix conflict
kyessenov Apr 4, 2022
a9bd24e
wip
kyessenov Apr 4, 2022
a651261
changes
kyessenov Apr 4, 2022
0a9bf76
check spell
kyessenov Apr 4, 2022
9dadef2
resolve dependency loop
kyessenov Apr 5, 2022
7ae5f85
wip
kyessenov Apr 5, 2022
0ddf84a
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov Apr 5, 2022
b45efb9
add unit test
kyessenov Apr 5, 2022
6c9a0f1
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov Apr 12, 2022
cb37fba
review
kyessenov Apr 12, 2022
b8711ce
integration test
kyessenov Apr 13, 2022
27b3d14
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov Apr 14, 2022
9afbbaf
bad release
kyessenov Apr 14, 2022
84b3c91
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov Apr 15, 2022
bf02b8a
fix test
kyessenov May 4, 2022
f1aeaa7
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov May 6, 2022
76da2ca
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov May 9, 2022
648dd85
review
kyessenov May 10, 2022
112cf60
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov May 10, 2022
a2da357
fix deprecated feature use
kyessenov May 10, 2022
5dfab49
fix deprecated feature use
kyessenov May 10, 2022
8d1ed10
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov May 13, 2022
5eba0e9
API review feedback
kyessenov May 13, 2022
1381639
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov May 17, 2022
b3b1b1d
add filter state to integration test
kyessenov May 17, 2022
2012ba5
coverage
kyessenov May 17, 2022
37cda51
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov May 19, 2022
cc74397
update docs
kyessenov May 19, 2022
0bd2862
merge fix
kyessenov Jun 6, 2022
7bec6ea
merge fix
kyessenov Jun 6, 2022
e3942cb
build again
kyessenov Jun 6, 2022
7c97a8a
change signature of createTransportSocket
kyessenov Jun 7, 2022
47f422a
test on CI
kyessenov Jun 7, 2022
990bf13
add docs
kyessenov Jun 7, 2022
7aec8ee
Merge remote-tracking branch 'upstream/main' into internal_address_me…
kyessenov Jun 8, 2022
1249d5e
merge fix
kyessenov Jun 15, 2022
b41b932
fix format
kyessenov Jun 15, 2022
0192bbd
merge fix
kyessenov Jun 22, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ extensions/filters/common/original_src @snowp @klarose
/*/extensions/transport_sockets/common @alyssawilk @wez470
# starttls transport socket
/*/extensions/transport_sockets/starttls @cpakulski @lizan
# internal transport socket
/*/extensions/transport_sockets/internal @kyessenov @lizan
Comment thread
kyessenov marked this conversation as resolved.
Outdated
# sni_cluster extension
/*/extensions/filters/network/sni_cluster @rshriram @lizan
# sni_dynamic_forward_proxy extension
Expand Down
13 changes: 13 additions & 0 deletions api/envoy/extensions/transport_sockets/internal/v3/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# 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 = [
"//envoy/config/core/v3:pkg",
"//envoy/type/metadata/v3:pkg",
"@com_github_cncf_udpa//udpa/annotations:pkg",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
syntax = "proto3";

package envoy.extensions.transport_sockets.internal.v3;

import "envoy/config/core/v3/base.proto";
import "envoy/type/metadata/v3/metadata.proto";

import "udpa/annotations/status.proto";
import "validate/validate.proto";

option java_package = "io.envoyproxy.envoy.extensions.transport_sockets.internal.v3";
option java_outer_classname = "InternalUpstreamProto";
option java_multiple_files = true;
option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/internal/v3;internalv3";
option (udpa.annotations.file_status).package_version_status = ACTIVE;

// [#protodoc-title: Internal Upstream]
// [#extension: envoy.transport_sockets.internal_upstream]

// Configuration for the internal upstream address. An internal address is a
// loopback user space socket residing in the same proxy instance.
// [#not-implemented-hide:]
message InternalUpstreamTransport {
// Describes the location of the metadata value in the upstream cluster context.
message MetadataValueSource {
// Specifies what kind of metadata.
type.metadata.v3.MetadataKind kind = 1;

// Name is the filter namespace used in the dynamic metadata.
Comment thread
kyessenov marked this conversation as resolved.
string name = 2 [(validate.rules).string = {min_len: 1}];
}

// Specifies the metadata namespaces and values to insert into the downstream
// internal connection dynamic metadata when an internal address is used as a host.
map<string, MetadataValueSource> passthrough_metadata = 1;

// The underlying transport socket being wrapped.
config.core.v3.TransportSocket transport_socket = 2 [(validate.rules).message = {required: true}];
}
1 change: 1 addition & 0 deletions api/versioning/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ proto_library(
"//envoy/extensions/stat_sinks/graphite_statsd/v3:pkg",
"//envoy/extensions/stat_sinks/wasm/v3:pkg",
"//envoy/extensions/transport_sockets/alts/v3:pkg",
"//envoy/extensions/transport_sockets/internal/v3:pkg",
"//envoy/extensions/transport_sockets/proxy_protocol/v3:pkg",
"//envoy/extensions/transport_sockets/quic/v3:pkg",
"//envoy/extensions/transport_sockets/raw_buffer/v3:pkg",
Expand Down
10 changes: 10 additions & 0 deletions envoy/network/transport_socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
#include "absl/types/optional.h"

namespace Envoy {

namespace Upstream {
class HostDescription;
}

namespace Network {

class TransportSocketFactory;
Expand Down Expand Up @@ -216,6 +221,11 @@ class TransportSocketOptions {
*/
virtual void hashKey(std::vector<uint8_t>& key,
const Network::TransportSocketFactory& factory) const PURE;

/**
* @return optional upstream host description.
*/
virtual std::shared_ptr<const Upstream::HostDescription> host() const PURE;
};

using TransportSocketOptionsConstSharedPtr = std::shared_ptr<const TransportSocketOptions>;
Expand Down
48 changes: 41 additions & 7 deletions source/common/network/transport_socket_options_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@
namespace Envoy {
namespace Network {

// A wrapper around another TransportSocketOptions that overrides the ALPN fallback.
class AlpnDecoratingTransportSocketOptions : public TransportSocketOptions {
// Base wrapper for transport socket options.
class BaseWrapperTransportSocketOptions : public TransportSocketOptions {
public:
AlpnDecoratingTransportSocketOptions(std::vector<std::string>&& alpn,
TransportSocketOptionsConstSharedPtr inner_options)
: alpn_fallback_(std::move(alpn)), inner_options_(std::move(inner_options)) {}
BaseWrapperTransportSocketOptions(TransportSocketOptionsConstSharedPtr inner_options)
: inner_options_(std::move(inner_options)) {}
// Network::TransportSocketOptions
const absl::optional<std::string>& serverNameOverride() const override {
Comment thread
kyessenov marked this conversation as resolved.
Outdated
return inner_options_->serverNameOverride();
Expand All @@ -24,17 +23,50 @@ class AlpnDecoratingTransportSocketOptions : public TransportSocketOptions {
return inner_options_->applicationProtocolListOverride();
}
const std::vector<std::string>& applicationProtocolFallback() const override {
return alpn_fallback_;
return inner_options_->applicationProtocolFallback();
}
absl::optional<Network::ProxyProtocolData> proxyProtocolOptions() const override {
return inner_options_->proxyProtocolOptions();
}
void hashKey(std::vector<uint8_t>& key,
const Network::TransportSocketFactory& factory) const override {
return inner_options_->hashKey(key, factory);
}
std::shared_ptr<const Upstream::HostDescription> host() const override {
return inner_options_->host();
}

private:
const TransportSocketOptionsConstSharedPtr inner_options_;
};

// A wrapper around another TransportSocketOptions that overrides the ALPN fallback.
class AlpnDecoratingTransportSocketOptions : public BaseWrapperTransportSocketOptions {
public:
AlpnDecoratingTransportSocketOptions(std::vector<std::string>&& alpn,
TransportSocketOptionsConstSharedPtr inner_options)
: BaseWrapperTransportSocketOptions(std::move(inner_options)),
alpn_fallback_(std::move(alpn)) {}
const std::vector<std::string>& applicationProtocolFallback() const override {
return alpn_fallback_;
}
void hashKey(std::vector<uint8_t>& key,
const Network::TransportSocketFactory& factory) const override;

private:
const std::vector<std::string> alpn_fallback_;
const TransportSocketOptionsConstSharedPtr inner_options_;
};

// A wrapper around another TransportSocketOptions that overrides the upstream host.
class HostDecoratingTransportSocketOptions : public BaseWrapperTransportSocketOptions {
public:
HostDecoratingTransportSocketOptions(std::shared_ptr<const Upstream::HostDescription>& host,
TransportSocketOptionsConstSharedPtr inner_options)
: BaseWrapperTransportSocketOptions(std::move(inner_options)), host_(host) {}
std::shared_ptr<const Upstream::HostDescription> host() const override { return host_; }

private:
const std::shared_ptr<const Upstream::HostDescription> host_;
};

class TransportSocketOptionsImpl : public TransportSocketOptions {
Expand Down Expand Up @@ -70,6 +102,8 @@ class TransportSocketOptionsImpl : public TransportSocketOptions {
void hashKey(std::vector<uint8_t>& key,
const Network::TransportSocketFactory& factory) const override;

std::shared_ptr<const Upstream::HostDescription> host() const override { return nullptr; }

private:
const absl::optional<std::string> override_server_name_;
const std::vector<std::string> override_verify_san_list_;
Expand Down
13 changes: 6 additions & 7 deletions source/common/upstream/logical_host.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,14 @@ namespace Upstream {
Upstream::Host::CreateConnectionData LogicalHost::createConnection(
Event::Dispatcher& dispatcher, const Network::ConnectionSocket::OptionsSharedPtr& options,
Network::TransportSocketOptionsConstSharedPtr transport_socket_options) const {
const auto current_address = address();
const std::vector<Network::Address::InstanceConstSharedPtr>& address_list = addressList();

return {HostImpl::createConnection(dispatcher, cluster(), current_address, address_list,
transportSocketFactory(), options,
HostDescriptionConstSharedPtr host =
std::make_shared<RealHostDescription>(address(), shared_from_this());
return {HostImpl::createConnection(dispatcher, host, transportSocketFactory(), options,
override_transport_socket_options_ != nullptr
? override_transport_socket_options_
: transport_socket_options),
std::make_shared<RealHostDescription>(current_address, shared_from_this())};
: transport_socket_options,
false),
host};
}

} // namespace Upstream
Expand Down
42 changes: 25 additions & 17 deletions source/common/upstream/upstream_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -277,9 +277,10 @@ Network::TransportSocketFactory& HostDescriptionImpl::resolveTransportSocketFact
Host::CreateConnectionData HostImpl::createConnection(
Event::Dispatcher& dispatcher, const Network::ConnectionSocket::OptionsSharedPtr& options,
Network::TransportSocketOptionsConstSharedPtr transport_socket_options) const {
return {createConnection(dispatcher, cluster(), address(), addressList(),
transportSocketFactory(), options, transport_socket_options),
shared_from_this()};
HostDescriptionConstSharedPtr host = shared_from_this();
return {createConnection(dispatcher, host, transportSocketFactory(), options,
transport_socket_options, false),
host};
}

void HostImpl::setEdsHealthFlag(envoy::config::core::v3::HealthStatus health_status) {
Expand Down Expand Up @@ -308,19 +309,19 @@ Host::CreateConnectionData HostImpl::createHealthCheckConnection(
Network::TransportSocketFactory& factory =
(metadata != nullptr) ? resolveTransportSocketFactory(healthCheckAddress(), metadata)
: transportSocketFactory();
return {createConnection(dispatcher, cluster(), healthCheckAddress(), {}, factory, nullptr,
transport_socket_options),
shared_from_this()};
}

Network::ClientConnectionPtr HostImpl::createConnection(
Event::Dispatcher& dispatcher, const ClusterInfo& cluster,
const Network::Address::InstanceConstSharedPtr& address,
const std::vector<Network::Address::InstanceConstSharedPtr>& address_list,
Network::TransportSocketFactory& socket_factory,
const Network::ConnectionSocket::OptionsSharedPtr& options,
Network::TransportSocketOptionsConstSharedPtr transport_socket_options) {
HostDescriptionConstSharedPtr host = shared_from_this();
return {createConnection(dispatcher, host, factory, nullptr, transport_socket_options, true),
host};
}

Network::ClientConnectionPtr
HostImpl::createConnection(Event::Dispatcher& dispatcher, HostDescriptionConstSharedPtr& host,
Network::TransportSocketFactory& socket_factory,
const Network::ConnectionSocket::OptionsSharedPtr& options,
Network::TransportSocketOptionsConstSharedPtr transport_socket_options,
bool health_check) {
Network::ConnectionSocket::OptionsSharedPtr connection_options;
const auto& cluster = host->cluster();
if (cluster.clusterSocketOptions() != nullptr) {
if (options) {
connection_options = std::make_shared<Network::ConnectionSocket::Options>();
Expand All @@ -334,17 +335,24 @@ Network::ClientConnectionPtr HostImpl::createConnection(
connection_options = options;
}

const auto& address = health_check ? host->healthCheckAddress() : host->address();
const auto& address_list =
health_check ? std::vector<Network::Address::InstanceConstSharedPtr>() : host->addressList();

ASSERT(!address->envoyInternalAddress() ||
Runtime::runtimeFeatureEnabled("envoy.reloadable_features.internal_address"));

auto host_transport_socket_options =
Comment thread
kyessenov marked this conversation as resolved.
Outdated
std::make_shared<Network::HostDecoratingTransportSocketOptions>(host,
transport_socket_options);
Network::ClientConnectionPtr connection =
address_list.size() > 1
? std::make_unique<Network::HappyEyeballsConnectionImpl>(
dispatcher, address_list, cluster.sourceAddress(), socket_factory,
transport_socket_options, connection_options)
host_transport_socket_options, connection_options)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I think std::move(host_transport_socket_options) should works here

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

right, I did move it in the other clause.

: dispatcher.createClientConnection(
address, cluster.sourceAddress(),
socket_factory.createTransportSocket(std::move(transport_socket_options)),
socket_factory.createTransportSocket(std::move(host_transport_socket_options)),
connection_options);

connection->setBufferLimits(cluster.perConnectionBufferLimitBytes());
Expand Down
7 changes: 3 additions & 4 deletions source/common/upstream/upstream_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -282,12 +282,11 @@ class HostImpl : public HostDescriptionImpl,

protected:
static Network::ClientConnectionPtr
createConnection(Event::Dispatcher& dispatcher, const ClusterInfo& cluster,
const Network::Address::InstanceConstSharedPtr& address,
const std::vector<Network::Address::InstanceConstSharedPtr>& address_list,
createConnection(Event::Dispatcher& dispatcher, HostDescriptionConstSharedPtr& host,
Network::TransportSocketFactory& socket_factory,
const Network::ConnectionSocket::OptionsSharedPtr& options,
Network::TransportSocketOptionsConstSharedPtr transport_socket_options);
Network::TransportSocketOptionsConstSharedPtr transport_socket_options,
bool health_check);

private:
void setEdsHealthFlag(envoy::config::core::v3::HealthStatus health_status);
Expand Down
1 change: 1 addition & 0 deletions source/extensions/extensions_build_config.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ EXTENSIONS = {
"envoy.transport_sockets.tap": "//source/extensions/transport_sockets/tap:config",
"envoy.transport_sockets.starttls": "//source/extensions/transport_sockets/starttls:config",
"envoy.transport_sockets.tcp_stats": "//source/extensions/transport_sockets/tcp_stats:config",
"envoy.transport_sockets.internal_upstream": "//source/extensions/transport_sockets/internal:config",

#
# Retry host predicates
Expand Down
1 change: 1 addition & 0 deletions source/extensions/io_socket/user_space/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ envoy_cc_library(
"//source/common/buffer:buffer_lib",
"//source/common/buffer:watermark_buffer_lib",
"//source/common/common:empty_string",
"@envoy_api//envoy/config/core/v3:pkg_cc_proto",
],
)

Expand Down
11 changes: 11 additions & 0 deletions source/extensions/io_socket/user_space/io_handle.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include "envoy/buffer/buffer.h"
#include "envoy/common/pure.h"
#include "envoy/config/core/v3/base.pb.h"

namespace Envoy {
namespace Extensions {
Expand Down Expand Up @@ -60,6 +61,16 @@ class IoHandle {
* @return true if the pending receive buffer is not empty or read_end is set.
*/
virtual bool isReadable() const PURE;

/**
* @return user space socket metadata.
*/
virtual const envoy::config::core::v3::Metadata& metadata() const PURE;

/**
* Set user space socket metadata by merging the protobuf.
*/
virtual void setMetadata(const envoy::config::core::v3::Metadata& metadata) PURE;
};
} // namespace UserSpace
} // namespace IoSocket
Expand Down
7 changes: 7 additions & 0 deletions source/extensions/io_socket/user_space/io_handle_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,10 @@ class IoHandleImpl final : public Network::IoHandle,
ENVOY_LOG(trace, "io handle {} set peer handle to {}.", static_cast<void*>(this),
static_cast<void*>(writable_peer));
}
const envoy::config::core::v3::Metadata& metadata() const override { return metadata_; }
virtual void setMetadata(const envoy::config::core::v3::Metadata& metadata) override {
metadata_.MergeFrom(metadata);
}

private:
friend class IoHandleFactory;
Expand Down Expand Up @@ -174,6 +178,9 @@ class IoHandleImpl final : public Network::IoHandle,

// The flag whether the peer is valid. Any write attempt must check this flag.
bool write_shutdown_{false};

// User space metadata passed through the user space socket pair.
envoy::config::core::v3::Metadata metadata_;
};

using IoHandleImplPtr = std::unique_ptr<IoHandleImpl>;
Expand Down
40 changes: 40 additions & 0 deletions source/extensions/transport_sockets/internal/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_extension",
"envoy_cc_library",
"envoy_extension_package",
)

licenses(["notice"]) # Apache 2

envoy_extension_package()

envoy_cc_library(
name = "internal_lib",
srcs = ["internal.cc"],
hdrs = ["internal.h"],
deps = [
"//envoy/network:transport_socket_interface",
"//envoy/upstream:host_description_interface",
"//envoy/upstream:upstream_interface",
"//source/common/common:assert_lib",
"//source/common/common:minimal_logger_lib",
"//source/common/protobuf:utility_lib",
"//source/extensions/io_socket/user_space:io_handle_lib",
"//source/extensions/transport_sockets/common:passthrough_lib",
"@envoy_api//envoy/extensions/transport_sockets/internal/v3:pkg_cc_proto",
],
)

envoy_cc_extension(
name = "config",
srcs = ["config.cc"],
hdrs = ["config.h"],
deps = [
":internal_lib",
"//envoy/registry",
"//envoy/server:transport_socket_config_interface",
"//source/common/config:utility_lib",
"@envoy_api//envoy/extensions/transport_sockets/internal/v3:pkg_cc_proto",
],
)
Loading