Line data Source code
1 : #include "source/extensions/transport_sockets/tap/config.h" 2 : 3 : #include "envoy/config/tap/v3/common.pb.h" 4 : #include "envoy/extensions/transport_sockets/tap/v3/tap.pb.h" 5 : #include "envoy/extensions/transport_sockets/tap/v3/tap.pb.validate.h" 6 : #include "envoy/registry/registry.h" 7 : 8 : #include "source/common/config/utility.h" 9 : #include "source/common/protobuf/utility.h" 10 : #include "source/extensions/transport_sockets/tap/tap.h" 11 : #include "source/extensions/transport_sockets/tap/tap_config_impl.h" 12 : 13 : namespace Envoy { 14 : namespace Extensions { 15 : namespace TransportSockets { 16 : namespace Tap { 17 : 18 : class SocketTapConfigFactoryImpl : public Extensions::Common::Tap::TapConfigFactory { 19 : public: 20 : SocketTapConfigFactoryImpl(TimeSource& time_source, 21 : Server::Configuration::TransportSocketFactoryContext& context) 22 0 : : time_source_(time_source), factory_context_(context) {} 23 : 24 : // TapConfigFactory 25 : Extensions::Common::Tap::TapConfigSharedPtr 26 : createConfigFromProto(const envoy::config::tap::v3::TapConfig& proto_config, 27 0 : Extensions::Common::Tap::Sink* admin_streamer) override { 28 0 : return std::make_shared<SocketTapConfigImpl>(std::move(proto_config), admin_streamer, 29 0 : time_source_, factory_context_); 30 0 : } 31 : 32 : private: 33 : TimeSource& time_source_; 34 : Server::Configuration::TransportSocketFactoryContext& factory_context_; 35 : }; 36 : 37 : Network::UpstreamTransportSocketFactoryPtr 38 : UpstreamTapSocketConfigFactory::createTransportSocketFactory( 39 : const Protobuf::Message& message, 40 0 : Server::Configuration::TransportSocketFactoryContext& context) { 41 0 : const auto& outer_config = 42 0 : MessageUtil::downcastAndValidate<const envoy::extensions::transport_sockets::tap::v3::Tap&>( 43 0 : message, context.messageValidationVisitor()); 44 0 : auto& inner_config_factory = Config::Utility::getAndCheckFactory< 45 0 : Server::Configuration::UpstreamTransportSocketConfigFactory>(outer_config.transport_socket()); 46 0 : ProtobufTypes::MessagePtr inner_factory_config = Config::Utility::translateToFactoryConfig( 47 0 : outer_config.transport_socket(), context.messageValidationVisitor(), inner_config_factory); 48 0 : auto inner_transport_factory = 49 0 : inner_config_factory.createTransportSocketFactory(*inner_factory_config, context); 50 : 51 0 : auto& server_context = context.serverFactoryContext(); 52 0 : return std::make_unique<TapSocketFactory>( 53 0 : outer_config, 54 0 : std::make_unique<SocketTapConfigFactoryImpl>( 55 0 : server_context.mainThreadDispatcher().timeSource(), context), 56 0 : server_context.admin(), server_context.singletonManager(), server_context.threadLocal(), 57 0 : server_context.mainThreadDispatcher(), std::move(inner_transport_factory)); 58 0 : } 59 : 60 : Network::DownstreamTransportSocketFactoryPtr 61 : DownstreamTapSocketConfigFactory::createTransportSocketFactory( 62 : const Protobuf::Message& message, Server::Configuration::TransportSocketFactoryContext& context, 63 0 : const std::vector<std::string>& server_names) { 64 0 : const auto& outer_config = 65 0 : MessageUtil::downcastAndValidate<const envoy::extensions::transport_sockets::tap::v3::Tap&>( 66 0 : message, context.messageValidationVisitor()); 67 0 : auto& inner_config_factory = Config::Utility::getAndCheckFactory< 68 0 : Server::Configuration::DownstreamTransportSocketConfigFactory>( 69 0 : outer_config.transport_socket()); 70 0 : ProtobufTypes::MessagePtr inner_factory_config = Config::Utility::translateToFactoryConfig( 71 0 : outer_config.transport_socket(), context.messageValidationVisitor(), inner_config_factory); 72 0 : auto inner_transport_factory = inner_config_factory.createTransportSocketFactory( 73 0 : *inner_factory_config, context, server_names); 74 0 : auto& server_context = context.serverFactoryContext(); 75 0 : return std::make_unique<DownstreamTapSocketFactory>( 76 0 : outer_config, 77 0 : std::make_unique<SocketTapConfigFactoryImpl>( 78 0 : server_context.mainThreadDispatcher().timeSource(), context), 79 0 : server_context.admin(), server_context.singletonManager(), server_context.threadLocal(), 80 0 : server_context.mainThreadDispatcher(), std::move(inner_transport_factory)); 81 0 : } 82 : 83 2 : ProtobufTypes::MessagePtr TapSocketConfigFactory::createEmptyConfigProto() { 84 2 : return std::make_unique<envoy::extensions::transport_sockets::tap::v3::Tap>(); 85 2 : } 86 : 87 : REGISTER_FACTORY(UpstreamTapSocketConfigFactory, 88 : Server::Configuration::UpstreamTransportSocketConfigFactory); 89 : 90 : REGISTER_FACTORY(DownstreamTapSocketConfigFactory, 91 : Server::Configuration::DownstreamTransportSocketConfigFactory); 92 : 93 : } // namespace Tap 94 : } // namespace TransportSockets 95 : } // namespace Extensions 96 : } // namespace Envoy