in pkg/controllers/memberclusterplacement/membercluster_controller.go [99:147]
func matchPlacement(placement *fleetv1alpha1.ClusterResourcePlacement, memberCluster *unstructured.Unstructured) bool {
placementObj := klog.KObj(placement)
// check if the placement already selected the member cluster
for _, selectedCluster := range placement.Status.TargetClusters {
if selectedCluster == memberCluster.GetName() {
return true
}
}
// no policy set
if placement.Spec.Policy == nil {
klog.V(2).InfoS("find a matching placement with no policy",
"memberCluster", memberCluster.GetName(), "placement", placementObj)
return true
}
// a fix list of clusters set, this takes precedence over the affinity
if len(placement.Spec.Policy.ClusterNames) != 0 {
for _, clusterName := range placement.Spec.Policy.ClusterNames {
if clusterName == memberCluster.GetName() {
klog.V(2).InfoS("find a matching placement with a list of cluster names",
"memberCluster", memberCluster.GetName(), "placement", placementObj)
return true
}
}
return false
}
// no cluster affinity set
if placement.Spec.Policy.Affinity == nil || placement.Spec.Policy.Affinity.ClusterAffinity == nil ||
len(placement.Spec.Policy.Affinity.ClusterAffinity.ClusterSelectorTerms) == 0 {
klog.V(2).InfoS("find a matching placement with no cluster affinity",
"memberCluster", memberCluster.GetName(), "placement", placementObj)
return true
}
// check if member cluster match any placement's cluster selectors
for _, clusterSelector := range placement.Spec.Policy.Affinity.ClusterAffinity.ClusterSelectorTerms {
s, err := metav1.LabelSelectorAsSelector(&clusterSelector.LabelSelector)
if err != nil {
// should not happen after we have webhooks
klog.ErrorS(err, "found a mal-formatted placement", "placement", placementObj, "selector", clusterSelector.LabelSelector)
continue
}
if s.Matches(labels.Set(memberCluster.GetLabels())) {
klog.V(2).InfoS("find a matching placement with label selector",
"memberCluster", memberCluster.GetName(), "placement", placementObj, "selector", clusterSelector.LabelSelector)
return true
}
}
return false
}