1
16
17 package rest
18
19 import (
20 admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
21 admissionregistrationv1alpha1 "k8s.io/api/admissionregistration/v1alpha1"
22 admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1"
23 "k8s.io/apiserver/pkg/authorization/authorizer"
24 "k8s.io/apiserver/pkg/registry/generic"
25 "k8s.io/apiserver/pkg/registry/rest"
26 genericapiserver "k8s.io/apiserver/pkg/server"
27 serverstorage "k8s.io/apiserver/pkg/server/storage"
28 "k8s.io/client-go/discovery"
29 "k8s.io/kubernetes/pkg/api/legacyscheme"
30 "k8s.io/kubernetes/pkg/apis/admissionregistration"
31 mutatingwebhookconfigurationstorage "k8s.io/kubernetes/pkg/registry/admissionregistration/mutatingwebhookconfiguration/storage"
32 "k8s.io/kubernetes/pkg/registry/admissionregistration/resolver"
33 validatingadmissionpolicystorage "k8s.io/kubernetes/pkg/registry/admissionregistration/validatingadmissionpolicy/storage"
34 policybindingstorage "k8s.io/kubernetes/pkg/registry/admissionregistration/validatingadmissionpolicybinding/storage"
35 validatingwebhookconfigurationstorage "k8s.io/kubernetes/pkg/registry/admissionregistration/validatingwebhookconfiguration/storage"
36 )
37
38 type RESTStorageProvider struct {
39 Authorizer authorizer.Authorizer
40 DiscoveryClient discovery.DiscoveryInterface
41 }
42
43 func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, error) {
44 apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(admissionregistration.GroupName, legacyscheme.Scheme, legacyscheme.ParameterCodec, legacyscheme.Codecs)
45
46
47
48 if storageMap, err := p.v1Storage(apiResourceConfigSource, restOptionsGetter); err != nil {
49 return genericapiserver.APIGroupInfo{}, err
50 } else if len(storageMap) > 0 {
51 apiGroupInfo.VersionedResourcesStorageMap[admissionregistrationv1.SchemeGroupVersion.Version] = storageMap
52 }
53
54 if storageMap, err := p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter); err != nil {
55 return genericapiserver.APIGroupInfo{}, err
56 } else if len(storageMap) > 0 {
57 apiGroupInfo.VersionedResourcesStorageMap[admissionregistrationv1beta1.SchemeGroupVersion.Version] = storageMap
58 }
59
60 if storageMap, err := p.v1alpha1Storage(apiResourceConfigSource, restOptionsGetter); err != nil {
61 return genericapiserver.APIGroupInfo{}, err
62 } else if len(storageMap) > 0 {
63 apiGroupInfo.VersionedResourcesStorageMap[admissionregistrationv1alpha1.SchemeGroupVersion.Version] = storageMap
64 }
65 return apiGroupInfo, nil
66 }
67
68 func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) {
69 storage := map[string]rest.Storage{}
70
71
72 var policyGetter rest.Getter
73
74 r, err := resolver.NewDiscoveryResourceResolver(p.DiscoveryClient)
75 if err != nil {
76 return storage, err
77 }
78
79
80 if resource := "validatingwebhookconfigurations"; apiResourceConfigSource.ResourceEnabled(admissionregistrationv1.SchemeGroupVersion.WithResource(resource)) {
81 validatingStorage, err := validatingwebhookconfigurationstorage.NewREST(restOptionsGetter)
82 if err != nil {
83 return storage, err
84 }
85 storage[resource] = validatingStorage
86 }
87
88
89 if resource := "mutatingwebhookconfigurations"; apiResourceConfigSource.ResourceEnabled(admissionregistrationv1.SchemeGroupVersion.WithResource(resource)) {
90 mutatingStorage, err := mutatingwebhookconfigurationstorage.NewREST(restOptionsGetter)
91 if err != nil {
92 return storage, err
93 }
94 storage[resource] = mutatingStorage
95 }
96
97
98 if resource := "validatingadmissionpolicies"; apiResourceConfigSource.ResourceEnabled(admissionregistrationv1.SchemeGroupVersion.WithResource(resource)) {
99 policyStorage, policyStatusStorage, err := validatingadmissionpolicystorage.NewREST(restOptionsGetter, p.Authorizer, r)
100 if err != nil {
101 return storage, err
102 }
103 policyGetter = policyStorage
104 storage[resource] = policyStorage
105 storage[resource+"/status"] = policyStatusStorage
106 }
107
108
109 if resource := "validatingadmissionpolicybindings"; apiResourceConfigSource.ResourceEnabled(admissionregistrationv1.SchemeGroupVersion.WithResource(resource)) {
110 policyBindingStorage, err := policybindingstorage.NewREST(restOptionsGetter, p.Authorizer, &policybindingstorage.DefaultPolicyGetter{Getter: policyGetter}, r)
111 if err != nil {
112 return storage, err
113 }
114 storage[resource] = policyBindingStorage
115 }
116
117 return storage, nil
118 }
119
120 func (p RESTStorageProvider) v1alpha1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) {
121 storage := map[string]rest.Storage{}
122
123
124 var policyGetter rest.Getter
125
126 r, err := resolver.NewDiscoveryResourceResolver(p.DiscoveryClient)
127 if err != nil {
128 return storage, err
129 }
130
131
132 if resource := "validatingadmissionpolicies"; apiResourceConfigSource.ResourceEnabled(admissionregistrationv1alpha1.SchemeGroupVersion.WithResource(resource)) {
133 policyStorage, policyStatusStorage, err := validatingadmissionpolicystorage.NewREST(restOptionsGetter, p.Authorizer, r)
134 if err != nil {
135 return storage, err
136 }
137 policyGetter = policyStorage
138 storage[resource] = policyStorage
139 storage[resource+"/status"] = policyStatusStorage
140 }
141
142
143 if resource := "validatingadmissionpolicybindings"; apiResourceConfigSource.ResourceEnabled(admissionregistrationv1alpha1.SchemeGroupVersion.WithResource(resource)) {
144 policyBindingStorage, err := policybindingstorage.NewREST(restOptionsGetter, p.Authorizer, &policybindingstorage.DefaultPolicyGetter{Getter: policyGetter}, r)
145 if err != nil {
146 return storage, err
147 }
148 storage[resource] = policyBindingStorage
149 }
150
151 return storage, nil
152 }
153
154 func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (map[string]rest.Storage, error) {
155 storage := map[string]rest.Storage{}
156
157
158 var policyGetter rest.Getter
159
160 r, err := resolver.NewDiscoveryResourceResolver(p.DiscoveryClient)
161 if err != nil {
162 return storage, err
163 }
164
165
166 if resource := "validatingadmissionpolicies"; apiResourceConfigSource.ResourceEnabled(admissionregistrationv1beta1.SchemeGroupVersion.WithResource(resource)) {
167 policyStorage, policyStatusStorage, err := validatingadmissionpolicystorage.NewREST(restOptionsGetter, p.Authorizer, r)
168 if err != nil {
169 return storage, err
170 }
171 policyGetter = policyStorage
172 storage[resource] = policyStorage
173 storage[resource+"/status"] = policyStatusStorage
174 }
175
176
177 if resource := "validatingadmissionpolicybindings"; apiResourceConfigSource.ResourceEnabled(admissionregistrationv1beta1.SchemeGroupVersion.WithResource(resource)) {
178 policyBindingStorage, err := policybindingstorage.NewREST(restOptionsGetter, p.Authorizer, &policybindingstorage.DefaultPolicyGetter{Getter: policyGetter}, r)
179 if err != nil {
180 return storage, err
181 }
182 storage[resource] = policyBindingStorage
183 }
184
185 return storage, nil
186 }
187
188 func (p RESTStorageProvider) GroupName() string {
189 return admissionregistration.GroupName
190 }
191
View as plain text