Skip to content

Commit 98c15cb

Browse files
Merge pull request #14896 from enj/enj/i/live_policy/1463630
Use live lookups to resolve uncached role refs
2 parents 1a96817 + 8561a28 commit 98c15cb

File tree

20 files changed

+313
-535
lines changed

20 files changed

+313
-535
lines changed

pkg/authorization/registry/clusterpolicy/registry.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -121,23 +121,23 @@ func (s *simulatedStorage) DeletePolicy(ctx apirequest.Context, name string) err
121121
}
122122

123123
type ReadOnlyClusterPolicy struct {
124-
Registry
124+
Registry Registry
125125
}
126126

127127
func (s ReadOnlyClusterPolicy) List(options metav1.ListOptions) (*authorizationapi.ClusterPolicyList, error) {
128128
optint := metainternal.ListOptions{}
129129
if err := metainternal.Convert_v1_ListOptions_To_internalversion_ListOptions(&options, &optint, nil); err != nil {
130130
return nil, err
131131
}
132-
return s.ListClusterPolicies(apirequest.WithNamespace(apirequest.NewContext(), ""), &optint)
132+
return s.Registry.ListClusterPolicies(apirequest.WithNamespace(apirequest.NewContext(), ""), &optint)
133133
}
134134

135135
func (s ReadOnlyClusterPolicy) Get(name string, options *metav1.GetOptions) (*authorizationapi.ClusterPolicy, error) {
136-
return s.GetClusterPolicy(apirequest.WithNamespace(apirequest.NewContext(), ""), name, options)
136+
return s.Registry.GetClusterPolicy(apirequest.WithNamespace(apirequest.NewContext(), ""), name, options)
137137
}
138138

139139
type ReadOnlyClusterPolicyClientShim struct {
140-
ReadOnlyClusterPolicy
140+
ReadOnlyClusterPolicy ReadOnlyClusterPolicy
141141
}
142142

143143
func (r *ReadOnlyClusterPolicyClientShim) List(label labels.Selector) ([]*authorizationapi.ClusterPolicy, error) {

pkg/authorization/registry/clusterpolicybinding/registry.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -121,23 +121,23 @@ func (s *simulatedStorage) DeletePolicyBinding(ctx apirequest.Context, name stri
121121
}
122122

123123
type ReadOnlyClusterPolicyBinding struct {
124-
Registry
124+
Registry Registry
125125
}
126126

127127
func (s ReadOnlyClusterPolicyBinding) List(options metav1.ListOptions) (*authorizationapi.ClusterPolicyBindingList, error) {
128128
optint := metainternal.ListOptions{}
129129
if err := metainternal.Convert_v1_ListOptions_To_internalversion_ListOptions(&options, &optint, nil); err != nil {
130130
return nil, err
131131
}
132-
return s.ListClusterPolicyBindings(apirequest.WithNamespace(apirequest.NewContext(), ""), &optint)
132+
return s.Registry.ListClusterPolicyBindings(apirequest.WithNamespace(apirequest.NewContext(), ""), &optint)
133133
}
134134

135135
func (s ReadOnlyClusterPolicyBinding) Get(name string, options *metav1.GetOptions) (*authorizationapi.ClusterPolicyBinding, error) {
136-
return s.GetClusterPolicyBinding(apirequest.WithNamespace(apirequest.NewContext(), ""), name, options)
136+
return s.Registry.GetClusterPolicyBinding(apirequest.WithNamespace(apirequest.NewContext(), ""), name, options)
137137
}
138138

139139
type ReadOnlyClusterPolicyBindingClientShim struct {
140-
ReadOnlyClusterPolicyBinding
140+
ReadOnlyClusterPolicyBinding ReadOnlyClusterPolicyBinding
141141
}
142142

143143
func (r *ReadOnlyClusterPolicyBindingClientShim) List(label labels.Selector) ([]*authorizationapi.ClusterPolicyBinding, error) {

pkg/authorization/registry/clusterrole/proxy/proxy.go

+6-18
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
authorizationapi "github.com/openshift/origin/pkg/authorization/apis/authorization"
1111
clusterpolicyregistry "github.com/openshift/origin/pkg/authorization/registry/clusterpolicy"
12-
clusterpolicybindingregistry "github.com/openshift/origin/pkg/authorization/registry/clusterpolicybinding"
12+
"github.com/openshift/origin/pkg/authorization/registry/clusterrole"
1313
roleregistry "github.com/openshift/origin/pkg/authorization/registry/role"
1414
rolestorage "github.com/openshift/origin/pkg/authorization/registry/role/policybased"
1515
"github.com/openshift/origin/pkg/authorization/rulevalidation"
@@ -19,30 +19,18 @@ type ClusterRoleStorage struct {
1919
roleStorage rolestorage.VirtualStorage
2020
}
2121

22-
func NewClusterRoleStorage(clusterPolicyRegistry clusterpolicyregistry.Registry, clusterBindingRegistry clusterpolicybindingregistry.Registry, cachedRuleResolver rulevalidation.AuthorizationRuleResolver) *ClusterRoleStorage {
23-
simulatedPolicyRegistry := clusterpolicyregistry.NewSimulatedRegistry(clusterPolicyRegistry)
24-
25-
ruleResolver := rulevalidation.NewDefaultRuleResolver(
26-
nil,
27-
nil,
28-
&clusterpolicyregistry.ReadOnlyClusterPolicyClientShim{
29-
ReadOnlyClusterPolicy: clusterpolicyregistry.ReadOnlyClusterPolicy{Registry: clusterPolicyRegistry},
30-
},
31-
&clusterpolicybindingregistry.ReadOnlyClusterPolicyBindingClientShim{
32-
ReadOnlyClusterPolicyBinding: clusterpolicybindingregistry.ReadOnlyClusterPolicyBinding{Registry: clusterBindingRegistry},
33-
},
34-
)
35-
22+
func NewClusterRoleStorage(clusterPolicyRegistry clusterpolicyregistry.Registry, liveRuleResolver, cachedRuleResolver rulevalidation.AuthorizationRuleResolver) clusterrole.Storage {
3623
return &ClusterRoleStorage{
3724
roleStorage: rolestorage.VirtualStorage{
38-
PolicyStorage: simulatedPolicyRegistry,
25+
PolicyStorage: clusterpolicyregistry.NewSimulatedRegistry(clusterPolicyRegistry),
3926

40-
RuleResolver: ruleResolver,
27+
RuleResolver: liveRuleResolver,
4128
CachedRuleResolver: cachedRuleResolver,
4229

4330
CreateStrategy: roleregistry.ClusterStrategy,
4431
UpdateStrategy: roleregistry.ClusterStrategy,
45-
Resource: authorizationapi.Resource("clusterrole")},
32+
Resource: authorizationapi.Resource("clusterrole"),
33+
},
4634
}
4735
}
4836

Original file line numberDiff line numberDiff line change
@@ -1,29 +1,12 @@
11
package clusterrole
22

33
import (
4-
metainternal "k8s.io/apimachinery/pkg/apis/meta/internalversion"
5-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
64
apirequest "k8s.io/apiserver/pkg/endpoints/request"
75
"k8s.io/apiserver/pkg/registry/rest"
8-
kapi "k8s.io/kubernetes/pkg/api"
96

107
authorizationapi "github.com/openshift/origin/pkg/authorization/apis/authorization"
118
)
129

13-
// Registry is an interface for things that know how to store ClusterRoles.
14-
type Registry interface {
15-
// ListClusterRoles obtains list of policyClusterRoles that match a selector.
16-
ListClusterRoles(ctx apirequest.Context, options *metainternal.ListOptions) (*authorizationapi.ClusterRoleList, error)
17-
// GetClusterRole retrieves a specific policyClusterRole.
18-
GetClusterRole(ctx apirequest.Context, id string, options *metav1.GetOptions) (*authorizationapi.ClusterRole, error)
19-
// CreateClusterRole creates a new policyClusterRole.
20-
CreateClusterRole(ctx apirequest.Context, policyClusterRole *authorizationapi.ClusterRole) (*authorizationapi.ClusterRole, error)
21-
// UpdateClusterRole updates a policyClusterRole.
22-
UpdateClusterRole(ctx apirequest.Context, policyClusterRole *authorizationapi.ClusterRole) (*authorizationapi.ClusterRole, bool, error)
23-
// DeleteClusterRole deletes a policyClusterRole.
24-
DeleteClusterRole(ctx apirequest.Context, id string) error
25-
}
26-
2710
// Storage is an interface for a standard REST Storage backend
2811
type Storage interface {
2912
rest.Getter
@@ -32,57 +15,7 @@ type Storage interface {
3215
rest.GracefulDeleter
3316

3417
// CreateRoleWithEscalation creates a new policyRole. Skipping the escalation check should only be done during bootstrapping procedures where no users are currently bound.
35-
CreateRoleWithEscalation(ctx apirequest.Context, policyRole *authorizationapi.Role) (*authorizationapi.Role, error)
18+
CreateClusterRoleWithEscalation(ctx apirequest.Context, policyRole *authorizationapi.ClusterRole) (*authorizationapi.ClusterRole, error)
3619
// UpdateRoleWithEscalation updates a policyRole. Skipping the escalation check should only be done during bootstrapping procedures where no users are currently bound.
37-
UpdateRoleWithEscalation(ctx apirequest.Context, policyRole *authorizationapi.Role) (*authorizationapi.Role, bool, error)
38-
}
39-
40-
// storage puts strong typing around storage calls
41-
type storage struct {
42-
Storage
43-
}
44-
45-
// NewRegistry returns a new Registry interface for the given Storage. Any mismatched
46-
// types will panic.
47-
func NewRegistry(s Storage) Registry {
48-
return &storage{s}
49-
}
50-
51-
func (s *storage) ListClusterRoles(ctx apirequest.Context, options *metainternal.ListOptions) (*authorizationapi.ClusterRoleList, error) {
52-
obj, err := s.List(ctx, options)
53-
if err != nil {
54-
return nil, err
55-
}
56-
57-
return obj.(*authorizationapi.ClusterRoleList), nil
58-
}
59-
60-
func (s *storage) CreateClusterRole(ctx apirequest.Context, node *authorizationapi.ClusterRole) (*authorizationapi.ClusterRole, error) {
61-
obj, err := s.Create(ctx, node)
62-
if err != nil {
63-
return nil, err
64-
}
65-
66-
return obj.(*authorizationapi.ClusterRole), err
67-
}
68-
69-
func (s *storage) UpdateClusterRole(ctx apirequest.Context, node *authorizationapi.ClusterRole) (*authorizationapi.ClusterRole, bool, error) {
70-
obj, created, err := s.Update(ctx, node.Name, rest.DefaultUpdatedObjectInfo(node, kapi.Scheme))
71-
if err != nil {
72-
return nil, created, err
73-
}
74-
return obj.(*authorizationapi.ClusterRole), created, err
75-
}
76-
77-
func (s *storage) GetClusterRole(ctx apirequest.Context, name string, options *metav1.GetOptions) (*authorizationapi.ClusterRole, error) {
78-
obj, err := s.Get(ctx, name, options)
79-
if err != nil {
80-
return nil, err
81-
}
82-
return obj.(*authorizationapi.ClusterRole), nil
83-
}
84-
85-
func (s *storage) DeleteClusterRole(ctx apirequest.Context, name string) error {
86-
_, _, err := s.Delete(ctx, name, nil)
87-
return err
20+
UpdateClusterRoleWithEscalation(ctx apirequest.Context, policyRole *authorizationapi.ClusterRole) (*authorizationapi.ClusterRole, bool, error)
8821
}

pkg/authorization/registry/clusterrolebinding/proxy/proxy.go

+5-18
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import (
88
"k8s.io/apiserver/pkg/registry/rest"
99

1010
authorizationapi "github.com/openshift/origin/pkg/authorization/apis/authorization"
11-
clusterpolicyregistry "github.com/openshift/origin/pkg/authorization/registry/clusterpolicy"
1211
clusterpolicybindingregistry "github.com/openshift/origin/pkg/authorization/registry/clusterpolicybinding"
12+
"github.com/openshift/origin/pkg/authorization/registry/clusterrolebinding"
1313
rolebindingregistry "github.com/openshift/origin/pkg/authorization/registry/rolebinding"
1414
rolebindingstorage "github.com/openshift/origin/pkg/authorization/registry/rolebinding/policybased"
1515
"github.com/openshift/origin/pkg/authorization/rulevalidation"
@@ -19,25 +19,12 @@ type ClusterRoleBindingStorage struct {
1919
roleBindingStorage rolebindingstorage.VirtualStorage
2020
}
2121

22-
func NewClusterRoleBindingStorage(clusterPolicyRegistry clusterpolicyregistry.Registry, clusterPolicyBindingRegistry clusterpolicybindingregistry.Registry, cachedRuleResolver rulevalidation.AuthorizationRuleResolver) *ClusterRoleBindingStorage {
23-
simulatedPolicyBindingRegistry := clusterpolicybindingregistry.NewSimulatedRegistry(clusterPolicyBindingRegistry)
24-
25-
ruleResolver := rulevalidation.NewDefaultRuleResolver(
26-
nil,
27-
nil,
28-
&clusterpolicyregistry.ReadOnlyClusterPolicyClientShim{
29-
ReadOnlyClusterPolicy: clusterpolicyregistry.ReadOnlyClusterPolicy{Registry: clusterPolicyRegistry},
30-
},
31-
&clusterpolicybindingregistry.ReadOnlyClusterPolicyBindingClientShim{
32-
ReadOnlyClusterPolicyBinding: clusterpolicybindingregistry.ReadOnlyClusterPolicyBinding{Registry: clusterPolicyBindingRegistry},
33-
},
34-
)
35-
22+
func NewClusterRoleBindingStorage(clusterBindingRegistry clusterpolicybindingregistry.Registry, liveRuleResolver, cachedRuleResolver rulevalidation.AuthorizationRuleResolver) clusterrolebinding.Storage {
3623
return &ClusterRoleBindingStorage{
37-
rolebindingstorage.VirtualStorage{
38-
BindingRegistry: simulatedPolicyBindingRegistry,
24+
roleBindingStorage: rolebindingstorage.VirtualStorage{
25+
BindingRegistry: clusterpolicybindingregistry.NewSimulatedRegistry(clusterBindingRegistry),
3926

40-
RuleResolver: ruleResolver,
27+
RuleResolver: liveRuleResolver,
4128
CachedRuleResolver: cachedRuleResolver,
4229

4330
CreateStrategy: rolebindingregistry.ClusterStrategy,
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,12 @@
11
package clusterrolebinding
22

33
import (
4-
metainternal "k8s.io/apimachinery/pkg/apis/meta/internalversion"
5-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
64
apirequest "k8s.io/apiserver/pkg/endpoints/request"
75
"k8s.io/apiserver/pkg/registry/rest"
8-
kapi "k8s.io/kubernetes/pkg/api"
96

107
authorizationapi "github.com/openshift/origin/pkg/authorization/apis/authorization"
118
)
129

13-
// Registry is an interface for things that know how to store RoleBindings.
14-
type Registry interface {
15-
// ListRoleBindings obtains list of policyRoleBindings that match a selector.
16-
ListRoleBindings(ctx apirequest.Context, options *metainternal.ListOptions) (*authorizationapi.RoleBindingList, error)
17-
// GetRoleBinding retrieves a specific policyRoleBinding.
18-
GetRoleBinding(ctx apirequest.Context, id string, options *metav1.GetOptions) (*authorizationapi.RoleBinding, error)
19-
// CreateRoleBinding creates a new policyRoleBinding.
20-
CreateRoleBinding(ctx apirequest.Context, policyRoleBinding *authorizationapi.RoleBinding) (*authorizationapi.RoleBinding, error)
21-
// UpdateRoleBinding updates a policyRoleBinding.
22-
UpdateRoleBinding(ctx apirequest.Context, policyRoleBinding *authorizationapi.RoleBinding) (*authorizationapi.RoleBinding, bool, error)
23-
// DeleteRoleBinding deletes a policyRoleBinding.
24-
DeleteRoleBinding(ctx apirequest.Context, id string) error
25-
}
26-
2710
// Storage is an interface for a standard REST Storage backend
2811
type Storage interface {
2912
rest.Getter
@@ -32,56 +15,7 @@ type Storage interface {
3215
rest.GracefulDeleter
3316

3417
// CreateRoleBinding creates a new policyRoleBinding. Skipping the escalation check should only be done during bootstrapping procedures where no users are currently bound.
35-
CreateRoleBindingWithEscalation(ctx apirequest.Context, policyRoleBinding *authorizationapi.RoleBinding) (*authorizationapi.RoleBinding, error)
18+
CreateClusterRoleBindingWithEscalation(ctx apirequest.Context, policyRoleBinding *authorizationapi.ClusterRoleBinding) (*authorizationapi.ClusterRoleBinding, error)
3619
// UpdateRoleBinding updates a policyRoleBinding. Skipping the escalation check should only be done during bootstrapping procedures where no users are currently bound.
37-
UpdateRoleBindingWithEscalation(ctx apirequest.Context, policyRoleBinding *authorizationapi.RoleBinding) (*authorizationapi.RoleBinding, bool, error)
38-
}
39-
40-
// storage puts strong typing around storage calls
41-
type storage struct {
42-
Storage
43-
}
44-
45-
// NewRegistry returns a new Registry interface for the given Storage. Any mismatched
46-
// types will panic.
47-
func NewRegistry(s Storage) Registry {
48-
return &storage{s}
49-
}
50-
51-
func (s *storage) ListRoleBindings(ctx apirequest.Context, options *metainternal.ListOptions) (*authorizationapi.RoleBindingList, error) {
52-
obj, err := s.List(ctx, options)
53-
if err != nil {
54-
return nil, err
55-
}
56-
57-
return obj.(*authorizationapi.RoleBindingList), nil
58-
}
59-
60-
func (s *storage) CreateRoleBinding(ctx apirequest.Context, binding *authorizationapi.RoleBinding) (*authorizationapi.RoleBinding, error) {
61-
obj, err := s.Create(ctx, binding)
62-
if err != nil {
63-
return nil, err
64-
}
65-
return obj.(*authorizationapi.RoleBinding), err
66-
}
67-
68-
func (s *storage) UpdateRoleBinding(ctx apirequest.Context, binding *authorizationapi.RoleBinding) (*authorizationapi.RoleBinding, bool, error) {
69-
obj, created, err := s.Update(ctx, binding.Name, rest.DefaultUpdatedObjectInfo(binding, kapi.Scheme))
70-
if err != nil {
71-
return nil, created, err
72-
}
73-
return obj.(*authorizationapi.RoleBinding), created, err
74-
}
75-
76-
func (s *storage) GetRoleBinding(ctx apirequest.Context, name string, options *metav1.GetOptions) (*authorizationapi.RoleBinding, error) {
77-
obj, err := s.Get(ctx, name, options)
78-
if err != nil {
79-
return nil, err
80-
}
81-
return obj.(*authorizationapi.RoleBinding), nil
82-
}
83-
84-
func (s *storage) DeleteRoleBinding(ctx apirequest.Context, name string) error {
85-
_, _, err := s.Delete(ctx, name, nil)
86-
return err
20+
UpdateClusterRoleBindingWithEscalation(ctx apirequest.Context, policyRoleBinding *authorizationapi.ClusterRoleBinding) (*authorizationapi.ClusterRoleBinding, bool, error)
8721
}

pkg/authorization/registry/policy/registry.go

+35
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ package policy
33
import (
44
metainternal "k8s.io/apimachinery/pkg/apis/meta/internalversion"
55
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
6+
"k8s.io/apimachinery/pkg/labels"
67
"k8s.io/apimachinery/pkg/watch"
78
apirequest "k8s.io/apiserver/pkg/endpoints/request"
89
"k8s.io/apiserver/pkg/registry/rest"
910
kapi "k8s.io/kubernetes/pkg/api"
1011

1112
authorizationapi "github.com/openshift/origin/pkg/authorization/apis/authorization"
13+
authorizationlister "github.com/openshift/origin/pkg/authorization/generated/listers/authorization/internalversion"
1214
)
1315

1416
// Registry is an interface for things that know how to store Policies.
@@ -82,3 +84,36 @@ func (s *storage) DeletePolicy(ctx apirequest.Context, name string) error {
8284
_, _, err := s.Delete(ctx, name, nil)
8385
return err
8486
}
87+
88+
type ReadOnlyPolicyListerNamespacer struct {
89+
Registry Registry
90+
}
91+
92+
func (s ReadOnlyPolicyListerNamespacer) Policies(namespace string) authorizationlister.PolicyNamespaceLister {
93+
return readOnlyPolicyLister{registry: s.Registry, namespace: namespace}
94+
}
95+
96+
func (s ReadOnlyPolicyListerNamespacer) List(label labels.Selector) ([]*authorizationapi.Policy, error) {
97+
return s.Policies("").List(label)
98+
}
99+
100+
type readOnlyPolicyLister struct {
101+
registry Registry
102+
namespace string
103+
}
104+
105+
func (s readOnlyPolicyLister) List(label labels.Selector) ([]*authorizationapi.Policy, error) {
106+
list, err := s.registry.ListPolicies(apirequest.WithNamespace(apirequest.NewContext(), s.namespace), &metainternal.ListOptions{LabelSelector: label})
107+
if err != nil {
108+
return nil, err
109+
}
110+
var items []*authorizationapi.Policy
111+
for i := range list.Items {
112+
items = append(items, &list.Items[i])
113+
}
114+
return items, nil
115+
}
116+
117+
func (s readOnlyPolicyLister) Get(name string) (*authorizationapi.Policy, error) {
118+
return s.registry.GetPolicy(apirequest.WithNamespace(apirequest.NewContext(), s.namespace), name, &metav1.GetOptions{})
119+
}

0 commit comments

Comments
 (0)