mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
Add test for zero-value custom resource validation
This commit is contained in:
parent
5515157f82
commit
b02b3c5828
@ -24,6 +24,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/go-cmp/cmp"
|
||||||
|
|
||||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
@ -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) {
|
func TestCustomResourceValidationErrors(t *testing.T) {
|
||||||
tearDown, apiExtensionClient, dynamicClient, err := fixtures.StartDefaultServerWithClients(t)
|
tearDown, apiExtensionClient, dynamicClient, err := fixtures.StartDefaultServerWithClients(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user