Skip to content

Commit e3a2814

Browse files
author
OpenShift Bot
authored
Merge pull request #11321 from deads2k/allow-who-can
Merged by openshift-bot
2 parents a941850 + e4c061f commit e3a2814

File tree

4 files changed

+33
-18
lines changed

4 files changed

+33
-18
lines changed

pkg/project/admission/lifecycle/admission.go

+14-17
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ import (
1010

1111
"k8s.io/kubernetes/pkg/admission"
1212
"k8s.io/kubernetes/pkg/api/meta"
13+
"k8s.io/kubernetes/pkg/api/unversioned"
1314
"k8s.io/kubernetes/pkg/apimachinery/registered"
1415
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
15-
"k8s.io/kubernetes/pkg/util/sets"
1616

17-
"github.com/openshift/origin/pkg/api"
17+
authorizationapi "github.com/openshift/origin/pkg/authorization/api"
1818
oadmission "github.com/openshift/origin/pkg/cmd/server/admission"
1919
"github.com/openshift/origin/pkg/project/cache"
2020
projectutil "github.com/openshift/origin/pkg/project/util"
@@ -33,10 +33,17 @@ type lifecycle struct {
3333
cache *cache.ProjectCache
3434

3535
// creatableResources is a set of resources that can be created even if the namespace is terminating
36-
creatableResources sets.String
36+
creatableResources map[unversioned.GroupResource]bool
3737
}
3838

39-
var recommendedCreatableResources = sets.NewString("resourceaccessreviews", "localresourceaccessreviews")
39+
var recommendedCreatableResources = map[unversioned.GroupResource]bool{
40+
authorizationapi.Resource("resourceaccessreviews"): true,
41+
authorizationapi.Resource("localresourceaccessreviews"): true,
42+
authorizationapi.Resource("subjectaccessreviews"): true,
43+
authorizationapi.Resource("localsubjectaccessreviews"): true,
44+
authorizationapi.Resource("selfsubjectrulesreviews"): true,
45+
authorizationapi.Resource("subjectrulesreviews"): true,
46+
}
4047
var _ = oadmission.WantsProjectCache(&lifecycle{})
4148
var _ = oadmission.Validator(&lifecycle{})
4249

@@ -46,9 +53,8 @@ func (e *lifecycle) Admit(a admission.Attributes) (err error) {
4653
if len(a.GetNamespace()) == 0 {
4754
return nil
4855
}
49-
// always allow a SAR request through, the SAR will return information about
50-
// the ability to take action on the object, no need to verify it here.
51-
if isSubjectAccessReview(a) {
56+
// always allow creatable resources through. These requests should always be allowed.
57+
if e.creatableResources[a.GetResource().GroupResource()] {
5258
return nil
5359
}
5460

@@ -117,18 +123,9 @@ func (e *lifecycle) Validate() error {
117123
return nil
118124
}
119125

120-
func NewLifecycle(client clientset.Interface, creatableResources sets.String) (admission.Interface, error) {
126+
func NewLifecycle(client clientset.Interface, creatableResources map[unversioned.GroupResource]bool) (admission.Interface, error) {
121127
return &lifecycle{
122128
client: client,
123129
creatableResources: creatableResources,
124130
}, nil
125131
}
126-
127-
var (
128-
sar = api.Kind("SubjectAccessReview")
129-
lsar = api.Kind("LocalSubjectAccessReview")
130-
)
131-
132-
func isSubjectAccessReview(a admission.Attributes) bool {
133-
return a.GetKind().GroupKind() == sar || a.GetKind().GroupKind() == lsar
134-
}

pkg/project/admission/lifecycle/admission_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func TestSAR(t *testing.T) {
8888
cache := projectcache.NewFake(mockClient.Namespaces(), store, "")
8989

9090
mockClientset := clientsetfake.NewSimpleClientset()
91-
handler := &lifecycle{client: mockClientset}
91+
handler := &lifecycle{client: mockClientset, creatableResources: recommendedCreatableResources}
9292
handler.SetProjectCache(cache)
9393

9494
tests := map[string]struct {

test/cmd/projects.sh

+17
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,21 @@ source "$(dirname "${BASH_SOURCE}")/../../hack/lib/init.sh"
33
trap os::test::junit::reconcile_output EXIT
44

55
os::test::junit::declare_suite_start "cmd/projects"
6+
7+
os::test::junit::declare_suite_start "cmd/projects/lifecycle"
8+
# resourceaccessreview
9+
os::cmd::expect_success 'oc policy who-can get pods -n missing-ns'
10+
# selfsubjectaccessreview
11+
os::cmd::expect_success 'oc policy can-i get pods -n missing-ns'
12+
# selfsubjectrulesreivew
13+
os::cmd::expect_success 'oc policy can-i --list -n missing-ns'
14+
# subjectaccessreview
15+
os::cmd::expect_success 'oc policy can-i get pods --user=bob -n missing-ns'
16+
# subjectrulesreview
17+
os::cmd::expect_success 'oc policy can-i --list --user=bob -n missing-ns'
18+
echo 'project lifecycle ok'
19+
os::test::junit::declare_suite_end
20+
621
os::cmd::expect_failure_and_text 'oc projects test_arg' 'no arguments'
722
# log in as a test user and expect no projects
823
os::cmd::expect_success 'oc login -u test -p test'
@@ -21,4 +36,6 @@ os::cmd::try_until_text 'oc projects' 'test6'
2136
os::cmd::expect_success_and_text 'oc project test6' 'Now using project "test6"'
2237
os::cmd::expect_success_and_text 'oc config view -o jsonpath="{.contexts[*].context.namespace}"' '\btest6\b'
2338
echo 'projects command ok'
39+
40+
2441
os::test::junit::declare_suite_end

vendor/k8s.io/kubernetes/plugin/pkg/admission/namespace/lifecycle/admission.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)