diff --git a/source/server/config/access_log/grpc_access_log.cc b/source/server/config/access_log/grpc_access_log.cc index 79de96e4ec70e..c5105dd6f5e10 100644 --- a/source/server/config/access_log/grpc_access_log.cc +++ b/source/server/config/access_log/grpc_access_log.cc @@ -41,14 +41,20 @@ AccessLog::InstanceSharedPtr HttpGrpcAccessLogFactory::createAccessLogInstance( const auto& proto_config = MessageUtil::downcastAndValidate< const envoy::api::v2::filter::accesslog::HttpGrpcAccessLogConfig&>(config); + // TODO(htuch): Support Google gRPC client. + const auto cluster_name = proto_config.common_config().grpc_service().envoy_grpc().cluster_name(); + auto cluster = context.clusterManager().get(cluster_name); + if (cluster == nullptr || cluster->info()->addedViaApi()) { + throw EnvoyException(fmt::format( + "invalid access log cluster '{}'. Missing or not a static cluster.", cluster_name)); + } + std::shared_ptr grpc_access_log_streamer = context.singletonManager().getTyped( - SINGLETON_MANAGER_REGISTERED_NAME(grpc_access_log_streamer), [&context, &proto_config] { + SINGLETON_MANAGER_REGISTERED_NAME(grpc_access_log_streamer), [&context, cluster_name] { return std::make_shared( - std::make_unique( - context.clusterManager(), - // TODO(htuch): Support Google gRPC client. - proto_config.common_config().grpc_service().envoy_grpc().cluster_name()), + std::make_unique(context.clusterManager(), + cluster_name), context.threadLocal(), context.localInfo()); }); diff --git a/test/server/config/access_log/config_test.cc b/test/server/config/access_log/config_test.cc index baa9da6edce22..6bdd0a98cc96c 100644 --- a/test/server/config/access_log/config_test.cc +++ b/test/server/config/access_log/config_test.cc @@ -9,33 +9,60 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +using testing::Return; + namespace Envoy { namespace Server { namespace Configuration { -TEST(AccessLogConfigTest, HttpGrpcAccessLogTest) { - auto factory = Registry::FactoryRegistry::getFactory( - Config::AccessLogNames::get().HTTP_GRPC); - ASSERT_NE(nullptr, factory); +class HttpGrpcAccessLogConfigTest : public testing::Test { +public: + void SetUp() override { + factory_ = Registry::FactoryRegistry::getFactory( + Config::AccessLogNames::get().HTTP_GRPC); + ASSERT_NE(nullptr, factory_); - ProtobufTypes::MessagePtr message = factory->createEmptyConfigProto(); - ASSERT_NE(nullptr, message); + message_ = factory_->createEmptyConfigProto(); + ASSERT_NE(nullptr, message_); - envoy::api::v2::filter::accesslog::HttpGrpcAccessLogConfig http_grpc_access_log; - auto* common_config = http_grpc_access_log.mutable_common_config(); - common_config->set_log_name("foo"); - common_config->mutable_grpc_service()->mutable_envoy_grpc()->set_cluster_name("bar"); - MessageUtil::jsonConvert(http_grpc_access_log, *message); + auto* common_config = http_grpc_access_log_.mutable_common_config(); + common_config->set_log_name("foo"); + common_config->mutable_grpc_service()->mutable_envoy_grpc()->set_cluster_name("bar"); + MessageUtil::jsonConvert(http_grpc_access_log_, *message_); + } - AccessLog::FilterPtr filter; - NiceMock context; + AccessLog::FilterPtr filter_; + NiceMock context_; + envoy::api::v2::filter::accesslog::HttpGrpcAccessLogConfig http_grpc_access_log_; + ProtobufTypes::MessagePtr message_; + AccessLogInstanceFactory* factory_{}; +}; +// Normal OK configuration. +TEST_F(HttpGrpcAccessLogConfigTest, Ok) { AccessLog::InstanceSharedPtr instance = - factory->createAccessLogInstance(*message, std::move(filter), context); + factory_->createAccessLogInstance(*message_, std::move(filter_), context_); EXPECT_NE(nullptr, instance); EXPECT_NE(nullptr, dynamic_cast(instance.get())); } +// Configuration with no matching cluster. +TEST_F(HttpGrpcAccessLogConfigTest, NoCluster) { + ON_CALL(context_.cluster_manager_, get("bar")).WillByDefault(Return(nullptr)); + EXPECT_THROW_WITH_MESSAGE( + factory_->createAccessLogInstance(*message_, std::move(filter_), context_), EnvoyException, + "invalid access log cluster 'bar'. Missing or not a static cluster."); +} + +// Configuration with cluster but not a static cluster. +TEST_F(HttpGrpcAccessLogConfigTest, ClusterAddedViaApi) { + ON_CALL(*context_.cluster_manager_.thread_local_cluster_.cluster_.info_, addedViaApi()) + .WillByDefault(Return(true)); + EXPECT_THROW_WITH_MESSAGE( + factory_->createAccessLogInstance(*message_, std::move(filter_), context_), EnvoyException, + "invalid access log cluster 'bar'. Missing or not a static cluster."); +} + } // namespace Configuration } // namespace Server } // namespace Envoy