From 6982747f81a736b59a52cb9d95b1115b17d59042 Mon Sep 17 00:00:00 2001 From: Max Smythe Date: Mon, 2 Aug 2021 21:25:11 +0000 Subject: [PATCH] Cherrypick empty parameters fix (#310) Signed-off-by: Max Smythe --- .../v1alpha1/constrainttemplate_types_test.go | 29 +++++++++++++ .../pkg/apis/templates/v1alpha1/conversion.go | 42 ++++++++++++++----- .../v1alpha1/zz_generated.conversion.go | 21 ---------- .../v1beta1/constrainttemplate_types_test.go | 29 +++++++++++++ .../pkg/apis/templates/v1beta1/conversion.go | 39 +++++++++++++---- .../v1beta1/zz_generated.conversion.go | 21 ---------- 6 files changed, 120 insertions(+), 61 deletions(-) diff --git a/constraint/pkg/apis/templates/v1alpha1/constrainttemplate_types_test.go b/constraint/pkg/apis/templates/v1alpha1/constrainttemplate_types_test.go index cc99dc581..61c2bb712 100644 --- a/constraint/pkg/apis/templates/v1alpha1/constrainttemplate_types_test.go +++ b/constraint/pkg/apis/templates/v1alpha1/constrainttemplate_types_test.go @@ -186,6 +186,17 @@ func TestValidationVersionConversionAndTransformation(t *testing.T) { }, error: false, }, + { + name: "Nil properties", + v: &Validation{ + OpenAPIV3Schema: nil, + }, + exp: &templates.Validation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + XPreserveUnknownFields: &trueBool, + }, + }, + }, } for _, tc := range testCases { @@ -201,3 +212,21 @@ func TestValidationVersionConversionAndTransformation(t *testing.T) { }) } } + +func TestEmptyConversion(t *testing.T) { + trueBool := true + expected := &templates.Validation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + XPreserveUnknownFields: &trueBool, + }, + } + in := &ConstraintTemplate{} + out := &templates.ConstraintTemplate{} + if err := Convert_v1alpha1_ConstraintTemplate_To_templates_ConstraintTemplate(in, out, nil); err != nil { + t.Fatalf("Conversion error: %v", err) + } + + if !reflect.DeepEqual(out.Spec.CRD.Spec.Validation, expected) { + t.Fatalf("Conversion does not match expected result: %v", cmp.Diff(out, expected)) + } +} diff --git a/constraint/pkg/apis/templates/v1alpha1/conversion.go b/constraint/pkg/apis/templates/v1alpha1/conversion.go index c1d219e82..d00b5f468 100644 --- a/constraint/pkg/apis/templates/v1alpha1/conversion.go +++ b/constraint/pkg/apis/templates/v1alpha1/conversion.go @@ -17,6 +17,7 @@ package v1alpha1 import ( apisTemplates "github.com/open-policy-agent/frameworks/constraint/pkg/apis/templates" + "github.com/open-policy-agent/frameworks/constraint/pkg/core/templates" coreTemplates "github.com/open-policy-agent/frameworks/constraint/pkg/core/templates" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" @@ -24,19 +25,40 @@ import ( ) func Convert_v1alpha1_Validation_To_templates_Validation(in *Validation, out *coreTemplates.Validation, s conversion.Scope) error { //nolint:golint - if in.OpenAPIV3Schema != nil { - inSchema := in.OpenAPIV3Schema.DeepCopy() - if err := apisTemplates.AddPreserveUnknownFields(inSchema); err != nil { - return err - } + inSchema := in.OpenAPIV3Schema + // to preserve legacy behavior, allow users to provide arbitrary parameters, regardless of whether the user specified them + if inSchema == nil { + inSchema = &apiextensionsv1beta1.JSONSchemaProps{} + } + + inSchemaCopy := inSchema.DeepCopy() + if err := apisTemplates.AddPreserveUnknownFields(inSchemaCopy); err != nil { + return err + } + + out.OpenAPIV3Schema = new(apiextensions.JSONSchemaProps) + if err := apiextensionsv1beta1.Convert_v1beta1_JSONSchemaProps_To_apiextensions_JSONSchemaProps(inSchemaCopy, out.OpenAPIV3Schema, s); err != nil { + return err + } - out.OpenAPIV3Schema = new(apiextensions.JSONSchemaProps) - if err := apiextensionsv1beta1.Convert_v1beta1_JSONSchemaProps_To_apiextensions_JSONSchemaProps(inSchema, out.OpenAPIV3Schema, s); err != nil { + return nil +} + +// Convert_v1alpha1_CRDSpec_To_templates_CRDSpec is an autogenerated conversion function. +func Convert_v1alpha1_CRDSpec_To_templates_CRDSpec(in *CRDSpec, out *templates.CRDSpec, s conversion.Scope) error { //nolint:golint + if err := Convert_v1alpha1_Names_To_templates_Names(&in.Names, &out.Names, s); err != nil { + return err + } + validation := in.Validation + if validation == nil { + validation = &Validation{} + } + { + in, out := &validation, &out.Validation + *out = new(templates.Validation) + if err := Convert_v1alpha1_Validation_To_templates_Validation(*in, *out, s); err != nil { return err } - - } else { - out.OpenAPIV3Schema = nil } return nil } diff --git a/constraint/pkg/apis/templates/v1alpha1/zz_generated.conversion.go b/constraint/pkg/apis/templates/v1alpha1/zz_generated.conversion.go index dfcd0e359..96d11f7f9 100644 --- a/constraint/pkg/apis/templates/v1alpha1/zz_generated.conversion.go +++ b/constraint/pkg/apis/templates/v1alpha1/zz_generated.conversion.go @@ -195,27 +195,6 @@ func Convert_templates_CRD_To_v1alpha1_CRD(in *templates.CRD, out *CRD, s conver return autoConvert_templates_CRD_To_v1alpha1_CRD(in, out, s) } -func autoConvert_v1alpha1_CRDSpec_To_templates_CRDSpec(in *CRDSpec, out *templates.CRDSpec, s conversion.Scope) error { - if err := Convert_v1alpha1_Names_To_templates_Names(&in.Names, &out.Names, s); err != nil { - return err - } - if in.Validation != nil { - in, out := &in.Validation, &out.Validation - *out = new(templates.Validation) - if err := Convert_v1alpha1_Validation_To_templates_Validation(*in, *out, s); err != nil { - return err - } - } else { - out.Validation = nil - } - return nil -} - -// Convert_v1alpha1_CRDSpec_To_templates_CRDSpec is an autogenerated conversion function. -func Convert_v1alpha1_CRDSpec_To_templates_CRDSpec(in *CRDSpec, out *templates.CRDSpec, s conversion.Scope) error { - return autoConvert_v1alpha1_CRDSpec_To_templates_CRDSpec(in, out, s) -} - func autoConvert_templates_CRDSpec_To_v1alpha1_CRDSpec(in *templates.CRDSpec, out *CRDSpec, s conversion.Scope) error { if err := Convert_templates_Names_To_v1alpha1_Names(&in.Names, &out.Names, s); err != nil { return err diff --git a/constraint/pkg/apis/templates/v1beta1/constrainttemplate_types_test.go b/constraint/pkg/apis/templates/v1beta1/constrainttemplate_types_test.go index ae8235a7c..66802860e 100644 --- a/constraint/pkg/apis/templates/v1beta1/constrainttemplate_types_test.go +++ b/constraint/pkg/apis/templates/v1beta1/constrainttemplate_types_test.go @@ -185,6 +185,17 @@ func TestValidationVersionConversionAndTransformation(t *testing.T) { }, error: false, }, + { + name: "Nil properties", + v: &Validation{ + OpenAPIV3Schema: nil, + }, + exp: &templates.Validation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + XPreserveUnknownFields: &trueBool, + }, + }, + }, } for _, tc := range testCases { @@ -200,3 +211,21 @@ func TestValidationVersionConversionAndTransformation(t *testing.T) { }) } } + +func TestEmptyConversion(t *testing.T) { + trueBool := true + expected := &templates.Validation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + XPreserveUnknownFields: &trueBool, + }, + } + in := &ConstraintTemplate{} + out := &templates.ConstraintTemplate{} + if err := Convert_v1beta1_ConstraintTemplate_To_templates_ConstraintTemplate(in, out, nil); err != nil { + t.Fatalf("Conversion error: %v", err) + } + + if !reflect.DeepEqual(out.Spec.CRD.Spec.Validation, expected) { + t.Fatalf("Conversion does not match expected result: %v", cmp.Diff(out, expected)) + } +} diff --git a/constraint/pkg/apis/templates/v1beta1/conversion.go b/constraint/pkg/apis/templates/v1beta1/conversion.go index 0be982509..4d98cfbfe 100644 --- a/constraint/pkg/apis/templates/v1beta1/conversion.go +++ b/constraint/pkg/apis/templates/v1beta1/conversion.go @@ -17,6 +17,7 @@ package v1beta1 import ( apisTemplates "github.com/open-policy-agent/frameworks/constraint/pkg/apis/templates" + "github.com/open-policy-agent/frameworks/constraint/pkg/core/templates" coreTemplates "github.com/open-policy-agent/frameworks/constraint/pkg/core/templates" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" @@ -24,18 +25,38 @@ import ( ) func Convert_v1beta1_Validation_To_templates_Validation(in *Validation, out *coreTemplates.Validation, s conversion.Scope) error { //nolint:golint - if in.OpenAPIV3Schema != nil { - inSchemaCopy := in.OpenAPIV3Schema.DeepCopy() - if err := apisTemplates.AddPreserveUnknownFields(inSchemaCopy); err != nil { - return err - } + inSchema := in.OpenAPIV3Schema + // to preserve legacy behavior, allow users to provide arbitrary parameters, regardless of whether the user specified them + if inSchema == nil { + inSchema = &apiextensionsv1beta1.JSONSchemaProps{} + } - out.OpenAPIV3Schema = new(apiextensions.JSONSchemaProps) - if err := apiextensionsv1beta1.Convert_v1beta1_JSONSchemaProps_To_apiextensions_JSONSchemaProps(inSchemaCopy, out.OpenAPIV3Schema, s); err != nil { + inSchemaCopy := inSchema.DeepCopy() + if err := apisTemplates.AddPreserveUnknownFields(inSchemaCopy); err != nil { + return err + } + + out.OpenAPIV3Schema = new(apiextensions.JSONSchemaProps) + if err := apiextensionsv1beta1.Convert_v1beta1_JSONSchemaProps_To_apiextensions_JSONSchemaProps(inSchemaCopy, out.OpenAPIV3Schema, s); err != nil { + return err + } + return nil +} + +func Convert_v1beta1_CRDSpec_To_templates_CRDSpec(in *CRDSpec, out *templates.CRDSpec, s conversion.Scope) error { //nolint:golint + if err := Convert_v1beta1_Names_To_templates_Names(&in.Names, &out.Names, s); err != nil { + return err + } + validation := in.Validation + if validation == nil { + validation = &Validation{} + } + { + in, out := &validation, &out.Validation + *out = new(templates.Validation) + if err := Convert_v1beta1_Validation_To_templates_Validation(*in, *out, s); err != nil { return err } - } else { - out.OpenAPIV3Schema = nil } return nil } diff --git a/constraint/pkg/apis/templates/v1beta1/zz_generated.conversion.go b/constraint/pkg/apis/templates/v1beta1/zz_generated.conversion.go index 651e4beb0..710329c55 100644 --- a/constraint/pkg/apis/templates/v1beta1/zz_generated.conversion.go +++ b/constraint/pkg/apis/templates/v1beta1/zz_generated.conversion.go @@ -195,27 +195,6 @@ func Convert_templates_CRD_To_v1beta1_CRD(in *templates.CRD, out *CRD, s convers return autoConvert_templates_CRD_To_v1beta1_CRD(in, out, s) } -func autoConvert_v1beta1_CRDSpec_To_templates_CRDSpec(in *CRDSpec, out *templates.CRDSpec, s conversion.Scope) error { - if err := Convert_v1beta1_Names_To_templates_Names(&in.Names, &out.Names, s); err != nil { - return err - } - if in.Validation != nil { - in, out := &in.Validation, &out.Validation - *out = new(templates.Validation) - if err := Convert_v1beta1_Validation_To_templates_Validation(*in, *out, s); err != nil { - return err - } - } else { - out.Validation = nil - } - return nil -} - -// Convert_v1beta1_CRDSpec_To_templates_CRDSpec is an autogenerated conversion function. -func Convert_v1beta1_CRDSpec_To_templates_CRDSpec(in *CRDSpec, out *templates.CRDSpec, s conversion.Scope) error { - return autoConvert_v1beta1_CRDSpec_To_templates_CRDSpec(in, out, s) -} - func autoConvert_templates_CRDSpec_To_v1beta1_CRDSpec(in *templates.CRDSpec, out *CRDSpec, s conversion.Scope) error { if err := Convert_templates_Names_To_v1beta1_Names(&in.Names, &out.Names, s); err != nil { return err