mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-30 23:15:14 +00:00
fix up CRD validation tests
This commit is contained in:
parent
06eb2f5d41
commit
734e9b7dd6
@ -22,8 +22,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
|
|
||||||
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
|
||||||
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
@ -47,7 +45,7 @@ func TestAPIApproval(t *testing.T) {
|
|||||||
|
|
||||||
newSigKubeAPIFn := func(resource, approvalAnnotation string) *apiextensionsv1.CustomResourceDefinition {
|
newSigKubeAPIFn := func(resource, approvalAnnotation string) *apiextensionsv1.CustomResourceDefinition {
|
||||||
return &apiextensionsv1.CustomResourceDefinition{
|
return &apiextensionsv1.CustomResourceDefinition{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: resource + ".sigs.k8s.io", Annotations: map[string]string{apiextensionsv1beta1.KubeAPIApprovedAnnotation: approvalAnnotation}},
|
ObjectMeta: metav1.ObjectMeta{Name: resource + ".sigs.k8s.io", Annotations: map[string]string{apiextensionsv1.KubeAPIApprovedAnnotation: approvalAnnotation}},
|
||||||
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
|
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
|
||||||
Group: "sigs.k8s.io",
|
Group: "sigs.k8s.io",
|
||||||
Versions: []apiextensionsv1.CustomResourceDefinitionVersion{
|
Versions: []apiextensionsv1.CustomResourceDefinitionVersion{
|
||||||
|
@ -26,7 +26,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
|
@ -27,8 +27,6 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp"
|
"github.com/google/go-cmp/cmp"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
@ -44,6 +42,7 @@ import (
|
|||||||
"k8s.io/client-go/dynamic"
|
"k8s.io/client-go/dynamic"
|
||||||
|
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
|
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
serveroptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options"
|
serveroptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options"
|
||||||
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
||||||
@ -336,10 +335,8 @@ func validateNonTrivialConverted(t *testing.T, ctc *conversionTestContext) {
|
|||||||
client := ctc.versionedClient(ns, createVersion.Name)
|
client := ctc.versionedClient(ns, createVersion.Name)
|
||||||
|
|
||||||
fixture := newConversionMultiVersionFixture(ns, name, createVersion.Name)
|
fixture := newConversionMultiVersionFixture(ns, name, createVersion.Name)
|
||||||
if createVersion.Schema.OpenAPIV3Schema.XPreserveUnknownFields == nil || !*createVersion.Schema.OpenAPIV3Schema.XPreserveUnknownFields {
|
if err := unstructured.SetNestedField(fixture.Object, "foo", "garbage"); err != nil {
|
||||||
if err := unstructured.SetNestedField(fixture.Object, "foo", "garbage"); err != nil {
|
t.Fatal(err)
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if _, err := client.Create(context.TODO(), fixture, metav1.CreateOptions{}); err != nil {
|
if _, err := client.Create(context.TODO(), fixture, metav1.CreateOptions{}); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@ -394,10 +391,8 @@ func validateNonTrivialConvertedList(t *testing.T, ctc *conversionTestContext) {
|
|||||||
name := "converted-" + createVersion.Name
|
name := "converted-" + createVersion.Name
|
||||||
client := ctc.versionedClient(ns, createVersion.Name)
|
client := ctc.versionedClient(ns, createVersion.Name)
|
||||||
fixture := newConversionMultiVersionFixture(ns, name, createVersion.Name)
|
fixture := newConversionMultiVersionFixture(ns, name, createVersion.Name)
|
||||||
if createVersion.Schema.OpenAPIV3Schema.XPreserveUnknownFields == nil || !*createVersion.Schema.OpenAPIV3Schema.XPreserveUnknownFields {
|
if err := unstructured.SetNestedField(fixture.Object, "foo", "garbage"); err != nil {
|
||||||
if err := unstructured.SetNestedField(fixture.Object, "foo", "garbage"); err != nil {
|
t.Fatal(err)
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_, err := client.Create(context.TODO(), fixture, metav1.CreateOptions{})
|
_, err := client.Create(context.TODO(), fixture, metav1.CreateOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -432,9 +427,6 @@ func validateStoragePruning(t *testing.T, ctc *conversionTestContext) {
|
|||||||
ns := ctc.namespace
|
ns := ctc.namespace
|
||||||
|
|
||||||
for _, createVersion := range ctc.crd.Spec.Versions {
|
for _, createVersion := range ctc.crd.Spec.Versions {
|
||||||
if createVersion.Schema.OpenAPIV3Schema.XPreserveUnknownFields == nil || !*createVersion.Schema.OpenAPIV3Schema.XPreserveUnknownFields {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
t.Run(fmt.Sprintf("getting objects created as %s", createVersion.Name), func(t *testing.T) {
|
t.Run(fmt.Sprintf("getting objects created as %s", createVersion.Name), func(t *testing.T) {
|
||||||
name := "storagepruning-" + createVersion.Name
|
name := "storagepruning-" + createVersion.Name
|
||||||
client := ctc.versionedClient(ns, createVersion.Name)
|
client := ctc.versionedClient(ns, createVersion.Name)
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
@ -23,13 +23,11 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
|
|
||||||
"k8s.io/client-go/dynamic"
|
|
||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
||||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
|
"k8s.io/client-go/dynamic"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestLimits(t *testing.T) {
|
func TestLimits(t *testing.T) {
|
||||||
|
@ -23,16 +23,14 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
|
||||||
"k8s.io/client-go/util/retry"
|
|
||||||
"sigs.k8s.io/yaml"
|
|
||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
||||||
|
"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"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
"k8s.io/client-go/util/retry"
|
||||||
|
"sigs.k8s.io/yaml"
|
||||||
)
|
)
|
||||||
|
|
||||||
var listTypeResourceFixture = &apiextensionsv1.CustomResourceDefinition{
|
var listTypeResourceFixture = &apiextensionsv1.CustomResourceDefinition{
|
||||||
|
@ -41,7 +41,6 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/json"
|
"k8s.io/apimachinery/pkg/util/json"
|
||||||
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||||
"k8s.io/client-go/dynamic"
|
"k8s.io/client-go/dynamic"
|
||||||
"k8s.io/utils/pointer"
|
|
||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
||||||
@ -62,8 +61,7 @@ var pruningFixture = &apiextensionsv1.CustomResourceDefinition{
|
|||||||
},
|
},
|
||||||
Schema: &apiextensionsv1.CustomResourceValidation{
|
Schema: &apiextensionsv1.CustomResourceValidation{
|
||||||
OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{
|
OpenAPIV3Schema: &apiextensionsv1.JSONSchemaProps{
|
||||||
XPreserveUnknownFields: pointer.BoolPtr(false),
|
Type: "object",
|
||||||
Type: "object",
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -21,18 +21,16 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
|
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
||||||
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"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
"k8s.io/client-go/dynamic"
|
"k8s.io/client-go/dynamic"
|
||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestHandlerScope(t *testing.T) {
|
func TestHandlerScope(t *testing.T) {
|
||||||
|
@ -388,7 +388,6 @@ func TestValidationSchemaWithStatus(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// fields other than properties in root schema are not allowed
|
|
||||||
noxuDefinition := newNoxuValidationCRDs()[0]
|
noxuDefinition := newNoxuValidationCRDs()[0]
|
||||||
|
|
||||||
// make sure we are not restricting fields to properties even in subschemas
|
// make sure we are not restricting fields to properties even in subschemas
|
||||||
@ -457,12 +456,10 @@ func TestValidateOnlyStatus(t *testing.T) {
|
|||||||
noxuDefinitions := NewNoxuSubresourcesCRDs(apiextensionsv1.NamespaceScoped)
|
noxuDefinitions := NewNoxuSubresourcesCRDs(apiextensionsv1.NamespaceScoped)
|
||||||
for _, noxuDefinition := range noxuDefinitions {
|
for _, noxuDefinition := range noxuDefinitions {
|
||||||
noxuDefinition.Spec.Versions[0].Schema = &apiextensionsv1.CustomResourceValidation{
|
noxuDefinition.Spec.Versions[0].Schema = &apiextensionsv1.CustomResourceValidation{
|
||||||
OpenAPIV3Schema: schema,
|
OpenAPIV3Schema: schema.DeepCopy(),
|
||||||
}
|
}
|
||||||
schemaWithDescription := schema.DeepCopy()
|
|
||||||
schemaWithDescription.Description = "test"
|
|
||||||
noxuDefinition.Spec.Versions[1].Schema = &apiextensionsv1.CustomResourceValidation{
|
noxuDefinition.Spec.Versions[1].Schema = &apiextensionsv1.CustomResourceValidation{
|
||||||
OpenAPIV3Schema: schemaWithDescription,
|
OpenAPIV3Schema: schema.DeepCopy(),
|
||||||
}
|
}
|
||||||
|
|
||||||
noxuDefinition, err = fixtures.CreateNewV1CustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
|
noxuDefinition, err = fixtures.CreateNewV1CustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
|
||||||
|
@ -647,21 +647,24 @@ func TestForbiddenFieldsInSchema(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
// v1 doesn't allow additional properties at all. this isn't necessary in v1.
|
existingProperties := validationSchema.OpenAPIV3Schema.Properties
|
||||||
//validationSchema.OpenAPIV3Schema.AdditionalProperties.Allows = false
|
validationSchema.OpenAPIV3Schema.Properties = nil
|
||||||
//_, err = fixtures.CreateNewV1CustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
|
validationSchema.OpenAPIV3Schema.AdditionalProperties = &apiextensionsv1.JSONSchemaPropsOrBool{Allows: false}
|
||||||
//if err == nil {
|
_, err = fixtures.CreateNewV1CustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
|
||||||
// t.Fatalf("unexpected non-error: additionalProperties cannot be set to false")
|
if err == nil {
|
||||||
//}
|
t.Fatalf("unexpected non-error: additionalProperties cannot be set to false")
|
||||||
|
}
|
||||||
|
// reset
|
||||||
|
validationSchema.OpenAPIV3Schema.Properties = existingProperties
|
||||||
|
validationSchema.OpenAPIV3Schema.AdditionalProperties = nil
|
||||||
|
|
||||||
validationSchema.OpenAPIV3Schema.Properties["zeta"] = apiextensionsv1.JSONSchemaProps{
|
validationSchema.OpenAPIV3Schema.Properties["zeta"] = apiextensionsv1.JSONSchemaProps{
|
||||||
Type: "array",
|
Type: "array",
|
||||||
UniqueItems: true,
|
UniqueItems: true,
|
||||||
|
AdditionalProperties: &apiextensionsv1.JSONSchemaPropsOrBool{
|
||||||
|
Allows: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// v1 doesn't allow additional properties at all. this isn't necessary in v1.
|
|
||||||
//validationSchema.OpenAPIV3Schema.AdditionalProperties.Allows = true
|
|
||||||
|
|
||||||
_, err = fixtures.CreateNewV1CustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
|
_, err = fixtures.CreateNewV1CustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatalf("unexpected non-error: uniqueItems cannot be set to true")
|
t.Fatalf("unexpected non-error: uniqueItems cannot be set to true")
|
||||||
|
@ -32,10 +32,9 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
|
||||||
|
|
||||||
apps "k8s.io/api/apps/v1"
|
apps "k8s.io/api/apps/v1"
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
"k8s.io/apiextensions-apiserver/test/integration/fixtures"
|
||||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
Loading…
Reference in New Issue
Block a user