in pkg/utils/overrider/overrider.go [45:160]
func FetchAllMatchingOverridesForResourceSnapshot(
ctx context.Context,
c client.Client,
manager informer.Manager,
crp string,
masterResourceSnapshot *placementv1beta1.ClusterResourceSnapshot,
) ([]*placementv1alpha1.ClusterResourceOverrideSnapshot, []*placementv1alpha1.ResourceOverrideSnapshot, error) {
// fetch the cro and ro snapshot list first before finding the matched ones.
latestSnapshotLabelMatcher := client.MatchingLabels{
placementv1beta1.IsLatestSnapshotLabel: strconv.FormatBool(true),
}
croList := &placementv1alpha1.ClusterResourceOverrideSnapshotList{}
if err := c.List(ctx, croList, latestSnapshotLabelMatcher); err != nil {
klog.ErrorS(err, "Failed to list all the clusterResourceOverrideSnapshots")
return nil, nil, err
}
roList := &placementv1alpha1.ResourceOverrideSnapshotList{}
if err := c.List(ctx, roList, latestSnapshotLabelMatcher); err != nil {
klog.ErrorS(err, "Failed to list all the resourceOverrideSnapshots")
return nil, nil, err
}
if len(croList.Items) == 0 && len(roList.Items) == 0 {
return nil, nil, nil // no overrides and nothing to do
}
resourceSnapshots, err := controller.FetchAllClusterResourceSnapshots(ctx, c, crp, masterResourceSnapshot)
if err != nil {
return nil, nil, err
}
possibleCROs := make(map[placementv1beta1.ResourceIdentifier]bool)
possibleROs := make(map[placementv1beta1.ResourceIdentifier]bool)
// List all the possible CROs and ROs based on the selected resources.
for _, snapshot := range resourceSnapshots {
for _, res := range snapshot.Spec.SelectedResources {
var uResource unstructured.Unstructured
if err := uResource.UnmarshalJSON(res.Raw); err != nil {
klog.ErrorS(err, "Resource has invalid content", "snapshot", klog.KObj(snapshot), "selectedResource", res.Raw)
return nil, nil, controller.NewUnexpectedBehaviorError(err)
}
// If the resource is namespaced scope resource, the resource could be selected by the namespace or selected
// by the object itself.
if !manager.IsClusterScopedResources(uResource.GroupVersionKind()) {
croKey := placementv1beta1.ResourceIdentifier{
Group: utils.NamespaceMetaGVK.Group,
Version: utils.NamespaceMetaGVK.Version,
Kind: utils.NamespaceMetaGVK.Kind,
Name: uResource.GetNamespace(),
}
possibleCROs[croKey] = true // selected by the namespace
roKey := placementv1beta1.ResourceIdentifier{
Group: uResource.GetObjectKind().GroupVersionKind().Group,
Version: uResource.GetObjectKind().GroupVersionKind().Version,
Kind: uResource.GetObjectKind().GroupVersionKind().Kind,
Namespace: uResource.GetNamespace(),
Name: uResource.GetName(),
}
possibleROs[roKey] = true // selected by the object itself
} else {
croKey := placementv1beta1.ResourceIdentifier{
Group: uResource.GetObjectKind().GroupVersionKind().Group,
Version: uResource.GetObjectKind().GroupVersionKind().Version,
Kind: uResource.GetObjectKind().GroupVersionKind().Kind,
Name: uResource.GetName(),
}
possibleCROs[croKey] = true // selected by the object itself
}
}
}
filteredCRO := make([]*placementv1alpha1.ClusterResourceOverrideSnapshot, 0, len(croList.Items))
filteredRO := make([]*placementv1alpha1.ResourceOverrideSnapshot, 0, len(roList.Items))
for i := range croList.Items {
placementInOverride := croList.Items[i].Spec.OverrideSpec.Placement
if placementInOverride != nil && placementInOverride.Name != crp {
klog.V(2).InfoS("Skipping this override which was created for another placement", "clusterResourceOverride", klog.KObj(&croList.Items[i]), "placementInOverride", placementInOverride.Name, "clusterResourcePlacement", crp)
continue
}
for _, selector := range croList.Items[i].Spec.OverrideSpec.ClusterResourceSelectors {
croKey := placementv1beta1.ResourceIdentifier{
Group: selector.Group,
Version: selector.Version,
Kind: selector.Kind,
Name: selector.Name,
}
if possibleCROs[croKey] {
filteredCRO = append(filteredCRO, &croList.Items[i])
break
}
}
}
for i := range roList.Items {
placementInOverride := roList.Items[i].Spec.OverrideSpec.Placement
if placementInOverride != nil && placementInOverride.Name != crp {
klog.V(2).InfoS("Skipping this override which was created for another placement", "resourceOverride", klog.KObj(&roList.Items[i]), "placementInOverride", placementInOverride.Name, "clusterResourcePlacement", crp)
continue
}
for _, selector := range roList.Items[i].Spec.OverrideSpec.ResourceSelectors {
roKey := placementv1beta1.ResourceIdentifier{
Group: selector.Group,
Version: selector.Version,
Kind: selector.Kind,
Namespace: roList.Items[i].Namespace,
Name: selector.Name,
}
if possibleROs[roKey] {
filteredRO = append(filteredRO, &roList.Items[i])
break
}
}
}
return filteredCRO, filteredRO, nil
}