Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix zero-value custom resource validation with go1.16 #99817

Merged
merged 2 commits into from Mar 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions go.mod
Expand Up @@ -129,7 +129,7 @@ require (
k8s.io/klog/v2 v2.5.0
k8s.io/kube-aggregator v0.0.0
k8s.io/kube-controller-manager v0.0.0
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7
k8s.io/kube-proxy v0.0.0
k8s.io/kube-scheduler v0.0.0
k8s.io/kubectl v0.0.0
Expand Down Expand Up @@ -506,7 +506,7 @@ replace (
k8s.io/klog/v2 => k8s.io/klog/v2 v2.5.0
k8s.io/kube-aggregator => ./staging/src/k8s.io/kube-aggregator
k8s.io/kube-controller-manager => ./staging/src/k8s.io/kube-controller-manager
k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd
k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7
k8s.io/kube-proxy => ./staging/src/k8s.io/kube-proxy
k8s.io/kube-scheduler => ./staging/src/k8s.io/kube-scheduler
k8s.io/kubectl => ./staging/src/k8s.io/kubectl
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Expand Up @@ -581,8 +581,8 @@ k8s.io/heapster v1.2.0-beta.1 h1:lUsE/AHOMHpi3MLlBEkaU8Esxm5QhdyCrv1o7ot0s84=
k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM=
k8s.io/klog/v2 v2.5.0 h1:8mOnjf1RmUPW6KRqQCfYSZq/K20Unmp3IhuZUhxl8KI=
k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c=
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0=
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
k8s.io/system-validators v1.4.0 h1:8ruXIHkuTAGfv9rHJproNWFW8oLASThFkCOxeHPYkNU=
k8s.io/system-validators v1.4.0/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q=
k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw=
Expand Down
4 changes: 1 addition & 3 deletions staging/src/k8s.io/api/go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion staging/src/k8s.io/apiextensions-apiserver/go.mod
Expand Up @@ -25,7 +25,7 @@ require (
k8s.io/code-generator v0.0.0
k8s.io/component-base v0.0.0
k8s.io/klog/v2 v2.5.0
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7
k8s.io/utils v0.0.0-20201110183641-67b214c5f920
sigs.k8s.io/yaml v1.2.0
)
Expand Down
5 changes: 2 additions & 3 deletions staging/src/k8s.io/apiextensions-apiserver/go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Expand Up @@ -24,6 +24,8 @@ import (
"testing"
"time"

"github.com/google/go-cmp/cmp"

apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
Expand Down Expand Up @@ -470,6 +472,174 @@ func TestCustomResourceUpdateValidation(t *testing.T) {
}
}

func TestZeroValueValidation(t *testing.T) {
tearDown, apiExtensionClient, dynamicClient, err := fixtures.StartDefaultServerWithClients(t)
if err != nil {
t.Fatal(err)
}
defer tearDown()

crdManifest := `
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: zeros.tests.example.com
spec:
group: tests.example.com
names:
plural: zeros
singular: zero
kind: Zero
listKind: Zerolist
scope: Cluster
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
string:
type: string
string_default:
type: string
default: ""
string_null:
type: string
nullable: true

boolean:
type: boolean
boolean_default:
type: boolean
default: false
boolean_null:
type: boolean
nullable: true

number:
type: number
number_default:
type: number
default: 0.0
number_null:
type: number
nullable: true

integer:
type: integer
integer_default:
type: integer
default: 0
integer_null:
type: integer
nullable: true

array:
type: array
items:
type: string
array_default:
type: array
items:
type: string
default: []
array_null:
type: array
nullable: true
items:
type: string

object:
type: object
properties:
a:
type: string
object_default:
type: object
properties:
a:
type: string
default: {}
object_null:
type: object
nullable: true
properties:
a:
type: string
`

// decode CRD crdManifest
crdObj, _, err := clientschema.Codecs.UniversalDeserializer().Decode([]byte(crdManifest), nil, nil)
if err != nil {
t.Fatalf("failed decoding of: %v\n\n%s", err, crdManifest)
}
crd := crdObj.(*apiextensionsv1.CustomResourceDefinition)
_, err = fixtures.CreateNewV1CustomResourceDefinition(crd, apiExtensionClient, dynamicClient)
if err != nil {
t.Fatal(err)
}

crObj := &unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": "tests.example.com/v1",
"kind": "Zero",
"metadata": map[string]interface{}{"name": "myzero"},

"string": "",
"string_null": nil,
"boolean": false,
"boolean_null": nil,
"number": 0,
"number_null": nil,
"integer": 0,
"integer_null": nil,
"array": []interface{}{},
"array_null": nil,
"object": map[string]interface{}{},
"object_null": nil,
},
}
zerosClient := dynamicClient.Resource(schema.GroupVersionResource{Group: "tests.example.com", Version: "v1", Resource: "zeros"})
createdCR, err := zerosClient.Create(context.TODO(), crObj, metav1.CreateOptions{})
if err != nil {
t.Fatal(err)
}

expectedCR := &unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": "tests.example.com/v1",
"kind": "Zero",
"metadata": createdCR.Object["metadata"],

"string": "",
"string_null": nil,
"boolean": false,
"boolean_null": nil,
"number": int64(0),
"number_null": nil,
"integer": int64(0),
"integer_null": nil,
"array": []interface{}{},
"array_null": nil,
"object": map[string]interface{}{},
"object_null": nil,

"string_default": "",
"boolean_default": false,
"number_default": int64(0),
"integer_default": int64(0),
"array_default": []interface{}{},
"object_default": map[string]interface{}{},
},
}

if diff := cmp.Diff(createdCR, expectedCR); len(diff) > 0 {
t.Error(diff)
}
}

func TestCustomResourceValidationErrors(t *testing.T) {
tearDown, apiExtensionClient, dynamicClient, err := fixtures.StartDefaultServerWithClients(t)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion staging/src/k8s.io/apimachinery/go.mod
Expand Up @@ -32,7 +32,7 @@ require (
gopkg.in/inf.v0 v0.9.1
gopkg.in/yaml.v2 v2.2.8
k8s.io/klog/v2 v2.5.0
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7
sigs.k8s.io/structured-merge-diff/v4 v4.0.3
sigs.k8s.io/yaml v1.2.0
)
Expand Down
6 changes: 2 additions & 4 deletions staging/src/k8s.io/apimachinery/go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion staging/src/k8s.io/apiserver/go.mod
Expand Up @@ -46,7 +46,7 @@ require (
k8s.io/client-go v0.0.0
k8s.io/component-base v0.0.0
k8s.io/klog/v2 v2.5.0
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7
k8s.io/utils v0.0.0-20201110183641-67b214c5f920
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15
sigs.k8s.io/structured-merge-diff/v4 v4.0.3
Expand Down
5 changes: 2 additions & 3 deletions staging/src/k8s.io/apiserver/go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion staging/src/k8s.io/cli-runtime/go.mod
Expand Up @@ -21,7 +21,7 @@ require (
k8s.io/api v0.0.0
k8s.io/apimachinery v0.0.0
k8s.io/client-go v0.0.0
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7
sigs.k8s.io/kustomize v2.0.3+incompatible
sigs.k8s.io/yaml v1.2.0
)
Expand Down
6 changes: 2 additions & 4 deletions staging/src/k8s.io/cli-runtime/go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.