func()

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
}