From 70a95c3ed9a632721e96269c617a5f5952c94fb6 Mon Sep 17 00:00:00 2001 From: deads2k Date: Tue, 9 May 2017 16:49:15 -0400 Subject: [PATCH] add defaulting for customresources --- .../pkg/apis/apiextensions/install/BUILD | 6 ++- .../apiextensions/install/install_test.go | 27 ++++++++++- .../pkg/apis/apiextensions/v1alpha1/BUILD | 1 + .../apis/apiextensions/v1alpha1/defaults.go | 46 +++++++++++++++++++ .../pkg/apis/apiextensions/v1alpha1/doc.go | 1 + .../apis/apiextensions/v1alpha1/register.go | 2 +- .../test/integration/BUILD | 1 - .../test/integration/basic_test.go | 3 +- 8 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/defaults.go diff --git a/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/install/BUILD b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/install/BUILD index ec040cd5173..b24d226dc9d 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/install/BUILD +++ b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/install/BUILD @@ -13,7 +13,11 @@ go_test( srcs = ["install_test.go"], library = ":go_default_library", tags = ["automanaged"], - deps = ["//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library"], + deps = [ + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library", + "//vendor/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions:go_default_library", + ], ) go_library( diff --git a/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/install/install_test.go b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/install/install_test.go index de4aaf18684..de662ad65e3 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/install/install_test.go +++ b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/install/install_test.go @@ -17,11 +17,36 @@ limitations under the License. package install import ( + "strings" "testing" + "github.com/google/gofuzz" + apitesting "k8s.io/apimachinery/pkg/api/testing" + "k8s.io/kube-apiextensions-server/pkg/apis/apiextensions" ) func TestRoundTripTypes(t *testing.T) { - apitesting.RoundTripTestForAPIGroup(t, Install, nil) + apitesting.RoundTripTestForAPIGroup(t, Install, apitesting.MergeFuzzerFuncs(t, + fuzzerFuncs(), + )) +} + +func fuzzerFuncs() []interface{} { + return []interface{}{ + func(obj *apiextensions.CustomResourceSpec, c fuzz.Continue) { + c.FuzzNoCustom(obj) + + // match our defaulter + if len(obj.Scope) == 0 { + obj.Scope = apiextensions.NamespaceScoped + } + if len(obj.Names.Singular) == 0 { + obj.Names.Singular = strings.ToLower(obj.Names.Kind) + } + if len(obj.Names.ListKind) == 0 && len(obj.Names.Kind) > 0 { + obj.Names.ListKind = obj.Names.Kind + "List" + } + }, + } } diff --git a/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/BUILD b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/BUILD index 1f5bad35e30..03d7135cb65 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/BUILD +++ b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/BUILD @@ -10,6 +10,7 @@ load( go_library( name = "go_default_library", srcs = [ + "defaults.go", "doc.go", "register.go", "types.go", diff --git a/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/defaults.go b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/defaults.go new file mode 100644 index 00000000000..05895198ed8 --- /dev/null +++ b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/defaults.go @@ -0,0 +1,46 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + "strings" + + "k8s.io/apimachinery/pkg/runtime" +) + +func addDefaultingFuncs(scheme *runtime.Scheme) error { + scheme.AddTypeDefaultingFunc(&CustomResource{}, func(obj interface{}) { SetDefaults_CustomResource(obj.(*CustomResource)) }) + // TODO figure out why I can't seem to get my defaulter generated + // return RegisterDefaults(scheme) + return nil +} + +func SetDefaults_CustomResource(obj *CustomResource) { + SetDefaults_CustomResourceSpec(&obj.Spec) +} + +func SetDefaults_CustomResourceSpec(obj *CustomResourceSpec) { + if len(obj.Scope) == 0 { + obj.Scope = NamespaceScoped + } + if len(obj.Names.Singular) == 0 { + obj.Names.Singular = strings.ToLower(obj.Names.Kind) + } + if len(obj.Names.ListKind) == 0 && len(obj.Names.Kind) > 0 { + obj.Names.ListKind = obj.Names.Kind + "List" + } +} diff --git a/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/doc.go b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/doc.go index 9923dceca94..c5d447effd0 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/doc.go +++ b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/doc.go @@ -16,6 +16,7 @@ limitations under the License. // +k8s:deepcopy-gen=package,register // +k8s:conversion-gen=k8s.io/kubernetes/vendor/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions +// +k8s:defaulter-gen=TypeMeta // Package v1alpha1 is the v1alpha1 version of the API. // +groupName=apiextensions.k8s.io diff --git a/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/register.go b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/register.go index 1ee13aeb671..ded314c8d58 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/register.go +++ b/staging/src/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1/register.go @@ -38,7 +38,7 @@ func Resource(resource string) schema.GroupResource { } var ( - SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes, addDefaultingFuncs) AddToScheme = SchemeBuilder.AddToScheme ) diff --git a/staging/src/k8s.io/kube-apiextensions-server/test/integration/BUILD b/staging/src/k8s.io/kube-apiextensions-server/test/integration/BUILD index 558da716006..59a4b1bccc1 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/test/integration/BUILD +++ b/staging/src/k8s.io/kube-apiextensions-server/test/integration/BUILD @@ -19,7 +19,6 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1:go_default_library", "//vendor/k8s.io/kube-apiextensions-server/test/integration/testserver:go_default_library", ], ) diff --git a/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go b/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go index e622447f8ad..eb7915af095 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go +++ b/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go @@ -25,7 +25,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/watch" - apiextensionsv1alpha1 "k8s.io/kube-apiextensions-server/pkg/apis/apiextensions/v1alpha1" "k8s.io/kube-apiextensions-server/test/integration/testserver" ) @@ -53,7 +52,7 @@ func TestSimpleCRUD(t *testing.T) { ns := "not-the-default" noxuNamespacedResourceClient := noxuVersionClient.Resource(&metav1.APIResource{ Name: noxuDefinition.Spec.Names.Plural, - Namespaced: noxuDefinition.Spec.Scope == apiextensionsv1alpha1.NamespaceScoped, + Namespaced: true, }, ns) initialList, err := noxuNamespacedResourceClient.List(metav1.ListOptions{}) if err != nil {