mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	CRD v1: copy v1beta1 types to v1
This commit is contained in:
		@@ -351,6 +351,25 @@ API rule violation: list_type_missing,k8s.io/api/storage/v1beta1,StorageClass,Al
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/api/storage/v1beta1,StorageClass,MountOptions
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/api/storage/v1beta1,StorageClassList,Items
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/api/storage/v1beta1,VolumeAttachmentList,Items
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,ConversionRequest,Objects
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,ConversionResponse,ConvertedObjects
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,CustomResourceDefinitionList,Items
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,CustomResourceDefinitionNames,Categories
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,CustomResourceDefinitionNames,ShortNames
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,CustomResourceDefinitionSpec,Versions
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,CustomResourceDefinitionStatus,Conditions
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,CustomResourceDefinitionStatus,StoredVersions
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,CustomResourceDefinitionVersion,AdditionalPrinterColumns
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSON,Raw
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,AllOf
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,AnyOf
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,Enum
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,OneOf
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,Required
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaPropsOrArray,JSONSchemas
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaPropsOrStringArray,Property
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,WebhookClientConfig,CABundle
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,WebhookConversion,ConversionReviewVersions
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,ConversionRequest,Objects
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,ConversionResponse,ConvertedObjects
 | 
			
		||||
API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,CustomResourceConversion,ConversionReviewVersions
 | 
			
		||||
@@ -498,6 +517,18 @@ API rule violation: names_match,k8s.io/api/core/v1,RBDVolumeSource,RadosUser
 | 
			
		||||
API rule violation: names_match,k8s.io/api/core/v1,VolumeSource,CephFS
 | 
			
		||||
API rule violation: names_match,k8s.io/api/core/v1,VolumeSource,StorageOS
 | 
			
		||||
API rule violation: names_match,k8s.io/api/policy/v1beta1,PodDisruptionBudgetStatus,PodDisruptionsAllowed
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSON,Raw
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,Ref
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,Schema
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,XEmbeddedResource
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,XIntOrString
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,XPreserveUnknownFields
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaPropsOrArray,JSONSchemas
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaPropsOrArray,Schema
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaPropsOrBool,Allows
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaPropsOrBool,Schema
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaPropsOrStringArray,Property
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaPropsOrStringArray,Schema
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,CustomResourceColumnDefinition,JSONPath
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSON,Raw
 | 
			
		||||
API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaProps,Ref
 | 
			
		||||
 
 | 
			
		||||
@@ -306,6 +306,7 @@ staging/src/k8s.io/api/storage/v1beta1
 | 
			
		||||
staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr
 | 
			
		||||
staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1
 | 
			
		||||
staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions
 | 
			
		||||
staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1
 | 
			
		||||
staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1
 | 
			
		||||
staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver
 | 
			
		||||
staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,73 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package v1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"k8s.io/apimachinery/pkg/conversion"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/json"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func addConversionFuncs(scheme *runtime.Scheme) error {
 | 
			
		||||
	// Add non-generated conversion functions
 | 
			
		||||
	err := scheme.AddConversionFuncs(
 | 
			
		||||
		Convert_apiextensions_JSONSchemaProps_To_v1_JSONSchemaProps,
 | 
			
		||||
		Convert_apiextensions_JSON_To_v1_JSON,
 | 
			
		||||
		Convert_v1_JSON_To_apiextensions_JSON,
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Convert_apiextensions_JSONSchemaProps_To_v1_JSONSchemaProps(in *apiextensions.JSONSchemaProps, out *JSONSchemaProps, s conversion.Scope) error {
 | 
			
		||||
	if err := autoConvert_apiextensions_JSONSchemaProps_To_v1_JSONSchemaProps(in, out, s); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if in.Default != nil && *(in.Default) == nil {
 | 
			
		||||
		out.Default = nil
 | 
			
		||||
	}
 | 
			
		||||
	if in.Example != nil && *(in.Example) == nil {
 | 
			
		||||
		out.Example = nil
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Convert_apiextensions_JSON_To_v1_JSON(in *apiextensions.JSON, out *JSON, s conversion.Scope) error {
 | 
			
		||||
	raw, err := json.Marshal(*in)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	out.Raw = raw
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Convert_v1_JSON_To_apiextensions_JSON(in *JSON, out *apiextensions.JSON, s conversion.Scope) error {
 | 
			
		||||
	if in != nil {
 | 
			
		||||
		var i interface{}
 | 
			
		||||
		if err := json.Unmarshal(in.Raw, &i); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		*out = i
 | 
			
		||||
	} else {
 | 
			
		||||
		out = nil
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,113 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package v1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestJSONConversion(t *testing.T) {
 | 
			
		||||
	nilJSON := apiextensions.JSON(nil)
 | 
			
		||||
	nullJSON := apiextensions.JSON("null")
 | 
			
		||||
	stringJSON := apiextensions.JSON("foo")
 | 
			
		||||
	boolJSON := apiextensions.JSON(true)
 | 
			
		||||
	sliceJSON := apiextensions.JSON([]string{"foo", "bar", "baz"})
 | 
			
		||||
 | 
			
		||||
	testCases := map[string]struct {
 | 
			
		||||
		input    *apiextensions.JSONSchemaProps
 | 
			
		||||
		expected *JSONSchemaProps
 | 
			
		||||
	}{
 | 
			
		||||
		"nil": {
 | 
			
		||||
			input: &apiextensions.JSONSchemaProps{
 | 
			
		||||
				Default: nil,
 | 
			
		||||
			},
 | 
			
		||||
			expected: &JSONSchemaProps{},
 | 
			
		||||
		},
 | 
			
		||||
		"aliased nil": {
 | 
			
		||||
			input: &apiextensions.JSONSchemaProps{
 | 
			
		||||
				Default: &nilJSON,
 | 
			
		||||
			},
 | 
			
		||||
			expected: &JSONSchemaProps{},
 | 
			
		||||
		},
 | 
			
		||||
		"null": {
 | 
			
		||||
			input: &apiextensions.JSONSchemaProps{
 | 
			
		||||
				Default: &nullJSON,
 | 
			
		||||
			},
 | 
			
		||||
			expected: &JSONSchemaProps{
 | 
			
		||||
				Default: &JSON{
 | 
			
		||||
					Raw: []byte(`"null"`),
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		"string": {
 | 
			
		||||
			input: &apiextensions.JSONSchemaProps{
 | 
			
		||||
				Default: &stringJSON,
 | 
			
		||||
			},
 | 
			
		||||
			expected: &JSONSchemaProps{
 | 
			
		||||
				Default: &JSON{
 | 
			
		||||
					Raw: []byte(`"foo"`),
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		"bool": {
 | 
			
		||||
			input: &apiextensions.JSONSchemaProps{
 | 
			
		||||
				Default: &boolJSON,
 | 
			
		||||
			},
 | 
			
		||||
			expected: &JSONSchemaProps{
 | 
			
		||||
				Default: &JSON{
 | 
			
		||||
					Raw: []byte(`true`),
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		"slice": {
 | 
			
		||||
			input: &apiextensions.JSONSchemaProps{
 | 
			
		||||
				Default: &sliceJSON,
 | 
			
		||||
			},
 | 
			
		||||
			expected: &JSONSchemaProps{
 | 
			
		||||
				Default: &JSON{
 | 
			
		||||
					Raw: []byte(`["foo","bar","baz"]`),
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	scheme := runtime.NewScheme()
 | 
			
		||||
 | 
			
		||||
	// add internal and external types
 | 
			
		||||
	if err := apiextensions.AddToScheme(scheme); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if err := AddToScheme(scheme); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for k, tc := range testCases {
 | 
			
		||||
		external := &JSONSchemaProps{}
 | 
			
		||||
		if err := scheme.Convert(tc.input, external, nil); err != nil {
 | 
			
		||||
			t.Errorf("%s: unexpected error: %v", k, err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if !reflect.DeepEqual(external, tc.expected) {
 | 
			
		||||
			t.Errorf("%s: expected\n\t%#v, got \n\t%#v", k, tc.expected, external)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,248 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package v1
 | 
			
		||||
 | 
			
		||||
// TODO: Update this after a tag is created for interface fields in DeepCopy
 | 
			
		||||
func (in *JSONSchemaProps) DeepCopy() *JSONSchemaProps {
 | 
			
		||||
	if in == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	out := new(JSONSchemaProps)
 | 
			
		||||
	*out = *in
 | 
			
		||||
 | 
			
		||||
	if in.Ref != nil {
 | 
			
		||||
		in, out := &in.Ref, &out.Ref
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(string)
 | 
			
		||||
			**out = **in
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.Maximum != nil {
 | 
			
		||||
		in, out := &in.Maximum, &out.Maximum
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(float64)
 | 
			
		||||
			**out = **in
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.Minimum != nil {
 | 
			
		||||
		in, out := &in.Minimum, &out.Minimum
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(float64)
 | 
			
		||||
			**out = **in
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.MaxLength != nil {
 | 
			
		||||
		in, out := &in.MaxLength, &out.MaxLength
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(int64)
 | 
			
		||||
			**out = **in
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.MinLength != nil {
 | 
			
		||||
		in, out := &in.MinLength, &out.MinLength
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(int64)
 | 
			
		||||
			**out = **in
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if in.MaxItems != nil {
 | 
			
		||||
		in, out := &in.MaxItems, &out.MaxItems
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(int64)
 | 
			
		||||
			**out = **in
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.MinItems != nil {
 | 
			
		||||
		in, out := &in.MinItems, &out.MinItems
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(int64)
 | 
			
		||||
			**out = **in
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.MultipleOf != nil {
 | 
			
		||||
		in, out := &in.MultipleOf, &out.MultipleOf
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(float64)
 | 
			
		||||
			**out = **in
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.MaxProperties != nil {
 | 
			
		||||
		in, out := &in.MaxProperties, &out.MaxProperties
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(int64)
 | 
			
		||||
			**out = **in
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.MinProperties != nil {
 | 
			
		||||
		in, out := &in.MinProperties, &out.MinProperties
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(int64)
 | 
			
		||||
			**out = **in
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.Required != nil {
 | 
			
		||||
		in, out := &in.Required, &out.Required
 | 
			
		||||
		*out = make([]string, len(*in))
 | 
			
		||||
		copy(*out, *in)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.Items != nil {
 | 
			
		||||
		in, out := &in.Items, &out.Items
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(JSONSchemaPropsOrArray)
 | 
			
		||||
			(*in).DeepCopyInto(*out)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.AllOf != nil {
 | 
			
		||||
		in, out := &in.AllOf, &out.AllOf
 | 
			
		||||
		*out = make([]JSONSchemaProps, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			(*in)[i].DeepCopyInto(&(*out)[i])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.OneOf != nil {
 | 
			
		||||
		in, out := &in.OneOf, &out.OneOf
 | 
			
		||||
		*out = make([]JSONSchemaProps, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			(*in)[i].DeepCopyInto(&(*out)[i])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if in.AnyOf != nil {
 | 
			
		||||
		in, out := &in.AnyOf, &out.AnyOf
 | 
			
		||||
		*out = make([]JSONSchemaProps, len(*in))
 | 
			
		||||
		for i := range *in {
 | 
			
		||||
			(*in)[i].DeepCopyInto(&(*out)[i])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.Not != nil {
 | 
			
		||||
		in, out := &in.Not, &out.Not
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(JSONSchemaProps)
 | 
			
		||||
			(*in).DeepCopyInto(*out)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.Properties != nil {
 | 
			
		||||
		in, out := &in.Properties, &out.Properties
 | 
			
		||||
		*out = make(map[string]JSONSchemaProps, len(*in))
 | 
			
		||||
		for key, val := range *in {
 | 
			
		||||
			(*out)[key] = *val.DeepCopy()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.AdditionalProperties != nil {
 | 
			
		||||
		in, out := &in.AdditionalProperties, &out.AdditionalProperties
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(JSONSchemaPropsOrBool)
 | 
			
		||||
			(*in).DeepCopyInto(*out)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.PatternProperties != nil {
 | 
			
		||||
		in, out := &in.PatternProperties, &out.PatternProperties
 | 
			
		||||
		*out = make(map[string]JSONSchemaProps, len(*in))
 | 
			
		||||
		for key, val := range *in {
 | 
			
		||||
			(*out)[key] = *val.DeepCopy()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.Dependencies != nil {
 | 
			
		||||
		in, out := &in.Dependencies, &out.Dependencies
 | 
			
		||||
		*out = make(JSONSchemaDependencies, len(*in))
 | 
			
		||||
		for key, val := range *in {
 | 
			
		||||
			(*out)[key] = *val.DeepCopy()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.AdditionalItems != nil {
 | 
			
		||||
		in, out := &in.AdditionalItems, &out.AdditionalItems
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(JSONSchemaPropsOrBool)
 | 
			
		||||
			(*in).DeepCopyInto(*out)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.Definitions != nil {
 | 
			
		||||
		in, out := &in.Definitions, &out.Definitions
 | 
			
		||||
		*out = make(JSONSchemaDefinitions, len(*in))
 | 
			
		||||
		for key, val := range *in {
 | 
			
		||||
			(*out)[key] = *val.DeepCopy()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.ExternalDocs != nil {
 | 
			
		||||
		in, out := &in.ExternalDocs, &out.ExternalDocs
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(ExternalDocumentation)
 | 
			
		||||
			(*in).DeepCopyInto(*out)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if in.XPreserveUnknownFields != nil {
 | 
			
		||||
		in, out := &in.XPreserveUnknownFields, &out.XPreserveUnknownFields
 | 
			
		||||
		if *in == nil {
 | 
			
		||||
			*out = nil
 | 
			
		||||
		} else {
 | 
			
		||||
			*out = new(bool)
 | 
			
		||||
			**out = **in
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,82 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package v1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	utilpointer "k8s.io/utils/pointer"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func addDefaultingFuncs(scheme *runtime.Scheme) error {
 | 
			
		||||
	return RegisterDefaults(scheme)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_CustomResourceDefinition(obj *CustomResourceDefinition) {
 | 
			
		||||
	SetDefaults_CustomResourceDefinitionSpec(&obj.Spec)
 | 
			
		||||
	if len(obj.Status.StoredVersions) == 0 {
 | 
			
		||||
		for _, v := range obj.Spec.Versions {
 | 
			
		||||
			if v.Storage {
 | 
			
		||||
				obj.Status.StoredVersions = append(obj.Status.StoredVersions, v.Name)
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetDefaults_CustomResourceDefinitionSpec(obj *CustomResourceDefinitionSpec) {
 | 
			
		||||
	if len(obj.Scope) == 0 {
 | 
			
		||||
		obj.Scope = NamespaceScoped
 | 
			
		||||
	}
 | 
			
		||||
	if len(obj.Names.Singular) == 0 {
 | 
			
		||||
		obj.Names.Singular = strings.ToLower(obj.Names.Kind)
 | 
			
		||||
	}
 | 
			
		||||
	if len(obj.Names.ListKind) == 0 && len(obj.Names.Kind) > 0 {
 | 
			
		||||
		obj.Names.ListKind = obj.Names.Kind + "List"
 | 
			
		||||
	}
 | 
			
		||||
	// If there is no list of versions, create on using deprecated Version field.
 | 
			
		||||
	if len(obj.Versions) == 0 && len(obj.Version) != 0 {
 | 
			
		||||
		obj.Versions = []CustomResourceDefinitionVersion{{
 | 
			
		||||
			Name:    obj.Version,
 | 
			
		||||
			Storage: true,
 | 
			
		||||
			Served:  true,
 | 
			
		||||
		}}
 | 
			
		||||
	}
 | 
			
		||||
	// For backward compatibility set the version field to the first item in versions list.
 | 
			
		||||
	if len(obj.Version) == 0 && len(obj.Versions) != 0 {
 | 
			
		||||
		obj.Version = obj.Versions[0].Name
 | 
			
		||||
	}
 | 
			
		||||
	if obj.Conversion == nil {
 | 
			
		||||
		obj.Conversion = &CustomResourceConversion{
 | 
			
		||||
			Strategy: NoneConverter,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if obj.Conversion.Strategy == WebhookConverter && len(obj.Conversion.ConversionReviewVersions) == 0 {
 | 
			
		||||
		obj.Conversion.ConversionReviewVersions = []string{SchemeGroupVersion.Version}
 | 
			
		||||
	}
 | 
			
		||||
	if obj.PreserveUnknownFields == nil {
 | 
			
		||||
		obj.PreserveUnknownFields = utilpointer.BoolPtr(true)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetDefaults_ServiceReference sets defaults for Webhook's ServiceReference
 | 
			
		||||
func SetDefaults_ServiceReference(obj *ServiceReference) {
 | 
			
		||||
	if obj.Port == nil {
 | 
			
		||||
		obj.Port = utilpointer.Int32Ptr(443)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,144 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package v1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/google/go-cmp/cmp"
 | 
			
		||||
 | 
			
		||||
	apiequality "k8s.io/apimachinery/pkg/api/equality"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	utilpointer "k8s.io/utils/pointer"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestDefaults(t *testing.T) {
 | 
			
		||||
	scheme := runtime.NewScheme()
 | 
			
		||||
	AddToScheme(scheme)
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name     string
 | 
			
		||||
		original *CustomResourceDefinition
 | 
			
		||||
		expected *CustomResourceDefinition
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name:     "empty",
 | 
			
		||||
			original: &CustomResourceDefinition{},
 | 
			
		||||
			expected: &CustomResourceDefinition{
 | 
			
		||||
				Spec: CustomResourceDefinitionSpec{
 | 
			
		||||
					Scope:                 NamespaceScoped,
 | 
			
		||||
					Conversion:            &CustomResourceConversion{Strategy: NoneConverter},
 | 
			
		||||
					PreserveUnknownFields: utilpointer.BoolPtr(true),
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "conversion defaults",
 | 
			
		||||
			original: &CustomResourceDefinition{
 | 
			
		||||
				Spec: CustomResourceDefinitionSpec{
 | 
			
		||||
					Scope: NamespaceScoped,
 | 
			
		||||
					Conversion: &CustomResourceConversion{
 | 
			
		||||
						Strategy: WebhookConverter,
 | 
			
		||||
						WebhookClientConfig: &WebhookClientConfig{
 | 
			
		||||
							Service: &ServiceReference{},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					PreserveUnknownFields: utilpointer.BoolPtr(true),
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expected: &CustomResourceDefinition{
 | 
			
		||||
				Spec: CustomResourceDefinitionSpec{
 | 
			
		||||
					Scope: NamespaceScoped,
 | 
			
		||||
					Conversion: &CustomResourceConversion{
 | 
			
		||||
						Strategy:                 WebhookConverter,
 | 
			
		||||
						ConversionReviewVersions: []string{"v1"},
 | 
			
		||||
						WebhookClientConfig: &WebhookClientConfig{
 | 
			
		||||
							Service: &ServiceReference{Port: utilpointer.Int32Ptr(443)},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					PreserveUnknownFields: utilpointer.BoolPtr(true),
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "storage status defaults",
 | 
			
		||||
			original: &CustomResourceDefinition{
 | 
			
		||||
				Spec: CustomResourceDefinitionSpec{
 | 
			
		||||
					Scope:                 NamespaceScoped,
 | 
			
		||||
					Conversion:            &CustomResourceConversion{Strategy: NoneConverter},
 | 
			
		||||
					PreserveUnknownFields: utilpointer.BoolPtr(true),
 | 
			
		||||
					Versions: []CustomResourceDefinitionVersion{
 | 
			
		||||
						{Name: "v1", Storage: false, Served: true},
 | 
			
		||||
						{Name: "v2", Storage: true, Served: true},
 | 
			
		||||
						{Name: "v3", Storage: false, Served: true},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expected: &CustomResourceDefinition{
 | 
			
		||||
				Spec: CustomResourceDefinitionSpec{
 | 
			
		||||
					Scope:                 NamespaceScoped,
 | 
			
		||||
					Conversion:            &CustomResourceConversion{Strategy: NoneConverter},
 | 
			
		||||
					PreserveUnknownFields: utilpointer.BoolPtr(true),
 | 
			
		||||
					Version:               "v1",
 | 
			
		||||
					Versions: []CustomResourceDefinitionVersion{
 | 
			
		||||
						{Name: "v1", Storage: false, Served: true},
 | 
			
		||||
						{Name: "v2", Storage: true, Served: true},
 | 
			
		||||
						{Name: "v3", Storage: false, Served: true},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Status: CustomResourceDefinitionStatus{
 | 
			
		||||
					StoredVersions: []string{"v2"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "version defaults",
 | 
			
		||||
			original: &CustomResourceDefinition{
 | 
			
		||||
				Spec: CustomResourceDefinitionSpec{
 | 
			
		||||
					Scope:                 NamespaceScoped,
 | 
			
		||||
					Conversion:            &CustomResourceConversion{Strategy: NoneConverter},
 | 
			
		||||
					PreserveUnknownFields: utilpointer.BoolPtr(true),
 | 
			
		||||
					Version:               "v1",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			expected: &CustomResourceDefinition{
 | 
			
		||||
				Spec: CustomResourceDefinitionSpec{
 | 
			
		||||
					Scope:                 NamespaceScoped,
 | 
			
		||||
					Conversion:            &CustomResourceConversion{Strategy: NoneConverter},
 | 
			
		||||
					PreserveUnknownFields: utilpointer.BoolPtr(true),
 | 
			
		||||
					Version:               "v1",
 | 
			
		||||
					Versions: []CustomResourceDefinitionVersion{
 | 
			
		||||
						{Name: "v1", Storage: true, Served: true},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Status: CustomResourceDefinitionStatus{
 | 
			
		||||
					StoredVersions: []string{"v1"},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, test := range tests {
 | 
			
		||||
		t.Run(test.name, func(t *testing.T) {
 | 
			
		||||
			original := test.original
 | 
			
		||||
			expected := test.expected
 | 
			
		||||
			scheme.Default(original)
 | 
			
		||||
			if !apiequality.Semantic.DeepEqual(original, expected) {
 | 
			
		||||
				t.Errorf("expected vs got:\n%s", cmp.Diff(test.expected, original))
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen=package
 | 
			
		||||
// +k8s:protobuf-gen=package
 | 
			
		||||
// +k8s:conversion-gen=k8s.io/apiextensions-apiserver/pkg/apis/apiextensions
 | 
			
		||||
// +k8s:defaulter-gen=TypeMeta
 | 
			
		||||
// +k8s:openapi-gen=true
 | 
			
		||||
// +groupName=apiextensions.k8s.io
 | 
			
		||||
 | 
			
		||||
// Package v1 is the v1 version of the API.
 | 
			
		||||
package v1 // import "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 | 
			
		||||
@@ -0,0 +1,135 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package v1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/json"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var jsTrue = []byte("true")
 | 
			
		||||
var jsFalse = []byte("false")
 | 
			
		||||
 | 
			
		||||
func (s JSONSchemaPropsOrBool) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	if s.Schema != nil {
 | 
			
		||||
		return json.Marshal(s.Schema)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if s.Schema == nil && !s.Allows {
 | 
			
		||||
		return jsFalse, nil
 | 
			
		||||
	}
 | 
			
		||||
	return jsTrue, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *JSONSchemaPropsOrBool) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	var nw JSONSchemaPropsOrBool
 | 
			
		||||
	switch {
 | 
			
		||||
	case len(data) == 0:
 | 
			
		||||
	case data[0] == '{':
 | 
			
		||||
		var sch JSONSchemaProps
 | 
			
		||||
		if err := json.Unmarshal(data, &sch); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		nw.Allows = true
 | 
			
		||||
		nw.Schema = &sch
 | 
			
		||||
	case len(data) == 4 && string(data) == "true":
 | 
			
		||||
		nw.Allows = true
 | 
			
		||||
	case len(data) == 5 && string(data) == "false":
 | 
			
		||||
		nw.Allows = false
 | 
			
		||||
	default:
 | 
			
		||||
		return errors.New("boolean or JSON schema expected")
 | 
			
		||||
	}
 | 
			
		||||
	*s = nw
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s JSONSchemaPropsOrStringArray) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	if len(s.Property) > 0 {
 | 
			
		||||
		return json.Marshal(s.Property)
 | 
			
		||||
	}
 | 
			
		||||
	if s.Schema != nil {
 | 
			
		||||
		return json.Marshal(s.Schema)
 | 
			
		||||
	}
 | 
			
		||||
	return []byte("null"), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *JSONSchemaPropsOrStringArray) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	var first byte
 | 
			
		||||
	if len(data) > 1 {
 | 
			
		||||
		first = data[0]
 | 
			
		||||
	}
 | 
			
		||||
	var nw JSONSchemaPropsOrStringArray
 | 
			
		||||
	if first == '{' {
 | 
			
		||||
		var sch JSONSchemaProps
 | 
			
		||||
		if err := json.Unmarshal(data, &sch); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		nw.Schema = &sch
 | 
			
		||||
	}
 | 
			
		||||
	if first == '[' {
 | 
			
		||||
		if err := json.Unmarshal(data, &nw.Property); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	*s = nw
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s JSONSchemaPropsOrArray) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	if len(s.JSONSchemas) > 0 {
 | 
			
		||||
		return json.Marshal(s.JSONSchemas)
 | 
			
		||||
	}
 | 
			
		||||
	return json.Marshal(s.Schema)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *JSONSchemaPropsOrArray) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	var nw JSONSchemaPropsOrArray
 | 
			
		||||
	var first byte
 | 
			
		||||
	if len(data) > 1 {
 | 
			
		||||
		first = data[0]
 | 
			
		||||
	}
 | 
			
		||||
	if first == '{' {
 | 
			
		||||
		var sch JSONSchemaProps
 | 
			
		||||
		if err := json.Unmarshal(data, &sch); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		nw.Schema = &sch
 | 
			
		||||
	}
 | 
			
		||||
	if first == '[' {
 | 
			
		||||
		if err := json.Unmarshal(data, &nw.JSONSchemas); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	*s = nw
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s JSON) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	if len(s.Raw) > 0 {
 | 
			
		||||
		return s.Raw, nil
 | 
			
		||||
	}
 | 
			
		||||
	return []byte("null"), nil
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *JSON) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	if len(data) > 0 && string(data) != "null" {
 | 
			
		||||
		s.Raw = data
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,150 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package v1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type JSONSchemaPropsOrBoolHolder struct {
 | 
			
		||||
	JSPoB          JSONSchemaPropsOrBool  `json:"val1"`
 | 
			
		||||
	JSPoBOmitEmpty *JSONSchemaPropsOrBool `json:"val2,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestJSONSchemaPropsOrBoolUnmarshalJSON(t *testing.T) {
 | 
			
		||||
	cases := []struct {
 | 
			
		||||
		input  string
 | 
			
		||||
		result JSONSchemaPropsOrBoolHolder
 | 
			
		||||
	}{
 | 
			
		||||
		{`{}`, JSONSchemaPropsOrBoolHolder{}},
 | 
			
		||||
 | 
			
		||||
		{`{"val1": {}}`, JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{Allows: true, Schema: &JSONSchemaProps{}}}},
 | 
			
		||||
		{`{"val1": {"type":"string"}}`, JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{Allows: true, Schema: &JSONSchemaProps{Type: "string"}}}},
 | 
			
		||||
		{`{"val1": false}`, JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{}}},
 | 
			
		||||
		{`{"val1": true}`, JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{Allows: true}}},
 | 
			
		||||
 | 
			
		||||
		{`{"val2": {}}`, JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{Allows: true, Schema: &JSONSchemaProps{}}}},
 | 
			
		||||
		{`{"val2": {"type":"string"}}`, JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{Allows: true, Schema: &JSONSchemaProps{Type: "string"}}}},
 | 
			
		||||
		{`{"val2": false}`, JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{}}},
 | 
			
		||||
		{`{"val2": true}`, JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{Allows: true}}},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, c := range cases {
 | 
			
		||||
		var result JSONSchemaPropsOrBoolHolder
 | 
			
		||||
		if err := json.Unmarshal([]byte(c.input), &result); err != nil {
 | 
			
		||||
			t.Errorf("Failed to unmarshal input '%v': %v", c.input, err)
 | 
			
		||||
		}
 | 
			
		||||
		if !reflect.DeepEqual(result, c.result) {
 | 
			
		||||
			t.Errorf("Failed to unmarshal input '%v': expected %+v, got %+v", c.input, c.result, result)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestStringArrayOrStringMarshalJSON(t *testing.T) {
 | 
			
		||||
	cases := []struct {
 | 
			
		||||
		input  JSONSchemaPropsOrBoolHolder
 | 
			
		||||
		result string
 | 
			
		||||
	}{
 | 
			
		||||
		{JSONSchemaPropsOrBoolHolder{}, `{"val1":false}`},
 | 
			
		||||
 | 
			
		||||
		{JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{Schema: &JSONSchemaProps{}}}, `{"val1":{}}`},
 | 
			
		||||
		{JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{Schema: &JSONSchemaProps{Type: "string"}}}, `{"val1":{"type":"string"}}`},
 | 
			
		||||
		{JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{}}, `{"val1":false}`},
 | 
			
		||||
		{JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{Allows: true}}, `{"val1":true}`},
 | 
			
		||||
 | 
			
		||||
		{JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{Schema: &JSONSchemaProps{}}}, `{"val1":false,"val2":{}}`},
 | 
			
		||||
		{JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{Schema: &JSONSchemaProps{Type: "string"}}}, `{"val1":false,"val2":{"type":"string"}}`},
 | 
			
		||||
		{JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{}}, `{"val1":false,"val2":false}`},
 | 
			
		||||
		{JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{Allows: true}}, `{"val1":false,"val2":true}`},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, c := range cases {
 | 
			
		||||
		result, err := json.Marshal(&c.input)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Errorf("Unexpected error marshaling input '%v': %v", c.input, err)
 | 
			
		||||
		}
 | 
			
		||||
		if string(result) != c.result {
 | 
			
		||||
			t.Errorf("Failed to marshal input '%v': expected: %q, got %q", c.input, c.result, string(result))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type JSONSchemaPropsOrArrayHolder struct {
 | 
			
		||||
	JSPoA          JSONSchemaPropsOrArray  `json:"val1"`
 | 
			
		||||
	JSPoAOmitEmpty *JSONSchemaPropsOrArray `json:"val2,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestJSONSchemaPropsOrArrayUnmarshalJSON(t *testing.T) {
 | 
			
		||||
	cases := []struct {
 | 
			
		||||
		input  string
 | 
			
		||||
		result JSONSchemaPropsOrArrayHolder
 | 
			
		||||
	}{
 | 
			
		||||
		{`{}`, JSONSchemaPropsOrArrayHolder{}},
 | 
			
		||||
 | 
			
		||||
		{`{"val1": {}}`, JSONSchemaPropsOrArrayHolder{JSPoA: JSONSchemaPropsOrArray{Schema: &JSONSchemaProps{}}}},
 | 
			
		||||
		{`{"val1": {"type":"string"}}`, JSONSchemaPropsOrArrayHolder{JSPoA: JSONSchemaPropsOrArray{Schema: &JSONSchemaProps{Type: "string"}}}},
 | 
			
		||||
		{`{"val1": [{}]}`, JSONSchemaPropsOrArrayHolder{JSPoA: JSONSchemaPropsOrArray{JSONSchemas: []JSONSchemaProps{{}}}}},
 | 
			
		||||
		{`{"val1": [{},{"type":"string"}]}`, JSONSchemaPropsOrArrayHolder{JSPoA: JSONSchemaPropsOrArray{JSONSchemas: []JSONSchemaProps{{}, {Type: "string"}}}}},
 | 
			
		||||
 | 
			
		||||
		{`{"val2": {}}`, JSONSchemaPropsOrArrayHolder{JSPoAOmitEmpty: &JSONSchemaPropsOrArray{Schema: &JSONSchemaProps{}}}},
 | 
			
		||||
		{`{"val2": {"type":"string"}}`, JSONSchemaPropsOrArrayHolder{JSPoAOmitEmpty: &JSONSchemaPropsOrArray{Schema: &JSONSchemaProps{Type: "string"}}}},
 | 
			
		||||
		{`{"val2": [{}]}`, JSONSchemaPropsOrArrayHolder{JSPoAOmitEmpty: &JSONSchemaPropsOrArray{JSONSchemas: []JSONSchemaProps{{}}}}},
 | 
			
		||||
		{`{"val2": [{},{"type":"string"}]}`, JSONSchemaPropsOrArrayHolder{JSPoAOmitEmpty: &JSONSchemaPropsOrArray{JSONSchemas: []JSONSchemaProps{{}, {Type: "string"}}}}},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, c := range cases {
 | 
			
		||||
		var result JSONSchemaPropsOrArrayHolder
 | 
			
		||||
		if err := json.Unmarshal([]byte(c.input), &result); err != nil {
 | 
			
		||||
			t.Errorf("Failed to unmarshal input '%v': %v", c.input, err)
 | 
			
		||||
		}
 | 
			
		||||
		if !reflect.DeepEqual(result, c.result) {
 | 
			
		||||
			t.Errorf("Failed to unmarshal input '%v': expected %+v, got %+v", c.input, c.result, result)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestJSONSchemaPropsOrArrayMarshalJSON(t *testing.T) {
 | 
			
		||||
	cases := []struct {
 | 
			
		||||
		input  JSONSchemaPropsOrArrayHolder
 | 
			
		||||
		result string
 | 
			
		||||
	}{
 | 
			
		||||
		{JSONSchemaPropsOrArrayHolder{}, `{"val1":null}`},
 | 
			
		||||
 | 
			
		||||
		{JSONSchemaPropsOrArrayHolder{JSPoA: JSONSchemaPropsOrArray{Schema: &JSONSchemaProps{}}}, `{"val1":{}}`},
 | 
			
		||||
		{JSONSchemaPropsOrArrayHolder{JSPoA: JSONSchemaPropsOrArray{Schema: &JSONSchemaProps{Type: "string"}}}, `{"val1":{"type":"string"}}`},
 | 
			
		||||
		{JSONSchemaPropsOrArrayHolder{JSPoA: JSONSchemaPropsOrArray{JSONSchemas: []JSONSchemaProps{{}}}}, `{"val1":[{}]}`},
 | 
			
		||||
		{JSONSchemaPropsOrArrayHolder{JSPoA: JSONSchemaPropsOrArray{JSONSchemas: []JSONSchemaProps{{}, {Type: "string"}}}}, `{"val1":[{},{"type":"string"}]}`},
 | 
			
		||||
 | 
			
		||||
		{JSONSchemaPropsOrArrayHolder{JSPoAOmitEmpty: &JSONSchemaPropsOrArray{}}, `{"val1":null,"val2":null}`},
 | 
			
		||||
		{JSONSchemaPropsOrArrayHolder{JSPoAOmitEmpty: &JSONSchemaPropsOrArray{Schema: &JSONSchemaProps{}}}, `{"val1":null,"val2":{}}`},
 | 
			
		||||
		{JSONSchemaPropsOrArrayHolder{JSPoAOmitEmpty: &JSONSchemaPropsOrArray{Schema: &JSONSchemaProps{Type: "string"}}}, `{"val1":null,"val2":{"type":"string"}}`},
 | 
			
		||||
		{JSONSchemaPropsOrArrayHolder{JSPoAOmitEmpty: &JSONSchemaPropsOrArray{JSONSchemas: []JSONSchemaProps{{}}}}, `{"val1":null,"val2":[{}]}`},
 | 
			
		||||
		{JSONSchemaPropsOrArrayHolder{JSPoAOmitEmpty: &JSONSchemaPropsOrArray{JSONSchemas: []JSONSchemaProps{{}, {Type: "string"}}}}, `{"val1":null,"val2":[{},{"type":"string"}]}`},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, c := range cases {
 | 
			
		||||
		result, err := json.Marshal(&c.input)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Errorf("%d: Unexpected error marshaling input '%v': %v", i, c.input, err)
 | 
			
		||||
		}
 | 
			
		||||
		if string(result) != c.result {
 | 
			
		||||
			t.Errorf("%d: Failed to marshal input '%v': expected: %q, got %q", i, c.input, c.result, string(result))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,62 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package v1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const GroupName = "apiextensions.k8s.io"
 | 
			
		||||
 | 
			
		||||
// SchemeGroupVersion is group version used to register these objects
 | 
			
		||||
var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"}
 | 
			
		||||
 | 
			
		||||
// Kind takes an unqualified kind and returns back a Group qualified GroupKind
 | 
			
		||||
func Kind(kind string) schema.GroupKind {
 | 
			
		||||
	return SchemeGroupVersion.WithKind(kind).GroupKind()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Resource takes an unqualified resource and returns back a Group qualified GroupResource
 | 
			
		||||
func Resource(resource string) schema.GroupResource {
 | 
			
		||||
	return SchemeGroupVersion.WithResource(resource).GroupResource()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	SchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes, addDefaultingFuncs, addConversionFuncs)
 | 
			
		||||
	localSchemeBuilder = &SchemeBuilder
 | 
			
		||||
	AddToScheme        = localSchemeBuilder.AddToScheme
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Adds the list of known types to the given scheme.
 | 
			
		||||
func addKnownTypes(scheme *runtime.Scheme) error {
 | 
			
		||||
	scheme.AddKnownTypes(SchemeGroupVersion,
 | 
			
		||||
		&CustomResourceDefinition{},
 | 
			
		||||
		&CustomResourceDefinitionList{},
 | 
			
		||||
		&ConversionReview{},
 | 
			
		||||
	)
 | 
			
		||||
	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	// We only register manually written functions here. The registration of the
 | 
			
		||||
	// generated functions takes place in the generated files. The separation
 | 
			
		||||
	// makes the code compile even when the generated files are missing.
 | 
			
		||||
	localSchemeBuilder.Register(addDefaultingFuncs, addConversionFuncs)
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,469 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package v1
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ConversionStrategyType describes different conversion types.
 | 
			
		||||
type ConversionStrategyType string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// NoneConverter is a converter that only sets apiversion of the CR and leave everything else unchanged.
 | 
			
		||||
	NoneConverter ConversionStrategyType = "None"
 | 
			
		||||
	// WebhookConverter is a converter that calls to an external webhook to convert the CR.
 | 
			
		||||
	WebhookConverter ConversionStrategyType = "Webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CustomResourceDefinitionSpec describes how a user wants their resource to appear
 | 
			
		||||
type CustomResourceDefinitionSpec struct {
 | 
			
		||||
	// Group is the group this resource belongs in
 | 
			
		||||
	Group string `json:"group" protobuf:"bytes,1,opt,name=group"`
 | 
			
		||||
	// Version is the version this resource belongs in
 | 
			
		||||
	// Should be always first item in Versions field if provided.
 | 
			
		||||
	// Optional, but at least one of Version or Versions must be set.
 | 
			
		||||
	// Deprecated: Please use `Versions`.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Version string `json:"version,omitempty" protobuf:"bytes,2,opt,name=version"`
 | 
			
		||||
	// Names are the names used to describe this custom resource
 | 
			
		||||
	Names CustomResourceDefinitionNames `json:"names" protobuf:"bytes,3,opt,name=names"`
 | 
			
		||||
	// Scope indicates whether this resource is cluster or namespace scoped.  Default is namespaced
 | 
			
		||||
	Scope ResourceScope `json:"scope" protobuf:"bytes,4,opt,name=scope,casttype=ResourceScope"`
 | 
			
		||||
	// Validation describes the validation methods for CustomResources
 | 
			
		||||
	// Optional, the global validation schema for all versions.
 | 
			
		||||
	// Top-level and per-version schemas are mutually exclusive.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Validation *CustomResourceValidation `json:"validation,omitempty" protobuf:"bytes,5,opt,name=validation"`
 | 
			
		||||
	// Subresources describes the subresources for CustomResource
 | 
			
		||||
	// Optional, the global subresources for all versions.
 | 
			
		||||
	// Top-level and per-version subresources are mutually exclusive.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Subresources *CustomResourceSubresources `json:"subresources,omitempty" protobuf:"bytes,6,opt,name=subresources"`
 | 
			
		||||
	// Versions is the list of all supported versions for this resource.
 | 
			
		||||
	// If Version field is provided, this field is optional.
 | 
			
		||||
	// Validation: All versions must use the same validation schema for now. i.e., top
 | 
			
		||||
	// level Validation field is applied to all of these versions.
 | 
			
		||||
	// Order: The version name will be used to compute the order.
 | 
			
		||||
	// If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered
 | 
			
		||||
	// lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version),
 | 
			
		||||
	// then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first
 | 
			
		||||
	// by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing
 | 
			
		||||
	// major version, then minor version. An example sorted list of versions:
 | 
			
		||||
	// v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Versions []CustomResourceDefinitionVersion `json:"versions,omitempty" protobuf:"bytes,7,rep,name=versions"`
 | 
			
		||||
	// AdditionalPrinterColumns are additional columns shown e.g. in kubectl next to the name. Defaults to a created-at column.
 | 
			
		||||
	// Optional, the global columns for all versions.
 | 
			
		||||
	// Top-level and per-version columns are mutually exclusive.
 | 
			
		||||
	// +optional
 | 
			
		||||
	AdditionalPrinterColumns []CustomResourceColumnDefinition `json:"additionalPrinterColumns,omitempty" protobuf:"bytes,8,rep,name=additionalPrinterColumns"`
 | 
			
		||||
 | 
			
		||||
	// `conversion` defines conversion settings for the CRD.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Conversion *CustomResourceConversion `json:"conversion,omitempty" protobuf:"bytes,9,opt,name=conversion"`
 | 
			
		||||
 | 
			
		||||
	// preserveUnknownFields disables pruning of object fields which are not
 | 
			
		||||
	// specified in the OpenAPI schema. apiVersion, kind, metadata and known
 | 
			
		||||
	// fields inside metadata are always preserved.
 | 
			
		||||
	// Defaults to true in v1beta and will default to false in v1.
 | 
			
		||||
	PreserveUnknownFields *bool `json:"preserveUnknownFields,omitempty" protobuf:"varint,10,opt,name=preserveUnknownFields"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CustomResourceConversion describes how to convert different versions of a CR.
 | 
			
		||||
type CustomResourceConversion struct {
 | 
			
		||||
	// `strategy` specifies the conversion strategy. Allowed values are:
 | 
			
		||||
	// - `None`: The converter only change the apiVersion and would not touch any other field in the CR.
 | 
			
		||||
	// - `Webhook`: API Server will call to an external webhook to do the conversion. Additional information
 | 
			
		||||
	//   is needed for this option. This requires spec.preserveUnknownFields to be false.
 | 
			
		||||
	Strategy ConversionStrategyType `json:"strategy" protobuf:"bytes,1,name=strategy"`
 | 
			
		||||
 | 
			
		||||
	// `webhookClientConfig` is the instructions for how to call the webhook if strategy is `Webhook`. This field is
 | 
			
		||||
	// alpha-level and is only honored by servers that enable the CustomResourceWebhookConversion feature.
 | 
			
		||||
	// +optional
 | 
			
		||||
	WebhookClientConfig *WebhookClientConfig `json:"webhookClientConfig,omitempty" protobuf:"bytes,2,name=webhookClientConfig"`
 | 
			
		||||
 | 
			
		||||
	// ConversionReviewVersions is an ordered list of preferred `ConversionReview`
 | 
			
		||||
	// versions the Webhook expects. API server will try to use first version in
 | 
			
		||||
	// the list which it supports. If none of the versions specified in this list
 | 
			
		||||
	// supported by API server, conversion will fail for this object.
 | 
			
		||||
	// If a persisted Webhook configuration specifies allowed versions and does not
 | 
			
		||||
	// include any versions known to the API Server, calls to the webhook will fail.
 | 
			
		||||
	// Default to `['v1']`.
 | 
			
		||||
	// +optional
 | 
			
		||||
	ConversionReviewVersions []string `json:"conversionReviewVersions,omitempty" protobuf:"bytes,3,rep,name=conversionReviewVersions"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WebhookClientConfig contains the information to make a TLS
 | 
			
		||||
// connection with the webhook. It has the same field as admissionregistration.v1.WebhookClientConfig.
 | 
			
		||||
type WebhookClientConfig struct {
 | 
			
		||||
	// `url` gives the location of the webhook, in standard URL form
 | 
			
		||||
	// (`scheme://host:port/path`). Exactly one of `url` or `service`
 | 
			
		||||
	// must be specified.
 | 
			
		||||
	//
 | 
			
		||||
	// The `host` should not refer to a service running in the cluster; use
 | 
			
		||||
	// the `service` field instead. The host might be resolved via external
 | 
			
		||||
	// DNS in some apiservers (e.g., `kube-apiserver` cannot resolve
 | 
			
		||||
	// in-cluster DNS as that would be a layering violation). `host` may
 | 
			
		||||
	// also be an IP address.
 | 
			
		||||
	//
 | 
			
		||||
	// Please note that using `localhost` or `127.0.0.1` as a `host` is
 | 
			
		||||
	// risky unless you take great care to run this webhook on all hosts
 | 
			
		||||
	// which run an apiserver which might need to make calls to this
 | 
			
		||||
	// webhook. Such installs are likely to be non-portable, i.e., not easy
 | 
			
		||||
	// to turn up in a new cluster.
 | 
			
		||||
	//
 | 
			
		||||
	// The scheme must be "https"; the URL must begin with "https://".
 | 
			
		||||
	//
 | 
			
		||||
	// A path is optional, and if present may be any string permissible in
 | 
			
		||||
	// a URL. You may use the path to pass an arbitrary string to the
 | 
			
		||||
	// webhook, for example, a cluster identifier.
 | 
			
		||||
	//
 | 
			
		||||
	// Attempting to use a user or basic auth e.g. "user:password@" is not
 | 
			
		||||
	// allowed. Fragments ("#...") and query parameters ("?...") are not
 | 
			
		||||
	// allowed, either.
 | 
			
		||||
	//
 | 
			
		||||
	// +optional
 | 
			
		||||
	URL *string `json:"url,omitempty" protobuf:"bytes,3,opt,name=url"`
 | 
			
		||||
 | 
			
		||||
	// `service` is a reference to the service for this webhook. Either
 | 
			
		||||
	// `service` or `url` must be specified.
 | 
			
		||||
	//
 | 
			
		||||
	// If the webhook is running within the cluster, then you should use `service`.
 | 
			
		||||
	//
 | 
			
		||||
	// +optional
 | 
			
		||||
	Service *ServiceReference `json:"service,omitempty" protobuf:"bytes,1,opt,name=service"`
 | 
			
		||||
 | 
			
		||||
	// `caBundle` is a PEM encoded CA bundle which will be used to validate the webhook's server certificate.
 | 
			
		||||
	// If unspecified, system trust roots on the apiserver are used.
 | 
			
		||||
	// +optional
 | 
			
		||||
	CABundle []byte `json:"caBundle,omitempty" protobuf:"bytes,2,opt,name=caBundle"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ServiceReference holds a reference to Service.legacy.k8s.io
 | 
			
		||||
type ServiceReference struct {
 | 
			
		||||
	// `namespace` is the namespace of the service.
 | 
			
		||||
	// Required
 | 
			
		||||
	Namespace string `json:"namespace" protobuf:"bytes,1,opt,name=namespace"`
 | 
			
		||||
	// `name` is the name of the service.
 | 
			
		||||
	// Required
 | 
			
		||||
	Name string `json:"name" protobuf:"bytes,2,opt,name=name"`
 | 
			
		||||
 | 
			
		||||
	// `path` is an optional URL path which will be sent in any request to
 | 
			
		||||
	// this service.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Path *string `json:"path,omitempty" protobuf:"bytes,3,opt,name=path"`
 | 
			
		||||
 | 
			
		||||
	// If specified, the port on the service that hosting webhook.
 | 
			
		||||
	// Default to 443 for backward compatibility.
 | 
			
		||||
	// `port` should be a valid port number (1-65535, inclusive).
 | 
			
		||||
	// +optional
 | 
			
		||||
	Port *int32 `json:"port,omitempty" protobuf:"varint,4,opt,name=port"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CustomResourceDefinitionVersion describes a version for CRD.
 | 
			
		||||
type CustomResourceDefinitionVersion struct {
 | 
			
		||||
	// Name is the version name, e.g. “v1”, “v2beta1”, etc.
 | 
			
		||||
	Name string `json:"name" protobuf:"bytes,1,opt,name=name"`
 | 
			
		||||
	// Served is a flag enabling/disabling this version from being served via REST APIs
 | 
			
		||||
	Served bool `json:"served" protobuf:"varint,2,opt,name=served"`
 | 
			
		||||
	// Storage flags the version as storage version. There must be exactly one
 | 
			
		||||
	// flagged as storage version.
 | 
			
		||||
	Storage bool `json:"storage" protobuf:"varint,3,opt,name=storage"`
 | 
			
		||||
	// Schema describes the schema for CustomResource used in validation, pruning, and defaulting.
 | 
			
		||||
	// Top-level and per-version schemas are mutually exclusive.
 | 
			
		||||
	// Per-version schemas must not all be set to identical values (top-level validation schema should be used instead)
 | 
			
		||||
	// This field is alpha-level and is only honored by servers that enable the CustomResourceWebhookConversion feature.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Schema *CustomResourceValidation `json:"schema,omitempty" protobuf:"bytes,4,opt,name=schema"`
 | 
			
		||||
	// Subresources describes the subresources for CustomResource
 | 
			
		||||
	// Top-level and per-version subresources are mutually exclusive.
 | 
			
		||||
	// Per-version subresources must not all be set to identical values (top-level subresources should be used instead)
 | 
			
		||||
	// This field is alpha-level and is only honored by servers that enable the CustomResourceWebhookConversion feature.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Subresources *CustomResourceSubresources `json:"subresources,omitempty" protobuf:"bytes,5,opt,name=subresources"`
 | 
			
		||||
	// AdditionalPrinterColumns are additional columns shown e.g. in kubectl next to the name. Defaults to a created-at column.
 | 
			
		||||
	// Top-level and per-version columns are mutually exclusive.
 | 
			
		||||
	// Per-version columns must not all be set to identical values (top-level columns should be used instead)
 | 
			
		||||
	// This field is alpha-level and is only honored by servers that enable the CustomResourceWebhookConversion feature.
 | 
			
		||||
	// NOTE: CRDs created prior to 1.13 populated the top-level additionalPrinterColumns field by default. To apply an
 | 
			
		||||
	// update that changes to per-version additionalPrinterColumns, the top-level additionalPrinterColumns field must
 | 
			
		||||
	// be explicitly set to null
 | 
			
		||||
	// +optional
 | 
			
		||||
	AdditionalPrinterColumns []CustomResourceColumnDefinition `json:"additionalPrinterColumns,omitempty" protobuf:"bytes,6,rep,name=additionalPrinterColumns"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CustomResourceColumnDefinition specifies a column for server side printing.
 | 
			
		||||
type CustomResourceColumnDefinition struct {
 | 
			
		||||
	// name is a human readable name for the column.
 | 
			
		||||
	Name string `json:"name" protobuf:"bytes,1,opt,name=name"`
 | 
			
		||||
	// type is an OpenAPI type definition for this column.
 | 
			
		||||
	// See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more.
 | 
			
		||||
	Type string `json:"type" protobuf:"bytes,2,opt,name=type"`
 | 
			
		||||
	// format is an optional OpenAPI type definition for this column. The 'name' format is applied
 | 
			
		||||
	// to the primary identifier column to assist in clients identifying column is the resource name.
 | 
			
		||||
	// See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Format string `json:"format,omitempty" protobuf:"bytes,3,opt,name=format"`
 | 
			
		||||
	// description is a human readable description of this column.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Description string `json:"description,omitempty" protobuf:"bytes,4,opt,name=description"`
 | 
			
		||||
	// priority is an integer defining the relative importance of this column compared to others. Lower
 | 
			
		||||
	// numbers are considered higher priority. Columns that may be omitted in limited space scenarios
 | 
			
		||||
	// should be given a higher priority.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Priority int32 `json:"priority,omitempty" protobuf:"bytes,5,opt,name=priority"`
 | 
			
		||||
 | 
			
		||||
	// JSONPath is a simple JSON path, i.e. with array notation.
 | 
			
		||||
	JSONPath string `json:"JSONPath" protobuf:"bytes,6,opt,name=JSONPath"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CustomResourceDefinitionNames indicates the names to serve this CustomResourceDefinition
 | 
			
		||||
type CustomResourceDefinitionNames struct {
 | 
			
		||||
	// Plural is the plural name of the resource to serve.  It must match the name of the CustomResourceDefinition-registration
 | 
			
		||||
	// too: plural.group and it must be all lowercase.
 | 
			
		||||
	Plural string `json:"plural" protobuf:"bytes,1,opt,name=plural"`
 | 
			
		||||
	// Singular is the singular name of the resource.  It must be all lowercase  Defaults to lowercased <kind>
 | 
			
		||||
	// +optional
 | 
			
		||||
	Singular string `json:"singular,omitempty" protobuf:"bytes,2,opt,name=singular"`
 | 
			
		||||
	// ShortNames are short names for the resource.  It must be all lowercase.
 | 
			
		||||
	// +optional
 | 
			
		||||
	ShortNames []string `json:"shortNames,omitempty" protobuf:"bytes,3,opt,name=shortNames"`
 | 
			
		||||
	// Kind is the serialized kind of the resource.  It is normally CamelCase and singular.
 | 
			
		||||
	Kind string `json:"kind" protobuf:"bytes,4,opt,name=kind"`
 | 
			
		||||
	// ListKind is the serialized kind of the list for this resource.  Defaults to <kind>List.
 | 
			
		||||
	// +optional
 | 
			
		||||
	ListKind string `json:"listKind,omitempty" protobuf:"bytes,5,opt,name=listKind"`
 | 
			
		||||
	// Categories is a list of grouped resources custom resources belong to (e.g. 'all')
 | 
			
		||||
	// +optional
 | 
			
		||||
	Categories []string `json:"categories,omitempty" protobuf:"bytes,6,rep,name=categories"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ResourceScope is an enum defining the different scopes available to a custom resource
 | 
			
		||||
type ResourceScope string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	ClusterScoped   ResourceScope = "Cluster"
 | 
			
		||||
	NamespaceScoped ResourceScope = "Namespaced"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ConditionStatus string
 | 
			
		||||
 | 
			
		||||
// These are valid condition statuses. "ConditionTrue" means a resource is in the condition.
 | 
			
		||||
// "ConditionFalse" means a resource is not in the condition. "ConditionUnknown" means kubernetes
 | 
			
		||||
// can't decide if a resource is in the condition or not. In the future, we could add other
 | 
			
		||||
// intermediate conditions, e.g. ConditionDegraded.
 | 
			
		||||
const (
 | 
			
		||||
	ConditionTrue    ConditionStatus = "True"
 | 
			
		||||
	ConditionFalse   ConditionStatus = "False"
 | 
			
		||||
	ConditionUnknown ConditionStatus = "Unknown"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CustomResourceDefinitionConditionType is a valid value for CustomResourceDefinitionCondition.Type
 | 
			
		||||
type CustomResourceDefinitionConditionType string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// Established means that the resource has become active. A resource is established when all names are
 | 
			
		||||
	// accepted without a conflict for the first time. A resource stays established until deleted, even during
 | 
			
		||||
	// a later NamesAccepted due to changed names. Note that not all names can be changed.
 | 
			
		||||
	Established CustomResourceDefinitionConditionType = "Established"
 | 
			
		||||
	// NamesAccepted means the names chosen for this CustomResourceDefinition do not conflict with others in
 | 
			
		||||
	// the group and are therefore accepted.
 | 
			
		||||
	NamesAccepted CustomResourceDefinitionConditionType = "NamesAccepted"
 | 
			
		||||
	// NonStructuralSchema means that one or more OpenAPI schema is not structural.
 | 
			
		||||
	//
 | 
			
		||||
	// A schema is structural if it specifies types for all values, with the only exceptions of those with
 | 
			
		||||
	// - x-kubernetes-int-or-string: true — for fields which can be integer or string
 | 
			
		||||
	// - x-kubernetes-preserve-unknown-fields: true — for raw, unspecified JSON values
 | 
			
		||||
	// and there is no type, additionalProperties, default, nullable or x-kubernetes-* vendor extenions
 | 
			
		||||
	// specified under allOf, anyOf, oneOf or not.
 | 
			
		||||
	//
 | 
			
		||||
	// Non-structural schemas will not be allowed anymore in v1 API groups. Moreover, new features will not be
 | 
			
		||||
	// available for non-structural CRDs:
 | 
			
		||||
	// - pruning
 | 
			
		||||
	// - defaulting
 | 
			
		||||
	// - read-only
 | 
			
		||||
	// - OpenAPI publishing
 | 
			
		||||
	// - webhook conversion
 | 
			
		||||
	NonStructuralSchema CustomResourceDefinitionConditionType = "NonStructuralSchema"
 | 
			
		||||
	// Terminating means that the CustomResourceDefinition has been deleted and is cleaning up.
 | 
			
		||||
	Terminating CustomResourceDefinitionConditionType = "Terminating"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CustomResourceDefinitionCondition contains details for the current condition of this pod.
 | 
			
		||||
type CustomResourceDefinitionCondition struct {
 | 
			
		||||
	// Type is the type of the condition. Types include Established, NamesAccepted and Terminating.
 | 
			
		||||
	Type CustomResourceDefinitionConditionType `json:"type" protobuf:"bytes,1,opt,name=type,casttype=CustomResourceDefinitionConditionType"`
 | 
			
		||||
	// Status is the status of the condition.
 | 
			
		||||
	// Can be True, False, Unknown.
 | 
			
		||||
	Status ConditionStatus `json:"status" protobuf:"bytes,2,opt,name=status,casttype=ConditionStatus"`
 | 
			
		||||
	// Last time the condition transitioned from one status to another.
 | 
			
		||||
	// +optional
 | 
			
		||||
	LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty" protobuf:"bytes,3,opt,name=lastTransitionTime"`
 | 
			
		||||
	// Unique, one-word, CamelCase reason for the condition's last transition.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Reason string `json:"reason,omitempty" protobuf:"bytes,4,opt,name=reason"`
 | 
			
		||||
	// Human-readable message indicating details about last transition.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Message string `json:"message,omitempty" protobuf:"bytes,5,opt,name=message"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CustomResourceDefinitionStatus indicates the state of the CustomResourceDefinition
 | 
			
		||||
type CustomResourceDefinitionStatus struct {
 | 
			
		||||
	// Conditions indicate state for particular aspects of a CustomResourceDefinition
 | 
			
		||||
	Conditions []CustomResourceDefinitionCondition `json:"conditions" protobuf:"bytes,1,opt,name=conditions"`
 | 
			
		||||
 | 
			
		||||
	// AcceptedNames are the names that are actually being used to serve discovery
 | 
			
		||||
	// They may be different than the names in spec.
 | 
			
		||||
	AcceptedNames CustomResourceDefinitionNames `json:"acceptedNames" protobuf:"bytes,2,opt,name=acceptedNames"`
 | 
			
		||||
 | 
			
		||||
	// StoredVersions are all versions of CustomResources that were ever persisted. Tracking these
 | 
			
		||||
	// versions allows a migration path for stored versions in etcd. The field is mutable
 | 
			
		||||
	// so the migration controller can first finish a migration to another version (i.e.
 | 
			
		||||
	// that no old objects are left in the storage), and then remove the rest of the
 | 
			
		||||
	// versions from this list.
 | 
			
		||||
	// None of the versions in this list can be removed from the spec.Versions field.
 | 
			
		||||
	StoredVersions []string `json:"storedVersions" protobuf:"bytes,3,rep,name=storedVersions"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CustomResourceCleanupFinalizer is the name of the finalizer which will delete instances of
 | 
			
		||||
// a CustomResourceDefinition
 | 
			
		||||
const CustomResourceCleanupFinalizer = "customresourcecleanup.apiextensions.k8s.io"
 | 
			
		||||
 | 
			
		||||
// +genclient
 | 
			
		||||
// +genclient:nonNamespaced
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// CustomResourceDefinition represents a resource that should be exposed on the API server.  Its name MUST be in the format
 | 
			
		||||
// <.spec.name>.<.spec.group>.
 | 
			
		||||
type CustomResourceDefinition struct {
 | 
			
		||||
	metav1.TypeMeta   `json:",inline"`
 | 
			
		||||
	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
 | 
			
		||||
 | 
			
		||||
	// Spec describes how the user wants the resources to appear
 | 
			
		||||
	Spec CustomResourceDefinitionSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
 | 
			
		||||
	// Status indicates the actual state of the CustomResourceDefinition
 | 
			
		||||
	// +optional
 | 
			
		||||
	Status CustomResourceDefinitionStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// CustomResourceDefinitionList is a list of CustomResourceDefinition objects.
 | 
			
		||||
type CustomResourceDefinitionList struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
	metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
 | 
			
		||||
 | 
			
		||||
	// Items individual CustomResourceDefinitions
 | 
			
		||||
	Items []CustomResourceDefinition `json:"items" protobuf:"bytes,2,rep,name=items"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CustomResourceValidation is a list of validation methods for CustomResources.
 | 
			
		||||
type CustomResourceValidation struct {
 | 
			
		||||
	// OpenAPIV3Schema is the OpenAPI v3 schema to be validated against.
 | 
			
		||||
	// +optional
 | 
			
		||||
	OpenAPIV3Schema *JSONSchemaProps `json:"openAPIV3Schema,omitempty" protobuf:"bytes,1,opt,name=openAPIV3Schema"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CustomResourceSubresources defines the status and scale subresources for CustomResources.
 | 
			
		||||
type CustomResourceSubresources struct {
 | 
			
		||||
	// Status denotes the status subresource for CustomResources
 | 
			
		||||
	// +optional
 | 
			
		||||
	Status *CustomResourceSubresourceStatus `json:"status,omitempty" protobuf:"bytes,1,opt,name=status"`
 | 
			
		||||
	// Scale denotes the scale subresource for CustomResources
 | 
			
		||||
	// +optional
 | 
			
		||||
	Scale *CustomResourceSubresourceScale `json:"scale,omitempty" protobuf:"bytes,2,opt,name=scale"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CustomResourceSubresourceStatus defines how to serve the status subresource for CustomResources.
 | 
			
		||||
// Status is represented by the `.status` JSON path inside of a CustomResource. When set,
 | 
			
		||||
// * exposes a /status subresource for the custom resource
 | 
			
		||||
// * PUT requests to the /status subresource take a custom resource object, and ignore changes to anything except the status stanza
 | 
			
		||||
// * PUT/POST/PATCH requests to the custom resource ignore changes to the status stanza
 | 
			
		||||
type CustomResourceSubresourceStatus struct{}
 | 
			
		||||
 | 
			
		||||
// CustomResourceSubresourceScale defines how to serve the scale subresource for CustomResources.
 | 
			
		||||
type CustomResourceSubresourceScale struct {
 | 
			
		||||
	// SpecReplicasPath defines the JSON path inside of a CustomResource that corresponds to Scale.Spec.Replicas.
 | 
			
		||||
	// Only JSON paths without the array notation are allowed.
 | 
			
		||||
	// Must be a JSON Path under .spec.
 | 
			
		||||
	// If there is no value under the given path in the CustomResource, the /scale subresource will return an error on GET.
 | 
			
		||||
	SpecReplicasPath string `json:"specReplicasPath" protobuf:"bytes,1,name=specReplicasPath"`
 | 
			
		||||
	// StatusReplicasPath defines the JSON path inside of a CustomResource that corresponds to Scale.Status.Replicas.
 | 
			
		||||
	// Only JSON paths without the array notation are allowed.
 | 
			
		||||
	// Must be a JSON Path under .status.
 | 
			
		||||
	// If there is no value under the given path in the CustomResource, the status replica value in the /scale subresource
 | 
			
		||||
	// will default to 0.
 | 
			
		||||
	StatusReplicasPath string `json:"statusReplicasPath" protobuf:"bytes,2,opt,name=statusReplicasPath"`
 | 
			
		||||
	// LabelSelectorPath defines the JSON path inside of a CustomResource that corresponds to Scale.Status.Selector.
 | 
			
		||||
	// Only JSON paths without the array notation are allowed.
 | 
			
		||||
	// Must be a JSON Path under .status or .spec.
 | 
			
		||||
	// Must be set to work with HPA.
 | 
			
		||||
	// The field pointed by this JSON path must be a string field (not a complex selector struct)
 | 
			
		||||
	// which contains a serialized label selector in string form.
 | 
			
		||||
	// More info: https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions#scale-subresource
 | 
			
		||||
	// If there is no value under the given path in the CustomResource, the status label selector value in the /scale
 | 
			
		||||
	// subresource will default to the empty string.
 | 
			
		||||
	// +optional
 | 
			
		||||
	LabelSelectorPath *string `json:"labelSelectorPath,omitempty" protobuf:"bytes,3,opt,name=labelSelectorPath"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | 
			
		||||
 | 
			
		||||
// ConversionReview describes a conversion request/response.
 | 
			
		||||
type ConversionReview struct {
 | 
			
		||||
	metav1.TypeMeta `json:",inline"`
 | 
			
		||||
	// `request` describes the attributes for the conversion request.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Request *ConversionRequest `json:"request,omitempty" protobuf:"bytes,1,opt,name=request"`
 | 
			
		||||
	// `response` describes the attributes for the conversion response.
 | 
			
		||||
	// +optional
 | 
			
		||||
	Response *ConversionResponse `json:"response,omitempty" protobuf:"bytes,2,opt,name=response"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ConversionRequest describes the conversion request parameters.
 | 
			
		||||
type ConversionRequest struct {
 | 
			
		||||
	// `uid` is an identifier for the individual request/response. It allows us to distinguish instances of requests which are
 | 
			
		||||
	// otherwise identical (parallel requests, requests when earlier requests did not modify etc)
 | 
			
		||||
	// The UID is meant to track the round trip (request/response) between the KAS and the WebHook, not the user request.
 | 
			
		||||
	// It is suitable for correlating log entries between the webhook and apiserver, for either auditing or debugging.
 | 
			
		||||
	UID types.UID `json:"uid" protobuf:"bytes,1,name=uid"`
 | 
			
		||||
	// `desiredAPIVersion` is the version to convert given objects to. e.g. "myapi.example.com/v1"
 | 
			
		||||
	DesiredAPIVersion string `json:"desiredAPIVersion" protobuf:"bytes,2,name=desiredAPIVersion"`
 | 
			
		||||
	// `objects` is the list of CR objects to be converted.
 | 
			
		||||
	Objects []runtime.RawExtension `json:"objects" protobuf:"bytes,3,rep,name=objects"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ConversionResponse describes a conversion response.
 | 
			
		||||
type ConversionResponse struct {
 | 
			
		||||
	// `uid` is an identifier for the individual request/response.
 | 
			
		||||
	// This should be copied over from the corresponding ConversionRequest.
 | 
			
		||||
	UID types.UID `json:"uid" protobuf:"bytes,1,name=uid"`
 | 
			
		||||
	// `convertedObjects` is the list of converted version of `request.objects` if the `result` is successful otherwise empty.
 | 
			
		||||
	// The webhook is expected to set apiVersion of these objects to the ConversionRequest.desiredAPIVersion. The list
 | 
			
		||||
	// must also have the same size as the input list with the same objects in the same order (equal kind, UID, name and namespace).
 | 
			
		||||
	// The webhook is allowed to mutate labels and annotations. Any other change to the metadata is silently ignored.
 | 
			
		||||
	ConvertedObjects []runtime.RawExtension `json:"convertedObjects" protobuf:"bytes,2,rep,name=convertedObjects"`
 | 
			
		||||
	// `result` contains the result of conversion with extra details if the conversion failed. `result.status` determines if
 | 
			
		||||
	// the conversion failed or succeeded. The `result.status` field is required and represent the success or failure of the
 | 
			
		||||
	// conversion. A successful conversion must set `result.status` to `Success`. A failed conversion must set
 | 
			
		||||
	// `result.status` to `Failure` and provide more details in `result.message` and return http status 200. The `result.message`
 | 
			
		||||
	// will be used to construct an error message for the end user.
 | 
			
		||||
	Result metav1.Status `json:"result" protobuf:"bytes,3,name=result"`
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,186 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 The Kubernetes Authors.
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package v1
 | 
			
		||||
 | 
			
		||||
// JSONSchemaProps is a JSON-Schema following Specification Draft 4 (http://json-schema.org/).
 | 
			
		||||
type JSONSchemaProps struct {
 | 
			
		||||
	ID          string        `json:"id,omitempty" protobuf:"bytes,1,opt,name=id"`
 | 
			
		||||
	Schema      JSONSchemaURL `json:"$schema,omitempty" protobuf:"bytes,2,opt,name=schema"`
 | 
			
		||||
	Ref         *string       `json:"$ref,omitempty" protobuf:"bytes,3,opt,name=ref"`
 | 
			
		||||
	Description string        `json:"description,omitempty" protobuf:"bytes,4,opt,name=description"`
 | 
			
		||||
	Type        string        `json:"type,omitempty" protobuf:"bytes,5,opt,name=type"`
 | 
			
		||||
	Format      string        `json:"format,omitempty" protobuf:"bytes,6,opt,name=format"`
 | 
			
		||||
	Title       string        `json:"title,omitempty" protobuf:"bytes,7,opt,name=title"`
 | 
			
		||||
	// default is a default value for undefined object fields.
 | 
			
		||||
	// Defaulting is an alpha feature under the CustomResourceDefaulting feature gate.
 | 
			
		||||
	// Defaulting requires spec.preserveUnknownFields to be false.
 | 
			
		||||
	Default              *JSON                      `json:"default,omitempty" protobuf:"bytes,8,opt,name=default"`
 | 
			
		||||
	Maximum              *float64                   `json:"maximum,omitempty" protobuf:"bytes,9,opt,name=maximum"`
 | 
			
		||||
	ExclusiveMaximum     bool                       `json:"exclusiveMaximum,omitempty" protobuf:"bytes,10,opt,name=exclusiveMaximum"`
 | 
			
		||||
	Minimum              *float64                   `json:"minimum,omitempty" protobuf:"bytes,11,opt,name=minimum"`
 | 
			
		||||
	ExclusiveMinimum     bool                       `json:"exclusiveMinimum,omitempty" protobuf:"bytes,12,opt,name=exclusiveMinimum"`
 | 
			
		||||
	MaxLength            *int64                     `json:"maxLength,omitempty" protobuf:"bytes,13,opt,name=maxLength"`
 | 
			
		||||
	MinLength            *int64                     `json:"minLength,omitempty" protobuf:"bytes,14,opt,name=minLength"`
 | 
			
		||||
	Pattern              string                     `json:"pattern,omitempty" protobuf:"bytes,15,opt,name=pattern"`
 | 
			
		||||
	MaxItems             *int64                     `json:"maxItems,omitempty" protobuf:"bytes,16,opt,name=maxItems"`
 | 
			
		||||
	MinItems             *int64                     `json:"minItems,omitempty" protobuf:"bytes,17,opt,name=minItems"`
 | 
			
		||||
	UniqueItems          bool                       `json:"uniqueItems,omitempty" protobuf:"bytes,18,opt,name=uniqueItems"`
 | 
			
		||||
	MultipleOf           *float64                   `json:"multipleOf,omitempty" protobuf:"bytes,19,opt,name=multipleOf"`
 | 
			
		||||
	Enum                 []JSON                     `json:"enum,omitempty" protobuf:"bytes,20,rep,name=enum"`
 | 
			
		||||
	MaxProperties        *int64                     `json:"maxProperties,omitempty" protobuf:"bytes,21,opt,name=maxProperties"`
 | 
			
		||||
	MinProperties        *int64                     `json:"minProperties,omitempty" protobuf:"bytes,22,opt,name=minProperties"`
 | 
			
		||||
	Required             []string                   `json:"required,omitempty" protobuf:"bytes,23,rep,name=required"`
 | 
			
		||||
	Items                *JSONSchemaPropsOrArray    `json:"items,omitempty" protobuf:"bytes,24,opt,name=items"`
 | 
			
		||||
	AllOf                []JSONSchemaProps          `json:"allOf,omitempty" protobuf:"bytes,25,rep,name=allOf"`
 | 
			
		||||
	OneOf                []JSONSchemaProps          `json:"oneOf,omitempty" protobuf:"bytes,26,rep,name=oneOf"`
 | 
			
		||||
	AnyOf                []JSONSchemaProps          `json:"anyOf,omitempty" protobuf:"bytes,27,rep,name=anyOf"`
 | 
			
		||||
	Not                  *JSONSchemaProps           `json:"not,omitempty" protobuf:"bytes,28,opt,name=not"`
 | 
			
		||||
	Properties           map[string]JSONSchemaProps `json:"properties,omitempty" protobuf:"bytes,29,rep,name=properties"`
 | 
			
		||||
	AdditionalProperties *JSONSchemaPropsOrBool     `json:"additionalProperties,omitempty" protobuf:"bytes,30,opt,name=additionalProperties"`
 | 
			
		||||
	PatternProperties    map[string]JSONSchemaProps `json:"patternProperties,omitempty" protobuf:"bytes,31,rep,name=patternProperties"`
 | 
			
		||||
	Dependencies         JSONSchemaDependencies     `json:"dependencies,omitempty" protobuf:"bytes,32,opt,name=dependencies"`
 | 
			
		||||
	AdditionalItems      *JSONSchemaPropsOrBool     `json:"additionalItems,omitempty" protobuf:"bytes,33,opt,name=additionalItems"`
 | 
			
		||||
	Definitions          JSONSchemaDefinitions      `json:"definitions,omitempty" protobuf:"bytes,34,opt,name=definitions"`
 | 
			
		||||
	ExternalDocs         *ExternalDocumentation     `json:"externalDocs,omitempty" protobuf:"bytes,35,opt,name=externalDocs"`
 | 
			
		||||
	Example              *JSON                      `json:"example,omitempty" protobuf:"bytes,36,opt,name=example"`
 | 
			
		||||
	Nullable             bool                       `json:"nullable,omitempty" protobuf:"bytes,37,opt,name=nullable"`
 | 
			
		||||
 | 
			
		||||
	// x-kubernetes-preserve-unknown-fields stops the API server
 | 
			
		||||
	// decoding step from pruning fields which are not specified
 | 
			
		||||
	// in the validation schema. This affects fields recursively,
 | 
			
		||||
	// but switches back to normal pruning behaviour if nested
 | 
			
		||||
	// properties or additionalProperties are specified in the schema.
 | 
			
		||||
	// This can either be true or undefined. False is forbidden.
 | 
			
		||||
	XPreserveUnknownFields *bool `json:"x-kubernetes-preserve-unknown-fields,omitempty" protobuf:"bytes,38,opt,name=xKubernetesPreserveUnknownFields"`
 | 
			
		||||
 | 
			
		||||
	// x-kubernetes-embedded-resource defines that the value is an
 | 
			
		||||
	// embedded Kubernetes runtime.Object, with TypeMeta and
 | 
			
		||||
	// ObjectMeta. The type must be object. It is allowed to further
 | 
			
		||||
	// restrict the embedded object. kind, apiVersion and metadata
 | 
			
		||||
	// are validated automatically. x-kubernetes-preserve-unknown-fields
 | 
			
		||||
	// is allowed to be true, but does not have to be if the object
 | 
			
		||||
	// is fully specified (up to kind, apiVersion, metadata).
 | 
			
		||||
	XEmbeddedResource bool `json:"x-kubernetes-embedded-resource,omitempty" protobuf:"bytes,39,opt,name=xKubernetesEmbeddedResource"`
 | 
			
		||||
 | 
			
		||||
	// x-kubernetes-int-or-string specifies that this value is
 | 
			
		||||
	// either an integer or a string. If this is true, an empty
 | 
			
		||||
	// type is allowed and type as child of anyOf is permitted
 | 
			
		||||
	// if following one of the following patterns:
 | 
			
		||||
	//
 | 
			
		||||
	// 1) anyOf:
 | 
			
		||||
	//    - type: integer
 | 
			
		||||
	//    - type: string
 | 
			
		||||
	// 2) allOf:
 | 
			
		||||
	//    - anyOf:
 | 
			
		||||
	//      - type: integer
 | 
			
		||||
	//      - type: string
 | 
			
		||||
	//    - ... zero or more
 | 
			
		||||
	XIntOrString bool `json:"x-kubernetes-int-or-string,omitempty" protobuf:"bytes,40,opt,name=xKubernetesIntOrString"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JSON represents any valid JSON value.
 | 
			
		||||
// These types are supported: bool, int64, float64, string, []interface{}, map[string]interface{} and nil.
 | 
			
		||||
type JSON struct {
 | 
			
		||||
	Raw []byte `protobuf:"bytes,1,opt,name=raw"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OpenAPISchemaType is used by the kube-openapi generator when constructing
 | 
			
		||||
// the OpenAPI spec of this type.
 | 
			
		||||
//
 | 
			
		||||
// See: https://github.com/kubernetes/kube-openapi/tree/master/pkg/generators
 | 
			
		||||
func (_ JSON) OpenAPISchemaType() []string {
 | 
			
		||||
	// TODO: return actual types when anyOf is supported
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OpenAPISchemaFormat is used by the kube-openapi generator when constructing
 | 
			
		||||
// the OpenAPI spec of this type.
 | 
			
		||||
func (_ JSON) OpenAPISchemaFormat() string { return "" }
 | 
			
		||||
 | 
			
		||||
// JSONSchemaURL represents a schema url.
 | 
			
		||||
type JSONSchemaURL string
 | 
			
		||||
 | 
			
		||||
// JSONSchemaPropsOrArray represents a value that can either be a JSONSchemaProps
 | 
			
		||||
// or an array of JSONSchemaProps. Mainly here for serialization purposes.
 | 
			
		||||
type JSONSchemaPropsOrArray struct {
 | 
			
		||||
	Schema      *JSONSchemaProps  `protobuf:"bytes,1,opt,name=schema"`
 | 
			
		||||
	JSONSchemas []JSONSchemaProps `protobuf:"bytes,2,rep,name=jSONSchemas"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OpenAPISchemaType is used by the kube-openapi generator when constructing
 | 
			
		||||
// the OpenAPI spec of this type.
 | 
			
		||||
//
 | 
			
		||||
// See: https://github.com/kubernetes/kube-openapi/tree/master/pkg/generators
 | 
			
		||||
func (_ JSONSchemaPropsOrArray) OpenAPISchemaType() []string {
 | 
			
		||||
	// TODO: return actual types when anyOf is supported
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OpenAPISchemaFormat is used by the kube-openapi generator when constructing
 | 
			
		||||
// the OpenAPI spec of this type.
 | 
			
		||||
func (_ JSONSchemaPropsOrArray) OpenAPISchemaFormat() string { return "" }
 | 
			
		||||
 | 
			
		||||
// JSONSchemaPropsOrBool represents JSONSchemaProps or a boolean value.
 | 
			
		||||
// Defaults to true for the boolean property.
 | 
			
		||||
type JSONSchemaPropsOrBool struct {
 | 
			
		||||
	Allows bool             `protobuf:"varint,1,opt,name=allows"`
 | 
			
		||||
	Schema *JSONSchemaProps `protobuf:"bytes,2,opt,name=schema"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OpenAPISchemaType is used by the kube-openapi generator when constructing
 | 
			
		||||
// the OpenAPI spec of this type.
 | 
			
		||||
//
 | 
			
		||||
// See: https://github.com/kubernetes/kube-openapi/tree/master/pkg/generators
 | 
			
		||||
func (_ JSONSchemaPropsOrBool) OpenAPISchemaType() []string {
 | 
			
		||||
	// TODO: return actual types when anyOf is supported
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OpenAPISchemaFormat is used by the kube-openapi generator when constructing
 | 
			
		||||
// the OpenAPI spec of this type.
 | 
			
		||||
func (_ JSONSchemaPropsOrBool) OpenAPISchemaFormat() string { return "" }
 | 
			
		||||
 | 
			
		||||
// JSONSchemaDependencies represent a dependencies property.
 | 
			
		||||
type JSONSchemaDependencies map[string]JSONSchemaPropsOrStringArray
 | 
			
		||||
 | 
			
		||||
// JSONSchemaPropsOrStringArray represents a JSONSchemaProps or a string array.
 | 
			
		||||
type JSONSchemaPropsOrStringArray struct {
 | 
			
		||||
	Schema   *JSONSchemaProps `protobuf:"bytes,1,opt,name=schema"`
 | 
			
		||||
	Property []string         `protobuf:"bytes,2,rep,name=property"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OpenAPISchemaType is used by the kube-openapi generator when constructing
 | 
			
		||||
// the OpenAPI spec of this type.
 | 
			
		||||
//
 | 
			
		||||
// See: https://github.com/kubernetes/kube-openapi/tree/master/pkg/generators
 | 
			
		||||
func (_ JSONSchemaPropsOrStringArray) OpenAPISchemaType() []string {
 | 
			
		||||
	// TODO: return actual types when anyOf is supported
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OpenAPISchemaFormat is used by the kube-openapi generator when constructing
 | 
			
		||||
// the OpenAPI spec of this type.
 | 
			
		||||
func (_ JSONSchemaPropsOrStringArray) OpenAPISchemaFormat() string { return "" }
 | 
			
		||||
 | 
			
		||||
// JSONSchemaDefinitions contains the models explicitly defined in this spec.
 | 
			
		||||
type JSONSchemaDefinitions map[string]JSONSchemaProps
 | 
			
		||||
 | 
			
		||||
// ExternalDocumentation allows referencing an external resource for extended documentation.
 | 
			
		||||
type ExternalDocumentation struct {
 | 
			
		||||
	Description string `json:"description,omitempty" protobuf:"bytes,1,opt,name=description"`
 | 
			
		||||
	URL         string `json:"url,omitempty" protobuf:"bytes,2,opt,name=url"`
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user