Line data Source code
1 : #include "source/extensions/common/tap/extension_config_base.h" 2 : 3 : #include "envoy/config/tap/v3/common.pb.h" 4 : #include "envoy/extensions/common/tap/v3/common.pb.h" 5 : 6 : namespace Envoy { 7 : namespace Extensions { 8 : namespace Common { 9 : namespace Tap { 10 : 11 : ExtensionConfigBase::ExtensionConfigBase( 12 : const envoy::extensions::common::tap::v3::CommonExtensionConfig proto_config, 13 : TapConfigFactoryPtr&& config_factory, OptRef<Server::Admin> admin, 14 : Singleton::Manager& singleton_manager, ThreadLocal::SlotAllocator& tls, 15 : Event::Dispatcher& main_thread_dispatcher) 16 2 : : proto_config_(proto_config), config_factory_(std::move(config_factory)), tls_slot_(tls) { 17 2 : tls_slot_.set([](Event::Dispatcher&) { return std::make_shared<TlsFilterConfig>(); }); 18 : 19 2 : switch (proto_config_.config_type_case()) { 20 2 : case envoy::extensions::common::tap::v3::CommonExtensionConfig::ConfigTypeCase::kAdminConfig: { 21 2 : admin_handler_ = AdminHandler::getSingleton(admin, singleton_manager, main_thread_dispatcher); 22 2 : admin_handler_->registerConfig(*this, proto_config_.admin_config().config_id()); 23 2 : ENVOY_LOG(debug, "initializing tap extension with admin endpoint (config_id={})", 24 2 : proto_config_.admin_config().config_id()); 25 2 : break; 26 0 : } 27 0 : case envoy::extensions::common::tap::v3::CommonExtensionConfig::ConfigTypeCase::kStaticConfig: { 28 : // Right now only one sink is supported. 29 0 : ASSERT(proto_config_.static_config().output_config().sinks().size() == 1); 30 0 : if (proto_config_.static_config().output_config().sinks()[0].output_sink_type_case() == 31 0 : envoy::config::tap::v3::OutputSink::OutputSinkTypeCase::kStreamingAdmin) { 32 : // Require that users do not specify a streaming admin with static configuration. 33 0 : throw EnvoyException( 34 0 : fmt::format("Error: Specifying admin streaming output without configuring admin.")); 35 0 : } 36 0 : installNewTap(proto_config_.static_config(), nullptr); 37 0 : ENVOY_LOG(debug, "initializing tap extension with static config"); 38 0 : break; 39 0 : } 40 0 : case envoy::extensions::common::tap::v3::CommonExtensionConfig::ConfigTypeCase:: 41 0 : CONFIG_TYPE_NOT_SET: 42 0 : PANIC_DUE_TO_CORRUPT_ENUM; 43 2 : } 44 2 : } 45 : 46 2 : ExtensionConfigBase::~ExtensionConfigBase() { 47 2 : if (admin_handler_) { 48 2 : admin_handler_->unregisterConfig(*this); 49 2 : } 50 2 : } 51 : 52 2 : const absl::string_view ExtensionConfigBase::adminId() { 53 : // It is only possible to get here if we had an admin config and registered with the admin 54 : // handler. 55 2 : ASSERT(proto_config_.has_admin_config()); 56 2 : return proto_config_.admin_config().config_id(); 57 2 : } 58 : 59 0 : void ExtensionConfigBase::clearTapConfig() { 60 0 : tls_slot_.runOnAllThreads( 61 0 : [](OptRef<TlsFilterConfig> tls_filter_config) { tls_filter_config->config_ = nullptr; }); 62 0 : } 63 : 64 : void ExtensionConfigBase::installNewTap(const envoy::config::tap::v3::TapConfig& proto_config, 65 0 : Sink* admin_streamer) { 66 0 : TapConfigSharedPtr new_config = 67 0 : config_factory_->createConfigFromProto(proto_config, admin_streamer); 68 0 : tls_slot_.runOnAllThreads( 69 0 : [new_config](OptRef<TlsFilterConfig> tls_filter_config) { 70 0 : tls_filter_config->config_ = new_config; 71 0 : }, 72 0 : []() -> void { ENVOY_LOG(debug, "New tap installed on all workers."); }); 73 0 : } 74 : 75 : void ExtensionConfigBase::newTapConfig(const envoy::config::tap::v3::TapConfig& proto_config, 76 0 : Sink* admin_streamer) { 77 0 : installNewTap(proto_config, admin_streamer); 78 0 : } 79 : 80 : } // namespace Tap 81 : } // namespace Common 82 : } // namespace Extensions 83 : } // namespace Envoy