Skip to content

Commit 7ebbf1a

Browse files
committed
Proxy Cluster Role Bindings to Native Kube RBAC
Store ClusterRoleBindings as native RBAC Objects via Kubernetes. Provides backwards compatible API for the old Openshift rolebindings.
1 parent 46b0941 commit 7ebbf1a

File tree

2 files changed

+98
-64
lines changed

2 files changed

+98
-64
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,150 @@
11
package proxy
22

33
import (
4+
apierrors "k8s.io/apimachinery/pkg/api/errors"
45
metainternal "k8s.io/apimachinery/pkg/apis/meta/internalversion"
56
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
67
"k8s.io/apimachinery/pkg/runtime"
78
apirequest "k8s.io/apiserver/pkg/endpoints/request"
89
"k8s.io/apiserver/pkg/registry/rest"
10+
"k8s.io/kubernetes/pkg/api"
11+
"k8s.io/kubernetes/pkg/apis/rbac"
12+
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion"
913

10-
authorizationapi "github.com/openshift/origin/pkg/authorization/apis/authorization"
11-
clusterpolicybindingregistry "github.com/openshift/origin/pkg/authorization/registry/clusterpolicybinding"
12-
"github.com/openshift/origin/pkg/authorization/registry/clusterrolebinding"
13-
rolebindingregistry "github.com/openshift/origin/pkg/authorization/registry/rolebinding"
14-
rolebindingstorage "github.com/openshift/origin/pkg/authorization/registry/rolebinding/policybased"
15-
"github.com/openshift/origin/pkg/authorization/rulevalidation"
14+
authzapi "github.com/openshift/origin/pkg/authorization/apis/authorization"
1615
)
1716

18-
type ClusterRoleBindingStorage struct {
19-
roleBindingStorage rolebindingstorage.VirtualStorage
17+
func rbacToClusterRoleBinding(in *rbac.ClusterRoleBinding) (authzapi.ClusterRoleBinding, error) {
18+
var out authzapi.ClusterRoleBinding
19+
err := authzapi.Convert_rbac_ClusterRoleBinding_To_authorization_ClusterRoleBinding(in, &out, nil)
20+
return out, err
2021
}
2122

22-
func NewClusterRoleBindingStorage(clusterBindingRegistry clusterpolicybindingregistry.Registry, liveRuleResolver, cachedRuleResolver rulevalidation.AuthorizationRuleResolver) clusterrolebinding.Storage {
23-
return &ClusterRoleBindingStorage{
24-
roleBindingStorage: rolebindingstorage.VirtualStorage{
25-
BindingRegistry: clusterpolicybindingregistry.NewSimulatedRegistry(clusterBindingRegistry),
23+
func rbacFromClusterRoleBinding(in *authzapi.ClusterRoleBinding) (rbac.ClusterRoleBinding, error) {
24+
var out rbac.ClusterRoleBinding
25+
err := authzapi.Convert_authorization_ClusterRoleBinding_To_rbac_ClusterRoleBinding(in, &out, nil)
26+
return out, err
27+
}
2628

27-
RuleResolver: liveRuleResolver,
28-
CachedRuleResolver: cachedRuleResolver,
29+
type ClusterRoleBindingStorage struct {
30+
client internalversion.ClusterRoleBindingInterface
31+
}
2932

30-
CreateStrategy: rolebindingregistry.ClusterStrategy,
31-
UpdateStrategy: rolebindingregistry.ClusterStrategy,
32-
Resource: authorizationapi.Resource("clusterrolebinding"),
33-
},
34-
}
33+
func NewREST(client internalversion.ClusterRoleBindingInterface) *ClusterRoleBindingStorage {
34+
return &ClusterRoleBindingStorage{client}
3535
}
3636

3737
func (s *ClusterRoleBindingStorage) New() runtime.Object {
38-
return &authorizationapi.ClusterRoleBinding{}
38+
return &authzapi.ClusterRoleBinding{}
3939
}
4040
func (s *ClusterRoleBindingStorage) NewList() runtime.Object {
41-
return &authorizationapi.ClusterRoleBindingList{}
41+
return &authzapi.ClusterRoleBindingList{}
4242
}
4343

4444
func (s *ClusterRoleBindingStorage) List(ctx apirequest.Context, options *metainternal.ListOptions) (runtime.Object, error) {
45-
ret, err := s.roleBindingStorage.List(ctx, options)
46-
if ret == nil {
45+
optv1 := metav1.ListOptions{}
46+
if err := metainternal.Convert_internalversion_ListOptions_To_v1_ListOptions(options, &optv1, nil); err != nil {
4747
return nil, err
4848
}
49-
return authorizationapi.ToClusterRoleBindingList(ret.(*authorizationapi.RoleBindingList)), err
49+
roles, err := s.client.List(optv1)
50+
if roles == nil {
51+
return nil, err
52+
}
53+
ret := &authzapi.ClusterRoleBindingList{}
54+
for _, curr := range roles.Items {
55+
role, err := rbacToClusterRoleBinding(&curr)
56+
if err != nil {
57+
return nil, err
58+
}
59+
ret.Items = append(ret.Items, role)
60+
}
61+
return ret, err
5062
}
5163

5264
func (s *ClusterRoleBindingStorage) Get(ctx apirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
53-
ret, err := s.roleBindingStorage.Get(ctx, name, options)
54-
if ret == nil {
65+
ret, err := s.client.Get(name, *options)
66+
if err != nil {
5567
return nil, err
5668
}
57-
58-
return authorizationapi.ToClusterRoleBinding(ret.(*authorizationapi.RoleBinding)), err
69+
role, err := rbacToClusterRoleBinding(ret)
70+
if err != nil {
71+
return nil, err
72+
}
73+
return &role, err
5974
}
75+
6076
func (s *ClusterRoleBindingStorage) Delete(ctx apirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error) {
61-
ret, immediate, err := s.roleBindingStorage.Delete(ctx, name, options)
62-
if ret == nil {
63-
return nil, immediate, err
77+
if err := s.client.Delete(name, options); err != nil {
78+
return nil, false, err
6479
}
6580

66-
return ret.(*metav1.Status), false, err
81+
return &metav1.Status{Status: metav1.StatusSuccess}, true, nil
6782
}
6883

6984
func (s *ClusterRoleBindingStorage) Create(ctx apirequest.Context, obj runtime.Object) (runtime.Object, error) {
70-
clusterObj := obj.(*authorizationapi.ClusterRoleBinding)
71-
convertedObj := authorizationapi.ToRoleBinding(clusterObj)
85+
clusterObj := obj.(*authzapi.ClusterRoleBinding)
86+
convertedObj, err := rbacFromClusterRoleBinding(clusterObj)
7287

73-
ret, err := s.roleBindingStorage.Create(ctx, convertedObj)
74-
if ret == nil {
88+
ret, err := s.client.Create(&convertedObj)
89+
if err != nil {
7590
return nil, err
7691
}
77-
78-
return authorizationapi.ToClusterRoleBinding(ret.(*authorizationapi.RoleBinding)), err
79-
}
80-
81-
type convertingObjectInfo struct {
82-
rest.UpdatedObjectInfo
83-
}
84-
85-
func (i convertingObjectInfo) UpdatedObject(ctx apirequest.Context, old runtime.Object) (runtime.Object, error) {
86-
oldObj := old.(*authorizationapi.RoleBinding)
87-
convertedOldObj := authorizationapi.ToClusterRoleBinding(oldObj)
88-
obj, err := i.UpdatedObjectInfo.UpdatedObject(ctx, convertedOldObj)
92+
role, err := rbacToClusterRoleBinding(ret)
8993
if err != nil {
9094
return nil, err
9195
}
92-
clusterObj := obj.(*authorizationapi.ClusterRoleBinding)
93-
convertedObj := authorizationapi.ToRoleBinding(clusterObj)
94-
return convertedObj, nil
96+
return &role, err
9597
}
9698

9799
func (s *ClusterRoleBindingStorage) Update(ctx apirequest.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) {
98-
ret, created, err := s.roleBindingStorage.Update(ctx, name, convertingObjectInfo{objInfo})
99-
if ret == nil {
100-
return nil, created, err
100+
old, err := s.client.Get(name, metav1.GetOptions{})
101+
if err != nil {
102+
if apierrors.IsNotFound(err) {
103+
err = apierrors.NewNotFound(rbac.Resource("clusterrolebinding"), name)
104+
}
105+
return nil, false, err
106+
}
107+
108+
oldRoleBinding, err := rbacToClusterRoleBinding(old)
109+
if err != nil {
110+
return nil, false, err
111+
}
112+
113+
obj, err := objInfo.UpdatedObject(ctx, &oldRoleBinding)
114+
if err != nil {
115+
return nil, false, err
116+
}
117+
118+
updatedRoleBinding, err := rbacFromClusterRoleBinding(obj.(*authzapi.ClusterRoleBinding))
119+
if err != nil {
120+
return nil, false, err
101121
}
102122

103-
return authorizationapi.ToClusterRoleBinding(ret.(*authorizationapi.RoleBinding)), created, err
123+
ret, err := s.client.Update(&updatedRoleBinding)
124+
if err != nil {
125+
return nil, false, err
126+
}
127+
128+
role, err := rbacToClusterRoleBinding(ret)
129+
if err != nil {
130+
return nil, false, err
131+
}
132+
return &role, false, err
104133
}
105134

106-
func (m *ClusterRoleBindingStorage) CreateClusterRoleBindingWithEscalation(ctx apirequest.Context, obj *authorizationapi.ClusterRoleBinding) (*authorizationapi.ClusterRoleBinding, error) {
107-
in := authorizationapi.ToRoleBinding(obj)
108-
ret, err := m.roleBindingStorage.CreateRoleBindingWithEscalation(ctx, in)
109-
return authorizationapi.ToClusterRoleBinding(ret), err
135+
// FIXME: what's escalation exactly ?
136+
func (m *ClusterRoleBindingStorage) CreateClusterRoleBindingWithEscalation(ctx apirequest.Context, obj *authzapi.ClusterRoleBinding) (*authzapi.ClusterRoleBinding, error) {
137+
ret, err := m.Create(ctx, obj)
138+
if err != nil {
139+
return nil, err
140+
}
141+
return ret.(*authzapi.ClusterRoleBinding), err
110142
}
111143

112-
func (m *ClusterRoleBindingStorage) UpdateClusterRoleBindingWithEscalation(ctx apirequest.Context, obj *authorizationapi.ClusterRoleBinding) (*authorizationapi.ClusterRoleBinding, bool, error) {
113-
in := authorizationapi.ToRoleBinding(obj)
114-
ret, created, err := m.roleBindingStorage.UpdateRoleBindingWithEscalation(ctx, in)
115-
return authorizationapi.ToClusterRoleBinding(ret), created, err
144+
func (m *ClusterRoleBindingStorage) UpdateClusterRoleBindingWithEscalation(ctx apirequest.Context, obj *authzapi.ClusterRoleBinding) (*authzapi.ClusterRoleBinding, bool, error) {
145+
ret, ignored, err := m.Update(ctx, obj.Name, rest.DefaultUpdatedObjectInfo(obj, api.Scheme))
146+
if err != nil {
147+
return nil, false, err
148+
}
149+
return ret.(*authzapi.ClusterRoleBinding), ignored, err
116150
}

pkg/authorization/util/util.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func GetAuthorizationStorage(optsGetter restoptions.Getter, kubeClient internalc
114114
roleStorage := rolestorage.NewVirtualStorage(policyRegistry, liveRuleResolver, cachedRuleResolver)
115115
roleBindingStorage := rolebindingstorage.NewVirtualStorage(policyBindingRegistry, liveRuleResolver, cachedRuleResolver)
116116
clusterRoleStorage := clusterrolestorage.NewREST(kubeClient.Rbac().ClusterRoles())
117-
clusterRoleBindingStorage := clusterrolebindingstorage.NewClusterRoleBindingStorage(clusterPolicyBindingRegistry, liveRuleResolver, cachedRuleResolver)
117+
clusterRoleBindingStorage := clusterrolebindingstorage.NewREST(kubeClient.Rbac().ClusterRoleBindings())
118118

119119
return &AuthorizationStorage{
120120
Policy: policyStorage,

0 commit comments

Comments
 (0)