func matchPlacement()

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
}