forked from openshift/origin
-
Notifications
You must be signed in to change notification settings - Fork 1
/
registry.go
129 lines (104 loc) · 4.39 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
package clusterpolicy
import (
kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/rest"
"k8s.io/kubernetes/pkg/watch"
authorizationapi "github.com/openshift/origin/pkg/authorization/api"
"github.com/openshift/origin/pkg/authorization/registry/policy"
)
// Registry is an interface for things that know how to store ClusterPolicies.
type Registry interface {
// ListClusterPolicies obtains list of policies that match a selector.
ListClusterPolicies(ctx kapi.Context, options *kapi.ListOptions) (*authorizationapi.ClusterPolicyList, error)
// GetClusterPolicy retrieves a specific policy.
GetClusterPolicy(ctx kapi.Context, id string) (*authorizationapi.ClusterPolicy, error)
// CreateClusterPolicy creates a new policy.
CreateClusterPolicy(ctx kapi.Context, policy *authorizationapi.ClusterPolicy) error
// UpdateClusterPolicy updates a policy.
UpdateClusterPolicy(ctx kapi.Context, policy *authorizationapi.ClusterPolicy) error
// DeleteClusterPolicy deletes a policy.
DeleteClusterPolicy(ctx kapi.Context, id string) error
}
type WatchingRegistry interface {
Registry
// WatchClusterPolicies watches policies.
WatchClusterPolicies(ctx kapi.Context, options *kapi.ListOptions) (watch.Interface, error)
}
type ReadOnlyClusterPolicyInterface interface {
List(options kapi.ListOptions) (*authorizationapi.ClusterPolicyList, error)
Get(name string) (*authorizationapi.ClusterPolicy, 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) ListClusterPolicies(ctx kapi.Context, options *kapi.ListOptions) (*authorizationapi.ClusterPolicyList, error) {
obj, err := s.List(ctx, options)
if err != nil {
return nil, err
}
return obj.(*authorizationapi.ClusterPolicyList), nil
}
func (s *storage) CreateClusterPolicy(ctx kapi.Context, policy *authorizationapi.ClusterPolicy) error {
_, err := s.Create(ctx, policy)
return err
}
func (s *storage) UpdateClusterPolicy(ctx kapi.Context, policy *authorizationapi.ClusterPolicy) error {
_, _, err := s.Update(ctx, policy.Name, rest.DefaultUpdatedObjectInfo(policy, kapi.Scheme))
return err
}
func (s *storage) WatchClusterPolicies(ctx kapi.Context, options *kapi.ListOptions) (watch.Interface, error) {
return s.Watch(ctx, options)
}
func (s *storage) GetClusterPolicy(ctx kapi.Context, name string) (*authorizationapi.ClusterPolicy, error) {
obj, err := s.Get(ctx, name)
if err != nil {
return nil, err
}
return obj.(*authorizationapi.ClusterPolicy), nil
}
func (s *storage) DeleteClusterPolicy(ctx kapi.Context, name string) error {
_, err := s.Delete(ctx, name, nil)
return err
}
type simulatedStorage struct {
clusterRegistry Registry
}
func NewSimulatedRegistry(clusterRegistry Registry) policy.Registry {
return &simulatedStorage{clusterRegistry}
}
func (s *simulatedStorage) ListPolicies(ctx kapi.Context, options *kapi.ListOptions) (*authorizationapi.PolicyList, error) {
ret, err := s.clusterRegistry.ListClusterPolicies(ctx, options)
return authorizationapi.ToPolicyList(ret), err
}
func (s *simulatedStorage) CreatePolicy(ctx kapi.Context, policy *authorizationapi.Policy) error {
return s.clusterRegistry.CreateClusterPolicy(ctx, authorizationapi.ToClusterPolicy(policy))
}
func (s *simulatedStorage) UpdatePolicy(ctx kapi.Context, policy *authorizationapi.Policy) error {
return s.clusterRegistry.UpdateClusterPolicy(ctx, authorizationapi.ToClusterPolicy(policy))
}
func (s *simulatedStorage) GetPolicy(ctx kapi.Context, name string) (*authorizationapi.Policy, error) {
ret, err := s.clusterRegistry.GetClusterPolicy(ctx, name)
return authorizationapi.ToPolicy(ret), err
}
func (s *simulatedStorage) DeletePolicy(ctx kapi.Context, name string) error {
return s.clusterRegistry.DeleteClusterPolicy(ctx, name)
}
type ReadOnlyClusterPolicy struct {
Registry
}
func (s ReadOnlyClusterPolicy) List(options kapi.ListOptions) (*authorizationapi.ClusterPolicyList, error) {
return s.ListClusterPolicies(kapi.WithNamespace(kapi.NewContext(), ""), &options)
}
func (s ReadOnlyClusterPolicy) Get(name string) (*authorizationapi.ClusterPolicy, error) {
return s.GetClusterPolicy(kapi.WithNamespace(kapi.NewContext(), ""), name)
}