package bootstrappolicy
import (
"reflect"
"testing"
kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/serviceaccount"
)
func TestBootstrappedConstraints(t *testing.T) {
expectedConstraints := []string{
SecurityContextConstraintPrivileged,
SecurityContextConstraintRestricted,
SecurityContextConstraintNonRoot,
SecurityContextConstraintHostMountAndAnyUID,
SecurityContextConstraintHostNS,
SecurityContextConstraintsAnyUID,
SecurityContextConstraintsHostNetwork,
}
expectedGroups, expectedUsers := getExpectedAccess()
expectedVolumes := []kapi.FSType{kapi.FSTypeEmptyDir, kapi.FSTypeSecret, kapi.FSTypeDownwardAPI, kapi.FSTypeConfigMap, kapi.FSTypePersistentVolumeClaim}
groups, users := GetBoostrapSCCAccess(DefaultOpenShiftInfraNamespace)
bootstrappedConstraints := GetBootstrapSecurityContextConstraints(groups, users)
if len(expectedConstraints) != len(bootstrappedConstraints) {
t.Errorf("unexpected number of constraints: found %d, wanted %d", len(bootstrappedConstraints), len(expectedConstraints))
}
for _, constraint := range bootstrappedConstraints {
g := expectedGroups[constraint.Name]
if !reflect.DeepEqual(g, constraint.Groups) {
t.Errorf("unexpected group access for %s. Found %v, wanted %v", constraint.Name, constraint.Groups, g)
}
u := expectedUsers[constraint.Name]
if !reflect.DeepEqual(u, constraint.Users) {
t.Errorf("unexpected user access for %s. Found %v, wanted %v", constraint.Name, constraint.Users, u)
}
for _, expectedVolume := range expectedVolumes {
if !supportsFSType(expectedVolume, &constraint) {
t.Errorf("%s does not support %v which is required for all default SCCs", constraint.Name, expectedVolume)
}
}
}
}
func TestBootstrappedConstraintsWithAddedUser(t *testing.T) {
expectedGroups, expectedUsers := getExpectedAccess()
// get default access and add our own user to it
groups, users := GetBoostrapSCCAccess(DefaultOpenShiftInfraNamespace)
users[SecurityContextConstraintPrivileged] = append(users[SecurityContextConstraintPrivileged], "foo")
bootstrappedConstraints := GetBootstrapSecurityContextConstraints(groups, users)
// add it to expected
expectedUsers[SecurityContextConstraintPrivileged] = append(expectedUsers[SecurityContextConstraintPrivileged], "foo")
for _, constraint := range bootstrappedConstraints {
g := expectedGroups[constraint.Name]
if !reflect.DeepEqual(g, constraint.Groups) {
t.Errorf("unexpected group access for %s. Found %v, wanted %v", constraint.Name, constraint.Groups, g)
}
u := expectedUsers[constraint.Name]
if !reflect.DeepEqual(u, constraint.Users) {
t.Errorf("unexpected user access for %s. Found %v, wanted %v", constraint.Name, constraint.Users, u)
}
}
}
func getExpectedAccess() (map[string][]string, map[string][]string) {
groups := map[string][]string{
SecurityContextConstraintPrivileged: {ClusterAdminGroup, NodesGroup},
SecurityContextConstraintsAnyUID: {ClusterAdminGroup},
SecurityContextConstraintRestricted: {AuthenticatedGroup},
}
buildControllerUsername := serviceaccount.MakeUsername(DefaultOpenShiftInfraNamespace, InfraBuildControllerServiceAccountName)
pvRecyclerControllerUsername := serviceaccount.MakeUsername(DefaultOpenShiftInfraNamespace, InfraPersistentVolumeRecyclerControllerServiceAccountName)
users := map[string][]string{
SecurityContextConstraintPrivileged: {buildControllerUsername},
SecurityContextConstraintHostMountAndAnyUID: {pvRecyclerControllerUsername},
}
return groups, users
}
func supportsFSType(fsType kapi.FSType, scc *kapi.SecurityContextConstraints) bool {
for _, v := range scc.Volumes {
if v == kapi.FSTypeAll || v == fsType {
return true
}
}
return false
}