package integration import ( "testing" //"time" kapi "k8s.io/kubernetes/pkg/api" kapierrors "k8s.io/kubernetes/pkg/api/errors" //"k8s.io/kubernetes/pkg/api/unversioned" //utilwait "k8s.io/kubernetes/pkg/util/wait" authorizationapi "github.com/openshift/origin/pkg/authorization/api" configapi "github.com/openshift/origin/pkg/cmd/server/api" testutil "github.com/openshift/origin/test/util" testserver "github.com/openshift/origin/test/util/server" ) func TestRestrictUsers(t *testing.T) { testutil.RequireEtcd(t) defer testutil.DumpEtcdOnFailure(t) masterConfig, err := testserver.DefaultMasterOptions() if err != nil { t.Fatalf("error creating config: %v", err) } masterConfig.AdmissionConfig.PluginConfig = map[string]configapi.AdmissionPluginConfig{ "openshift.io/RestrictSubjectBindings": { Configuration: &configapi.DefaultAdmissionConfig{}, }, } clusterAdminKubeConfig, err := testserver.StartConfiguredMaster(masterConfig) if err != nil { t.Fatalf("unexpected error: %v", err) } clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig) if err != nil { t.Fatalf("unexpected error: %v", err) } clusterAdminClientConfig, err := testutil.GetClusterAdminClientConfig(clusterAdminKubeConfig) if err != nil { t.Fatalf("unexpected error: %v", err) } if _, err := testserver.CreateNewProject(clusterAdminClient, *clusterAdminClientConfig, "namespace", "carol"); err != nil { t.Fatalf("unexpected error: %v", err) } role := &authorizationapi.Role{ ObjectMeta: kapi.ObjectMeta{ Namespace: "namespace", Name: "role", }, } if _, err := clusterAdminClient.Roles("namespace").Create(role); err != nil { t.Fatalf("unexpected error: %v", err) } policyBinding := &authorizationapi.PolicyBinding{ ObjectMeta: kapi.ObjectMeta{ Namespace: "namespace", Name: "policybinding", }, PolicyRef: kapi.ObjectReference{ Namespace: "namespace", Name: authorizationapi.GetPolicyBindingName("policy"), }, } if _, err := clusterAdminClient.PolicyBindings("namespace").Create(policyBinding); err != nil { t.Fatalf("unexpected error: %v", err) } rolebindingAlice := &authorizationapi.RoleBinding{ ObjectMeta: kapi.ObjectMeta{ Namespace: "namespace", Name: "rolebinding1", }, Subjects: []kapi.ObjectReference{ { Kind: authorizationapi.UserKind, Namespace: "namespace", Name: "alice", }, }, RoleRef: kapi.ObjectReference{Name: "role", Namespace: "namespace"}, } // Creating a rolebinding when no restrictions exist should succeed. if _, err := clusterAdminClient.RoleBindings("namespace").Create(rolebindingAlice); err != nil { t.Fatalf("unexpected error: %v", err) } allowAlice := &authorizationapi.RoleBindingRestriction{ ObjectMeta: kapi.ObjectMeta{ Name: "match-users-alice", Namespace: "namespace", }, Spec: authorizationapi.RoleBindingRestrictionSpec{ UserRestriction: &authorizationapi.UserRestriction{ Users: []string{"alice"}, }, }, } if _, err := clusterAdminClient.RoleBindingRestrictions("namespace").Create(allowAlice); err != nil { t.Fatalf("unexpected error: %v", err) } rolebindingAliceDup := &authorizationapi.RoleBinding{ ObjectMeta: kapi.ObjectMeta{ Namespace: "namespace", Name: "rolebinding2", }, Subjects: []kapi.ObjectReference{ { Kind: authorizationapi.UserKind, Namespace: "namespace", Name: "alice", }, }, RoleRef: kapi.ObjectReference{Name: "role", Namespace: "namespace"}, } // Creating a rolebinding when the subject is already bound should succeed. if _, err := clusterAdminClient.RoleBindings("namespace").Create(rolebindingAliceDup); err != nil { t.Fatalf("unexpected error: %v", err) } rolebindingBob := &authorizationapi.RoleBinding{ ObjectMeta: kapi.ObjectMeta{ Namespace: "namespace", Name: "rolebinding3", }, Subjects: []kapi.ObjectReference{ { Kind: authorizationapi.UserKind, Namespace: "namespace", Name: "bob", }, }, RoleRef: kapi.ObjectReference{Name: "role", Namespace: "namespace"}, } // Creating a rolebinding when the subject is not already bound and is not // permitted by any RoleBindingRestrictions should fail. if _, err := clusterAdminClient.RoleBindings("namespace").Create(rolebindingBob); !kapierrors.IsForbidden(err) { t.Fatalf("expected forbidden, got %v", err) } allowBob := &authorizationapi.RoleBindingRestriction{ ObjectMeta: kapi.ObjectMeta{ Name: "match-users-bob", Namespace: "namespace", }, Spec: authorizationapi.RoleBindingRestrictionSpec{ UserRestriction: &authorizationapi.UserRestriction{ Users: []string{"bob"}, }, }, } if _, err := clusterAdminClient.RoleBindingRestrictions("namespace").Create(allowBob); err != nil { t.Fatalf("unexpected error: %v", err) } // Creating a rolebinding when the subject is permitted by some // RoleBindingRestrictions should succeed. if _, err := clusterAdminClient.RoleBindings("namespace").Create(rolebindingBob); err != nil { t.Fatalf("unexpected error: %v", err) } }