123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- package clusterroleaggregation
- import (
- "testing"
- rbacv1 "k8s.io/api/rbac/v1"
- "k8s.io/apimachinery/pkg/api/equality"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/apimachinery/pkg/runtime"
- "k8s.io/apimachinery/pkg/util/diff"
- fakeclient "k8s.io/client-go/kubernetes/fake"
- rbaclisters "k8s.io/client-go/listers/rbac/v1"
- clienttesting "k8s.io/client-go/testing"
- "k8s.io/client-go/tools/cache"
- "k8s.io/kubernetes/pkg/controller"
- )
- func TestSyncClusterRole(t *testing.T) {
- hammerRules := func() []rbacv1.PolicyRule {
- return []rbacv1.PolicyRule{
- {Verbs: []string{"hammer"}, Resources: []string{"nails"}},
- {Verbs: []string{"hammer"}, Resources: []string{"wedges"}},
- }
- }
- chiselRules := func() []rbacv1.PolicyRule {
- return []rbacv1.PolicyRule{
- {Verbs: []string{"chisel"}, Resources: []string{"mortises"}},
- }
- }
- sawRules := func() []rbacv1.PolicyRule {
- return []rbacv1.PolicyRule{
- {Verbs: []string{"saw"}, Resources: []string{"boards"}},
- }
- }
- role := func(name string, labels map[string]string, rules []rbacv1.PolicyRule) *rbacv1.ClusterRole {
- return &rbacv1.ClusterRole{
- ObjectMeta: metav1.ObjectMeta{Name: name, Labels: labels},
- Rules: rules,
- }
- }
- combinedRole := func(selectors []map[string]string, rules ...[]rbacv1.PolicyRule) *rbacv1.ClusterRole {
- ret := &rbacv1.ClusterRole{
- ObjectMeta: metav1.ObjectMeta{Name: "combined"},
- AggregationRule: &rbacv1.AggregationRule{},
- }
- for _, selector := range selectors {
- ret.AggregationRule.ClusterRoleSelectors = append(ret.AggregationRule.ClusterRoleSelectors,
- metav1.LabelSelector{MatchLabels: selector})
- }
- for _, currRules := range rules {
- ret.Rules = append(ret.Rules, currRules...)
- }
- return ret
- }
- tests := []struct {
- name string
- startingClusterRoles []*rbacv1.ClusterRole
- clusterRoleToSync string
- expectedClusterRole *rbacv1.ClusterRole
- }{
- {
- name: "remove dead rules",
- startingClusterRoles: []*rbacv1.ClusterRole{
- role("hammer", map[string]string{"foo": "bar"}, hammerRules()),
- combinedRole([]map[string]string{{"foo": "bar"}}, sawRules()),
- },
- clusterRoleToSync: "combined",
- expectedClusterRole: combinedRole([]map[string]string{{"foo": "bar"}}, hammerRules()),
- },
- {
- name: "strip rules",
- startingClusterRoles: []*rbacv1.ClusterRole{
- role("hammer", map[string]string{"foo": "not-bar"}, hammerRules()),
- combinedRole([]map[string]string{{"foo": "bar"}}, hammerRules()),
- },
- clusterRoleToSync: "combined",
- expectedClusterRole: combinedRole([]map[string]string{{"foo": "bar"}}),
- },
- {
- name: "select properly and put in order",
- startingClusterRoles: []*rbacv1.ClusterRole{
- role("hammer", map[string]string{"foo": "bar"}, hammerRules()),
- role("chisel", map[string]string{"foo": "bar"}, chiselRules()),
- role("saw", map[string]string{"foo": "not-bar"}, sawRules()),
- combinedRole([]map[string]string{{"foo": "bar"}}),
- },
- clusterRoleToSync: "combined",
- expectedClusterRole: combinedRole([]map[string]string{{"foo": "bar"}}, chiselRules(), hammerRules()),
- },
- {
- name: "select properly with multiple selectors",
- startingClusterRoles: []*rbacv1.ClusterRole{
- role("hammer", map[string]string{"foo": "bar"}, hammerRules()),
- role("chisel", map[string]string{"foo": "bar"}, chiselRules()),
- role("saw", map[string]string{"foo": "not-bar"}, sawRules()),
- combinedRole([]map[string]string{{"foo": "bar"}, {"foo": "not-bar"}}),
- },
- clusterRoleToSync: "combined",
- expectedClusterRole: combinedRole([]map[string]string{{"foo": "bar"}, {"foo": "not-bar"}}, chiselRules(), hammerRules(), sawRules()),
- },
- {
- name: "select properly remove duplicates",
- startingClusterRoles: []*rbacv1.ClusterRole{
- role("hammer", map[string]string{"foo": "bar"}, hammerRules()),
- role("chisel", map[string]string{"foo": "bar"}, chiselRules()),
- role("saw", map[string]string{"foo": "bar"}, sawRules()),
- role("other-saw", map[string]string{"foo": "not-bar"}, sawRules()),
- combinedRole([]map[string]string{{"foo": "bar"}, {"foo": "not-bar"}}),
- },
- clusterRoleToSync: "combined",
- expectedClusterRole: combinedRole([]map[string]string{{"foo": "bar"}, {"foo": "not-bar"}}, chiselRules(), hammerRules(), sawRules()),
- },
- {
- name: "no diff skip",
- startingClusterRoles: []*rbacv1.ClusterRole{
- role("hammer", map[string]string{"foo": "bar"}, hammerRules()),
- combinedRole([]map[string]string{{"foo": "bar"}}, hammerRules()),
- },
- clusterRoleToSync: "combined",
- expectedClusterRole: nil,
- }}
- for _, test := range tests {
- t.Run(test.name, func(t *testing.T) {
- indexer := cache.NewIndexer(controller.KeyFunc, cache.Indexers{})
- objs := []runtime.Object{}
- for _, obj := range test.startingClusterRoles {
- objs = append(objs, obj)
- indexer.Add(obj)
- }
- fakeClient := fakeclient.NewSimpleClientset(objs...)
- c := ClusterRoleAggregationController{
- clusterRoleClient: fakeClient.RbacV1(),
- clusterRoleLister: rbaclisters.NewClusterRoleLister(indexer),
- }
- err := c.syncClusterRole(test.clusterRoleToSync)
- if err != nil {
- t.Fatal(err)
- }
- if test.expectedClusterRole == nil {
- if len(fakeClient.Actions()) != 0 {
- t.Fatalf("unexpected actions %#v", fakeClient.Actions())
- }
- return
- }
- if len(fakeClient.Actions()) != 1 {
- t.Fatalf("unexpected actions %#v", fakeClient.Actions())
- }
- action := fakeClient.Actions()[0]
- if !action.Matches("update", "clusterroles") {
- t.Fatalf("unexpected action %#v", action)
- }
- updateAction, ok := action.(clienttesting.UpdateAction)
- if !ok {
- t.Fatalf("unexpected action %#v", action)
- }
- if !equality.Semantic.DeepEqual(updateAction.GetObject().(*rbacv1.ClusterRole), test.expectedClusterRole) {
- t.Fatalf("%v", diff.ObjectDiff(test.expectedClusterRole, updateAction.GetObject().(*rbacv1.ClusterRole)))
- }
- })
- }
- }
|