@@ -387,6 +387,7 @@ class DnsResolverImplPeer {
387
387
resolver_->initializeChannel (&options, ARES_OPT_FLAGS | ARES_OPT_DOMAINS |
388
388
(zero_timeout ? ARES_OPT_TIMEOUTMS : 0 ));
389
389
}
390
+ bool isCaresDefaultTheOnlyNameserver () { return resolver_->isCaresDefaultTheOnlyNameserver (); }
390
391
391
392
private:
392
393
DnsResolverImpl* resolver_;
@@ -450,18 +451,35 @@ TEST_F(DnsImplConstructor, SupportsCustomResolversAsFallback) {
450
451
char addr4str[INET_ADDRSTRLEN];
451
452
auto addr4 = Network::Utility::parseInternetAddress (" 1.2.3.4" );
452
453
453
- // convert the address and options into typed_dns_resolver_config
454
+ // First, create a resolver with no fallback. Check to see if cares default is
455
+ // the only nameserver.
456
+ bool only_has_default = false ;
457
+ {
458
+ envoy::extensions::network::dns_resolver::cares::v3::CaresDnsResolverConfig cares;
459
+ cares.mutable_dns_resolver_options ()->MergeFrom (dns_resolver_options_);
460
+
461
+ envoy::config::core::v3::TypedExtensionConfig typed_dns_resolver_config;
462
+ typed_dns_resolver_config.mutable_typed_config ()->PackFrom (cares);
463
+ typed_dns_resolver_config.set_name (std::string (Network::CaresDnsResolver));
464
+ Network::DnsResolverFactory& dns_resolver_factory =
465
+ createDnsResolverFactoryFromTypedConfig (typed_dns_resolver_config);
466
+ auto resolver =
467
+ dns_resolver_factory.createDnsResolver (*dispatcher_, *api_, typed_dns_resolver_config);
468
+ auto peer =
469
+ std::make_unique<DnsResolverImplPeer>(dynamic_cast <DnsResolverImpl*>(resolver.get ()));
470
+ only_has_default = peer->isCaresDefaultTheOnlyNameserver ();
471
+ }
472
+
473
+ // Now create a resolver with a failover resolver.
454
474
envoy::config::core::v3::Address dns_resolvers;
455
475
Network::Utility::addressToProtobufAddress (
456
476
Network::Address::Ipv4Instance (addr4->ip ()->addressAsString (), addr4->ip ()->port ()),
457
477
dns_resolvers);
458
478
envoy::extensions::network::dns_resolver::cares::v3::CaresDnsResolverConfig cares;
459
479
cares.set_use_resolvers_as_fallback (true );
460
480
cares.add_resolvers ()->MergeFrom (dns_resolvers);
461
-
462
481
// copy over dns_resolver_options_
463
482
cares.mutable_dns_resolver_options ()->MergeFrom (dns_resolver_options_);
464
-
465
483
envoy::config::core::v3::TypedExtensionConfig typed_dns_resolver_config;
466
484
typed_dns_resolver_config.mutable_typed_config ()->PackFrom (cares);
467
485
typed_dns_resolver_config.set_name (std::string (Network::CaresDnsResolver));
@@ -470,14 +488,19 @@ TEST_F(DnsImplConstructor, SupportsCustomResolversAsFallback) {
470
488
auto resolver =
471
489
dns_resolver_factory.createDnsResolver (*dispatcher_, *api_, typed_dns_resolver_config);
472
490
473
- // Given that the local machine will have a working conf in resolve.conf the resolver will not
474
- // use the fallback given.
475
491
auto peer = std::make_unique<DnsResolverImplPeer>(dynamic_cast <DnsResolverImpl*>(resolver.get ()));
476
492
ares_addr_port_node* resolvers;
477
493
int result = ares_get_servers_ports (peer->channel (), &resolvers);
478
494
EXPECT_EQ (result, ARES_SUCCESS);
479
495
EXPECT_EQ (resolvers->family , AF_INET);
480
- EXPECT_STRNE (inet_ntop (AF_INET, &resolvers->addr .addr4 , addr4str, INET_ADDRSTRLEN), " 1.2.3.4" );
496
+ if (only_has_default) {
497
+ // If cares default was the only resolver, the fallbacks will be used.
498
+ EXPECT_STREQ (inet_ntop (AF_INET, &resolvers->addr .addr4 , addr4str, INET_ADDRSTRLEN), " 1.2.3.4" );
499
+ } else {
500
+ // In the common case, where cares default was not the only resolver, the fallback will not be
501
+ // used.
502
+ EXPECT_STRNE (inet_ntop (AF_INET, &resolvers->addr .addr4 , addr4str, INET_ADDRSTRLEN), " 1.2.3.4" );
503
+ }
481
504
ares_free_data (resolvers);
482
505
}
483
506
0 commit comments