Skip to content

Commit 6085d90

Browse files
authored
Merge pull request kubernetes#92064 from roycaihw/storage-version/serve-api
Serve storage-versions API in kube-apiserver
2 parents 0ea3987 + 07506ab commit 6085d90

File tree

26 files changed

+2216
-292
lines changed

26 files changed

+2216
-292
lines changed

api/openapi-spec/swagger.json

Lines changed: 1534 additions & 289 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/kube-apiserver/app/aggregator.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ var apiVersionPriorities = map[schema.GroupVersion]priority{
275275
{Group: "discovery.k8s.io", Version: "v1beta1"}: {group: 16200, version: 12},
276276
{Group: "discovery.k8s.io", Version: "v1alpha1"}: {group: 16200, version: 9},
277277
{Group: "flowcontrol.apiserver.k8s.io", Version: "v1alpha1"}: {group: 16100, version: 9},
278+
{Group: "internal.apiserver.k8s.io", Version: "v1alpha1"}: {group: 16000, version: 9},
278279
// Append a new group to the end of the list if unsure.
279280
// You can use min(existing group)-100 as the initial value for a group.
280281
// Version can be set to 9 (to have space around) for a new group.

pkg/apis/apiserverinternal/install/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ go_library(
66
importpath = "k8s.io/kubernetes/pkg/apis/apiserverinternal/install",
77
visibility = ["//visibility:public"],
88
deps = [
9+
"//pkg/api/legacyscheme:go_default_library",
910
"//pkg/apis/apiserverinternal:go_default_library",
1011
"//pkg/apis/apiserverinternal/v1alpha1:go_default_library",
1112
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",

pkg/apis/apiserverinternal/install/install.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,15 @@ package install
2121
import (
2222
"k8s.io/apimachinery/pkg/runtime"
2323
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
24+
"k8s.io/kubernetes/pkg/api/legacyscheme"
2425
"k8s.io/kubernetes/pkg/apis/apiserverinternal"
2526
"k8s.io/kubernetes/pkg/apis/apiserverinternal/v1alpha1"
2627
)
2728

29+
func init() {
30+
Install(legacyscheme.Scheme)
31+
}
32+
2833
// Install registers the API group and adds types to a scheme
2934
func Install(scheme *runtime.Scheme) {
3035
utilruntime.Must(apiserverinternal.AddToScheme(scheme))

pkg/apis/apiserverinternal/validation/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ go_library(
77
visibility = ["//visibility:public"],
88
deps = [
99
"//pkg/apis/apiserverinternal:go_default_library",
10+
"//pkg/apis/core/validation:go_default_library",
1011
"//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library",
1112
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
1213
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",

pkg/apis/apiserverinternal/validation/validation.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,42 @@ import (
2525
utilvalidation "k8s.io/apimachinery/pkg/util/validation"
2626
"k8s.io/apimachinery/pkg/util/validation/field"
2727
"k8s.io/kubernetes/pkg/apis/apiserverinternal"
28+
apivalidation "k8s.io/kubernetes/pkg/apis/core/validation"
2829
)
2930

3031
// ValidateStorageVersion validate the storage version object.
3132
func ValidateStorageVersion(sv *apiserverinternal.StorageVersion) field.ErrorList {
33+
var allErrs field.ErrorList
34+
allErrs = append(allErrs, apivalidation.ValidateObjectMeta(&sv.ObjectMeta, false, ValidateStorageVersionName, field.NewPath("metadata"))...)
35+
allErrs = append(allErrs, validateStorageVersionStatus(sv.Status, field.NewPath("status"))...)
36+
return allErrs
37+
}
38+
39+
// ValidateStorageVersionName is a ValidateNameFunc for storage version names
40+
func ValidateStorageVersionName(name string, prefix bool) []string {
41+
var allErrs []string
42+
idx := strings.LastIndex(name, ".")
43+
if idx < 0 {
44+
allErrs = append(allErrs, "name must be in the form of <group>.<resource>")
45+
} else {
46+
for _, msg := range utilvalidation.IsDNS1123Subdomain(name[:idx]) {
47+
allErrs = append(allErrs, "the group segment "+msg)
48+
}
49+
for _, msg := range utilvalidation.IsDNS1035Label(name[idx+1:]) {
50+
allErrs = append(allErrs, "the resource segment "+msg)
51+
}
52+
}
53+
return allErrs
54+
}
55+
56+
// ValidateStorageVersionUpdate tests if an update to a StorageVersion is valid.
57+
func ValidateStorageVersionUpdate(sv, oldSV *apiserverinternal.StorageVersion) field.ErrorList {
58+
// no error since StorageVersionSpec is an empty spec
59+
return field.ErrorList{}
60+
}
61+
62+
// ValidateStorageVersionStatusUpdate tests if an update to a StorageVersionStatus is valid.
63+
func ValidateStorageVersionStatusUpdate(sv, oldSV *apiserverinternal.StorageVersion) field.ErrorList {
3264
var allErrs field.ErrorList
3365
allErrs = append(allErrs, validateStorageVersionStatus(sv.Status, field.NewPath("status"))...)
3466
return allErrs

pkg/apis/apiserverinternal/validation/validation_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,3 +284,66 @@ func TestValidateStorageVersionCondition(t *testing.T) {
284284
}
285285
}
286286
}
287+
288+
func TestValidateStorageVersionName(t *testing.T) {
289+
cases := []struct {
290+
name string
291+
expectedErr string
292+
}{
293+
{
294+
name: "",
295+
expectedErr: `name must be in the form of <group>.<resource>`,
296+
},
297+
{
298+
name: "pods",
299+
expectedErr: `name must be in the form of <group>.<resource>`,
300+
},
301+
{
302+
name: "core.pods",
303+
expectedErr: "",
304+
},
305+
{
306+
name: "authentication.k8s.io.tokenreviews",
307+
expectedErr: "",
308+
},
309+
{
310+
name: strings.Repeat("x", 253) + ".tokenreviews",
311+
expectedErr: "",
312+
},
313+
{
314+
name: strings.Repeat("x", 254) + ".tokenreviews",
315+
expectedErr: `the group segment must be no more than 253 characters`,
316+
},
317+
{
318+
name: "authentication.k8s.io." + strings.Repeat("x", 63),
319+
expectedErr: "",
320+
},
321+
{
322+
name: "authentication.k8s.io." + strings.Repeat("x", 64),
323+
expectedErr: `the resource segment must be no more than 63 characters`,
324+
},
325+
}
326+
for _, tc := range cases {
327+
errs := ValidateStorageVersionName(tc.name, false)
328+
if errs == nil && len(tc.expectedErr) == 0 {
329+
continue
330+
}
331+
if errs != nil && len(tc.expectedErr) == 0 {
332+
t.Errorf("unexpected error %v", errs)
333+
continue
334+
}
335+
if errs == nil && len(tc.expectedErr) != 0 {
336+
t.Errorf("unexpected empty error")
337+
continue
338+
}
339+
found := false
340+
for _, msg := range errs {
341+
if msg == tc.expectedErr {
342+
found = true
343+
}
344+
}
345+
if !found {
346+
t.Errorf("expected error to contain %s, got %v", tc.expectedErr, errs)
347+
}
348+
}
349+
}

pkg/controlplane/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ go_library(
4444
"//pkg/kubeapiserver/options:go_default_library",
4545
"//pkg/kubelet/client:go_default_library",
4646
"//pkg/registry/admissionregistration/rest:go_default_library",
47+
"//pkg/registry/apiserverinternal/rest:go_default_library",
4748
"//pkg/registry/apps/rest:go_default_library",
4849
"//pkg/registry/authentication/rest:go_default_library",
4950
"//pkg/registry/authorization/rest:go_default_library",
@@ -72,6 +73,7 @@ go_library(
7273
"//pkg/util/node:go_default_library",
7374
"//staging/src/k8s.io/api/admissionregistration/v1:go_default_library",
7475
"//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library",
76+
"//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library",
7577
"//staging/src/k8s.io/api/apps/v1:go_default_library",
7678
"//staging/src/k8s.io/api/authentication/v1:go_default_library",
7779
"//staging/src/k8s.io/api/authentication/v1beta1:go_default_library",

pkg/controlplane/master.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727

2828
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
2929
admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1"
30+
apiserverinternalv1alpha1 "k8s.io/api/apiserverinternal/v1alpha1"
3031
appsv1 "k8s.io/api/apps/v1"
3132
authenticationv1 "k8s.io/api/authentication/v1"
3233
authenticationv1beta1 "k8s.io/api/authentication/v1beta1"
@@ -93,6 +94,7 @@ import (
9394

9495
// RESTStorage installers
9596
admissionregistrationrest "k8s.io/kubernetes/pkg/registry/admissionregistration/rest"
97+
apiserverinternalrest "k8s.io/kubernetes/pkg/registry/apiserverinternal/rest"
9698
appsrest "k8s.io/kubernetes/pkg/registry/apps/rest"
9799
authenticationrest "k8s.io/kubernetes/pkg/registry/authentication/rest"
98100
authorizationrest "k8s.io/kubernetes/pkg/registry/authorization/rest"
@@ -415,6 +417,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
415417
// TODO: describe the priority all the way down in the RESTStorageProviders and plumb it back through the various discovery
416418
// handlers that we have.
417419
restStorageProviders := []RESTStorageProvider{
420+
apiserverinternalrest.StorageProvider{},
418421
authenticationrest.RESTStorageProvider{Authenticator: c.GenericConfig.Authentication.Authenticator, APIAudiences: c.GenericConfig.Authentication.APIAudiences},
419422
authorizationrest.RESTStorageProvider{Authorizer: c.GenericConfig.Authorization.Authorizer, RuleResolver: c.GenericConfig.RuleResolver},
420423
autoscalingrest.RESTStorageProvider{},
@@ -633,6 +636,7 @@ func DefaultAPIResourceConfigSource() *serverstorage.ResourceConfig {
633636
)
634637
// disable alpha versions explicitly so we have a full list of what's possible to serve
635638
ret.DisableVersions(
639+
apiserverinternalv1alpha1.SchemeGroupVersion,
636640
batchapiv2alpha1.SchemeGroupVersion,
637641
nodev1alpha1.SchemeGroupVersion,
638642
rbacv1alpha1.SchemeGroupVersion,

pkg/printers/internalversion/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ go_test(
1414
],
1515
embed = [":go_default_library"],
1616
deps = [
17+
"//pkg/apis/apiserverinternal:go_default_library",
1718
"//pkg/apis/apps:go_default_library",
1819
"//pkg/apis/autoscaling:go_default_library",
1920
"//pkg/apis/batch:go_default_library",
@@ -47,6 +48,7 @@ go_library(
4748
importpath = "k8s.io/kubernetes/pkg/printers/internalversion",
4849
deps = [
4950
"//pkg/apis/admissionregistration:go_default_library",
51+
"//pkg/apis/apiserverinternal:go_default_library",
5052
"//pkg/apis/apps:go_default_library",
5153
"//pkg/apis/apps/install:go_default_library",
5254
"//pkg/apis/authentication/install:go_default_library",
@@ -83,6 +85,7 @@ go_library(
8385
"//pkg/features:go_default_library",
8486
"//pkg/printers:go_default_library",
8587
"//pkg/util/node:go_default_library",
88+
"//staging/src/k8s.io/api/apiserverinternal/v1alpha1:go_default_library",
8689
"//staging/src/k8s.io/api/apps/v1beta1:go_default_library",
8790
"//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library",
8891
"//staging/src/k8s.io/api/batch/v1:go_default_library",

0 commit comments

Comments
 (0)