Skip to content

Commit 4b7d962

Browse files
Arkeleniaclaude
andcommitted
address comments
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 0db315e commit 4b7d962

2 files changed

Lines changed: 69 additions & 4 deletions

File tree

source/common/router/route_config_update_receiver_impl.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "source/common/common/assert.h"
1010
#include "source/common/common/fmt.h"
11+
#include "source/common/common/logger.h"
1112
#include "source/common/common/thread.h"
1213
#include "source/common/config/resource_name.h"
1314
#include "source/common/protobuf/utility.h"
@@ -26,8 +27,9 @@ void rebuildRouteConfigVirtualHosts(
2627
envoy::config::route::v3::RouteConfiguration& route_config) {
2728
route_config.clear_virtual_hosts();
2829
for (const auto& vhost : rds_vhosts) {
29-
auto found = vhds_vhosts.find(vhost.first);
30-
if (found != vhds_vhosts.end()) {
30+
if (vhds_vhosts.contains(vhost.first)) {
31+
ENVOY_LOG_MISC(debug, "VHDS virtual host '{}' overrides RDS virtual host with the same name",
32+
vhost.first);
3133
continue;
3234
}
3335
route_config.mutable_virtual_hosts()->Add()->CheckTypeAndMergeFrom(vhost.second);

test/common/router/vhds_test.cc

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,8 +373,8 @@ name: my_route
373373
found_rds_only = true;
374374
}
375375
}
376-
EXPECT_TRUE(found_vhds_version);
377-
EXPECT_TRUE(found_rds_only);
376+
EXPECT_TRUE(found_vhds_version) << "VHDS version of overlapping_vhost not found";
377+
EXPECT_TRUE(found_rds_only) << "vhost_rds_only not found";
378378
}
379379

380380
// verify VHDS precedence is maintained after an RDS update
@@ -441,12 +441,75 @@ name: my_route
441441
EXPECT_EQ(2UL, config_update_info->protobufConfigurationCast().virtual_hosts_size());
442442

443443
// Verify VHDS version still takes precedence after RDS update
444+
bool found_vhds_version = false;
444445
for (int i = 0; i < config_update_info->protobufConfigurationCast().virtual_hosts_size(); ++i) {
445446
const auto& vh = config_update_info->protobufConfigurationCast().virtual_hosts(i);
446447
if (vh.name() == "overlapping_vhost") {
447448
EXPECT_EQ("vhost.vhds.domain", vh.domains(0));
449+
found_vhds_version = true;
448450
}
449451
}
452+
EXPECT_TRUE(found_vhds_version) << "VHDS version of overlapping_vhost not found after RDS update";
453+
}
454+
455+
// verify that removing a VHDS virtual host that was overriding an RDS one causes the RDS vhost to
456+
// reappear
457+
TEST_F(VhdsTest, RemovingVhdsVirtualHostRestoresRdsVirtualHost) {
458+
const auto route_config =
459+
TestUtility::parseYaml<envoy::config::route::v3::RouteConfiguration>(R"EOF(
460+
name: my_route
461+
virtual_hosts:
462+
- name: overlapping_vhost
463+
domains: ["vhost.rds.domain"]
464+
routes:
465+
- match: { prefix: "/rds" }
466+
route: { cluster: rds_service }
467+
vhds:
468+
config_source:
469+
api_config_source:
470+
api_type: DELTA_GRPC
471+
grpc_services:
472+
envoy_grpc:
473+
cluster_name: xds_cluster
474+
)EOF");
475+
RouteConfigUpdatePtr config_update_info = makeRouteConfigUpdate(route_config);
476+
477+
VhdsSubscriptionPtr subscription = VhdsSubscription::createVhdsSubscription(
478+
config_update_info, factory_context_, context_, provider_)
479+
.value();
480+
EXPECT_EQ(1UL, config_update_info->protobufConfigurationCast().virtual_hosts_size());
481+
482+
// Add a VHDS virtual host with the same name as the RDS one
483+
auto vhost = buildVirtualHost("overlapping_vhost", "vhost.vhds.domain");
484+
const auto& added_resources = buildAddedResources({vhost});
485+
const auto decoded_resources =
486+
TestUtility::decodeResources<envoy::config::route::v3::VirtualHost>(added_resources);
487+
Protobuf::RepeatedPtrField<std::string> removed_resources;
488+
EXPECT_TRUE(factory_context_.cluster_manager_.subscription_factory_.callbacks_
489+
->onConfigUpdate(decoded_resources.refvec_, removed_resources, "1")
490+
.ok());
491+
492+
// VHDS version should override
493+
EXPECT_EQ(1UL, config_update_info->protobufConfigurationCast().virtual_hosts_size());
494+
EXPECT_EQ("vhost.vhds.domain",
495+
config_update_info->protobufConfigurationCast().virtual_hosts(0).domains(0));
496+
497+
// Now remove the VHDS virtual host
498+
const auto no_added_resources = buildAddedResources({});
499+
const auto no_decoded_resources =
500+
TestUtility::decodeResources<envoy::config::route::v3::VirtualHost>(no_added_resources);
501+
Protobuf::RepeatedPtrField<std::string> resources_to_remove;
502+
*resources_to_remove.Add() = "overlapping_vhost";
503+
EXPECT_TRUE(factory_context_.cluster_manager_.subscription_factory_.callbacks_
504+
->onConfigUpdate(no_decoded_resources.refvec_, resources_to_remove, "2")
505+
.ok());
506+
507+
// The RDS virtual host should reappear
508+
EXPECT_EQ(1UL, config_update_info->protobufConfigurationCast().virtual_hosts_size());
509+
EXPECT_EQ("overlapping_vhost",
510+
config_update_info->protobufConfigurationCast().virtual_hosts(0).name());
511+
EXPECT_EQ("vhost.rds.domain",
512+
config_update_info->protobufConfigurationCast().virtual_hosts(0).domains(0));
450513
}
451514

452515
} // namespace

0 commit comments

Comments
 (0)