|
|
|
@ -22,6 +22,7 @@ |
|
|
|
|
#include <memory> |
|
|
|
|
#include <string> |
|
|
|
|
#include <utility> |
|
|
|
|
#include <vector> |
|
|
|
|
|
|
|
|
|
#include <google/protobuf/wrappers.pb.h> |
|
|
|
|
|
|
|
|
@ -54,6 +55,7 @@ |
|
|
|
|
#include "src/proto/grpc/testing/xds/v3/endpoint.pb.h" |
|
|
|
|
#include "src/proto/grpc/testing/xds/v3/health_check.pb.h" |
|
|
|
|
#include "src/proto/grpc/testing/xds/v3/percent.pb.h" |
|
|
|
|
#include "test/core/util/scoped_env_var.h" |
|
|
|
|
#include "test/core/util/test_config.h" |
|
|
|
|
|
|
|
|
|
using envoy::config::endpoint::v3::ClusterLoadAssignment; |
|
|
|
@ -489,6 +491,254 @@ TEST_F(XdsEndpointTest, MissingAddress) { |
|
|
|
|
<< decode_result.resource.status(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(XdsEndpointTest, MultipleAddressesPerEndpoint) { |
|
|
|
|
testing::ScopedExperimentalEnvVar env( |
|
|
|
|
"GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS"); |
|
|
|
|
ClusterLoadAssignment cla; |
|
|
|
|
cla.set_cluster_name("foo"); |
|
|
|
|
auto* locality = cla.add_endpoints(); |
|
|
|
|
locality->mutable_load_balancing_weight()->set_value(1); |
|
|
|
|
auto* locality_name = locality->mutable_locality(); |
|
|
|
|
locality_name->set_region("myregion"); |
|
|
|
|
locality_name->set_zone("myzone"); |
|
|
|
|
locality_name->set_sub_zone("mysubzone"); |
|
|
|
|
auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); |
|
|
|
|
auto* socket_address = ep->mutable_address()->mutable_socket_address(); |
|
|
|
|
socket_address->set_address("127.0.0.1"); |
|
|
|
|
socket_address->set_port_value(443); |
|
|
|
|
socket_address = ep->add_additional_addresses() |
|
|
|
|
->mutable_address() |
|
|
|
|
->mutable_socket_address(); |
|
|
|
|
socket_address->set_address("127.0.0.1"); |
|
|
|
|
socket_address->set_port_value(444); |
|
|
|
|
std::string serialized_resource; |
|
|
|
|
ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); |
|
|
|
|
auto* resource_type = XdsEndpointResourceType::Get(); |
|
|
|
|
auto decode_result = |
|
|
|
|
resource_type->Decode(decode_context_, serialized_resource); |
|
|
|
|
ASSERT_TRUE(decode_result.resource.ok()) << decode_result.resource.status(); |
|
|
|
|
ASSERT_TRUE(decode_result.name.has_value()); |
|
|
|
|
EXPECT_EQ(*decode_result.name, "foo"); |
|
|
|
|
auto& resource = |
|
|
|
|
static_cast<const XdsEndpointResource&>(**decode_result.resource); |
|
|
|
|
ASSERT_EQ(resource.priorities.size(), 1); |
|
|
|
|
const auto& priority = resource.priorities[0]; |
|
|
|
|
ASSERT_EQ(priority.localities.size(), 1); |
|
|
|
|
const auto& p = *priority.localities.begin(); |
|
|
|
|
ASSERT_EQ(p.first, p.second.name.get()); |
|
|
|
|
EXPECT_EQ(p.first->region(), "myregion"); |
|
|
|
|
EXPECT_EQ(p.first->zone(), "myzone"); |
|
|
|
|
EXPECT_EQ(p.first->sub_zone(), "mysubzone"); |
|
|
|
|
EXPECT_EQ(p.second.lb_weight, 1); |
|
|
|
|
ASSERT_EQ(p.second.endpoints.size(), 1); |
|
|
|
|
const auto& endpoint = p.second.endpoints.front(); |
|
|
|
|
ASSERT_EQ(endpoint.addresses().size(), 2); |
|
|
|
|
auto addr = |
|
|
|
|
grpc_sockaddr_to_string(&endpoint.addresses()[0], /*normalize=*/false); |
|
|
|
|
ASSERT_TRUE(addr.ok()) << addr.status(); |
|
|
|
|
EXPECT_EQ(*addr, "127.0.0.1:443"); |
|
|
|
|
addr = grpc_sockaddr_to_string(&endpoint.addresses()[1], /*normalize=*/false); |
|
|
|
|
ASSERT_TRUE(addr.ok()) << addr.status(); |
|
|
|
|
EXPECT_EQ(*addr, "127.0.0.1:444"); |
|
|
|
|
EXPECT_EQ(endpoint.args(), ChannelArgs() |
|
|
|
|
.Set(GRPC_ARG_ADDRESS_WEIGHT, 1) |
|
|
|
|
.Set(GRPC_ARG_XDS_HEALTH_STATUS, |
|
|
|
|
XdsHealthStatus::HealthStatus::kUnknown)); |
|
|
|
|
ASSERT_NE(resource.drop_config, nullptr); |
|
|
|
|
EXPECT_TRUE(resource.drop_config->drop_category_list().empty()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(XdsEndpointTest, AdditionalAddressesMissingAddress) { |
|
|
|
|
testing::ScopedExperimentalEnvVar env( |
|
|
|
|
"GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS"); |
|
|
|
|
ClusterLoadAssignment cla; |
|
|
|
|
cla.set_cluster_name("foo"); |
|
|
|
|
auto* locality = cla.add_endpoints(); |
|
|
|
|
locality->mutable_load_balancing_weight()->set_value(1); |
|
|
|
|
auto* locality_name = locality->mutable_locality(); |
|
|
|
|
locality_name->set_region("myregion"); |
|
|
|
|
locality_name->set_zone("myzone"); |
|
|
|
|
locality_name->set_sub_zone("mysubzone"); |
|
|
|
|
auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); |
|
|
|
|
auto* socket_address = ep->mutable_address()->mutable_socket_address(); |
|
|
|
|
socket_address->set_address("127.0.0.1"); |
|
|
|
|
socket_address->set_port_value(443); |
|
|
|
|
ep->add_additional_addresses(); |
|
|
|
|
std::string serialized_resource; |
|
|
|
|
ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); |
|
|
|
|
auto* resource_type = XdsEndpointResourceType::Get(); |
|
|
|
|
auto decode_result = |
|
|
|
|
resource_type->Decode(decode_context_, serialized_resource); |
|
|
|
|
ASSERT_TRUE(decode_result.name.has_value()); |
|
|
|
|
EXPECT_EQ(*decode_result.name, "foo"); |
|
|
|
|
EXPECT_EQ(decode_result.resource.status().code(), |
|
|
|
|
absl::StatusCode::kInvalidArgument); |
|
|
|
|
EXPECT_EQ(decode_result.resource.status().message(), |
|
|
|
|
"errors parsing EDS resource: [" |
|
|
|
|
"field:endpoints[0].lb_endpoints[0].endpoint" |
|
|
|
|
".additional_addresses[0].address error:field not present]") |
|
|
|
|
<< decode_result.resource.status(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(XdsEndpointTest, AdditionalAddressesMissingSocketAddress) { |
|
|
|
|
testing::ScopedExperimentalEnvVar env( |
|
|
|
|
"GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS"); |
|
|
|
|
ClusterLoadAssignment cla; |
|
|
|
|
cla.set_cluster_name("foo"); |
|
|
|
|
auto* locality = cla.add_endpoints(); |
|
|
|
|
locality->mutable_load_balancing_weight()->set_value(1); |
|
|
|
|
auto* locality_name = locality->mutable_locality(); |
|
|
|
|
locality_name->set_region("myregion"); |
|
|
|
|
locality_name->set_zone("myzone"); |
|
|
|
|
locality_name->set_sub_zone("mysubzone"); |
|
|
|
|
auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); |
|
|
|
|
auto* socket_address = ep->mutable_address()->mutable_socket_address(); |
|
|
|
|
socket_address->set_address("127.0.0.1"); |
|
|
|
|
socket_address->set_port_value(443); |
|
|
|
|
ep->add_additional_addresses()->mutable_address(); |
|
|
|
|
std::string serialized_resource; |
|
|
|
|
ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); |
|
|
|
|
auto* resource_type = XdsEndpointResourceType::Get(); |
|
|
|
|
auto decode_result = |
|
|
|
|
resource_type->Decode(decode_context_, serialized_resource); |
|
|
|
|
ASSERT_TRUE(decode_result.name.has_value()); |
|
|
|
|
EXPECT_EQ(*decode_result.name, "foo"); |
|
|
|
|
EXPECT_EQ(decode_result.resource.status().code(), |
|
|
|
|
absl::StatusCode::kInvalidArgument); |
|
|
|
|
EXPECT_EQ(decode_result.resource.status().message(), |
|
|
|
|
"errors parsing EDS resource: [" |
|
|
|
|
"field:endpoints[0].lb_endpoints[0].endpoint" |
|
|
|
|
".additional_addresses[0].address.socket_address " |
|
|
|
|
"error:field not present]") |
|
|
|
|
<< decode_result.resource.status(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(XdsEndpointTest, AdditionalAddressesInvalidPort) { |
|
|
|
|
testing::ScopedExperimentalEnvVar env( |
|
|
|
|
"GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS"); |
|
|
|
|
ClusterLoadAssignment cla; |
|
|
|
|
cla.set_cluster_name("foo"); |
|
|
|
|
auto* locality = cla.add_endpoints(); |
|
|
|
|
locality->mutable_load_balancing_weight()->set_value(1); |
|
|
|
|
auto* locality_name = locality->mutable_locality(); |
|
|
|
|
locality_name->set_region("myregion"); |
|
|
|
|
locality_name->set_zone("myzone"); |
|
|
|
|
locality_name->set_sub_zone("mysubzone"); |
|
|
|
|
auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); |
|
|
|
|
auto* socket_address = ep->mutable_address()->mutable_socket_address(); |
|
|
|
|
socket_address->set_address("127.0.0.1"); |
|
|
|
|
socket_address->set_port_value(443); |
|
|
|
|
socket_address = ep->add_additional_addresses() |
|
|
|
|
->mutable_address() |
|
|
|
|
->mutable_socket_address(); |
|
|
|
|
socket_address->set_address("127.0.0.1"); |
|
|
|
|
socket_address->set_port_value(65537); |
|
|
|
|
std::string serialized_resource; |
|
|
|
|
ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); |
|
|
|
|
auto* resource_type = XdsEndpointResourceType::Get(); |
|
|
|
|
auto decode_result = |
|
|
|
|
resource_type->Decode(decode_context_, serialized_resource); |
|
|
|
|
ASSERT_TRUE(decode_result.name.has_value()); |
|
|
|
|
EXPECT_EQ(*decode_result.name, "foo"); |
|
|
|
|
EXPECT_EQ(decode_result.resource.status().code(), |
|
|
|
|
absl::StatusCode::kInvalidArgument); |
|
|
|
|
EXPECT_EQ(decode_result.resource.status().message(), |
|
|
|
|
"errors parsing EDS resource: [" |
|
|
|
|
"field:endpoints[0].lb_endpoints[0].endpoint" |
|
|
|
|
".additional_addresses[0].address.socket_address.port_value " |
|
|
|
|
"error:invalid port]") |
|
|
|
|
<< decode_result.resource.status(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(XdsEndpointTest, AdditionalAddressesInvalidAddress) { |
|
|
|
|
testing::ScopedExperimentalEnvVar env( |
|
|
|
|
"GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS"); |
|
|
|
|
ClusterLoadAssignment cla; |
|
|
|
|
cla.set_cluster_name("foo"); |
|
|
|
|
auto* locality = cla.add_endpoints(); |
|
|
|
|
locality->mutable_load_balancing_weight()->set_value(1); |
|
|
|
|
auto* locality_name = locality->mutable_locality(); |
|
|
|
|
locality_name->set_region("myregion"); |
|
|
|
|
locality_name->set_zone("myzone"); |
|
|
|
|
locality_name->set_sub_zone("mysubzone"); |
|
|
|
|
auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); |
|
|
|
|
auto* socket_address = ep->mutable_address()->mutable_socket_address(); |
|
|
|
|
socket_address->set_address("127.0.0.1"); |
|
|
|
|
socket_address->set_port_value(443); |
|
|
|
|
socket_address = ep->add_additional_addresses() |
|
|
|
|
->mutable_address() |
|
|
|
|
->mutable_socket_address(); |
|
|
|
|
socket_address->set_address("not_an_ip_address"); |
|
|
|
|
socket_address->set_port_value(444); |
|
|
|
|
std::string serialized_resource; |
|
|
|
|
ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); |
|
|
|
|
auto* resource_type = XdsEndpointResourceType::Get(); |
|
|
|
|
auto decode_result = |
|
|
|
|
resource_type->Decode(decode_context_, serialized_resource); |
|
|
|
|
ASSERT_TRUE(decode_result.name.has_value()); |
|
|
|
|
EXPECT_EQ(*decode_result.name, "foo"); |
|
|
|
|
EXPECT_EQ(decode_result.resource.status().code(), |
|
|
|
|
absl::StatusCode::kInvalidArgument); |
|
|
|
|
EXPECT_EQ(decode_result.resource.status().message(), |
|
|
|
|
"errors parsing EDS resource: [" |
|
|
|
|
"field:endpoints[0].lb_endpoints[0].endpoint" |
|
|
|
|
".additional_addresses[0].address.socket_address error:" |
|
|
|
|
"Failed to parse address:not_an_ip_address:444]") |
|
|
|
|
<< decode_result.resource.status(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(XdsEndpointTest, IgnoresMultipleAddressesPerEndpointWhenNotEnabled) { |
|
|
|
|
ClusterLoadAssignment cla; |
|
|
|
|
cla.set_cluster_name("foo"); |
|
|
|
|
auto* locality = cla.add_endpoints(); |
|
|
|
|
locality->mutable_load_balancing_weight()->set_value(1); |
|
|
|
|
auto* locality_name = locality->mutable_locality(); |
|
|
|
|
locality_name->set_region("myregion"); |
|
|
|
|
locality_name->set_zone("myzone"); |
|
|
|
|
locality_name->set_sub_zone("mysubzone"); |
|
|
|
|
auto* ep = locality->add_lb_endpoints()->mutable_endpoint(); |
|
|
|
|
auto* socket_address = ep->mutable_address()->mutable_socket_address(); |
|
|
|
|
socket_address->set_address("127.0.0.1"); |
|
|
|
|
socket_address->set_port_value(443); |
|
|
|
|
socket_address = ep->add_additional_addresses() |
|
|
|
|
->mutable_address() |
|
|
|
|
->mutable_socket_address(); |
|
|
|
|
socket_address->set_address("127.0.0.1"); |
|
|
|
|
socket_address->set_port_value(444); |
|
|
|
|
std::string serialized_resource; |
|
|
|
|
ASSERT_TRUE(cla.SerializeToString(&serialized_resource)); |
|
|
|
|
auto* resource_type = XdsEndpointResourceType::Get(); |
|
|
|
|
auto decode_result = |
|
|
|
|
resource_type->Decode(decode_context_, serialized_resource); |
|
|
|
|
ASSERT_TRUE(decode_result.resource.ok()) << decode_result.resource.status(); |
|
|
|
|
ASSERT_TRUE(decode_result.name.has_value()); |
|
|
|
|
EXPECT_EQ(*decode_result.name, "foo"); |
|
|
|
|
auto& resource = |
|
|
|
|
static_cast<const XdsEndpointResource&>(**decode_result.resource); |
|
|
|
|
ASSERT_EQ(resource.priorities.size(), 1); |
|
|
|
|
const auto& priority = resource.priorities[0]; |
|
|
|
|
ASSERT_EQ(priority.localities.size(), 1); |
|
|
|
|
const auto& p = *priority.localities.begin(); |
|
|
|
|
ASSERT_EQ(p.first, p.second.name.get()); |
|
|
|
|
EXPECT_EQ(p.first->region(), "myregion"); |
|
|
|
|
EXPECT_EQ(p.first->zone(), "myzone"); |
|
|
|
|
EXPECT_EQ(p.first->sub_zone(), "mysubzone"); |
|
|
|
|
EXPECT_EQ(p.second.lb_weight, 1); |
|
|
|
|
ASSERT_EQ(p.second.endpoints.size(), 1); |
|
|
|
|
const auto& endpoint = p.second.endpoints.front(); |
|
|
|
|
ASSERT_EQ(endpoint.addresses().size(), 1); |
|
|
|
|
auto addr = |
|
|
|
|
grpc_sockaddr_to_string(&endpoint.addresses()[0], /*normalize=*/false); |
|
|
|
|
ASSERT_TRUE(addr.ok()) << addr.status(); |
|
|
|
|
EXPECT_EQ(*addr, "127.0.0.1:443"); |
|
|
|
|
EXPECT_EQ(endpoint.args(), ChannelArgs() |
|
|
|
|
.Set(GRPC_ARG_ADDRESS_WEIGHT, 1) |
|
|
|
|
.Set(GRPC_ARG_XDS_HEALTH_STATUS, |
|
|
|
|
XdsHealthStatus::HealthStatus::kUnknown)); |
|
|
|
|
ASSERT_NE(resource.drop_config, nullptr); |
|
|
|
|
EXPECT_TRUE(resource.drop_config->drop_category_list().empty()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(XdsEndpointTest, MissingEndpoint) { |
|
|
|
|
ClusterLoadAssignment cla; |
|
|
|
|
cla.set_cluster_name("foo"); |
|
|
|
|