Merge pull request #119928 from aojea/fixe2e

e2e WaitForServiceEndpointsNum take into account the address family
This commit is contained in:
Kubernetes Prow Robot 2023-08-16 00:24:27 -07:00 committed by GitHub
commit b57b2dcfcf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -436,6 +436,13 @@ func WaitForServiceEndpointsNum(ctx context.Context, c clientset.Interface, name
return false, nil return false, nil
} }
// Endpoints are single family but EndpointSlices can have dual stack addresses,
// so we verify the number of addresses that matches the same family on both.
addressType := discoveryv1.AddressTypeIPv4
if isIPv6Endpoint(endpoint) {
addressType = discoveryv1.AddressTypeIPv6
}
esList, err := c.DiscoveryV1().EndpointSlices(namespace).List(ctx, metav1.ListOptions{LabelSelector: fmt.Sprintf("%s=%s", discoveryv1.LabelServiceName, serviceName)}) esList, err := c.DiscoveryV1().EndpointSlices(namespace).List(ctx, metav1.ListOptions{LabelSelector: fmt.Sprintf("%s=%s", discoveryv1.LabelServiceName, serviceName)})
if err != nil { if err != nil {
Logf("Unexpected error trying to get EndpointSlices for %s : %v", serviceName, err) Logf("Unexpected error trying to get EndpointSlices for %s : %v", serviceName, err)
@ -447,8 +454,8 @@ func WaitForServiceEndpointsNum(ctx context.Context, c clientset.Interface, name
return false, nil return false, nil
} }
if countEndpointsSlicesNum(esList) != expectNum { if countEndpointsSlicesNum(esList, addressType) != expectNum {
Logf("Unexpected number of Endpoints on Slices, got %d, expected %d", countEndpointsSlicesNum(esList), expectNum) Logf("Unexpected number of Endpoints on Slices, got %d, expected %d", countEndpointsSlicesNum(esList, addressType), expectNum)
return false, nil return false, nil
} }
return true, nil return true, nil
@ -463,10 +470,28 @@ func countEndpointsNum(e *v1.Endpoints) int {
return num return num
} }
func countEndpointsSlicesNum(epList *discoveryv1.EndpointSliceList) int { // isIPv6Endpoint returns true if the Endpoint uses IPv6 addresses
func isIPv6Endpoint(e *v1.Endpoints) bool {
for _, sub := range e.Subsets {
for _, addr := range sub.Addresses {
if len(addr.IP) == 0 {
continue
}
// Endpoints are single family, so it is enough to check only one address
return netutils.IsIPv6String(sub.Addresses[0].IP)
}
}
// default to IPv4 an Endpoint without IP addresses
return false
}
func countEndpointsSlicesNum(epList *discoveryv1.EndpointSliceList, addressType discoveryv1.AddressType) int {
// EndpointSlices can contain the same address on multiple Slices // EndpointSlices can contain the same address on multiple Slices
addresses := sets.Set[string]{} addresses := sets.Set[string]{}
for _, epSlice := range epList.Items { for _, epSlice := range epList.Items {
if epSlice.AddressType != addressType {
continue
}
for _, ep := range epSlice.Endpoints { for _, ep := range epSlice.Endpoints {
if len(ep.Addresses) > 0 { if len(ep.Addresses) > 0 {
addresses.Insert(ep.Addresses[0]) addresses.Insert(ep.Addresses[0])