forked from openshift/origin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
registry.go
163 lines (135 loc) · 6.41 KB
/
registry.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package clusterpolicybinding
import (
metainternal "k8s.io/apimachinery/pkg/apis/meta/internalversion"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/watch"
apirequest "k8s.io/apiserver/pkg/endpoints/request"
"k8s.io/apiserver/pkg/registry/rest"
kapi "k8s.io/kubernetes/pkg/api"
authorizationapi "github.com/openshift/origin/pkg/authorization/apis/authorization"
"github.com/openshift/origin/pkg/cmd/server/admin/legacyetcd/policybinding"
)
// Registry is an interface for things that know how to store ClusterPolicyBindings.
type Registry interface {
// ListClusterPolicyBindings obtains list of policyBindings that match a selector.
ListClusterPolicyBindings(ctx apirequest.Context, options *metainternal.ListOptions) (*authorizationapi.ClusterPolicyBindingList, error)
// GetClusterPolicyBinding retrieves a specific policyBinding.
GetClusterPolicyBinding(ctx apirequest.Context, name string, options *metav1.GetOptions) (*authorizationapi.ClusterPolicyBinding, error)
// CreateClusterPolicyBinding creates a new policyBinding.
CreateClusterPolicyBinding(ctx apirequest.Context, policyBinding *authorizationapi.ClusterPolicyBinding) error
// UpdateClusterPolicyBinding updates a policyBinding.
UpdateClusterPolicyBinding(ctx apirequest.Context, policyBinding *authorizationapi.ClusterPolicyBinding) error
// DeleteClusterPolicyBinding deletes a policyBinding.
DeleteClusterPolicyBinding(ctx apirequest.Context, name string) error
}
type WatchingRegistry interface {
Registry
// WatchClusterPolicyBindings watches policyBindings.
WatchClusterPolicyBindings(ctx apirequest.Context, options *metainternal.ListOptions) (watch.Interface, error)
}
type ReadOnlyClusterPolicyInterface interface {
List(options metainternal.ListOptions) (*authorizationapi.ClusterPolicyBindingList, error)
Get(name string) (*authorizationapi.ClusterPolicyBinding, error)
}
// Storage is an interface for a standard REST Storage backend
type Storage interface {
rest.StandardStorage
}
// storage puts strong typing around storage calls
type storage struct {
Storage
}
// NewRegistry returns a new Registry interface for the given Storage. Any mismatched
// types will panic.
func NewRegistry(s Storage) WatchingRegistry {
return &storage{s}
}
func (s *storage) ListClusterPolicyBindings(ctx apirequest.Context, options *metainternal.ListOptions) (*authorizationapi.ClusterPolicyBindingList, error) {
obj, err := s.List(ctx, options)
if err != nil {
return nil, err
}
return obj.(*authorizationapi.ClusterPolicyBindingList), nil
}
func (s *storage) CreateClusterPolicyBinding(ctx apirequest.Context, policyBinding *authorizationapi.ClusterPolicyBinding) error {
_, err := s.Create(ctx, policyBinding, false)
return err
}
func (s *storage) UpdateClusterPolicyBinding(ctx apirequest.Context, policyBinding *authorizationapi.ClusterPolicyBinding) error {
_, _, err := s.Update(ctx, policyBinding.Name, rest.DefaultUpdatedObjectInfo(policyBinding, kapi.Scheme))
return err
}
func (s *storage) WatchClusterPolicyBindings(ctx apirequest.Context, options *metainternal.ListOptions) (watch.Interface, error) {
return s.Watch(ctx, options)
}
func (s *storage) GetClusterPolicyBinding(ctx apirequest.Context, name string, options *metav1.GetOptions) (*authorizationapi.ClusterPolicyBinding, error) {
obj, err := s.Get(ctx, name, options)
if err != nil {
return nil, err
}
return obj.(*authorizationapi.ClusterPolicyBinding), nil
}
func (s *storage) DeleteClusterPolicyBinding(ctx apirequest.Context, name string) error {
_, _, err := s.Delete(ctx, name, nil)
return err
}
type simulatedStorage struct {
clusterRegistry Registry
}
func NewSimulatedRegistry(clusterRegistry Registry) policybinding.Registry {
return &simulatedStorage{clusterRegistry}
}
func (s *simulatedStorage) ListPolicyBindings(ctx apirequest.Context, options *metainternal.ListOptions) (*authorizationapi.PolicyBindingList, error) {
ret, err := s.clusterRegistry.ListClusterPolicyBindings(ctx, options)
if err != nil {
return nil, err
}
return authorizationapi.ToPolicyBindingList(ret), err
}
func (s *simulatedStorage) CreatePolicyBinding(ctx apirequest.Context, policyBinding *authorizationapi.PolicyBinding) error {
return s.clusterRegistry.CreateClusterPolicyBinding(ctx, authorizationapi.ToClusterPolicyBinding(policyBinding))
}
func (s *simulatedStorage) UpdatePolicyBinding(ctx apirequest.Context, policyBinding *authorizationapi.PolicyBinding) error {
return s.clusterRegistry.UpdateClusterPolicyBinding(ctx, authorizationapi.ToClusterPolicyBinding(policyBinding))
}
func (s *simulatedStorage) GetPolicyBinding(ctx apirequest.Context, name string, options *metav1.GetOptions) (*authorizationapi.PolicyBinding, error) {
ret, err := s.clusterRegistry.GetClusterPolicyBinding(ctx, name, options)
if err != nil {
return nil, err
}
return authorizationapi.ToPolicyBinding(ret), err
}
func (s *simulatedStorage) DeletePolicyBinding(ctx apirequest.Context, name string) error {
return s.clusterRegistry.DeleteClusterPolicyBinding(ctx, name)
}
type ReadOnlyClusterPolicyBinding struct {
Registry Registry
}
func (s ReadOnlyClusterPolicyBinding) List(options metav1.ListOptions) (*authorizationapi.ClusterPolicyBindingList, error) {
optint := metainternal.ListOptions{}
if err := metainternal.Convert_v1_ListOptions_To_internalversion_ListOptions(&options, &optint, nil); err != nil {
return nil, err
}
return s.Registry.ListClusterPolicyBindings(apirequest.WithNamespace(apirequest.NewContext(), ""), &optint)
}
func (s ReadOnlyClusterPolicyBinding) Get(name string, options *metav1.GetOptions) (*authorizationapi.ClusterPolicyBinding, error) {
return s.Registry.GetClusterPolicyBinding(apirequest.WithNamespace(apirequest.NewContext(), ""), name, options)
}
type ReadOnlyClusterPolicyBindingClientShim struct {
ReadOnlyClusterPolicyBinding ReadOnlyClusterPolicyBinding
}
func (r *ReadOnlyClusterPolicyBindingClientShim) List(label labels.Selector) ([]*authorizationapi.ClusterPolicyBinding, error) {
list, err := r.ReadOnlyClusterPolicyBinding.List(metav1.ListOptions{LabelSelector: label.String()})
if err != nil {
return nil, err
}
var items []*authorizationapi.ClusterPolicyBinding
for i := range list.Items {
items = append(items, &list.Items[i])
}
return items, nil
}
func (r *ReadOnlyClusterPolicyBindingClientShim) Get(name string) (*authorizationapi.ClusterPolicyBinding, error) {
return r.ReadOnlyClusterPolicyBinding.Get(name, &metav1.GetOptions{})
}