Skip to content

Commit

Permalink
ConstraintTemplate versions use apiextensionsv1
Browse files Browse the repository at this point in the history
Previously, I left ConstraintTemplate (CT) versions v1alpha1 and v1beta1
using apiextensionsv1beta1.JSONSchemaProps.  I thought this appropriate,
given that was what they were previously implemented as.  v1 CT, on the
other hand, would use v1beta1 JSONSchemaProps.

This turns out to be a bad idea.

Any logic we write that interacts with OpenAPIV3Schema in a CT's
Validation section is forced to interact with OpenAPIV3Schema's type.
Before this PR, that type is apiextensionsv1beta1.JSONSchemaProps.  This
makes our life difficult, as v1 CT's version of this variable will have
a different type.  This would then require us to re-implement any logic
for this section to implement a second type, or to do some gross
conversions.

Further, apiextensionsv1beta1 will be removed from
k8s.io/apiextensions-apiserver, preventing us from upgrading that
library without doing this work.

Basically, this change is unavoidable and appropriate.

This blocks open-policy-agent#121

Contributes to open-policy-agent/gatekeeper#550

Signed-off-by: juliankatz <juliankatz@google.com>
  • Loading branch information
julianKatz committed Jun 9, 2021
1 parent 5c03494 commit 88ba532
Show file tree
Hide file tree
Showing 10 changed files with 118 additions and 118 deletions.
10 changes: 5 additions & 5 deletions constraint/pkg/apis/templates/transform.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ package templates
import (
"fmt"

apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
)

// AddPreserveUnknownFields recurses through an *apiextensionsv1beta1.JSONSchemaProps
// AddPreserveUnknownFields recurses through an *apiextensionsv1.JSONSchemaProps
// data structure, adding `x-kubernetes-preserve-unknown-fields: true` at every level
// that type is equal to "object", "array", or is undefined.
func AddPreserveUnknownFields(sch *apiextensionsv1beta1.JSONSchemaProps) error {
func AddPreserveUnknownFields(sch *apiextensionsv1.JSONSchemaProps) error {
switch sch.Type {
// An object can have values not described in the schema. A blank Type could be anything,
// including an object, so we add x-kubernetes-preserve-unknown-fields: true to both.
Expand All @@ -37,8 +37,8 @@ func AddPreserveUnknownFields(sch *apiextensionsv1beta1.JSONSchemaProps) error {
// this structural item schema requirement.
if sch.Items == nil || (sch.Items.Schema == nil && sch.Items.JSONSchemas == nil) {
tr := true
sch.Items = &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
sch.Items = &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &tr,
},
}
Expand Down
154 changes: 77 additions & 77 deletions constraint/pkg/apis/templates/transform_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,92 +20,92 @@ import (
"testing"

"github.com/google/go-cmp/cmp"
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
)

func TestAddPreserveUnknownFields(t *testing.T) {
trueBool := true
testCases := []struct {
name string
v *apiextensionsv1beta1.JSONSchemaProps
exp *apiextensionsv1beta1.JSONSchemaProps
v *apiextensionsv1.JSONSchemaProps
exp *apiextensionsv1.JSONSchemaProps
error bool
}{
{
name: "no information",
v: &apiextensionsv1beta1.JSONSchemaProps{},
exp: &apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{},
exp: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
},
},
{
name: "nil properties",
v: &apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{
Properties: nil,
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
Properties: nil,
},
},
{
name: "x-kubernetes-preserve-unknown-fields is present already and true",
v: &apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
},
},
{
name: "type object with no Properties",
v: &apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{
Type: "object",
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
Type: "object",
},
},
{
name: "type array with no Items",
v: &apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{
Type: "array",
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
Type: "array",
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
},
},
},
},
{
name: "type array with Items but no schemas",
v: &apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{
Type: "array",
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{},
Items: &apiextensionsv1.JSONSchemaPropsOrArray{},
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
Type: "array",
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
},
},
},
},
{
name: "map with empty JSONSchemaProps value",
v: &apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"foo": {},
},
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"foo": {
XPreserveUnknownFields: &trueBool,
},
Expand All @@ -114,24 +114,24 @@ func TestAddPreserveUnknownFields(t *testing.T) {
},
{
name: "Items with no type: array",
v: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
Type: "object",
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"key": {Type: "string"},
"allowedRegex": {Type: "string"},
},
},
},
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
Type: "object",
XPreserveUnknownFields: &trueBool,
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"key": {Type: "string"},
"allowedRegex": {Type: "string"},
},
Expand All @@ -141,27 +141,27 @@ func TestAddPreserveUnknownFields(t *testing.T) {
},
{
name: "Recuse through doubly-nested properties",
v: &apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{
Type: "object",
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"foo": {
Type: "object",
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"bar": {
Type: "string",
},
},
},
},
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
Type: "object",
XPreserveUnknownFields: &trueBool,
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"foo": {
Type: "object",
XPreserveUnknownFields: &trueBool,
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"bar": {
Type: "string",
},
Expand All @@ -172,15 +172,15 @@ func TestAddPreserveUnknownFields(t *testing.T) {
},
{
name: "Recurse through triply-nested properties",
v: &apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{
Type: "object",
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"foo": {
Type: "object",
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"bar": {
Type: "object",
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"burrito": {
Type: "string",
},
Expand All @@ -190,18 +190,18 @@ func TestAddPreserveUnknownFields(t *testing.T) {
},
},
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
Type: "object",
XPreserveUnknownFields: &trueBool,
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"foo": {
Type: "object",
XPreserveUnknownFields: &trueBool,
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"bar": {
Type: "object",
XPreserveUnknownFields: &trueBool,
Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{
Properties: map[string]apiextensionsv1.JSONSchemaProps{
"burrito": {
Type: "string",
},
Expand All @@ -214,24 +214,24 @@ func TestAddPreserveUnknownFields(t *testing.T) {
},
{
name: "Recurse through doubly-nested Items with no type information",
v: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
Type: "string",
},
},
},
},
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
Type: "string",
},
},
Expand All @@ -241,26 +241,26 @@ func TestAddPreserveUnknownFields(t *testing.T) {
},
{
name: "Recurse through doubly-nested Items with array type",
v: &apiextensionsv1beta1.JSONSchemaProps{
v: &apiextensionsv1.JSONSchemaProps{
Type: "array",
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
Type: "array",
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
Type: "string",
},
},
},
},
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
Type: "array",
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
Type: "array",
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
Schema: &apiextensionsv1.JSONSchemaProps{
Type: "string",
},
},
Expand All @@ -270,21 +270,21 @@ func TestAddPreserveUnknownFields(t *testing.T) {
},
{
name: "Recurse through doubly-nested AdditionalProperties",
v: &apiextensionsv1beta1.JSONSchemaProps{
AdditionalProperties: &apiextensionsv1beta1.JSONSchemaPropsOrBool{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
AdditionalProperties: &apiextensionsv1beta1.JSONSchemaPropsOrBool{
v: &apiextensionsv1.JSONSchemaProps{
AdditionalProperties: &apiextensionsv1.JSONSchemaPropsOrBool{
Schema: &apiextensionsv1.JSONSchemaProps{
AdditionalProperties: &apiextensionsv1.JSONSchemaPropsOrBool{
Allows: false,
},
},
},
},
exp: &apiextensionsv1beta1.JSONSchemaProps{
exp: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
AdditionalProperties: &apiextensionsv1beta1.JSONSchemaPropsOrBool{
Schema: &apiextensionsv1beta1.JSONSchemaProps{
AdditionalProperties: &apiextensionsv1.JSONSchemaPropsOrBool{
Schema: &apiextensionsv1.JSONSchemaProps{
XPreserveUnknownFields: &trueBool,
AdditionalProperties: &apiextensionsv1beta1.JSONSchemaPropsOrBool{
AdditionalProperties: &apiextensionsv1.JSONSchemaPropsOrBool{
Allows: false,
},
},
Expand All @@ -293,9 +293,9 @@ func TestAddPreserveUnknownFields(t *testing.T) {
},
{
name: "JSONSchemas not supported",
v: &apiextensionsv1beta1.JSONSchemaProps{
Items: &apiextensionsv1beta1.JSONSchemaPropsOrArray{
JSONSchemas: []apiextensionsv1beta1.JSONSchemaProps{},
v: &apiextensionsv1.JSONSchemaProps{
Items: &apiextensionsv1.JSONSchemaPropsOrArray{
JSONSchemas: []apiextensionsv1.JSONSchemaProps{},
},
},
error: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ limitations under the License.
package v1alpha1

import (
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

Expand Down Expand Up @@ -47,7 +47,7 @@ type Validation struct {
// +kubebuilder:validation:Schemaless
// +kubebuilder:validation:Type=object
// +kubebuilder:pruning:PreserveUnknownFields
OpenAPIV3Schema *apiextensionsv1beta1.JSONSchemaProps `json:"openAPIV3Schema,omitempty"`
OpenAPIV3Schema *apiextensionsv1.JSONSchemaProps `json:"openAPIV3Schema,omitempty"`
}

type Target struct {
Expand Down
Loading

0 comments on commit 88ba532

Please sign in to comment.