mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-11 09:02:53 +00:00
Enable validation using function config schema from KRMFunctionDefinition
This commit is contained in:
153
kyaml/fn/framework/validation_test.go
Normal file
153
kyaml/fn/framework/validation_test.go
Normal file
@@ -0,0 +1,153 @@
|
||||
// Copyright 2022 The Kubernetes Authors.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package framework
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"sigs.k8s.io/kustomize/kyaml/resid"
|
||||
)
|
||||
|
||||
var demoFunctionDefinition = `
|
||||
apiVersion: config.kubernetes.io/v1alpha1
|
||||
kind: KRMFunctionDefinition
|
||||
metadata:
|
||||
name: demos.example.io
|
||||
spec:
|
||||
group: example.io
|
||||
names:
|
||||
kind: Demo
|
||||
versions:
|
||||
- name: v1alpha1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
properties:
|
||||
apiVersion:
|
||||
type: string
|
||||
color:
|
||||
type: string
|
||||
kind:
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
required:
|
||||
- color
|
||||
type: object
|
||||
- name: v1alpha2
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
properties:
|
||||
apiVersion:
|
||||
type: string
|
||||
flavor:
|
||||
type: string
|
||||
kind:
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
required:
|
||||
- flavor
|
||||
type: object
|
||||
`
|
||||
|
||||
var demoCRD = `
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
name: demos.example.io
|
||||
spec:
|
||||
group: example.io
|
||||
names:
|
||||
kind: Demo
|
||||
listKind: DemoList
|
||||
plural: demos
|
||||
singular: demo
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- name: v1alpha1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
properties:
|
||||
apiVersion:
|
||||
description: 'APIVersion defines the versioned schema of this representation
|
||||
of an object. Servers should convert recognized schemas to the latest
|
||||
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||
type: string
|
||||
color:
|
||||
type: string
|
||||
kind:
|
||||
description: 'Kind is a string value representing the REST resource this
|
||||
object represents. Servers may infer this from the endpoint the client
|
||||
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
required:
|
||||
- color
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
`
|
||||
|
||||
func TestSchemaFromFunctionDefinition(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
gvk resid.Gvk
|
||||
data string
|
||||
wantProps []string
|
||||
wantErr string
|
||||
}{
|
||||
{
|
||||
name: "demo KRMFunctionDefinition extract v1alpha1",
|
||||
gvk: resid.NewGvk("example.io", "v1alpha1", "Demo"),
|
||||
data: demoFunctionDefinition,
|
||||
wantProps: []string{"apiVersion", "kind", "metadata", "color"},
|
||||
}, {
|
||||
name: "demo KRMFunctionDefinition extract v1alpha2",
|
||||
gvk: resid.NewGvk("example.io", "v1alpha2", "Demo"),
|
||||
data: demoFunctionDefinition,
|
||||
wantProps: []string{"apiVersion", "kind", "metadata", "flavor"},
|
||||
}, {
|
||||
name: "works with CustomResourceDefinition",
|
||||
gvk: resid.NewGvk("example.io", "v1alpha1", "Demo"),
|
||||
data: demoCRD,
|
||||
wantProps: []string{"apiVersion", "kind", "metadata", "color"},
|
||||
}, {
|
||||
name: "group mismatch",
|
||||
gvk: resid.NewGvk("example.com", "v1alpha2", "Demo"),
|
||||
data: demoFunctionDefinition,
|
||||
wantErr: "KRMFunctionDefinition does not define Demo.v1alpha2.example.com (defines: [Demo.v1alpha1.example.io Demo.v1alpha2.example.io])",
|
||||
}, {
|
||||
name: "version mismatch",
|
||||
gvk: resid.NewGvk("example.io", "v1alpha3", "Demo"),
|
||||
data: demoFunctionDefinition,
|
||||
wantErr: "KRMFunctionDefinition does not define Demo.v1alpha3.example.io (defines: [Demo.v1alpha1.example.io Demo.v1alpha2.example.io])",
|
||||
}, {
|
||||
name: "kind mismatch",
|
||||
gvk: resid.NewGvk("example.io", "v1alpha2", "Demonstration"),
|
||||
data: demoFunctionDefinition,
|
||||
wantErr: "KRMFunctionDefinition does not define Demonstration.v1alpha2.example.io (defines: [Demo.v1alpha1.example.io Demo.v1alpha2.example.io])",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := SchemaFromFunctionDefinition(tt.gvk, tt.data)
|
||||
if tt.wantErr != "" {
|
||||
require.EqualError(t, err, tt.wantErr)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
var gotProps []string
|
||||
for prop, _ := range got.Properties {
|
||||
gotProps = append(gotProps, prop)
|
||||
}
|
||||
sort.Strings(tt.wantProps)
|
||||
sort.Strings(gotProps)
|
||||
assert.Equal(t, gotProps, tt.wantProps)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user