@@ -11,6 +11,7 @@ import (
1111 "io/ioutil"
1212 "net"
1313 "net/http"
14+ "slices"
1415 "strings"
1516 "testing"
1617 "time"
@@ -21,9 +22,11 @@ import (
2122 util "github.com/openshift/cluster-ingress-operator/pkg/util"
2223 operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
2324
25+ "github.com/google/go-cmp/cmp"
2426 admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
2527 appsv1 "k8s.io/api/apps/v1"
2628 corev1 "k8s.io/api/core/v1"
29+ rbacv1 "k8s.io/api/rbac/v1"
2730 apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2831 kerrors "k8s.io/apimachinery/pkg/api/errors"
2932 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -947,3 +950,48 @@ func (m *vapManager) enable() {
947950 m .t .Errorf ("failed to find vap %q: %v" , m .name , err )
948951 }
949952}
953+
954+ func eventuallyClusterRoleContainsAggregatedPolicies (t * testing.T , destClusterRoleName , srcClusterRoleName string ) error {
955+ t .Helper ()
956+
957+ return wait .PollImmediate (time .Second , timeout , func () (bool , error ) {
958+ var destClusterRole rbacv1.ClusterRole
959+ if err := kclient .Get (context .Background (), types.NamespacedName {Name : destClusterRoleName }, & destClusterRole ); err != nil {
960+ t .Logf ("Failed to get destination ClusterRole %s; retrying...: %v" , destClusterRoleName , err )
961+ return false , nil
962+ }
963+
964+ var srcClusterRole rbacv1.ClusterRole
965+ if err := kclient .Get (context .Background (), types.NamespacedName {Name : srcClusterRoleName }, & srcClusterRole ); err != nil {
966+ t .Logf ("Failed to get source ClusterRole %s: %v; retrying..." , srcClusterRoleName , err )
967+ return false , nil
968+ }
969+
970+ if len (destClusterRole .Rules ) == 0 {
971+ return false , fmt .Errorf ("ClusterRole %s unexpectedly had no PolicyRules set" , destClusterRoleName )
972+ }
973+
974+ if len (srcClusterRole .Rules ) == 0 {
975+ return false , fmt .Errorf ("ClusterRole %s unexpectedly had no PolicyRules set" , srcClusterRoleName )
976+ }
977+
978+ if containsPolicyRules (destClusterRole .Rules , srcClusterRole .Rules ) {
979+ t .Logf ("ClusterRole %s aggregated all rules from %s" , destClusterRoleName , srcClusterRoleName )
980+ return true , nil
981+ }
982+
983+ return false , nil
984+ })
985+ }
986+
987+ func containsPolicyRules (destRules , srcRules []rbacv1.PolicyRule ) bool {
988+ for _ , srcRule := range srcRules {
989+ if ! slices .ContainsFunc (destRules , func (destRule rbacv1.PolicyRule ) bool {
990+ return cmp .Equal (destRule , srcRule )
991+ }) {
992+ return false
993+ }
994+ }
995+
996+ return true
997+ }
0 commit comments