@@ -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