diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index a2f7d8bc85ce6..0ac8dc532041b 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -422,9 +422,12 @@ ClusterSharedPtr ClusterImplBase::create( if (!cluster.health_checks().empty()) { // TODO(htuch): Need to support multiple health checks in v2. - ASSERT(cluster.health_checks().size() == 1); - new_cluster->setHealthChecker(HealthCheckerFactory::create( - cluster.health_checks()[0], *new_cluster, runtime, random, dispatcher, log_manager)); + if (cluster.health_checks().size() != 1) { + throw EnvoyException("Multiple health checks not supported"); + } else { + new_cluster->setHealthChecker(HealthCheckerFactory::create( + cluster.health_checks()[0], *new_cluster, runtime, random, dispatcher, log_manager)); + } } new_cluster->setOutlierDetector(Outlier::DetectorImplFactory::createForCluster( diff --git a/test/common/upstream/cluster_manager_impl_test.cc b/test/common/upstream/cluster_manager_impl_test.cc index 8082c0c090c0a..56080b449dcf8 100644 --- a/test/common/upstream/cluster_manager_impl_test.cc +++ b/test/common/upstream/cluster_manager_impl_test.cc @@ -193,6 +193,27 @@ TEST_F(ClusterManagerImplTest, MultipleProtocolClusterFail) { "'protocol_selection' values"); } +TEST_F(ClusterManagerImplTest, MultipleHealthCheckFail) { + const std::string yaml = R"EOF( + static_resources: + clusters: + - name: service_google + connect_timeout: 0.25s + health_checks: + - timeout: 1s + interval: 1s + http_health_check: + path: "/blah" + - timeout: 1s + interval: 1s + http_health_check: + path: "/" + )EOF"; + + EXPECT_THROW_WITH_MESSAGE(create(parseBootstrapFromV2Yaml(yaml)), EnvoyException, + "Multiple health checks not supported"); +} + TEST_F(ClusterManagerImplTest, MultipleProtocolCluster) { EXPECT_CALL(system_time_source_, currentTime()) .WillRepeatedly(Return(SystemTime(std::chrono::milliseconds(1234567891234)))); diff --git a/test/server/server_corpus/clusterfuzz-testcase-server_fuzz_test-5366294281977856 b/test/server/server_corpus/clusterfuzz-testcase-server_fuzz_test-5366294281977856 new file mode 100644 index 0000000000000..675806abca08d --- /dev/null +++ b/test/server/server_corpus/clusterfuzz-testcase-server_fuzz_test-5366294281977856 @@ -0,0 +1,126 @@ +static_resources { + clusters { + name: "9" + connect_timeout { + nanos: 1 + } + hosts { + pipe { + path: "N" + } + } + hosts { + pipe { + path: "n" + } + } + hosts { + pipe { + path: "=" + } + } + hosts { + pipe { + path: "s" + } + } + hosts { + pipe { + path: "n" + } + } + hosts { + pipe { + path: "N" + } + } + hosts { + pipe { + path: "W" + } + } + hosts { + pipe { + path: "=" + } + } + hosts { + pipe { + path: "N" + } + } + hosts { + pipe { + path: "n" + } + } + health_checks { + timeout { + nanos: 1 + } + interval { + nanos: 1 + } + unhealthy_threshold { + } + healthy_threshold { + value: 1701650432 + } + http_health_check { + path: "~" + request_headers_to_add { + } + request_headers_to_add { + header { + value: "W" + } + } + request_headers_to_add { + } + request_headers_to_add { + } + request_headers_to_add { + } + request_headers_to_add { + } + request_headers_to_add { + } + request_headers_to_add { + } + request_headers_to_add { + } + use_http2: true + } + } + health_checks { + timeout { + nanos: 1 + } + interval { + nanos: 1 + } + unhealthy_threshold { + } + healthy_threshold { + } + http_health_check { + path: "E" + request_headers_to_add { + } + request_headers_to_add { + } + request_headers_to_add { + } + } + } + } +} +admin { + access_log_path: "@\'" + address { + socket_address { + address: "::" + port_value: 0 + } + } +}