in pkg/controllers/cloudmap_controller.go [189:232]
func (r *CloudMapReconciler) updateEndpointSlices(ctx context.Context, svcImport *v1alpha1.ServiceImport, desiredEndpoints []*model.Endpoint, svc *v1.Service) error {
existingSlicesList := discovery.EndpointSliceList{}
if err := r.Client.List(ctx, &existingSlicesList,
client.InNamespace(svc.Namespace), client.MatchingLabels{discovery.LabelServiceName: svc.Name}); err != nil {
return err
}
existingSlices := make([]*discovery.EndpointSlice, 0)
for _, existingSlice := range existingSlicesList.Items {
existingSlices = append(existingSlices, &existingSlice)
}
plan := EndpointSlicePlan{
Current: existingSlices,
Desired: desiredEndpoints,
Service: svc,
ServiceImportName: svcImport.Name,
}
changes := plan.CalculateChanges()
for _, sliceToUpdate := range changes.Update {
r.Log.Debug("updating EndpointSlice", "namespace", sliceToUpdate.Namespace, "name", sliceToUpdate.Name)
if err := r.Client.Update(ctx, sliceToUpdate); err != nil {
return fmt.Errorf("failed to update EndpointSlice: %w", err)
}
}
for _, sliceToDelete := range changes.Delete {
r.Log.Debug("deleting EndpointSlice", "namespace", sliceToDelete.Namespace, "name", sliceToDelete.Name)
if err := r.Client.Delete(ctx, sliceToDelete); err != nil {
return fmt.Errorf("failed to delete EndpointSlice: %w", err)
}
}
for _, sliceToCreate := range changes.Create {
r.Log.Debug("creating EndpointSlice", "namespace", sliceToCreate.Namespace)
if err := r.Client.Create(ctx, sliceToCreate); err != nil {
return fmt.Errorf("failed to create EndpointSlice: %w", err)
}
}
return nil
}