in pkg/controllers/endpointslice_plan.go [40:73]
func (p *EndpointSlicePlan) CalculateChanges() EndpointSliceChanges {
// populate map of desired endpoints for lookup efficiency
desiredEndpoints := make(map[string]*model.Endpoint)
for _, desiredEndpoint := range p.Desired {
desiredEndpoints[desiredEndpoint.IP] = desiredEndpoint
}
desiredPorts := ExtractEndpointPorts(p.Desired)
// Remove unwanted endpoints from slices
changes := p.trimSlices(desiredEndpoints, desiredPorts)
// Add new endpoints to slices
for len(desiredEndpoints) > 0 {
sliceWithRoom, needsPortUpdate := p.getOrCreateUnfilledEndpointSlice(&changes, len(desiredEndpoints))
for key, endpointToAdd := range desiredEndpoints {
roomInSlice := p.getMaxEndpointsPerSlice() - len(sliceWithRoom.Endpoints)
if roomInSlice <= 0 {
// stop adding to slice once it is full
break
}
sliceWithRoom.Endpoints = append(sliceWithRoom.Endpoints, CreateEndpointForSlice(p.Service, endpointToAdd.IP))
delete(desiredEndpoints, key)
}
if needsPortUpdate {
newPorts := portSliceToEndpointPortSlice(desiredPorts)
sliceWithRoom.Ports = newPorts
}
}
return changes
}