1
+ /*
2
+ Copyright 2020 The Kubernetes Authors.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
1
17
package builder
2
18
3
19
import (
4
20
"fmt"
5
21
6
- "k8s.io/apimachinery/pkg/runtime"
7
22
"k8s.io/apimachinery/pkg/runtime/schema"
8
23
regsitryrest "k8s.io/apiserver/pkg/registry/rest"
9
24
"sigs.k8s.io/apiserver-runtime/internal/sample-apiserver/pkg/apiserver"
10
25
"sigs.k8s.io/apiserver-runtime/pkg/builder/resource"
11
26
"sigs.k8s.io/apiserver-runtime/pkg/builder/resource/resourcerest"
12
- "sigs.k8s.io/apiserver-runtime/pkg/builder/resource/resourcestrategy"
13
27
"sigs.k8s.io/apiserver-runtime/pkg/builder/rest"
14
28
)
15
29
@@ -44,32 +58,32 @@ func (a *Server) WithResource(obj resource.Object) *Server {
44
58
45
59
// reuse the storage if this resource has already been registered
46
60
if s , found := a .storage [gvr .GroupResource ()]; found {
47
- _ = a .forGroupVersionResource (gvr , obj , s .Get )
61
+ _ = a .forGroupVersionResource (gvr , s .Get )
48
62
return a
49
63
}
50
64
51
65
// If the type implements it's own storage, then use that
52
66
switch s := obj .(type ) {
53
67
case resourcerest.Creator :
54
- return a .forGroupVersionResource (gvr , obj , rest.StaticHandlerProvider {Storage : s .(regsitryrest.Storage )}.Get )
68
+ return a .forGroupVersionResource (gvr , rest.StaticHandlerProvider {Storage : s .(regsitryrest.Storage )}.Get )
55
69
case resourcerest.Updater :
56
- return a .forGroupVersionResource (gvr , obj , rest.StaticHandlerProvider {Storage : s .(regsitryrest.Storage )}.Get )
70
+ return a .forGroupVersionResource (gvr , rest.StaticHandlerProvider {Storage : s .(regsitryrest.Storage )}.Get )
57
71
case resourcerest.Getter :
58
- return a .forGroupVersionResource (gvr , obj , rest.StaticHandlerProvider {Storage : s .(regsitryrest.Storage )}.Get )
72
+ return a .forGroupVersionResource (gvr , rest.StaticHandlerProvider {Storage : s .(regsitryrest.Storage )}.Get )
59
73
case resourcerest.Lister :
60
- return a .forGroupVersionResource (gvr , obj , rest.StaticHandlerProvider {Storage : s .(regsitryrest.Storage )}.Get )
74
+ return a .forGroupVersionResource (gvr , rest.StaticHandlerProvider {Storage : s .(regsitryrest.Storage )}.Get )
61
75
}
62
76
63
- _ = a .forGroupVersionResource (gvr , obj , rest .New (obj ))
77
+ _ = a .forGroupVersionResource (gvr , rest .New (obj ))
64
78
65
79
// automatically create status subresource if the object implements the status interface
66
80
if sgs , ok := obj .(resource.ObjectWithStatusSubResource ); ok {
67
81
st := gvr .GroupVersion ().WithResource (gvr .Resource + "/status" )
68
82
if s , found := a .storage [st .GroupResource ()]; found {
69
- _ = a .forGroupVersionResource (st , obj , s .Get )
83
+ _ = a .forGroupVersionResource (st , s .Get )
70
84
} else {
71
85
_ , _ , _ , sp := rest .NewStatus (sgs )
72
- _ = a .forGroupVersionResource (st , obj , sp )
86
+ _ = a .forGroupVersionResource (st , sp )
73
87
}
74
88
}
75
89
return a
@@ -85,12 +99,12 @@ func (a *Server) WithResourceAndStrategy(obj resource.Object, strategy rest.Stra
85
99
gvr := obj .GetGroupVersionResource ()
86
100
a .schemeBuilder .Register (resource .AddToScheme (obj ))
87
101
88
- _ = a .forGroupVersionResource (gvr , obj , rest .NewWithStrategy (obj , strategy ))
102
+ _ = a .forGroupVersionResource (gvr , rest .NewWithStrategy (obj , strategy ))
89
103
90
104
// automatically create status subresource if the object implements the status interface
91
105
if _ , ok := obj .(resource.ObjectWithStatusSubResource ); ok {
92
106
st := gvr .GroupVersion ().WithResource (gvr .Resource + "/status" )
93
- _ = a .forGroupVersionResource (st , obj , rest .NewStatusWithStrategy (obj , strategy ))
107
+ _ = a .forGroupVersionResource (st , rest .NewStatusWithStrategy (obj , strategy ))
94
108
}
95
109
return a
96
110
}
@@ -105,7 +119,7 @@ func (a *Server) WithResourceAndStrategy(obj resource.Object, strategy rest.Stra
105
119
func (a * Server ) WithResourceAndHandler (obj resource.Object , sp rest.ResourceHandlerProvider ) * Server {
106
120
gvr := obj .GetGroupVersionResource ()
107
121
a .schemeBuilder .Register (resource .AddToScheme (obj ))
108
- return a .forGroupVersionResource (gvr , obj , sp )
122
+ return a .forGroupVersionResource (gvr , sp )
109
123
}
110
124
111
125
// WithResourceAndStorage registers the resource with the apiserver, applying fn to the storage for the resource
@@ -120,19 +134,19 @@ func (a *Server) WithResourceAndStorage(obj resource.Object, fn rest.StoreFn) *S
120
134
gvr := obj .GetGroupVersionResource ()
121
135
a .schemeBuilder .Register (resource .AddToScheme (obj ))
122
136
123
- _ = a .forGroupVersionResource (gvr , obj , rest .NewWithFn (obj , fn ))
137
+ _ = a .forGroupVersionResource (gvr , rest .NewWithFn (obj , fn ))
124
138
125
139
// automatically create status subresource if the object implements the status interface
126
140
if _ , ok := obj .(resource.ObjectWithStatusSubResource ); ok {
127
141
st := gvr .GroupVersion ().WithResource (gvr .Resource + "/status" )
128
- _ = a .forGroupVersionResource (st , obj , rest .NewStatusWithFn (obj , fn ))
142
+ _ = a .forGroupVersionResource (st , rest .NewStatusWithFn (obj , fn ))
129
143
}
130
144
return a
131
145
}
132
146
133
147
// forGroupVersionResource manually registers storage for a specific resource or subresource version.
134
148
func (a * Server ) forGroupVersionResource (
135
- gvr schema.GroupVersionResource , obj runtime. Object , sp rest.ResourceHandlerProvider ) * Server {
149
+ gvr schema.GroupVersionResource , sp rest.ResourceHandlerProvider ) * Server {
136
150
// register the group version
137
151
a .withGroupVersions (gvr .GroupVersion ())
138
152
@@ -142,14 +156,6 @@ func (a *Server) forGroupVersionResource(
142
156
if _ , found := a .storage [gvr .GroupResource ()]; ! found {
143
157
a .storage [gvr .GroupResource ()] = & singletonProvider {Provider : sp }
144
158
}
145
-
146
- // add the defaulting function for this version to the scheme
147
- if _ , ok := obj .(resourcestrategy.Defaulter ); ok {
148
- apiserver .Scheme .AddTypeDefaultingFunc (obj , func (obj interface {}) {
149
- obj .(resourcestrategy.Defaulter ).Default ()
150
- })
151
- }
152
-
153
159
// add the API with its storage
154
160
apiserver .APIs [gvr ] = sp
155
161
return a
@@ -161,13 +167,13 @@ func (a *Server) forGroupVersionResource(
161
167
// Note: WithSubResource does NOT register the request or parent with the SchemeBuilder. If they were not registered
162
168
// through a WithResource call, then this must be done manually with WithAdditionalSchemeInstallers.
163
169
func (a * Server ) WithSubResource (
164
- parent resource.Object , subResourcePath string , request runtime. Object ) * Server {
170
+ parent resource.Object , subResource resource. SubResource ) * Server {
165
171
gvr := parent .GetGroupVersionResource ()
166
- gvr .Resource = gvr .Resource + "/" + subResourcePath
167
172
168
173
// reuse the storage if this resource has already been registered
169
174
if s , found := a .storage [gvr .GroupResource ()]; found {
170
- _ = a .forGroupVersionResource (gvr , request , s .Get )
175
+ subResourceGVR := gvr .GroupVersion ().WithResource (gvr .Resource + "/" + subResource .SubResourceName ())
176
+ _ = a .forGroupVersionResource (subResourceGVR , s .Get )
171
177
} else {
172
178
a .errs = append (a .errs , fmt .Errorf (
173
179
"subresources must be registered with a strategy or handler the first time they are registered" ))
@@ -181,10 +187,10 @@ func (a *Server) WithSubResource(
181
187
// Note: WithSubResource does NOT register the request or parent with the SchemeBuilder. If they were not registered
182
188
// through a WithResource call, then this must be done manually with WithAdditionalSchemeInstallers.
183
189
func (a * Server ) WithSubResourceAndStrategy (
184
- parent resource.Object , subResourcePath string , request resource.Object , strategy rest.Strategy ) * Server {
190
+ parent resource.Object , subResource resource.SubResource , strategy rest.Strategy ) * Server {
185
191
gvr := parent .GetGroupVersionResource ()
186
- gvr .Resource = gvr .Resource + "/" + subResourcePath
187
- return a .forGroupVersionResource (gvr , request , rest .NewWithStrategy ( request , strategy ))
192
+ gvr .Resource = gvr .Resource + "/" + subResource . SubResourceName ()
193
+ return a .forGroupVersionResource (gvr , rest .NewSubResourceWithStrategy ( parent , subResource , strategy ))
188
194
}
189
195
190
196
// WithSubResourceAndHandler registers a request handler for the subresource rather than the default
@@ -193,11 +199,11 @@ func (a *Server) WithSubResourceAndStrategy(
193
199
// Note: WithSubResource does NOT register the request or parent with the SchemeBuilder. If they were not registered
194
200
// through a WithResource call, then this must be done manually with WithAdditionalSchemeInstallers.
195
201
func (a * Server ) WithSubResourceAndHandler (
196
- parent resource.Object , subResourcePath string , request runtime. Object , sp rest.ResourceHandlerProvider ) * Server {
202
+ parent resource.Object , subResource resource. SubResource , sp rest.ResourceHandlerProvider ) * Server {
197
203
gvr := parent .GetGroupVersionResource ()
198
204
// add the subresource path
199
- gvr .Resource = gvr .Resource + "/" + subResourcePath
200
- return a .forGroupVersionResource (gvr , request , sp )
205
+ gvr .Resource = gvr .Resource + "/" + subResource . SubResourceName ()
206
+ return a .forGroupVersionResource (gvr , sp )
201
207
}
202
208
203
209
// WithSchemeInstallers registers functions to install resource types into the Scheme.
0 commit comments