in pkg/controllers/clusterresourceplacement/cluster_selector.go [36:95]
func (r *Reconciler) selectClusters(placement *fleetv1alpha1.ClusterResourcePlacement) (clusterNames []string, err error) {
defer func() {
if err == nil {
// Set the status
placement.Status.TargetClusters = clusterNames
}
}()
// no policy set
if placement.Spec.Policy == nil {
clusterNames, err = r.listClusters(labels.Everything())
if err != nil {
return nil, err
}
klog.V(2).InfoS("we select all the available clusters in the fleet without a policy",
"placement", placement.Name, "clusters", clusterNames)
return clusterNames, nil
}
// a fix list of clusters set
if len(placement.Spec.Policy.ClusterNames) != 0 {
klog.V(2).InfoS("use the cluster names provided as the list of cluster we select",
"placement", placement.Name, "clusters", placement.Spec.Policy.ClusterNames)
clusterNames, err = r.getClusters(placement.Spec.Policy.ClusterNames)
if err != nil {
return nil, err
}
return clusterNames, nil
}
// no Affinity or ClusterAffinity set
if placement.Spec.Policy.Affinity == nil || placement.Spec.Policy.Affinity.ClusterAffinity == nil {
clusterNames, err = r.listClusters(labels.Everything())
if err != nil {
return nil, err
}
klog.V(2).InfoS("we select all the available clusters in the fleet without a cluster affinity",
"placement", placement.Name, "clusters", clusterNames)
return clusterNames, nil
}
selectedClusters := make(map[string]bool)
for _, clusterSelector := range placement.Spec.Policy.Affinity.ClusterAffinity.ClusterSelectorTerms {
selector, err := metav1.LabelSelectorAsSelector(&clusterSelector.LabelSelector)
if err != nil {
return nil, fmt.Errorf("cannot convert the label clusterSelector to a clusterSelector: %w", err)
}
matchClusters, err := r.listClusters(selector)
if err != nil {
return nil, fmt.Errorf("selector = %v: %w", clusterSelector.LabelSelector, err)
}
klog.V(2).InfoS("selector matches some cluster", "clusterNum", len(matchClusters), "placement", placement.Name, "selector", clusterSelector.LabelSelector)
for _, clusterName := range matchClusters {
selectedClusters[clusterName] = true
}
}
for cluster := range selectedClusters {
klog.V(2).InfoS("matched a cluster", "cluster", cluster, "placement", placement.Name)
clusterNames = append(clusterNames, cluster)
}
return clusterNames, nil
}