open-cluster-management.io/governance-policy-propagator@v0.13.0/controllers/policyset/placementRuleMapper.go (about)

     1  // Copyright (c) 2022 Red Hat, Inc.
     2  // Copyright Contributors to the Open Cluster Management project
     3  
     4  package controllers
     5  
     6  import (
     7  	"context"
     8  
     9  	"k8s.io/apimachinery/pkg/types"
    10  	appsv1 "open-cluster-management.io/multicloud-operators-subscription/pkg/apis/apps/placementrule/v1"
    11  	"sigs.k8s.io/controller-runtime/pkg/client"
    12  	"sigs.k8s.io/controller-runtime/pkg/handler"
    13  	"sigs.k8s.io/controller-runtime/pkg/reconcile"
    14  
    15  	policiesv1 "open-cluster-management.io/governance-policy-propagator/api/v1"
    16  )
    17  
    18  func placementRuleMapper(c client.Client) handler.MapFunc {
    19  	return func(ctx context.Context, object client.Object) []reconcile.Request {
    20  		log := log.WithValues("placementRuleName", object.GetName(), "namespace", object.GetNamespace())
    21  
    22  		log.V(2).Info("Reconcile Request for PlacementRule")
    23  
    24  		// list pb
    25  		pbList := &policiesv1.PlacementBindingList{}
    26  
    27  		// find pb in the same namespace of placementrule
    28  		err := c.List(ctx, pbList, &client.ListOptions{Namespace: object.GetNamespace()})
    29  		if err != nil {
    30  			return nil
    31  		}
    32  
    33  		var result []reconcile.Request
    34  		// loop through pb to find if current placementrule is used for policy set
    35  		for _, pb := range pbList.Items {
    36  			// found matching placement rule in pb
    37  			if pb.PlacementRef.APIGroup == appsv1.SchemeGroupVersion.Group &&
    38  				pb.PlacementRef.Kind == "PlacementRule" && pb.PlacementRef.Name == object.GetName() {
    39  				// check if it is for policy set
    40  				subjects := pb.Subjects
    41  				for _, subject := range subjects {
    42  					if subject.APIGroup == policiesv1.SchemeGroupVersion.Group {
    43  						if subject.Kind == policiesv1.PolicySetKind {
    44  							log.V(2).Info("Found reconciliation request from policyset placement rule",
    45  								"policySetName", subject.Name)
    46  
    47  							request := reconcile.Request{NamespacedName: types.NamespacedName{
    48  								Name:      subject.Name,
    49  								Namespace: object.GetNamespace(),
    50  							}}
    51  							result = append(result, request)
    52  						}
    53  					}
    54  				}
    55  			}
    56  		}
    57  
    58  		return result
    59  	}
    60  }