in pkg/policyendpoints/manager.go [267:345]
func (m *policyEndpointsManager) processExistingPolicyEndpoints(
policy *networking.NetworkPolicy,
existingPolicyEndpoints []policyinfo.PolicyEndpoint, ingressEndpoints []policyinfo.EndpointInfo,
egressEndpoints []policyinfo.EndpointInfo, podSelectorEndpoints []policyinfo.PodEndpoint,
) (
map[string]policyinfo.EndpointInfo,
map[string]policyinfo.EndpointInfo,
sets.Set[policyinfo.PodEndpoint],
[]policyinfo.PolicyEndpoint,
[]policyinfo.PolicyEndpoint,
) {
// Loop through ingressEndpoints, egressEndpoints and podSelectorEndpoints and put in map
ingressEndpointsMap := map[string]policyinfo.EndpointInfo{}
for _, ingressEndpoint := range ingressEndpoints {
ingressEndpointsMap[m.getEndpointInfoKey(ingressEndpoint)] = ingressEndpoint
}
egressEndpointsMap := map[string]policyinfo.EndpointInfo{}
for _, egressEndpoint := range egressEndpoints {
egressEndpointsMap[m.getEndpointInfoKey(egressEndpoint)] = egressEndpoint
}
podSelectorEndpointSet := sets.New[policyinfo.PodEndpoint](podSelectorEndpoints...)
// Go over the existing endpoints, and remove entries that are no longer needed
var modifiedEndpoints []policyinfo.PolicyEndpoint
var potentialDeletes []policyinfo.PolicyEndpoint
// We loop through existing PolicyEndpoint resources for the current Network Policy and purge any stale endpoints across Ingress,
// Egress and PodSelector endpoints. Once a PolicyEndpoint resource is updated/processed we place it in modifiedEndpoints list
// and if a particular PolicyEndpoint resource is purged of all the endpoints, we mark it as a potential delete candidate.
// We then start bin-packing any new Ingress, Egress, PodSelector endpoints across the existing PolicyEndpoint resources placed
// in modified and potential delete candidate lists. We only create new PolicyEndpoint resources if we exhaust all the existing resources.
// Any PolicyEndpoint resources placed in potentialDelete bucket that aren't utilized at the end of the binpacking flow will be permanently deleted.
for i := range existingPolicyEndpoints {
ingEndpointList := make([]policyinfo.EndpointInfo, 0, len(existingPolicyEndpoints[i].Spec.Ingress))
for _, ingRule := range existingPolicyEndpoints[i].Spec.Ingress {
ruleKey := m.getEndpointInfoKey(ingRule)
if _, exists := ingressEndpointsMap[ruleKey]; exists {
ingEndpointList = append(ingEndpointList, ingRule)
delete(ingressEndpointsMap, ruleKey)
}
}
egEndpointList := make([]policyinfo.EndpointInfo, 0, len(existingPolicyEndpoints[i].Spec.Egress))
for _, egRule := range existingPolicyEndpoints[i].Spec.Egress {
ruleKey := m.getEndpointInfoKey(egRule)
if _, exists := egressEndpointsMap[ruleKey]; exists {
egEndpointList = append(egEndpointList, egRule)
delete(egressEndpointsMap, ruleKey)
}
}
podSelectorEndpointList := make([]policyinfo.PodEndpoint, 0, len(existingPolicyEndpoints[i].Spec.PodSelectorEndpoints))
for _, ps := range existingPolicyEndpoints[i].Spec.PodSelectorEndpoints {
if podSelectorEndpointSet.Has(ps) {
podSelectorEndpointList = append(podSelectorEndpointList, ps)
podSelectorEndpointSet.Delete(ps)
}
}
policyEndpointChanged := false
if !equality.Semantic.DeepEqual(policy.Spec.PolicyTypes, existingPolicyEndpoints[i].Spec.PodIsolation) {
existingPolicyEndpoints[i].Spec.PodIsolation = policy.Spec.PolicyTypes
policyEndpointChanged = true
}
if len(ingEndpointList) == 0 && len(egEndpointList) == 0 && len(podSelectorEndpointList) == 0 {
existingPolicyEndpoints[i].Spec.Ingress = ingEndpointList
existingPolicyEndpoints[i].Spec.Egress = egEndpointList
existingPolicyEndpoints[i].Spec.PodSelectorEndpoints = podSelectorEndpointList
potentialDeletes = append(potentialDeletes, existingPolicyEndpoints[i])
} else if len(existingPolicyEndpoints[i].Spec.Ingress) != len(ingEndpointList) || len(existingPolicyEndpoints[i].Spec.Egress) != len(egEndpointList) ||
len(existingPolicyEndpoints[i].Spec.PodSelectorEndpoints) != len(podSelectorEndpointList) || policyEndpointChanged {
existingPolicyEndpoints[i].Spec.Ingress = ingEndpointList
existingPolicyEndpoints[i].Spec.Egress = egEndpointList
existingPolicyEndpoints[i].Spec.PodSelectorEndpoints = podSelectorEndpointList
modifiedEndpoints = append(modifiedEndpoints, existingPolicyEndpoints[i])
} else {
modifiedEndpoints = append(modifiedEndpoints, existingPolicyEndpoints[i])
}
}
return ingressEndpointsMap, egressEndpointsMap, podSelectorEndpointSet, modifiedEndpoints, potentialDeletes
}