|
|
|
@ -765,6 +765,18 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, |
|
|
|
|
resource_types_to_ignore_.emplace(type_url); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void UnsetResource(const std::string& type_url, const std::string& name) { |
|
|
|
|
grpc_core::MutexLock lock(&ads_mu_); |
|
|
|
|
ResourceState& state = resource_map_[type_url][name]; |
|
|
|
|
++state.version; |
|
|
|
|
state.resource.reset(); |
|
|
|
|
gpr_log(GPR_INFO, "ADS[%p]: Unsetting %s resource %s to version %u", this, |
|
|
|
|
type_url.c_str(), name.c_str(), state.version); |
|
|
|
|
for (SubscriptionState* subscription : state.subscriptions) { |
|
|
|
|
subscription->update_queue->emplace_back(type_url, name); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void SetResource(google::protobuf::Any resource, const std::string& type_url, |
|
|
|
|
const std::string& name) { |
|
|
|
|
grpc_core::MutexLock lock(&ads_mu_); |
|
|
|
@ -1639,6 +1651,45 @@ TEST_P(BasicTest, BackendsRestart) { |
|
|
|
|
true /* wait_for_ready */); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
using XdsResolverOnlyTest = BasicTest; |
|
|
|
|
|
|
|
|
|
// Tests switching over from one cluster to another.
|
|
|
|
|
TEST_P(XdsResolverOnlyTest, ChangeClusters) { |
|
|
|
|
const char* kNewClusterName = "new_cluster_name"; |
|
|
|
|
SetNextResolution({}); |
|
|
|
|
SetNextResolutionForLbChannelAllBalancers(); |
|
|
|
|
AdsServiceImpl::EdsResourceArgs args({ |
|
|
|
|
{"locality0", GetBackendPorts(0, 2)}, |
|
|
|
|
}); |
|
|
|
|
balancers_[0]->ads_service()->SetEdsResource( |
|
|
|
|
AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); |
|
|
|
|
// We need to wait for all backends to come online.
|
|
|
|
|
WaitForAllBackends(0, 2); |
|
|
|
|
// Populate new EDS resource.
|
|
|
|
|
AdsServiceImpl::EdsResourceArgs args2({ |
|
|
|
|
{"locality0", GetBackendPorts(2, 4)}, |
|
|
|
|
}); |
|
|
|
|
balancers_[0]->ads_service()->SetEdsResource( |
|
|
|
|
AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), |
|
|
|
|
kNewClusterName); |
|
|
|
|
// Populate new CDS resource.
|
|
|
|
|
Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); |
|
|
|
|
new_cluster.set_name(kNewClusterName); |
|
|
|
|
balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); |
|
|
|
|
// Change RDS resource to point to new cluster.
|
|
|
|
|
RouteConfiguration new_route_config = |
|
|
|
|
balancers_[0]->ads_service()->default_route_config(); |
|
|
|
|
new_route_config.mutable_virtual_hosts(0)->mutable_routes(0) |
|
|
|
|
->mutable_route()->set_cluster(kNewClusterName); |
|
|
|
|
Listener listener = |
|
|
|
|
balancers_[0]->ads_service()->BuildListener(new_route_config); |
|
|
|
|
balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); |
|
|
|
|
// Wait for all new backends to be used.
|
|
|
|
|
std::tuple<int, int, int> counts = WaitForAllBackends(2, 4); |
|
|
|
|
// Make sure no RPCs failed in the transition.
|
|
|
|
|
EXPECT_EQ(0, std::get<1>(counts)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
using SecureNamingTest = BasicTest; |
|
|
|
|
|
|
|
|
|
// Tests that secure naming check passes if target name is expected.
|
|
|
|
@ -3307,6 +3358,12 @@ INSTANTIATE_TEST_SUITE_P(XdsTest, EdsTest, |
|
|
|
|
TestType(true, true)), |
|
|
|
|
&TestTypeName); |
|
|
|
|
|
|
|
|
|
// XdsResolverOnlyTest depends on XdsResolver.
|
|
|
|
|
INSTANTIATE_TEST_SUITE_P(XdsTest, XdsResolverOnlyTest, |
|
|
|
|
::testing::Values(TestType(true, false), |
|
|
|
|
TestType(true, true)), |
|
|
|
|
&TestTypeName); |
|
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_SUITE_P(XdsTest, LocalityMapTest, |
|
|
|
|
::testing::Values(TestType(false, true), |
|
|
|
|
TestType(false, false), |
|
|
|
|