1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-06 16:06:56 +00:00
kyverno/pkg/userinfo/roleRef_test.go

254 lines
5.5 KiB
Go
Raw Normal View History

2019-11-11 14:52:09 -08:00
package userinfo
2019-11-11 09:56:53 -08:00
import (
"testing"
"gotest.tools/assert"
authenticationv1 "k8s.io/api/authentication/v1"
rbacv1 "k8s.io/api/rbac/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2019-11-11 09:56:53 -08:00
)
func Test_matchServiceAccount_subject_variants(t *testing.T) {
userInfo := authenticationv1.UserInfo{
Username: "system:serviceaccount:default:saconfig",
}
tests := []struct {
subject rbacv1.Subject
2019-11-11 09:56:53 -08:00
expected bool
}{
{
subject: rbacv1.Subject{},
2019-11-11 09:56:53 -08:00
expected: false,
},
{
subject: rbacv1.Subject{
Kind: "serviceaccount",
2019-11-11 09:56:53 -08:00
},
expected: false,
},
{
subject: rbacv1.Subject{
Kind: "ServiceAccount",
Namespace: "testnamespace",
2019-11-11 09:56:53 -08:00
},
expected: false,
},
{
subject: rbacv1.Subject{
Kind: "ServiceAccount",
Namespace: "1",
2019-11-11 09:56:53 -08:00
},
expected: false,
},
{
subject: rbacv1.Subject{
Kind: "ServiceAccount",
Namespace: "testnamespace",
Name: "",
2019-11-11 09:56:53 -08:00
},
expected: false,
},
{
subject: rbacv1.Subject{
Kind: "ServiceAccount",
Namespace: "testnamespace",
Name: "testname",
2019-11-11 09:56:53 -08:00
},
expected: false,
},
}
for _, test := range tests {
res := matchServiceAccount(test.subject, userInfo, test.subject.Namespace)
assert.Equal(t, test.expected, res)
2019-11-11 09:56:53 -08:00
}
}
func Test_matchUserOrGroup(t *testing.T) {
group := authenticationv1.UserInfo{
Username: "kubernetes-admin",
Groups: []string{"system:masters", "system:authenticated"},
}
sa := authenticationv1.UserInfo{
Username: "system:serviceaccount:kube-system:deployment-controller",
Groups: []string{"system:serviceaccounts", "system:serviceaccounts:kube-system", "system:authenticated"},
}
user := authenticationv1.UserInfo{
Username: "system:kube-scheduler",
Groups: []string{"system:authenticated"},
}
userContext := rbacv1.Subject{
Kind: "User",
Name: "system:kube-scheduler",
2019-11-11 09:56:53 -08:00
}
groupContext := rbacv1.Subject{
Kind: "Group",
Name: "system:masters",
2019-11-11 09:56:53 -08:00
}
fakegroupContext := rbacv1.Subject{
Kind: "Group",
Name: "fakeGroup",
2019-11-11 09:56:53 -08:00
}
res := matchUserOrGroup(userContext, user)
assert.Assert(t, res)
res = matchUserOrGroup(groupContext, group)
assert.Assert(t, res)
res = matchUserOrGroup(groupContext, sa)
assert.Assert(t, !res)
res = matchUserOrGroup(fakegroupContext, group)
assert.Assert(t, !res)
}
func Test_matchSubjectsMap(t *testing.T) {
sa := authenticationv1.UserInfo{
Username: "system:serviceaccount:default:saconfig",
}
group := authenticationv1.UserInfo{
Username: "kubernetes-admin",
Groups: []string{"system:masters", "system:authenticated"},
}
sasubject := rbacv1.Subject{
Kind: "ServiceAccount",
Namespace: "default",
Name: "saconfig",
2019-11-11 09:56:53 -08:00
}
groupsubject := rbacv1.Subject{
Kind: "Group",
Name: "fakeGroup",
2019-11-11 09:56:53 -08:00
}
res := matchSubjectsMap(sasubject, sa, sasubject.Namespace)
2019-11-11 09:56:53 -08:00
assert.Assert(t, res)
res = matchSubjectsMap(groupsubject, group, "")
2019-11-11 09:56:53 -08:00
assert.Assert(t, !res)
}
func newRoleBinding(name, ns string, subjects []rbacv1.Subject, roles rbacv1.RoleRef) *rbacv1.RoleBinding {
rb := &rbacv1.RoleBinding{
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: ns},
Subjects: subjects,
RoleRef: roles,
}
rb.Kind = "RoleBinding"
rb.APIVersion = "rbac.authorization.k8s.io/v1"
return rb
}
2019-11-11 09:56:53 -08:00
func Test_getRoleRefByRoleBindings(t *testing.T) {
2020-03-17 16:25:34 -07:00
// flag.Parse()
// flag.Set("logtostderr", "true")
// flag.Set("v", "3")
list := make([]*rbacv1.RoleBinding, 2)
list[0] = newRoleBinding("test1", "default",
[]rbacv1.Subject{
{
Kind: "ServiceAccount",
Name: "saconfig",
Namespace: "default",
},
}, rbacv1.RoleRef{
Kind: roleKind,
Name: "myrole",
},
)
list[1] = newRoleBinding("test2", "default",
[]rbacv1.Subject{
{
Kind: "ServiceAccount",
Name: "saconfig",
Namespace: "default",
},
}, rbacv1.RoleRef{
Kind: clusterroleKind,
Name: "myclusterrole",
2019-11-11 09:56:53 -08:00
},
)
2019-11-11 09:56:53 -08:00
sa := authenticationv1.UserInfo{
Username: "system:serviceaccount:default:saconfig",
}
expectedrole := []string{list[0].Namespace + ":" + "myrole"}
2019-11-11 09:56:53 -08:00
expectedClusterRole := []string{"myclusterrole"}
roles, clusterroles := getRoleRefByRoleBindings(list, sa)
assert.DeepEqual(t, roles, expectedrole)
assert.DeepEqual(t, clusterroles, expectedClusterRole)
2019-11-11 09:56:53 -08:00
}
func newClusterRoleBinding(name, ns string, subjects []rbacv1.Subject, roles rbacv1.RoleRef) *rbacv1.ClusterRoleBinding {
rb := &rbacv1.ClusterRoleBinding{
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: ns},
Subjects: subjects,
RoleRef: roles,
}
rb.Kind = "ClusterRoleBinding"
rb.APIVersion = "rbac.authorization.k8s.io/v1"
return rb
}
2019-11-11 09:56:53 -08:00
func Test_getRoleRefByClusterRoleBindings(t *testing.T) {
list := make([]*rbacv1.ClusterRoleBinding, 2)
list[0] = newClusterRoleBinding("test1", "mynamespace",
[]rbacv1.Subject{
{
Kind: "User",
Name: "kube-scheduler",
},
}, rbacv1.RoleRef{
Kind: clusterroleKind,
Name: "fakeclusterrole",
},
)
list[1] = newClusterRoleBinding("test2", "mynamespace",
[]rbacv1.Subject{
{
Kind: "Group",
Name: "system:masters",
},
}, rbacv1.RoleRef{
Kind: clusterroleKind,
Name: "myclusterrole",
2019-11-11 09:56:53 -08:00
},
)
2019-11-11 09:56:53 -08:00
group := authenticationv1.UserInfo{
Username: "kubernetes-admin",
Groups: []string{"system:masters", "system:authenticated"},
}
user := authenticationv1.UserInfo{
Username: "system:kube-scheduler",
Groups: []string{"system:authenticated"},
}
clusterroles := getRoleRefByClusterRoleBindings(list, group)
assert.DeepEqual(t, clusterroles, []string{"myclusterrole"})
2019-11-11 09:56:53 -08:00
clusterroles = getRoleRefByClusterRoleBindings(list, user)
assert.Equal(t, len(clusterroles), 0)
2019-11-11 09:56:53 -08:00
}