@@ -7,6 +7,7 @@ import { isIPv4, isIPv6 } from "net";
7
7
import { Any__Output } from "../generated/google/protobuf/Any" ;
8
8
import { EDS_TYPE_URL , decodeSingleResource } from "../resources" ;
9
9
import { Watcher , XdsClient } from "../xds-client" ;
10
+ import { EXPERIMENTAL_DUALSTACK_ENDPOINTS } from "../environment" ;
10
11
11
12
const TRACER_NAME = 'xds_client' ;
12
13
@@ -39,6 +40,24 @@ export class EndpointResourceType extends XdsResourceType {
39
40
return 'envoy.config.endpoint.v3.ClusterLoadAssignment' ;
40
41
}
41
42
43
+ private validateAddress ( socketAddress : SocketAddress__Output , seenAddresses : SocketAddress__Output [ ] ) : boolean {
44
+ if ( socketAddress . port_specifier !== 'port_value' ) {
45
+ trace ( 'EDS validation: socket_address.port_specifier !== "port_value"' ) ;
46
+ return false ;
47
+ }
48
+ if ( ! ( isIPv4 ( socketAddress . address ) || isIPv6 ( socketAddress . address ) ) ) {
49
+ trace ( 'EDS validation: address not a valid IPv4 or IPv6 address: ' + socketAddress . address ) ;
50
+ return false ;
51
+ }
52
+ for ( const address of seenAddresses ) {
53
+ if ( addressesEqual ( socketAddress , address ) ) {
54
+ trace ( 'EDS validation: duplicate address seen: ' + address ) ;
55
+ return false ;
56
+ }
57
+ }
58
+ return true ;
59
+ }
60
+
42
61
private validateResource ( message : ClusterLoadAssignment__Output ) : ClusterLoadAssignment__Output | null {
43
62
const seenLocalities : { locality : Locality__Output , priority : number } [ ] = [ ] ;
44
63
const seenAddresses : SocketAddress__Output [ ] = [ ] ;
@@ -61,21 +80,22 @@ export class EndpointResourceType extends XdsResourceType {
61
80
trace ( 'EDS validation: endpoint socket_address not set' ) ;
62
81
return null ;
63
82
}
64
- if ( socketAddress . port_specifier !== 'port_value' ) {
65
- trace ( 'EDS validation: socket_address.port_specifier !== "port_value"' ) ;
66
- return null ;
67
- }
68
- if ( ! ( isIPv4 ( socketAddress . address ) || isIPv6 ( socketAddress . address ) ) ) {
69
- trace ( 'EDS validation: address not a valid IPv4 or IPv6 address: ' + socketAddress . address ) ;
83
+ if ( ! this . validateAddress ( socketAddress , seenAddresses ) ) {
70
84
return null ;
71
85
}
72
- for ( const address of seenAddresses ) {
73
- if ( addressesEqual ( socketAddress , address ) ) {
74
- trace ( 'EDS validation: duplicate address seen: ' + address ) ;
75
- return null ;
86
+ seenAddresses . push ( socketAddress ) ;
87
+ if ( EXPERIMENTAL_DUALSTACK_ENDPOINTS && lb . endpoint ?. additional_addresses ) {
88
+ for ( const additionalAddress of lb . endpoint . additional_addresses ) {
89
+ if ( ! additionalAddress . address ?. socket_address ) {
90
+ trace ( 'EDS validation: endpoint additional_addresses socket_address not set' ) ;
91
+ return null ;
92
+ }
93
+ if ( ! this . validateAddress ( additionalAddress . address . socket_address , seenAddresses ) ) {
94
+ return null ;
95
+ }
96
+ seenAddresses . push ( additionalAddress . address . socket_address ) ;
76
97
}
77
98
}
78
- seenAddresses . push ( socketAddress ) ;
79
99
}
80
100
priorityTotalWeights . set ( endpoint . priority , ( priorityTotalWeights . get ( endpoint . priority ) ?? 0 ) + ( endpoint . load_balancing_weight ?. value ?? 0 ) ) ;
81
101
}
0 commit comments