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 }