From 7eeef1ac28d334e46b00f789d2320909cea35612 Mon Sep 17 00:00:00 2001 From: jennybuckley Date: Mon, 19 Aug 2019 12:12:51 -0700 Subject: [PATCH 1/7] Update kube-openapi version --- go.mod | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index c242c498f95..9794fe784a4 100644 --- a/go.mod +++ b/go.mod @@ -160,7 +160,7 @@ require ( k8s.io/klog v0.4.0 k8s.io/kube-aggregator v0.0.0 k8s.io/kube-controller-manager v0.0.0 - k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 + k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf k8s.io/kube-proxy v0.0.0 k8s.io/kube-scheduler v0.0.0 k8s.io/kubectl v0.0.0 @@ -465,7 +465,7 @@ replace ( k8s.io/klog => k8s.io/klog v0.4.0 k8s.io/kube-aggregator => ./staging/src/k8s.io/kube-aggregator k8s.io/kube-controller-manager => ./staging/src/k8s.io/kube-controller-manager - k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 + k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf k8s.io/kube-proxy => ./staging/src/k8s.io/kube-proxy k8s.io/kube-scheduler => ./staging/src/k8s.io/kube-scheduler k8s.io/kubectl => ./staging/src/k8s.io/kubectl From c0617933d4bec5b00dbbfcd24edb7d7e7fc5509d Mon Sep 17 00:00:00 2001 From: jennybuckley Date: Wed, 28 Aug 2019 15:28:49 -0700 Subject: [PATCH 2/7] Use CRD validation field in server-side apply --- .../pkg/apis/apiextensions/deepcopy.go | 16 + .../apis/apiextensions/types_jsonschema.go | 23 + .../apis/apiextensions/v1/types_jsonschema.go | 23 + .../apis/apiextensions/v1beta1/deepcopy.go | 16 + .../apiextensions/v1beta1/types_jsonschema.go | 23 + .../apiextensions/validation/validation.go | 20 + .../validation/validation_test.go | 50 ++ .../pkg/apiserver/apiserver.go | 1 + .../pkg/apiserver/customresource_handler.go | 38 +- .../pkg/apiserver/schema/convert.go | 2 + .../pkg/apiserver/schema/goopenapi.go | 6 + .../pkg/apiserver/schema/structural.go | 23 + .../pkg/apiserver/schema/validation.go | 6 + .../pkg/apiserver/schema/validation_test.go | 4 - .../pkg/apiserver/validation/validation.go | 6 + .../handlers/fieldmanager/fieldmanager.go | 21 +- .../fieldmanager/fieldmanager_test.go | 5 +- .../fieldmanager/internal/gvkparser.go | 4 +- .../fieldmanager/internal/typeconverter.go | 4 +- .../internal/typeconverter_test.go | 4 +- .../internal/versionconverter_test.go | 2 +- .../apiserver/pkg/server/genericapiserver.go | 7 + .../apiserver/apply/apply_crd_test.go | 494 ++++++++++++++++++ 23 files changed, 777 insertions(+), 21 deletions(-) create mode 100644 test/integration/apiserver/apply/apply_crd_test.go diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go index 51fb72df3cf..3c7ac0060f1 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go @@ -268,5 +268,21 @@ func (in *JSONSchemaProps) DeepCopy() *JSONSchemaProps { } } + if in.XListMapKeys != nil { + in, out := &in.XListMapKeys, &out.XListMapKeys + *out = make([]string, len(*in)) + copy(*out, *in) + } + + if in.XListType != nil { + in, out := &in.XListType, &out.XListType + if *in == nil { + *out = nil + } else { + *out = new(string) + **out = **in + } + } + return out } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go index 78223934628..06380a4e8e0 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go @@ -86,6 +86,29 @@ type JSONSchemaProps struct { // - type: string // - ... zero or more XIntOrString bool + + // x-kubernetes-list-map-keys annotates lists with the x-kubernetes-list-type `map` by specifying the keys used + // as the index of the map. + // + // This tag MUST only be used on lists that have the "x-kubernetes-list-type" + // extension set to "map". Also, the values specified for this attribute must + // be a scalar typed field of the child structure (no nesting is supported). + XListMapKeys []string + + // x-kubernetes-list-type annotates a list to further describe its topology. + // This extension must only be used on lists and may have 3 possible values: + // + // 1) `atomic`: the list is treated as a single entity, like a scalar. + // Atomic lists will be entirely replaced when updated. This extension + // may be used on any type of list (struct, scalar, ...). + // 2) `set`: + // Sets are lists that must not have multiple times the same value. Each + // value must be a scalar (or another atomic type). + // 3) `map`: + // These lists are like maps in that their elements have a non-index key + // used to identify them. Order is preserved upon merge. The map tag + // must only be used on a list with struct elements. + XListType *string } // JSON represents any valid JSON value. diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go index 06c63625091..1d3727fed87 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go @@ -90,6 +90,29 @@ type JSONSchemaProps struct { // - type: string // - ... zero or more XIntOrString bool `json:"x-kubernetes-int-or-string,omitempty" protobuf:"bytes,40,opt,name=xKubernetesIntOrString"` + + // x-kubernetes-list-map-keys annotates lists with the x-kubernetes-list-type `map` by specifying the keys used + // as the index of the map. + // + // This tag MUST only be used on lists that have the "x-kubernetes-list-type" + // extension set to "map". Also, the values specified for this attribute must + // be a scalar typed field of the child structure (no nesting is supported). + XListMapKeys []string `json:"x-kubernetes-list-map-keys,omitempty" protobuf:"bytes,41,rep,name=xKubernetesListMapKeys"` + + // x-kubernetes-list-type annotates a list to further describe its topology. + // This extension must only be used on lists and may have 3 possible values: + // + // 1) `atomic`: the list is treated as a single entity, like a scalar. + // Atomic lists will be entirely replaced when updated. This extension + // may be used on any type of list (struct, scalar, ...). + // 2) `set`: + // Sets are lists that must not have multiple times the same value. Each + // value must be a scalar (or another atomic type). + // 3) `map`: + // These lists are like maps in that their elements have a non-index key + // used to identify them. Order is preserved upon merge. The map tag + // must only be used on a list with struct elements. + XListType *string `json:"x-kubernetes-list-type,omitempty" protobuf:"bytes,42,opt,name=xKubernetesListType"` } // JSON represents any valid JSON value. diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go index f67f4418125..a4560dc5f6c 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go @@ -244,5 +244,21 @@ func (in *JSONSchemaProps) DeepCopy() *JSONSchemaProps { } } + if in.XListMapKeys != nil { + in, out := &in.XListMapKeys, &out.XListMapKeys + *out = make([]string, len(*in)) + copy(*out, *in) + } + + if in.XListType != nil { + in, out := &in.XListType, &out.XListType + if *in == nil { + *out = nil + } else { + *out = new(string) + **out = **in + } + } + return out } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go index ed893bdff57..9ef486747d0 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go @@ -90,6 +90,29 @@ type JSONSchemaProps struct { // - type: string // - ... zero or more XIntOrString bool `json:"x-kubernetes-int-or-string,omitempty" protobuf:"bytes,40,opt,name=xKubernetesIntOrString"` + + // x-kubernetes-list-map-keys annotates lists with the x-kubernetes-list-type `map` by specifying the keys used + // as the index of the map. + // + // This tag MUST only be used on lists that have the "x-kubernetes-list-type" + // extension set to "map". Also, the values specified for this attribute must + // be a scalar typed field of the child structure (no nesting is supported). + XListMapKeys []string `json:"x-kubernetes-list-map-keys,omitempty" protobuf:"bytes,41,rep,name=xKubernetesListMapKeys"` + + // x-kubernetes-list-type annotates a list to further describe its topology. + // This extension must only be used on lists and may have 3 possible values: + // + // 1) `atomic`: the list is treated as a single entity, like a scalar. + // Atomic lists will be entirely replaced when updated. This extension + // may be used on any type of list (struct, scalar, ...). + // 2) `set`: + // Sets are lists that must not have multiple times the same value. Each + // value must be a scalar (or another atomic type). + // 3) `map`: + // These lists are like maps in that their elements have a non-index key + // used to identify them. Order is preserved upon merge. The map tag + // must only be used on a list with struct elements. + XListType *string `json:"x-kubernetes-list-type,omitempty" protobuf:"bytes,42,opt,name=xKubernetesListType"` } // JSON represents any valid JSON value. diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go index fa98c93c870..defc42e1914 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go @@ -788,6 +788,26 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-preserve-unknown-fields"), *schema.XPreserveUnknownFields, "must be true or undefined")) } + if schema.XListType != nil && schema.Type != "array" { + if len(schema.Type) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("type"), "must be array if x-kubernetes-list-type is set")) + } else { + allErrs = append(allErrs, field.Invalid(fldPath.Child("type"), schema.Type, "must be array if x-kubernetes-list-type is set")) + } + } + + if schema.XListType != nil && *schema.XListType != "atomic" && *schema.XListType != "set" && *schema.XListType != "map" { + allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-type"), *schema.XListType, "must be one of 'atomic', 'set', 'map', or unset")) + } + + if len(schema.XListMapKeys) > 0 && (schema.XListType == nil || *schema.XListType != "map") { + if schema.XListType == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-list-type"), "must be map if x-kubernetes-list-map-keys is non-empty")) + } else { + allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-type"), *schema.XListType, "must be map if x-kubernetes-list-map-keys is non-empty")) + } + } + return allErrs } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go index dac9a6aed7f..11a94aea1be 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go @@ -6572,6 +6572,56 @@ func TestValidateCustomResourceDefinitionValidation(t *testing.T) { opts: validationOptions{requireValidPropertyType: true, requireStructuralSchema: true}, wantError: true, }, + { + name: "invalid type with list type extension set", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "object", + XListType: strPtr("map"), + }, + }, + wantError: true, + }, + { + name: "unset type with list type extension set", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + XListType: strPtr("map"), + }, + }, + wantError: true, + }, + { + name: "invalid list type extension with list map keys extension set", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + XListType: strPtr("set"), + XListMapKeys: []string{"key"}, + }, + }, + wantError: true, + }, + { + name: "unset list type extension with list map keys extension set", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + XListMapKeys: []string{"key"}, + }, + }, + wantError: true, + }, + { + name: "invalid list type", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + XListType: strPtr("invalid"), + }, + }, + wantError: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go index fb15693722b..e207ba65863 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go @@ -200,6 +200,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) s.GenericAPIServer.Authorizer, c.GenericConfig.RequestTimeout, time.Duration(c.GenericConfig.MinRequestTimeout)*time.Second, + apiGroupInfo.StaticOpenAPISpec, ) if err != nil { return nil, err diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go index d72dc1014c5..bf0d809fec8 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go @@ -40,6 +40,7 @@ import ( listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion" "k8s.io/apiextensions-apiserver/pkg/controller/establish" "k8s.io/apiextensions-apiserver/pkg/controller/finalizer" + "k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder" "k8s.io/apiextensions-apiserver/pkg/crdserverscheme" apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apiextensions-apiserver/pkg/registry/customresource" @@ -74,11 +75,13 @@ import ( genericfilters "k8s.io/apiserver/pkg/server/filters" "k8s.io/apiserver/pkg/storage/storagebackend" utilfeature "k8s.io/apiserver/pkg/util/feature" + utilopenapi "k8s.io/apiserver/pkg/util/openapi" "k8s.io/apiserver/pkg/util/webhook" "k8s.io/client-go/scale" "k8s.io/client-go/scale/scheme/autoscalingv1" "k8s.io/client-go/tools/cache" "k8s.io/klog" + "k8s.io/kube-openapi/pkg/util/proto" ) // crdHandler serves the `/apis` endpoint. @@ -117,6 +120,11 @@ type crdHandler struct { // minRequestTimeout applies to CR's list/watch calls minRequestTimeout time.Duration + + // staticOpenAPISpec is used as a base for the schema of CR's for the + // purpose of managing fields, it is how CR handlers get the structure + // of TypeMeta and ObjectMeta + staticOpenAPISpec *spec.Swagger } // crdInfo stores enough information to serve the storage for the custom resource @@ -160,7 +168,8 @@ func NewCustomResourceDefinitionHandler( masterCount int, authorizer authorizer.Authorizer, requestTimeout time.Duration, - minRequestTimeout time.Duration) (*crdHandler, error) { + minRequestTimeout time.Duration, + staticOpenAPISpec *spec.Swagger) (*crdHandler, error) { ret := &crdHandler{ versionDiscoveryHandler: versionDiscoveryHandler, groupDiscoveryHandler: groupDiscoveryHandler, @@ -175,6 +184,7 @@ func NewCustomResourceDefinitionHandler( authorizer: authorizer, requestTimeout: requestTimeout, minRequestTimeout: minRequestTimeout, + staticOpenAPISpec: staticOpenAPISpec, } crdInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: ret.createCustomResourceDefinition, @@ -634,6 +644,25 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd structuralSchemas[v.Name] = s } + var openAPIModels proto.Models + if utilfeature.DefaultFeatureGate.Enabled(features.ServerSideApply) && r.staticOpenAPISpec != nil { + specs := []*spec.Swagger{} + for _, v := range crd.Spec.Versions { + s, err := builder.BuildSwagger(crd, v.Name, builder.Options{V2: false, StripDefaults: true, StripValueValidation: true}) + if err != nil { + utilruntime.HandleError(err) + return nil, fmt.Errorf("the server could not properly serve the CR schema") + } + specs = append(specs, s) + } + mergedOpenAPI := builder.MergeSpecs(r.staticOpenAPISpec, specs...) + openAPIModels, err = utilopenapi.ToProtoModels(mergedOpenAPI) + if err != nil { + utilruntime.HandleError(err) + return nil, fmt.Errorf("the server could not properly serve the CR schema") + } + } + for _, v := range crd.Spec.Versions { safeConverter, unsafeConverter, err := r.converterFactory.NewConverter(crd) if err != nil { @@ -799,12 +828,17 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd } if utilfeature.DefaultFeatureGate.Enabled(features.ServerSideApply) { reqScope := *requestScopes[v.Name] - reqScope.FieldManager = fieldmanager.NewCRDFieldManager( + reqScope.FieldManager, err = fieldmanager.NewCRDFieldManager( + openAPIModels, reqScope.Convertor, reqScope.Defaulter, reqScope.Kind.GroupVersion(), reqScope.HubGroupVersion, + *crd.Spec.PreserveUnknownFields, ) + if err != nil { + return nil, err + } requestScopes[v.Name] = &reqScope } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/convert.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/convert.go index 3025d39e004..6f0e3f6bc1c 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/convert.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/convert.go @@ -244,6 +244,8 @@ func newExtensions(s *apiextensions.JSONSchemaProps) (*Extensions, error) { ret := &Extensions{ XEmbeddedResource: s.XEmbeddedResource, XIntOrString: s.XIntOrString, + XListMapKeys: s.XListMapKeys, + XListType: s.XListType, } if s.XPreserveUnknownFields != nil { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/goopenapi.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/goopenapi.go index 9fbf02c8f93..d9bc667c66c 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/goopenapi.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/goopenapi.go @@ -78,6 +78,12 @@ func (x *Extensions) toGoOpenAPI(ret *spec.Schema) { if x.XIntOrString { ret.VendorExtensible.AddExtension("x-kubernetes-int-or-string", true) } + if len(x.XListMapKeys) > 0 { + ret.VendorExtensible.AddExtension("x-kubernetes-list-map-keys", x.XListMapKeys) + } + if x.XListType != nil { + ret.VendorExtensible.AddExtension("x-kubernetes-list-type", x.XListType) + } } func (v *ValueValidation) toGoOpenAPI(ret *spec.Schema) { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/structural.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/structural.go index a060644a7cd..0d57200d086 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/structural.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/structural.go @@ -92,6 +92,29 @@ type Extensions struct { // - type: string // - ... zero or more XIntOrString bool + + // x-kubernetes-list-map-keys annotates lists with the x-kubernetes-list-type `map` by specifying the keys used + // as the index of the map. + // + // This tag MUST only be used on lists that have the "x-kubernetes-list-type" + // extension set to "map". Also, the values specified for this attribute must + // be a scalar typed field of the child structure (no nesting is supported). + XListMapKeys []string + + // x-kubernetes-list-type annotates a list to further describe its topology. + // This extension must only be used on lists and may have 3 possible values: + // + // 1) `atomic`: the list is treated as a single entity, like a scalar. + // Atomic lists will be entirely replaced when updated. This extension + // may be used on any type of list (struct, scalar, ...). + // 2) `set`: + // Sets are lists that must not have multiple times the same value. Each + // value must be a scalar (or another atomic type). + // 3) `map`: + // These lists are like maps in that their elements have a non-index key + // used to identify them. Order is preserved upon merge. The map tag + // must only be used on a list with struct elements. + XListType *string } // +k8s:deepcopy-gen=true diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation.go index 487731fd887..56d5f5a0816 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation.go @@ -305,6 +305,12 @@ func validateNestedValueValidation(v *NestedValueValidation, skipAnyOf, skipAllO if v.ForbiddenExtensions.XIntOrString { allErrs = append(allErrs, field.Forbidden(fldPath.Child("x-kubernetes-int-or-string"), "must be false to be structural")) } + if len(v.ForbiddenExtensions.XListMapKeys) > 0 { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("x-kubernetes-list-map-keys"), "must be empty to be structural")) + } + if v.ForbiddenExtensions.XListType != nil { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("x-kubernetes-list-type"), "must be undefined to be structural")) + } // forbid reasoning about metadata because it can lead to metadata restriction we don't want if _, found := v.Properties["metadata"]; found { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation_test.go index 3067f672f9d..15c7118e49b 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation_test.go @@ -21,8 +21,6 @@ import ( "testing" fuzz "github.com/google/gofuzz" - - "k8s.io/apimachinery/pkg/util/rand" ) func TestValidateNestedValueValidationComplete(t *testing.T) { @@ -46,7 +44,6 @@ func TestValidateNestedValueValidationComplete(t *testing.T) { for i := 0; i < tt.NumField(); i++ { vv := &NestedValueValidation{} x := reflect.ValueOf(&vv.ForbiddenGenerics).Elem() - i := rand.Intn(x.NumField()) fuzzer.Fuzz(x.Field(i).Addr().Interface()) errs := validateNestedValueValidation(vv, false, false, fieldLevel, nil) @@ -60,7 +57,6 @@ func TestValidateNestedValueValidationComplete(t *testing.T) { for i := 0; i < tt.NumField(); i++ { vv := &NestedValueValidation{} x := reflect.ValueOf(&vv.ForbiddenExtensions).Elem() - i := rand.Intn(x.NumField()) fuzzer.Fuzz(x.Field(i).Addr().Interface()) errs := validateNestedValueValidation(vv, false, false, fieldLevel, nil) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go index a45fe7a0acd..58f72fe2a11 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go @@ -246,6 +246,12 @@ func ConvertJSONSchemaPropsWithPostProcess(in *apiextensions.JSONSchemaProps, ou if in.XEmbeddedResource { out.VendorExtensible.AddExtension("x-kubernetes-embedded-resource", true) } + if len(in.XListMapKeys) != 0 { + out.VendorExtensible.AddExtension("x-kubernetes-list-map-keys", in.XListMapKeys) + } + if in.XListType != nil { + out.VendorExtensible.AddExtension("x-kubernetes-list-type", in.XListType) + } return nil } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager.go index 6a0bc579f87..54a4eae00f6 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager.go @@ -48,7 +48,7 @@ type FieldManager struct { // NewFieldManager creates a new FieldManager that merges apply requests // and update managed fields for other types of requests. func NewFieldManager(models openapiproto.Models, objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, gv schema.GroupVersion, hub schema.GroupVersion) (*FieldManager, error) { - typeConverter, err := internal.NewTypeConverter(models) + typeConverter, err := internal.NewTypeConverter(models, false) if err != nil { return nil, err } @@ -66,19 +66,26 @@ func NewFieldManager(models openapiproto.Models, objectConverter runtime.ObjectC } // NewCRDFieldManager creates a new FieldManager specifically for -// CRDs. This doesn't use openapi models (and it doesn't support the -// validation field right now). -func NewCRDFieldManager(objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, gv schema.GroupVersion, hub schema.GroupVersion) *FieldManager { +// CRDs. This allows for the possibility of fields which are not defined +// in models, as well as having no models defined at all. +func NewCRDFieldManager(models openapiproto.Models, objectConverter runtime.ObjectConvertor, objectDefaulter runtime.ObjectDefaulter, gv schema.GroupVersion, hub schema.GroupVersion, preserveUnknownFields bool) (_ *FieldManager, err error) { + var typeConverter internal.TypeConverter = internal.DeducedTypeConverter{} + if models != nil { + typeConverter, err = internal.NewTypeConverter(models, preserveUnknownFields) + if err != nil { + return nil, err + } + } return &FieldManager{ - typeConverter: internal.DeducedTypeConverter{}, + typeConverter: typeConverter, objectConverter: objectConverter, objectDefaulter: objectDefaulter, groupVersion: gv, hubVersion: hub, updater: merge.Updater{ - Converter: internal.NewCRDVersionConverter(internal.DeducedTypeConverter{}, objectConverter, hub), + Converter: internal.NewCRDVersionConverter(typeConverter, objectConverter, hub), }, - } + }, nil } // Update is used when the object has already been merged (non-apply diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go index f4dd58b40f6..3a3fded4ef4 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go @@ -58,12 +58,15 @@ func NewTestFieldManager() *fieldmanager.FieldManager { Version: "v1", } - return fieldmanager.NewCRDFieldManager( + f, _ := fieldmanager.NewCRDFieldManager( + nil, &fakeObjectConvertor{}, &fakeObjectDefaulter{}, gv, gv, + true, ) + return f } func TestFieldManagerCreation(t *testing.T) { diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/gvkparser.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/gvkparser.go index ff4022c8863..4d6ed52d803 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/gvkparser.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/gvkparser.go @@ -44,8 +44,8 @@ func (p *gvkParser) Type(gvk schema.GroupVersionKind) *typed.ParseableType { return &t } -func newGVKParser(models proto.Models) (*gvkParser, error) { - typeSchema, err := schemaconv.ToSchema(models) +func newGVKParser(models proto.Models, preserveUnknownFields bool) (*gvkParser, error) { + typeSchema, err := schemaconv.ToSchemaWithPreserveUnknownFields(models, preserveUnknownFields) if err != nil { return nil, fmt.Errorf("failed to convert models to schema: %v", err) } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/typeconverter.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/typeconverter.go index c9e329d65c4..44ad55916fa 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/typeconverter.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/typeconverter.go @@ -78,8 +78,8 @@ var _ TypeConverter = &typeConverter{} // NewTypeConverter builds a TypeConverter from a proto.Models. This // will automatically find the proper version of the object, and the // corresponding schema information. -func NewTypeConverter(models proto.Models) (TypeConverter, error) { - parser, err := newGVKParser(models) +func NewTypeConverter(models proto.Models, preserveUnknownFields bool) (TypeConverter, error) { + parser, err := newGVKParser(models, preserveUnknownFields) if err != nil { return nil, err } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/typeconverter_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/typeconverter_test.go index 700abb90c50..7ca4969d852 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/typeconverter_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/typeconverter_test.go @@ -48,7 +48,7 @@ func TestTypeConverter(t *testing.T) { t.Fatalf("Failed to build OpenAPI models: %v", err) } - tc, err := internal.NewTypeConverter(m) + tc, err := internal.NewTypeConverter(m, false) if err != nil { t.Fatalf("Failed to build TypeConverter: %v", err) } @@ -214,7 +214,7 @@ spec: b.Fatalf("Failed to build OpenAPI models: %v", err) } - tc, err := internal.NewTypeConverter(m) + tc, err := internal.NewTypeConverter(m, false) if err != nil { b.Fatalf("Failed to build TypeConverter: %v", err) } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/versionconverter_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/versionconverter_test.go index 18365f6d3a1..214b416d8bb 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/versionconverter_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/versionconverter_test.go @@ -39,7 +39,7 @@ func TestVersionConverter(t *testing.T) { if err != nil { t.Fatalf("Failed to build OpenAPI models: %v", err) } - tc, err := internal.NewTypeConverter(m) + tc, err := internal.NewTypeConverter(m, false) if err != nil { t.Fatalf("Failed to build TypeConverter: %v", err) } diff --git a/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go b/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go index 53b770c93d6..b1be70831c8 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go +++ b/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go @@ -77,6 +77,10 @@ type APIGroupInfo struct { NegotiatedSerializer runtime.NegotiatedSerializer // ParameterCodec performs conversions for query parameters passed to API calls ParameterCodec runtime.ParameterCodec + + // StaticOpenAPISpec is the spec derived from the definitions of all resources installed together. + // It is set during InstallAPIGroups, InstallAPIGroup, and InstallLegacyAPIGroup. + StaticOpenAPISpec *spec.Swagger } // GenericAPIServer contains state for a Kubernetes cluster api server. @@ -552,6 +556,9 @@ func (s *GenericAPIServer) getOpenAPIModels(apiPrefix string, apiGroupInfos ...* if err != nil { return nil, err } + for _, apiGroupInfo := range apiGroupInfos { + apiGroupInfo.StaticOpenAPISpec = openAPISpec + } return utilopenapi.ToProtoModels(openAPISpec) } diff --git a/test/integration/apiserver/apply/apply_crd_test.go b/test/integration/apiserver/apply/apply_crd_test.go new file mode 100644 index 00000000000..ccb56cbaeae --- /dev/null +++ b/test/integration/apiserver/apply/apply_crd_test.go @@ -0,0 +1,494 @@ +/* +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 apiserver + +import ( + "encoding/json" + "fmt" + "testing" + + apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" + "k8s.io/apiextensions-apiserver/test/integration/fixtures" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" + genericfeatures "k8s.io/apiserver/pkg/features" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/client-go/dynamic" + featuregatetesting "k8s.io/component-base/featuregate/testing" + apiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" + "k8s.io/kubernetes/test/integration/framework" +) + +// TestApplyCRDNoSchema tests that CRDs and CRs can both be applied to with a PATCH request with the apply content type +// when there is no validation field provided. +func TestApplyCRDNoSchema(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.ServerSideApply, true)() + + server, err := apiservertesting.StartTestServer(t, apiservertesting.NewDefaultTestServerOptions(), nil, framework.SharedEtcd()) + if err != nil { + t.Fatal(err) + } + defer server.TearDownFn() + config := server.ClientConfig + + apiExtensionClient, err := clientset.NewForConfig(config) + if err != nil { + t.Fatal(err) + } + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + t.Fatal(err) + } + + noxuDefinition := fixtures.NewMultipleVersionNoxuCRD(apiextensionsv1beta1.ClusterScoped) + + noxuDefinition, err = fixtures.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) + if err != nil { + t.Fatal(err) + } + + kind := noxuDefinition.Spec.Names.Kind + apiVersion := noxuDefinition.Spec.Group + "/" + noxuDefinition.Spec.Version + name := "mytest" + + rest := apiExtensionClient.Discovery().RESTClient() + yamlBody := []byte(fmt.Sprintf(` +apiVersion: %s +kind: %s +metadata: + name: %s +spec: + replicas: 1`, apiVersion, kind, name)) + result, err := rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw() + if err != nil { + t.Fatalf("failed to create custom resource with apply: %v:\n%v", err, string(result)) + } + + // Patch object to change the number of replicas + result, err = rest.Patch(types.MergePatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Body([]byte(`{"spec":{"replicas": 5}}`)). + DoRaw() + if err != nil { + t.Fatalf("failed to update number of replicas with merge patch: %v:\n%v", err, string(result)) + } + + // Re-apply, we should get conflicts now, since the number of replicas was changed. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw() + if err == nil { + t.Fatalf("Expecting to get conflicts when applying object after updating replicas, got no error: %s", result) + } + status, ok := err.(*errors.StatusError) + if !ok { + t.Fatalf("Expecting to get conflicts as API error") + } + if len(status.Status().Details.Causes) < 1 { + t.Fatalf("Expecting to get at least one conflict when applying object after updating replicas, got: %v", status.Status().Details.Causes) + } + + // Re-apply with force, should work fine. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("force", "true"). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw() + if err != nil { + t.Fatalf("failed to apply object with force after updating replicas: %v:\n%v", err, string(result)) + } +} + +// TestApplyCRDStructuralSchema tests that when a CRD has a structural schema in its validation field, +// it will be used to construct the CR schema used by apply. +func TestApplyCRDStructuralSchema(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.ServerSideApply, true)() + + server, err := apiservertesting.StartTestServer(t, apiservertesting.NewDefaultTestServerOptions(), nil, framework.SharedEtcd()) + if err != nil { + t.Fatal(err) + } + defer server.TearDownFn() + config := server.ClientConfig + + apiExtensionClient, err := clientset.NewForConfig(config) + if err != nil { + t.Fatal(err) + } + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + t.Fatal(err) + } + + noxuDefinition := fixtures.NewMultipleVersionNoxuCRD(apiextensionsv1beta1.ClusterScoped) + + var c apiextensionsv1beta1.CustomResourceValidation + err = json.Unmarshal([]byte(`{ + "openAPIV3Schema": { + "type": "object", + "properties": { + "spec": { + "type": "object", + "x-kubernetes-preserve-unknown-fields": true, + "properties": { + "cronSpec": { + "type": "string", + "pattern": "^(\\d+|\\*)(/\\d+)?(\\s+(\\d+|\\*)(/\\d+)?){4}$" + }, + "ports": { + "type": "array", + "x-kubernetes-list-map-keys": [ + "containerPort", + "protocol" + ], + "x-kubernetes-list-type": "map", + "items": { + "properties": { + "containerPort": { + "format": "int32", + "type": "integer" + }, + "hostIP": { + "type": "string" + }, + "hostPort": { + "format": "int32", + "type": "integer" + }, + "name": { + "type": "string" + }, + "protocol": { + "type": "string" + } + }, + "required": [ + "containerPort" + ], + "type": "object" + } + } + } + } + } + } + }`), &c) + if err != nil { + t.Fatal(err) + } + noxuDefinition.Spec.Validation = &c + falseBool := false + noxuDefinition.Spec.PreserveUnknownFields = &falseBool + + noxuDefinition, err = fixtures.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) + if err != nil { + t.Fatal(err) + } + + kind := noxuDefinition.Spec.Names.Kind + apiVersion := noxuDefinition.Spec.Group + "/" + noxuDefinition.Spec.Version + name := "mytest" + + rest := apiExtensionClient.Discovery().RESTClient() + yamlBody := []byte(fmt.Sprintf(` +apiVersion: %s +kind: %s +metadata: + name: %s + finalizers: + - test-finalizer +spec: + cronSpec: "* * * * */5" + replicas: 1 + ports: + - name: x + containerPort: 80 + protocol: TCP`, apiVersion, kind, name)) + result, err := rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw() + if err != nil { + t.Fatalf("failed to create custom resource with apply: %v:\n%v", err, string(result)) + } + + // Patch object to add another finalizer to the finalizers list + result, err = rest.Patch(types.MergePatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Body([]byte(`{"metadata":{"finalizers":["another-one"]}}`)). + DoRaw() + if err != nil { + t.Fatalf("failed to add finalizer with merge patch: %v:\n%v", err, string(result)) + } + + // Re-apply the same config, should work fine, since finalizers should have the list-type extension 'set'. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw() + if err != nil { + t.Fatalf("failed to apply same config after adding a finalizer: %v:\n%v", err, string(result)) + } + + // Patch object to change the number of replicas + result, err = rest.Patch(types.MergePatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Body([]byte(`{"spec":{"replicas": 5}}`)). + DoRaw() + if err != nil { + t.Fatalf("failed to update number of replicas with merge patch: %v:\n%v", err, string(result)) + } + + // Re-apply, we should get conflicts now, since the number of replicas was changed. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw() + if err == nil { + t.Fatalf("Expecting to get conflicts when applying object after updating replicas, got no error: %s", result) + } + status, ok := err.(*errors.StatusError) + if !ok { + t.Fatalf("Expecting to get conflicts as API error") + } + if len(status.Status().Details.Causes) < 1 { + t.Fatalf("Expecting to get at least one conflict when applying object after updating replicas, got: %v", status.Status().Details.Causes) + } + + // Re-apply with force, should work fine. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("force", "true"). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw() + if err != nil { + t.Fatalf("failed to apply object with force after updating replicas: %v:\n%v", err, string(result)) + } + + // New applier tries to edit an existing list item, we should get conflicts. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test_2"). + Body([]byte(fmt.Sprintf(` +apiVersion: %s +kind: %s +metadata: + name: %s +spec: + ports: + - name: "y" + containerPort: 80 + protocol: TCP`, apiVersion, kind, name))). + DoRaw() + if err == nil { + t.Fatalf("Expecting to get conflicts when a different applier updates existing list item, got no error: %s", result) + } + status, ok = err.(*errors.StatusError) + if !ok { + t.Fatalf("Expecting to get conflicts as API error") + } + if len(status.Status().Details.Causes) < 1 { + t.Fatalf("Expecting to get at least one conflict when a different applier updates existing list item, got: %v", status.Status().Details.Causes) + } + + // New applier tries to add a new list item, should work fine. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test_2"). + Body([]byte(fmt.Sprintf(` +apiVersion: %s +kind: %s +metadata: + name: %s +spec: + ports: + - name: "y" + containerPort: 8080 + protocol: TCP`, apiVersion, kind, name))). + DoRaw() + if err != nil { + t.Fatalf("failed to add a new list item to the object as a different applier: %v:\n%v", err, string(result)) + } +} + +// TestApplyCRDNonStructuralSchema tests that when a CRD has a non-structural schema in its validation field, +// it will be used to construct the CR schema used by apply, but any non-structural parts of the schema will be treated as +// nested maps (same as a CRD without a schema) +func TestApplyCRDNonStructuralSchema(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.ServerSideApply, true)() + + server, err := apiservertesting.StartTestServer(t, apiservertesting.NewDefaultTestServerOptions(), nil, framework.SharedEtcd()) + if err != nil { + t.Fatal(err) + } + defer server.TearDownFn() + config := server.ClientConfig + + apiExtensionClient, err := clientset.NewForConfig(config) + if err != nil { + t.Fatal(err) + } + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + t.Fatal(err) + } + + noxuDefinition := fixtures.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped) + + var c apiextensionsv1beta1.CustomResourceValidation + err = json.Unmarshal([]byte(`{ + "openAPIV3Schema": { + "type": "object", + "properties": { + "spec": { + "anyOf": [ + { + "type": "object", + "properties": { + "cronSpec": { + "type": "string", + "pattern": "^(\\d+|\\*)(/\\d+)?(\\s+(\\d+|\\*)(/\\d+)?){4}$" + } + } + }, { + "type": "string" + } + ] + } + } + } + }`), &c) + if err != nil { + t.Fatal(err) + } + noxuDefinition.Spec.Validation = &c + + noxuDefinition, err = fixtures.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) + if err != nil { + t.Fatal(err) + } + + kind := noxuDefinition.Spec.Names.Kind + apiVersion := noxuDefinition.Spec.Group + "/" + noxuDefinition.Spec.Version + name := "mytest" + + rest := apiExtensionClient.Discovery().RESTClient() + yamlBody := []byte(fmt.Sprintf(` +apiVersion: %s +kind: %s +metadata: + name: %s + finalizers: + - test-finalizer +spec: + cronSpec: "* * * * */5" + replicas: 1`, apiVersion, kind, name)) + result, err := rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw() + if err != nil { + t.Fatalf("failed to create custom resource with apply: %v:\n%v", err, string(result)) + } + + // Patch object to add another finalizer to the finalizers list + result, err = rest.Patch(types.MergePatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Body([]byte(`{"metadata":{"finalizers":["another-one"]}}`)). + DoRaw() + if err != nil { + t.Fatalf("failed to add finalizer with merge patch: %v:\n%v", err, string(result)) + } + + // Re-apply the same config, should work fine, since finalizers should have the list-type extension 'set'. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw() + if err != nil { + t.Fatalf("failed to apply same config after adding a finalizer: %v:\n%v", err, string(result)) + } + + // Patch object to change the number of replicas + result, err = rest.Patch(types.MergePatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Body([]byte(`{"spec":{"replicas": 5}}`)). + DoRaw() + if err != nil { + t.Fatalf("failed to update number of replicas with merge patch: %v:\n%v", err, string(result)) + } + + // Re-apply, we should get conflicts now, since the number of replicas was changed. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw() + if err == nil { + t.Fatalf("Expecting to get conflicts when applying object after updating replicas, got no error: %s", result) + } + status, ok := err.(*errors.StatusError) + if !ok { + t.Fatalf("Expecting to get conflicts as API error") + } + if len(status.Status().Details.Causes) < 1 { + t.Fatalf("Expecting to get at least one conflict when applying object after updating replicas, got: %v", status.Status().Details.Causes) + } + + // Re-apply with force, should work fine. + result, err = rest.Patch(types.ApplyPatchType). + AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). + Name(name). + Param("force", "true"). + Param("fieldManager", "apply_test"). + Body(yamlBody). + DoRaw() + if err != nil { + t.Fatalf("failed to apply object with force after updating replicas: %v:\n%v", err, string(result)) + } +} From cf24968309a82d29f673518b0bd4539bce2ca453 Mon Sep 17 00:00:00 2001 From: jennybuckley Date: Thu, 29 Aug 2019 19:10:28 -0700 Subject: [PATCH 3/7] Fix validation and add many tests --- .../apis/apiextensions/types_jsonschema.go | 8 +- .../pkg/apis/apiextensions/v1/defaults.go | 44 +++++ .../apis/apiextensions/v1/defaults_test.go | 41 +++++ .../apis/apiextensions/v1/types_jsonschema.go | 12 +- .../apis/apiextensions/v1beta1/defaults.go | 44 +++++ .../apiextensions/v1beta1/defaults_test.go | 28 ++++ .../apiextensions/v1beta1/types_jsonschema.go | 12 +- .../apiextensions/validation/validation.go | 35 +++- .../validation/validation_test.go | 153 +++++++++++++++++- .../pkg/apiserver/customresource_handler.go | 6 +- .../pkg/apiserver/schema/goopenapi.go | 2 +- .../pkg/apiserver/schema/structural.go | 4 +- .../pkg/apiserver/validation/validation.go | 2 +- test/e2e/apimachinery/crd_publish_openapi.go | 10 +- .../apiserver/apply/apply_crd_test.go | 135 ++++++++++++++-- 15 files changed, 500 insertions(+), 36 deletions(-) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go index 06380a4e8e0..77abe9e36d0 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go @@ -87,7 +87,7 @@ type JSONSchemaProps struct { // - ... zero or more XIntOrString bool - // x-kubernetes-list-map-keys annotates lists with the x-kubernetes-list-type `map` by specifying the keys used + // x-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used // as the index of the map. // // This tag MUST only be used on lists that have the "x-kubernetes-list-type" @@ -95,19 +95,19 @@ type JSONSchemaProps struct { // be a scalar typed field of the child structure (no nesting is supported). XListMapKeys []string - // x-kubernetes-list-type annotates a list to further describe its topology. + // x-kubernetes-list-type annotates an array to further describe its topology. // This extension must only be used on lists and may have 3 possible values: // // 1) `atomic`: the list is treated as a single entity, like a scalar. // Atomic lists will be entirely replaced when updated. This extension // may be used on any type of list (struct, scalar, ...). // 2) `set`: - // Sets are lists that must not have multiple times the same value. Each + // Sets are lists that must not have multiple items with the same value. Each // value must be a scalar (or another atomic type). // 3) `map`: // These lists are like maps in that their elements have a non-index key // used to identify them. Order is preserved upon merge. The map tag - // must only be used on a list with struct elements. + // must only be used on a list with elements of type object. XListType *string } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go index 5cebec927bd..7bf26d5c7f0 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go @@ -59,3 +59,47 @@ func SetDefaults_ServiceReference(obj *ServiceReference) { obj.Port = utilpointer.Int32Ptr(443) } } + +// SetDefaults_JSONSchemaProps sets the defaults for JSONSchemaProps +func SetDefaults_JSONSchemaProps(obj *JSONSchemaProps) { + if obj == nil { + return + } + if obj.Type == "array" && obj.XListType == nil { + obj.XListType = utilpointer.StringPtr("atomic") + } + if obj.Items != nil { + SetDefaults_JSONSchemaProps(obj.Items.Schema) + defaultJSONSchemaPropsArray(obj.Items.JSONSchemas) + } + defaultJSONSchemaPropsArray(obj.AllOf) + defaultJSONSchemaPropsArray(obj.OneOf) + defaultJSONSchemaPropsArray(obj.AnyOf) + SetDefaults_JSONSchemaProps(obj.Not) + defaultJSONSchemaPropsMap(obj.Properties) + if obj.AdditionalProperties != nil { + SetDefaults_JSONSchemaProps(obj.AdditionalProperties.Schema) + } + defaultJSONSchemaPropsMap(obj.PatternProperties) + for i := range obj.Dependencies { + SetDefaults_JSONSchemaProps(obj.Dependencies[i].Schema) + } + if obj.AdditionalItems != nil { + SetDefaults_JSONSchemaProps(obj.AdditionalItems.Schema) + } + defaultJSONSchemaPropsMap(map[string]JSONSchemaProps(obj.Definitions)) +} + +func defaultJSONSchemaPropsArray(obj []JSONSchemaProps) { + for i := range obj { + SetDefaults_JSONSchemaProps(&obj[i]) + } +} + +func defaultJSONSchemaPropsMap(obj map[string]JSONSchemaProps) { + for i := range obj { + props := obj[i] + SetDefaults_JSONSchemaProps(&props) + obj[i] = props + } +} diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go index 7640c10c5c4..4f17503218f 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go @@ -124,6 +124,47 @@ func TestDefaults(t *testing.T) { }, }, }, + { + name: "list type extension defaults", + original: &CustomResourceDefinition{ + Spec: CustomResourceDefinitionSpec{ + Scope: NamespaceScoped, + Conversion: &CustomResourceConversion{Strategy: NoneConverter}, + Versions: []CustomResourceDefinitionVersion{ + { + Name: "v1", + Storage: true, + Schema: &CustomResourceValidation{ + OpenAPIV3Schema: &JSONSchemaProps{ + Type: "array", + }, + }, + }, + }, + }, + }, + expected: &CustomResourceDefinition{ + Spec: CustomResourceDefinitionSpec{ + Scope: NamespaceScoped, + Conversion: &CustomResourceConversion{Strategy: NoneConverter}, + Versions: []CustomResourceDefinitionVersion{ + { + Name: "v1", + Storage: true, + Schema: &CustomResourceValidation{ + OpenAPIV3Schema: &JSONSchemaProps{ + Type: "array", + XListType: utilpointer.StringPtr("atomic"), + }, + }, + }, + }, + }, + Status: CustomResourceDefinitionStatus{ + StoredVersions: []string{"v1"}, + }, + }, + }, } for _, test := range tests { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go index 1d3727fed87..37d0f75b0f2 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types_jsonschema.go @@ -91,27 +91,31 @@ type JSONSchemaProps struct { // - ... zero or more XIntOrString bool `json:"x-kubernetes-int-or-string,omitempty" protobuf:"bytes,40,opt,name=xKubernetesIntOrString"` - // x-kubernetes-list-map-keys annotates lists with the x-kubernetes-list-type `map` by specifying the keys used + // x-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used // as the index of the map. // // This tag MUST only be used on lists that have the "x-kubernetes-list-type" // extension set to "map". Also, the values specified for this attribute must // be a scalar typed field of the child structure (no nesting is supported). + // + // +optional XListMapKeys []string `json:"x-kubernetes-list-map-keys,omitempty" protobuf:"bytes,41,rep,name=xKubernetesListMapKeys"` - // x-kubernetes-list-type annotates a list to further describe its topology. + // x-kubernetes-list-type annotates an array to further describe its topology. // This extension must only be used on lists and may have 3 possible values: // // 1) `atomic`: the list is treated as a single entity, like a scalar. // Atomic lists will be entirely replaced when updated. This extension // may be used on any type of list (struct, scalar, ...). // 2) `set`: - // Sets are lists that must not have multiple times the same value. Each + // Sets are lists that must not have multiple items with the same value. Each // value must be a scalar (or another atomic type). // 3) `map`: // These lists are like maps in that their elements have a non-index key // used to identify them. Order is preserved upon merge. The map tag - // must only be used on a list with struct elements. + // must only be used on a list with elements of type object. + // Defaults to atomic for arrays. + // +optional XListType *string `json:"x-kubernetes-list-type,omitempty" protobuf:"bytes,42,opt,name=xKubernetesListType"` } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go index 1a9c2238e33..bffce311907 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go @@ -80,3 +80,47 @@ func SetDefaults_ServiceReference(obj *ServiceReference) { obj.Port = utilpointer.Int32Ptr(443) } } + +// SetDefaults_JSONSchemaProps sets the defaults for JSONSchemaProps +func SetDefaults_JSONSchemaProps(obj *JSONSchemaProps) { + if obj == nil { + return + } + if obj.Type == "array" && obj.XListType == nil { + obj.XListType = utilpointer.StringPtr("atomic") + } + if obj.Items != nil { + SetDefaults_JSONSchemaProps(obj.Items.Schema) + defaultJSONSchemaPropsArray(obj.Items.JSONSchemas) + } + defaultJSONSchemaPropsArray(obj.AllOf) + defaultJSONSchemaPropsArray(obj.OneOf) + defaultJSONSchemaPropsArray(obj.AnyOf) + SetDefaults_JSONSchemaProps(obj.Not) + defaultJSONSchemaPropsMap(obj.Properties) + if obj.AdditionalProperties != nil { + SetDefaults_JSONSchemaProps(obj.AdditionalProperties.Schema) + } + defaultJSONSchemaPropsMap(obj.PatternProperties) + for i := range obj.Dependencies { + SetDefaults_JSONSchemaProps(obj.Dependencies[i].Schema) + } + if obj.AdditionalItems != nil { + SetDefaults_JSONSchemaProps(obj.AdditionalItems.Schema) + } + defaultJSONSchemaPropsMap(map[string]JSONSchemaProps(obj.Definitions)) +} + +func defaultJSONSchemaPropsArray(obj []JSONSchemaProps) { + for i := range obj { + SetDefaults_JSONSchemaProps(&obj[i]) + } +} + +func defaultJSONSchemaPropsMap(obj map[string]JSONSchemaProps) { + for i := range obj { + props := obj[i] + SetDefaults_JSONSchemaProps(&props) + obj[i] = props + } +} diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults_test.go index 6aad4c5eee7..dff89a77f1a 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults_test.go @@ -129,6 +129,34 @@ func TestDefaults(t *testing.T) { }, }, }, + { + name: "list type extension defaults", + original: &CustomResourceDefinition{ + Spec: CustomResourceDefinitionSpec{ + Scope: NamespaceScoped, + Conversion: &CustomResourceConversion{Strategy: NoneConverter}, + PreserveUnknownFields: utilpointer.BoolPtr(true), + Validation: &CustomResourceValidation{ + OpenAPIV3Schema: &JSONSchemaProps{ + Type: "array", + }, + }, + }, + }, + expected: &CustomResourceDefinition{ + Spec: CustomResourceDefinitionSpec{ + Scope: NamespaceScoped, + Conversion: &CustomResourceConversion{Strategy: NoneConverter}, + PreserveUnknownFields: utilpointer.BoolPtr(true), + Validation: &CustomResourceValidation{ + OpenAPIV3Schema: &JSONSchemaProps{ + Type: "array", + XListType: utilpointer.StringPtr("atomic"), + }, + }, + }, + }, + }, } for _, test := range tests { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go index 9ef486747d0..90097e4e5b2 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go @@ -91,27 +91,31 @@ type JSONSchemaProps struct { // - ... zero or more XIntOrString bool `json:"x-kubernetes-int-or-string,omitempty" protobuf:"bytes,40,opt,name=xKubernetesIntOrString"` - // x-kubernetes-list-map-keys annotates lists with the x-kubernetes-list-type `map` by specifying the keys used + // x-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used // as the index of the map. // // This tag MUST only be used on lists that have the "x-kubernetes-list-type" // extension set to "map". Also, the values specified for this attribute must // be a scalar typed field of the child structure (no nesting is supported). + // + // +optional XListMapKeys []string `json:"x-kubernetes-list-map-keys,omitempty" protobuf:"bytes,41,rep,name=xKubernetesListMapKeys"` - // x-kubernetes-list-type annotates a list to further describe its topology. + // x-kubernetes-list-type annotates an array to further describe its topology. // This extension must only be used on lists and may have 3 possible values: // // 1) `atomic`: the list is treated as a single entity, like a scalar. // Atomic lists will be entirely replaced when updated. This extension // may be used on any type of list (struct, scalar, ...). // 2) `set`: - // Sets are lists that must not have multiple times the same value. Each + // Sets are lists that must not have multiple items with the same value. Each // value must be a scalar (or another atomic type). // 3) `map`: // These lists are like maps in that their elements have a non-index key // used to identify them. Order is preserved upon merge. The map tag - // must only be used on a list with struct elements. + // must only be used on a list with elements of type object. + // Defaults to atomic for arrays. + // +optional XListType *string `json:"x-kubernetes-list-type,omitempty" protobuf:"bytes,42,opt,name=xKubernetesListType"` } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go index defc42e1914..17c4e24a028 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go @@ -796,8 +796,12 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch } } + if schema.XListType == nil && schema.Type == "array" { + allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-list-type"), "must be set if type is array")) + } + if schema.XListType != nil && *schema.XListType != "atomic" && *schema.XListType != "set" && *schema.XListType != "map" { - allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-type"), *schema.XListType, "must be one of 'atomic', 'set', 'map', or unset")) + allErrs = append(allErrs, field.NotSupported(fldPath.Child("x-kubernetes-list-type"), *schema.XListType, []string{"atomic", "set", "map"})) } if len(schema.XListMapKeys) > 0 && (schema.XListType == nil || *schema.XListType != "map") { @@ -808,6 +812,35 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch } } + if len(schema.XListMapKeys) == 0 && schema.XListType != nil && *schema.XListType == "map" { + allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-list-map-keys"), "must not be empty if x-kubernetes-list-type is map")) + } + + if schema.Items != nil && schema.Items.Schema == nil && schema.XListType != nil && *schema.XListType == "map" { + allErrs = append(allErrs, field.Invalid(fldPath.Child("items"), schema.Items, "must only have a single schema if x-kubernetes-list-type is map")) + } + + if schema.Items != nil && schema.Items.Schema != nil && schema.Items.Schema.Type != "object" && schema.XListType != nil && *schema.XListType == "map" { + allErrs = append(allErrs, field.Invalid(fldPath.Child("items").Child("type"), schema.Items.Schema.Type, "must be object if parent array's x-kubernetes-list-type is map")) + } + + if schema.Items != nil && schema.Items.Schema != nil && schema.Items.Schema.Type == "object" && schema.XListType != nil && *schema.XListType == "map" { + keys := map[string]struct{}{} + for _, k := range schema.XListMapKeys { + if s, ok := schema.Items.Schema.Properties[k]; ok { + if s.Type == "array" || s.Type == "object" { + allErrs = append(allErrs, field.Invalid(fldPath.Child("items").Child("properties").Child(k).Child("type"), schema.Items.Schema.Type, "must be a scalar type if parent array's x-kubernetes-list-type is map")) + } + } else { + allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-map-keys"), schema.XListMapKeys, "entries must all be names of item properties")) + } + if _, ok := keys[k]; ok { + allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-map-keys"), schema.XListMapKeys, "must not contain duplicate entries")) + } + keys[k] = struct{}{} + } + } + return allErrs } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go index 11a94aea1be..e00bff9c917 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go @@ -6510,6 +6510,9 @@ func TestValidateCustomResourceDefinitionValidation(t *testing.T) { "array": { Type: "array", Nullable: true, + + // This value is defaulted + XListType: strPtr("atomic"), }, "number": { Type: "number", @@ -6577,7 +6580,7 @@ func TestValidateCustomResourceDefinitionValidation(t *testing.T) { input: apiextensions.CustomResourceValidation{ OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ Type: "object", - XListType: strPtr("map"), + XListType: strPtr("set"), }, }, wantError: true, @@ -6586,13 +6589,32 @@ func TestValidateCustomResourceDefinitionValidation(t *testing.T) { name: "unset type with list type extension set", input: apiextensions.CustomResourceValidation{ OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ - XListType: strPtr("map"), + XListType: strPtr("set"), }, }, wantError: true, }, { - name: "invalid list type extension with list map keys extension set", + name: "unset list type extension with type array", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + }, + }, + wantError: true, + }, + { + name: "invalid list type extension", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + XListType: strPtr("invalid"), + }, + }, + wantError: true, + }, + { + name: "invalid list type extension with list map keys extension non-empty", input: apiextensions.CustomResourceValidation{ OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ Type: "array", @@ -6603,25 +6625,142 @@ func TestValidateCustomResourceDefinitionValidation(t *testing.T) { wantError: true, }, { - name: "unset list type extension with list map keys extension set", + name: "unset list type extension with list map keys extension non-empty", input: apiextensions.CustomResourceValidation{ OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ - Type: "array", XListMapKeys: []string{"key"}, }, }, wantError: true, }, { - name: "invalid list type", + name: "empty list map keys extension with list type extension map", input: apiextensions.CustomResourceValidation{ OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ Type: "array", - XListType: strPtr("invalid"), + XListType: strPtr("map"), }, }, wantError: true, }, + { + name: "multiple schema items with list type extension map", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + XListType: strPtr("map"), + XListMapKeys: []string{"key"}, + Items: &apiextensions.JSONSchemaPropsOrArray{ + JSONSchemas: []apiextensions.JSONSchemaProps{ + { + Type: "string", + }, { + Type: "integer", + }, + }, + }, + }, + }, + wantError: true, + }, + { + name: "non object item with list type extension map", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + XListType: strPtr("map"), + XListMapKeys: []string{"key"}, + Items: &apiextensions.JSONSchemaPropsOrArray{ + Schema: &apiextensions.JSONSchemaProps{ + Type: "string", + }, + }, + }, + }, + wantError: true, + }, + { + name: "items with key missing from properties with list type extension map", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + XListType: strPtr("map"), + XListMapKeys: []string{"key"}, + Items: &apiextensions.JSONSchemaPropsOrArray{ + Schema: &apiextensions.JSONSchemaProps{ + Type: "object", + }, + }, + }, + }, + wantError: true, + }, + { + name: "items with non scalar key property type with list type extension map", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + XListType: strPtr("map"), + XListMapKeys: []string{"key"}, + Items: &apiextensions.JSONSchemaPropsOrArray{ + Schema: &apiextensions.JSONSchemaProps{ + Type: "object", + Properties: map[string]apiextensions.JSONSchemaProps{ + "key": { + Type: "object", + }, + }, + }, + }, + }, + }, + wantError: true, + }, + { + name: "duplicate map keys with list type extension map", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + XListType: strPtr("map"), + XListMapKeys: []string{"key", "key"}, + Items: &apiextensions.JSONSchemaPropsOrArray{ + Schema: &apiextensions.JSONSchemaProps{ + Type: "object", + Properties: map[string]apiextensions.JSONSchemaProps{ + "key": { + Type: "string", + }, + }, + }, + }, + }, + }, + wantError: true, + }, + { + name: "allowed schema with list type extension map", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + XListType: strPtr("map"), + XListMapKeys: []string{"keyA", "keyB"}, + Items: &apiextensions.JSONSchemaPropsOrArray{ + Schema: &apiextensions.JSONSchemaProps{ + Type: "object", + Properties: map[string]apiextensions.JSONSchemaProps{ + "keyA": { + Type: "string", + }, + "keyB": { + Type: "integer", + }, + }, + }, + }, + }, + }, + wantError: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go index bf0d809fec8..23d4b236e32 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go @@ -655,7 +655,11 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd } specs = append(specs, s) } - mergedOpenAPI := builder.MergeSpecs(r.staticOpenAPISpec, specs...) + mergedOpenAPI, err := builder.MergeSpecs(r.staticOpenAPISpec, specs...) + if err != nil { + utilruntime.HandleError(err) + return nil, fmt.Errorf("the server could not properly merge the CR schema") + } openAPIModels, err = utilopenapi.ToProtoModels(mergedOpenAPI) if err != nil { utilruntime.HandleError(err) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/goopenapi.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/goopenapi.go index d9bc667c66c..0db56b85637 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/goopenapi.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/goopenapi.go @@ -82,7 +82,7 @@ func (x *Extensions) toGoOpenAPI(ret *spec.Schema) { ret.VendorExtensible.AddExtension("x-kubernetes-list-map-keys", x.XListMapKeys) } if x.XListType != nil { - ret.VendorExtensible.AddExtension("x-kubernetes-list-type", x.XListType) + ret.VendorExtensible.AddExtension("x-kubernetes-list-type", *x.XListType) } } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/structural.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/structural.go index 0d57200d086..23d09eb9ef7 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/structural.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/structural.go @@ -108,12 +108,12 @@ type Extensions struct { // Atomic lists will be entirely replaced when updated. This extension // may be used on any type of list (struct, scalar, ...). // 2) `set`: - // Sets are lists that must not have multiple times the same value. Each + // Sets are lists that must not have multiple items with the same value. Each // value must be a scalar (or another atomic type). // 3) `map`: // These lists are like maps in that their elements have a non-index key // used to identify them. Order is preserved upon merge. The map tag - // must only be used on a list with struct elements. + // must only be used on a list with elements of type object. XListType *string } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go index 58f72fe2a11..c5e9892e2c8 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go @@ -250,7 +250,7 @@ func ConvertJSONSchemaPropsWithPostProcess(in *apiextensions.JSONSchemaProps, ou out.VendorExtensible.AddExtension("x-kubernetes-list-map-keys", in.XListMapKeys) } if in.XListType != nil { - out.VendorExtensible.AddExtension("x-kubernetes-list-type", in.XListType) + out.VendorExtensible.AddExtension("x-kubernetes-list-type", *in.XListType) } return nil diff --git a/test/e2e/apimachinery/crd_publish_openapi.go b/test/e2e/apimachinery/crd_publish_openapi.go index 6dce7a38d59..2179845677c 100644 --- a/test/e2e/apimachinery/crd_publish_openapi.go +++ b/test/e2e/apimachinery/crd_publish_openapi.go @@ -35,6 +35,7 @@ import ( apiequality "k8s.io/apimachinery/pkg/api/equality" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + utildiff "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/wait" k8sclientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" @@ -507,7 +508,8 @@ func waitForDefinition(c k8sclientset.Interface, name string, schema []byte) err // drop properties and extension that we added dropDefaults(&d) if !apiequality.Semantic.DeepEqual(expect, d) { - return false, fmt.Sprintf("spec.SwaggerProps.Definitions[\"%s\"] not match; expect: %v, actual: %v", name, expect, d) + diff := utildiff.ObjectGoPrintSideBySide(expect, d) + return false, fmt.Sprintf("spec.SwaggerProps.Definitions[\"%s\"] not match; expect: %v, actual: %v\n%v", name, expect, d, diff) } } return true, "" @@ -627,6 +629,7 @@ properties: bars: description: List of Bars and their specs. type: array + x-kubernetes-list-type: atomic items: type: object required: @@ -643,6 +646,7 @@ properties: items: type: string type: array + x-kubernetes-list-type: atomic status: description: Status of Foo type: object @@ -650,6 +654,7 @@ properties: bars: description: List of Bars and their statuses. type: array + x-kubernetes-list-type: atomic items: type: object properties: @@ -681,6 +686,7 @@ properties: bars: description: List of Bars and their statuses. type: array + x-kubernetes-list-type: atomic items: type: object`) @@ -702,6 +708,7 @@ properties: bars: description: List of Bars and their statuses. type: array + x-kubernetes-list-type: atomic items: type: object`) @@ -723,5 +730,6 @@ properties: bars: description: List of Bars and their statuses. type: array + x-kubernetes-list-type: atomic items: type: object`) diff --git a/test/integration/apiserver/apply/apply_crd_test.go b/test/integration/apiserver/apply/apply_crd_test.go index ccb56cbaeae..83796feaa51 100644 --- a/test/integration/apiserver/apply/apply_crd_test.go +++ b/test/integration/apiserver/apply/apply_crd_test.go @@ -19,12 +19,14 @@ package apiserver import ( "encoding/json" "fmt" + "reflect" "testing" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" "k8s.io/apiextensions-apiserver/test/integration/fixtures" "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/types" genericfeatures "k8s.io/apiserver/pkg/features" utilfeature "k8s.io/apiserver/pkg/util/feature" @@ -83,6 +85,7 @@ spec: if err != nil { t.Fatalf("failed to create custom resource with apply: %v:\n%v", err, string(result)) } + verifyReplicas(t, result, 1) // Patch object to change the number of replicas result, err = rest.Patch(types.MergePatchType). @@ -93,6 +96,7 @@ spec: if err != nil { t.Fatalf("failed to update number of replicas with merge patch: %v:\n%v", err, string(result)) } + verifyReplicas(t, result, 5) // Re-apply, we should get conflicts now, since the number of replicas was changed. result, err = rest.Patch(types.ApplyPatchType). @@ -108,8 +112,8 @@ spec: if !ok { t.Fatalf("Expecting to get conflicts as API error") } - if len(status.Status().Details.Causes) < 1 { - t.Fatalf("Expecting to get at least one conflict when applying object after updating replicas, got: %v", status.Status().Details.Causes) + if len(status.Status().Details.Causes) != 1 { + t.Fatalf("Expecting to get one conflict when applying object after updating replicas, got: %v", status.Status().Details.Causes) } // Re-apply with force, should work fine. @@ -123,6 +127,7 @@ spec: if err != nil { t.Fatalf("failed to apply object with force after updating replicas: %v:\n%v", err, string(result)) } + verifyReplicas(t, result, 1) } // TestApplyCRDStructuralSchema tests that when a CRD has a structural schema in its validation field, @@ -239,27 +244,38 @@ spec: if err != nil { t.Fatalf("failed to create custom resource with apply: %v:\n%v", err, string(result)) } + verifyNumFinalizers(t, result, 1) + verifyFinalizersIncludes(t, result, "test-finalizer") + verifyReplicas(t, result, 1) + verifyNumPorts(t, result, 1) // Patch object to add another finalizer to the finalizers list result, err = rest.Patch(types.MergePatchType). AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). Name(name). - Body([]byte(`{"metadata":{"finalizers":["another-one"]}}`)). + Body([]byte(`{"metadata":{"finalizers":["test-finalizer","another-one"]}}`)). DoRaw() if err != nil { t.Fatalf("failed to add finalizer with merge patch: %v:\n%v", err, string(result)) } + verifyNumFinalizers(t, result, 2) + verifyFinalizersIncludes(t, result, "test-finalizer") + verifyFinalizersIncludes(t, result, "another-one") // Re-apply the same config, should work fine, since finalizers should have the list-type extension 'set'. result, err = rest.Patch(types.ApplyPatchType). AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). Name(name). Param("fieldManager", "apply_test"). + SetHeader("Accept", "application/json"). Body(yamlBody). DoRaw() if err != nil { t.Fatalf("failed to apply same config after adding a finalizer: %v:\n%v", err, string(result)) } + verifyNumFinalizers(t, result, 2) + verifyFinalizersIncludes(t, result, "test-finalizer") + verifyFinalizersIncludes(t, result, "another-one") // Patch object to change the number of replicas result, err = rest.Patch(types.MergePatchType). @@ -270,6 +286,7 @@ spec: if err != nil { t.Fatalf("failed to update number of replicas with merge patch: %v:\n%v", err, string(result)) } + verifyReplicas(t, result, 5) // Re-apply, we should get conflicts now, since the number of replicas was changed. result, err = rest.Patch(types.ApplyPatchType). @@ -285,8 +302,8 @@ spec: if !ok { t.Fatalf("Expecting to get conflicts as API error") } - if len(status.Status().Details.Causes) < 1 { - t.Fatalf("Expecting to get at least one conflict when applying object after updating replicas, got: %v", status.Status().Details.Causes) + if len(status.Status().Details.Causes) != 1 { + t.Fatalf("Expecting to get one conflict when applying object after updating replicas, got: %v", status.Status().Details.Causes) } // Re-apply with force, should work fine. @@ -300,6 +317,7 @@ spec: if err != nil { t.Fatalf("failed to apply object with force after updating replicas: %v:\n%v", err, string(result)) } + verifyReplicas(t, result, 1) // New applier tries to edit an existing list item, we should get conflicts. result, err = rest.Patch(types.ApplyPatchType). @@ -324,8 +342,8 @@ spec: if !ok { t.Fatalf("Expecting to get conflicts as API error") } - if len(status.Status().Details.Causes) < 1 { - t.Fatalf("Expecting to get at least one conflict when a different applier updates existing list item, got: %v", status.Status().Details.Causes) + if len(status.Status().Details.Causes) != 1 { + t.Fatalf("Expecting to get one conflict when a different applier updates existing list item, got: %v", status.Status().Details.Causes) } // New applier tries to add a new list item, should work fine. @@ -343,10 +361,12 @@ spec: - name: "y" containerPort: 8080 protocol: TCP`, apiVersion, kind, name))). + SetHeader("Accept", "application/json"). DoRaw() if err != nil { t.Fatalf("failed to add a new list item to the object as a different applier: %v:\n%v", err, string(result)) } + verifyNumPorts(t, result, 2) } // TestApplyCRDNonStructuralSchema tests that when a CRD has a non-structural schema in its validation field, @@ -430,27 +450,37 @@ spec: if err != nil { t.Fatalf("failed to create custom resource with apply: %v:\n%v", err, string(result)) } + verifyNumFinalizers(t, result, 1) + verifyFinalizersIncludes(t, result, "test-finalizer") + verifyReplicas(t, result, 1.0) // Patch object to add another finalizer to the finalizers list result, err = rest.Patch(types.MergePatchType). AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). Name(name). - Body([]byte(`{"metadata":{"finalizers":["another-one"]}}`)). + Body([]byte(`{"metadata":{"finalizers":["test-finalizer","another-one"]}}`)). DoRaw() if err != nil { t.Fatalf("failed to add finalizer with merge patch: %v:\n%v", err, string(result)) } + verifyNumFinalizers(t, result, 2) + verifyFinalizersIncludes(t, result, "test-finalizer") + verifyFinalizersIncludes(t, result, "another-one") // Re-apply the same config, should work fine, since finalizers should have the list-type extension 'set'. result, err = rest.Patch(types.ApplyPatchType). AbsPath("/apis", noxuDefinition.Spec.Group, noxuDefinition.Spec.Version, noxuDefinition.Spec.Names.Plural). Name(name). Param("fieldManager", "apply_test"). + SetHeader("Accept", "application/json"). Body(yamlBody). DoRaw() if err != nil { t.Fatalf("failed to apply same config after adding a finalizer: %v:\n%v", err, string(result)) } + verifyNumFinalizers(t, result, 2) + verifyFinalizersIncludes(t, result, "test-finalizer") + verifyFinalizersIncludes(t, result, "another-one") // Patch object to change the number of replicas result, err = rest.Patch(types.MergePatchType). @@ -461,6 +491,7 @@ spec: if err != nil { t.Fatalf("failed to update number of replicas with merge patch: %v:\n%v", err, string(result)) } + verifyReplicas(t, result, 5.0) // Re-apply, we should get conflicts now, since the number of replicas was changed. result, err = rest.Patch(types.ApplyPatchType). @@ -476,8 +507,8 @@ spec: if !ok { t.Fatalf("Expecting to get conflicts as API error") } - if len(status.Status().Details.Causes) < 1 { - t.Fatalf("Expecting to get at least one conflict when applying object after updating replicas, got: %v", status.Status().Details.Causes) + if len(status.Status().Details.Causes) != 1 { + t.Fatalf("Expecting to get one conflict when applying object after updating replicas, got: %v", status.Status().Details.Causes) } // Re-apply with force, should work fine. @@ -491,4 +522,88 @@ spec: if err != nil { t.Fatalf("failed to apply object with force after updating replicas: %v:\n%v", err, string(result)) } + verifyReplicas(t, result, 1.0) +} + +// verifyNumFinalizers checks that len(.metadata.finalizers) == n +func verifyNumFinalizers(t *testing.T, b []byte, n int) { + obj := unstructured.Unstructured{} + err := obj.UnmarshalJSON(b) + if err != nil { + t.Fatalf("failed to unmarshal response: %v", err) + } + if actual, expected := len(obj.GetFinalizers()), n; actual != expected { + t.Fatalf("expected %v finalizers but got %v:\n%v", expected, actual, string(b)) + } +} + +// verifyFinalizersIncludes checks that .metadata.finalizers includes e +func verifyFinalizersIncludes(t *testing.T, b []byte, e string) { + obj := unstructured.Unstructured{} + err := obj.UnmarshalJSON(b) + if err != nil { + t.Fatalf("failed to unmarshal response: %v", err) + } + for _, a := range obj.GetFinalizers() { + if a == e { + return + } + } + t.Fatalf("expected finalizers to include %q but got: %v", e, obj.GetFinalizers()) +} + +// verifyReplicas checks that .spec.replicas == r +func verifyReplicas(t *testing.T, b []byte, r int) { + obj := unstructured.Unstructured{} + err := obj.UnmarshalJSON(b) + if err != nil { + t.Fatalf("failed to find replicas number in response: %v:\n%v", err, string(b)) + } + spec, ok := obj.Object["spec"] + if !ok { + t.Fatalf("failed to find replicas number in response:\n%v", string(b)) + } + specMap, ok := spec.(map[string]interface{}) + if !ok { + t.Fatalf("failed to find replicas number in response:\n%v", string(b)) + } + replicas, ok := specMap["replicas"] + if !ok { + t.Fatalf("failed to find replicas number in response:\n%v", string(b)) + } + replicasNumber, ok := replicas.(int64) + if !ok { + t.Fatalf("failed to find replicas number in response: expected int64 but got: %v", reflect.TypeOf(replicas)) + } + if actual, expected := replicasNumber, int64(r); actual != expected { + t.Fatalf("expected %v ports but got %v:\n%v", expected, actual, string(b)) + } +} + +// verifyNumPorts checks that len(.spec.ports) == n +func verifyNumPorts(t *testing.T, b []byte, n int) { + obj := unstructured.Unstructured{} + err := obj.UnmarshalJSON(b) + if err != nil { + t.Fatalf("failed to find ports list in response: %v:\n%v", err, string(b)) + } + spec, ok := obj.Object["spec"] + if !ok { + t.Fatalf("failed to find ports list in response:\n%v", string(b)) + } + specMap, ok := spec.(map[string]interface{}) + if !ok { + t.Fatalf("failed to find ports list in response:\n%v", string(b)) + } + ports, ok := specMap["ports"] + if !ok { + t.Fatalf("failed to find ports list in response:\n%v", string(b)) + } + portsList, ok := ports.([]interface{}) + if !ok { + t.Fatalf("failed to find ports list in response: expected array but got: %v", reflect.TypeOf(ports)) + } + if actual, expected := len(portsList), n; actual != expected { + t.Fatalf("expected %v ports but got %v:\n%v", expected, actual, string(b)) + } } From badd5b9a26026138e4fc44a643ec1c6b65a7891b Mon Sep 17 00:00:00 2001 From: jennybuckley Date: Thu, 29 Aug 2019 19:10:28 -0700 Subject: [PATCH 4/7] Update generated --- api/api-rules/violation_exceptions.list | 6 + api/openapi-spec/swagger.json | 22 + go.sum | 4 +- staging/src/k8s.io/api/go.sum | 3 +- .../src/k8s.io/apiextensions-apiserver/go.mod | 2 +- .../src/k8s.io/apiextensions-apiserver/go.sum | 5 +- .../pkg/apis/apiextensions/v1/generated.pb.go | 462 ++++++++++------- .../pkg/apis/apiextensions/v1/generated.proto | 27 + .../v1/zz_generated.conversion.go | 4 + .../apiextensions/v1/zz_generated.defaults.go | 8 + .../apiextensions/v1beta1/generated.pb.go | 466 +++++++++++------- .../apiextensions/v1beta1/generated.proto | 27 + .../v1beta1/zz_generated.conversion.go | 4 + .../v1beta1/zz_generated.defaults.go | 13 + .../pkg/apiserver/BUILD | 3 + .../pkg/apiserver/schema/BUILD | 1 - .../apiserver/schema/zz_generated.deepcopy.go | 14 +- staging/src/k8s.io/apimachinery/go.mod | 2 +- staging/src/k8s.io/apimachinery/go.sum | 5 +- staging/src/k8s.io/apiserver/go.mod | 2 +- staging/src/k8s.io/apiserver/go.sum | 5 +- staging/src/k8s.io/cli-runtime/go.sum | 5 +- staging/src/k8s.io/client-go/go.sum | 5 +- staging/src/k8s.io/cloud-provider/go.sum | 5 +- staging/src/k8s.io/cluster-bootstrap/go.sum | 3 +- staging/src/k8s.io/code-generator/go.mod | 2 +- staging/src/k8s.io/code-generator/go.sum | 7 +- staging/src/k8s.io/component-base/go.sum | 5 +- staging/src/k8s.io/csi-translation-lib/go.sum | 3 +- staging/src/k8s.io/kube-aggregator/go.mod | 3 +- staging/src/k8s.io/kube-aggregator/go.sum | 7 +- .../src/k8s.io/kube-controller-manager/go.sum | 3 +- staging/src/k8s.io/kube-proxy/go.sum | 3 +- staging/src/k8s.io/kube-scheduler/go.sum | 3 +- staging/src/k8s.io/kubectl/go.mod | 2 +- staging/src/k8s.io/kubectl/go.sum | 5 +- staging/src/k8s.io/kubelet/go.sum | 3 +- .../src/k8s.io/legacy-cloud-providers/go.sum | 5 +- staging/src/k8s.io/metrics/go.sum | 5 +- staging/src/k8s.io/node-api/go.sum | 5 +- staging/src/k8s.io/sample-apiserver/go.mod | 2 +- staging/src/k8s.io/sample-apiserver/go.sum | 5 +- staging/src/k8s.io/sample-cli-plugin/go.sum | 5 +- staging/src/k8s.io/sample-controller/go.sum | 5 +- test/integration/apiserver/apply/BUILD | 7 + .../kube-openapi/pkg/aggregator/aggregator.go | 126 ++--- .../kube-openapi/pkg/builder/openapi.go | 9 +- .../k8s.io/kube-openapi/pkg/common/common.go | 18 + .../kube-openapi/pkg/generators/openapi.go | 46 +- .../k8s.io/kube-openapi/pkg/schemaconv/smd.go | 70 ++- vendor/modules.txt | 2 +- 51 files changed, 940 insertions(+), 519 deletions(-) diff --git a/api/api-rules/violation_exceptions.list b/api/api-rules/violation_exceptions.list index a8e5bf4f009..571ae85a59e 100644 --- a/api/api-rules/violation_exceptions.list +++ b/api/api-rules/violation_exceptions.list @@ -368,6 +368,7 @@ API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/ap 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,JSONSchemaProps,XListMapKeys 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 @@ -389,6 +390,7 @@ API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/ap API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaProps,Enum API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaProps,OneOf API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaProps,Required +API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaProps,XListMapKeys API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaPropsOrArray,JSONSchemas API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaPropsOrStringArray,Property API rule violation: list_type_missing,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,WebhookClientConfig,CABundle @@ -523,6 +525,8 @@ API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiexten 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,XListMapKeys +API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1,JSONSchemaProps,XListType 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 @@ -536,6 +540,8 @@ API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiexten API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaProps,Schema API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaProps,XEmbeddedResource API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaProps,XIntOrString +API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaProps,XListMapKeys +API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaProps,XListType API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaProps,XPreserveUnknownFields API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaPropsOrArray,JSONSchemas API rule violation: names_match,k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1,JSONSchemaPropsOrArray,Schema diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index a2d4ebabc63..9192967f6b9 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -17864,6 +17864,17 @@ "description": "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:\n\n1) anyOf:\n - type: integer\n - type: string\n2) allOf:\n - anyOf:\n - type: integer\n - type: string\n - ... zero or more", "type": "boolean" }, + "x-kubernetes-list-map-keys": { + "description": "x-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used as the index of the map.\n\nThis tag MUST only be used on lists that have the \"x-kubernetes-list-type\" extension set to \"map\". Also, the values specified for this attribute must be a scalar typed field of the child structure (no nesting is supported).", + "items": { + "type": "string" + }, + "type": "array" + }, + "x-kubernetes-list-type": { + "description": "x-kubernetes-list-type annotates an array to further describe its topology. This extension must only be used on lists and may have 3 possible values:\n\n1) `atomic`: the list is treated as a single entity, like a scalar.\n Atomic lists will be entirely replaced when updated. This extension\n may be used on any type of list (struct, scalar, ...).\n2) `set`:\n Sets are lists that must not have multiple items with the same value. Each\n value must be a scalar (or another atomic type).\n3) `map`:\n These lists are like maps in that their elements have a non-index key\n used to identify them. Order is preserved upon merge. The map tag\n must only be used on a list with elements of type object.\nDefaults to atomic for arrays.", + "type": "string" + }, "x-kubernetes-preserve-unknown-fields": { "description": "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.", "type": "boolean" @@ -18492,6 +18503,17 @@ "description": "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:\n\n1) anyOf:\n - type: integer\n - type: string\n2) allOf:\n - anyOf:\n - type: integer\n - type: string\n - ... zero or more", "type": "boolean" }, + "x-kubernetes-list-map-keys": { + "description": "x-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used as the index of the map.\n\nThis tag MUST only be used on lists that have the \"x-kubernetes-list-type\" extension set to \"map\". Also, the values specified for this attribute must be a scalar typed field of the child structure (no nesting is supported).", + "items": { + "type": "string" + }, + "type": "array" + }, + "x-kubernetes-list-type": { + "description": "x-kubernetes-list-type annotates an array to further describe its topology. This extension must only be used on lists and may have 3 possible values:\n\n1) `atomic`: the list is treated as a single entity, like a scalar.\n Atomic lists will be entirely replaced when updated. This extension\n may be used on any type of list (struct, scalar, ...).\n2) `set`:\n Sets are lists that must not have multiple items with the same value. Each\n value must be a scalar (or another atomic type).\n3) `map`:\n These lists are like maps in that their elements have a non-index key\n used to identify them. Order is preserved upon merge. The map tag\n must only be used on a list with elements of type object.\nDefaults to atomic for arrays.", + "type": "string" + }, "x-kubernetes-preserve-unknown-fields": { "description": "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.", "type": "boolean" diff --git a/go.sum b/go.sum index 16d5831543e..0cfa4f80dcd 100644 --- a/go.sum +++ b/go.sum @@ -506,8 +506,8 @@ k8s.io/heapster v1.2.0-beta.1 h1:lUsE/AHOMHpi3MLlBEkaU8Esxm5QhdyCrv1o7ot0s84= k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/repo-infra v0.0.0-20181204233714-00fe14e3d1a3 h1:WD6cPA3q7qxZe6Fwir0XjjGwGMaWbHlHUcjCcOzuRG0= k8s.io/repo-infra v0.0.0-20181204233714-00fe14e3d1a3/go.mod h1:+G1xBfZDfVFsm1Tj/HNCvg4QqWx8rJ2Fxpqr1rqp/gQ= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= diff --git a/staging/src/k8s.io/api/go.sum b/staging/src/k8s.io/api/go.sum index 7ab641cac83..2a074c5e7f5 100644 --- a/staging/src/k8s.io/api/go.sum +++ b/staging/src/k8s.io/api/go.sum @@ -30,7 +30,6 @@ github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSN github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -97,7 +96,7 @@ k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/staging/src/k8s.io/apiextensions-apiserver/go.mod b/staging/src/k8s.io/apiextensions-apiserver/go.mod index b72a8c851af..8a55c43f513 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/go.mod +++ b/staging/src/k8s.io/apiextensions-apiserver/go.mod @@ -30,7 +30,7 @@ require ( k8s.io/code-generator v0.0.0 k8s.io/component-base v0.0.0 k8s.io/klog v0.4.0 - k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 + k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf k8s.io/utils v0.0.0-20190801114015-581e00157fb1 sigs.k8s.io/yaml v1.1.0 ) diff --git a/staging/src/k8s.io/apiextensions-apiserver/go.sum b/staging/src/k8s.io/apiextensions-apiserver/go.sum index d5add19e04b..40d7109a178 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/go.sum +++ b/staging/src/k8s.io/apiextensions-apiserver/go.sum @@ -144,7 +144,6 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -364,8 +363,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go index ab367034ee7..1eba9e372e8 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.pb.go @@ -785,187 +785,190 @@ func init() { } var fileDescriptor_f5a35c9667703937 = []byte{ - // 2876 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xcf, 0x6f, 0x24, 0x47, - 0xf5, 0xdf, 0x1e, 0xff, 0x1a, 0x97, 0xed, 0xb5, 0x5d, 0xbb, 0xf6, 0xb7, 0xd7, 0xd9, 0x9d, 0xf1, - 0x4e, 0xbe, 0x09, 0x26, 0x6c, 0xc6, 0xd9, 0x25, 0x21, 0x21, 0x07, 0x24, 0x8f, 0xed, 0x44, 0x4e, - 0xec, 0xb5, 0x55, 0xb3, 0xbb, 0x71, 0x12, 0xa4, 0xa4, 0xdc, 0x5d, 0x1e, 0x77, 0xdc, 0xbf, 0xb6, - 0xab, 0x7b, 0x6c, 0x4b, 0x20, 0x45, 0xa0, 0x08, 0x88, 0x44, 0xc2, 0x01, 0xc1, 0x09, 0x21, 0x84, - 0x72, 0x80, 0x03, 0xdc, 0xe0, 0x5f, 0xc8, 0x05, 0x29, 0x07, 0x84, 0x22, 0x21, 0x8d, 0xc8, 0xf0, - 0x27, 0x00, 0x42, 0xf8, 0x80, 0x50, 0xfd, 0xe8, 0xea, 0x9a, 0x9e, 0x99, 0xec, 0x6a, 0x3d, 0x4e, - 0x6e, 0x33, 0xef, 0xd7, 0xe7, 0xd5, 0xab, 0x57, 0xaf, 0xde, 0xab, 0x19, 0x80, 0x0f, 0x5f, 0xa0, - 0x55, 0x27, 0x58, 0x3e, 0x4c, 0xf6, 0x48, 0xe4, 0x93, 0x98, 0xd0, 0xe5, 0x26, 0xf1, 0xed, 0x20, - 0x5a, 0x96, 0x0c, 0x1c, 0x3a, 0xe4, 0x38, 0x26, 0x3e, 0x75, 0x02, 0x9f, 0x3e, 0x8d, 0x43, 0x87, - 0x92, 0xa8, 0x49, 0xa2, 0xe5, 0xf0, 0xb0, 0xc1, 0x78, 0xb4, 0x53, 0x60, 0xb9, 0x79, 0x73, 0xb9, - 0x41, 0x7c, 0x12, 0xe1, 0x98, 0xd8, 0xd5, 0x30, 0x0a, 0xe2, 0x00, 0xbe, 0x20, 0x2c, 0x55, 0x3b, - 0x04, 0xdf, 0x52, 0x96, 0xaa, 0xe1, 0x61, 0x83, 0xf1, 0x68, 0xa7, 0x40, 0xb5, 0x79, 0x73, 0xe1, - 0xe9, 0x86, 0x13, 0x1f, 0x24, 0x7b, 0x55, 0x2b, 0xf0, 0x96, 0x1b, 0x41, 0x23, 0x58, 0xe6, 0x06, - 0xf7, 0x92, 0x7d, 0xfe, 0x8d, 0x7f, 0xe1, 0x9f, 0x04, 0xd0, 0xc2, 0xb3, 0x99, 0xcb, 0x1e, 0xb6, - 0x0e, 0x1c, 0x9f, 0x44, 0x27, 0x99, 0x9f, 0x1e, 0x89, 0x71, 0x0f, 0xf7, 0x16, 0x96, 0xfb, 0x69, - 0x45, 0x89, 0x1f, 0x3b, 0x1e, 0xe9, 0x52, 0xf8, 0xc6, 0x83, 0x14, 0xa8, 0x75, 0x40, 0x3c, 0x9c, - 0xd7, 0xab, 0x9c, 0x1a, 0x60, 0x76, 0x35, 0xf0, 0x9b, 0x24, 0x62, 0x0b, 0x44, 0xe4, 0x7e, 0x42, - 0x68, 0x0c, 0x6b, 0x60, 0x28, 0x71, 0x6c, 0xd3, 0x58, 0x34, 0x96, 0xc6, 0x6b, 0xcf, 0x7c, 0xdc, - 0x2a, 0x5f, 0x68, 0xb7, 0xca, 0x43, 0x77, 0x37, 0xd6, 0x4e, 0x5b, 0xe5, 0xeb, 0xfd, 0x90, 0xe2, - 0x93, 0x90, 0xd0, 0xea, 0xdd, 0x8d, 0x35, 0xc4, 0x94, 0xe1, 0xcb, 0x60, 0xd6, 0x26, 0xd4, 0x89, - 0x88, 0xbd, 0xb2, 0xb3, 0x71, 0x4f, 0xd8, 0x37, 0x0b, 0xdc, 0xe2, 0x15, 0x69, 0x71, 0x76, 0x2d, - 0x2f, 0x80, 0xba, 0x75, 0xe0, 0x2e, 0x18, 0x0b, 0xf6, 0xde, 0x21, 0x56, 0x4c, 0xcd, 0xa1, 0xc5, - 0xa1, 0xa5, 0x89, 0x5b, 0x4f, 0x57, 0xb3, 0xcd, 0x53, 0x2e, 0xf0, 0x1d, 0x93, 0x8b, 0xad, 0x22, - 0x7c, 0xb4, 0x9e, 0x6e, 0x5a, 0x6d, 0x5a, 0xa2, 0x8d, 0x6d, 0x0b, 0x2b, 0x28, 0x35, 0x57, 0xf9, - 0x75, 0x01, 0x40, 0x7d, 0xf1, 0x34, 0x0c, 0x7c, 0x4a, 0x06, 0xb2, 0x7a, 0x0a, 0x66, 0x2c, 0x6e, - 0x39, 0x26, 0xb6, 0xc4, 0x35, 0x0b, 0x8f, 0xe2, 0xbd, 0x29, 0xf1, 0x67, 0x56, 0x73, 0xe6, 0x50, - 0x17, 0x00, 0xbc, 0x03, 0x46, 0x23, 0x42, 0x13, 0x37, 0x36, 0x87, 0x16, 0x8d, 0xa5, 0x89, 0x5b, - 0x37, 0xfa, 0x42, 0xf1, 0xd4, 0x66, 0xc9, 0x57, 0x6d, 0xde, 0xac, 0xd6, 0x63, 0x1c, 0x27, 0xb4, - 0x76, 0x51, 0x22, 0x8d, 0x22, 0x6e, 0x03, 0x49, 0x5b, 0x95, 0xff, 0x1a, 0x60, 0x46, 0x8f, 0x52, - 0xd3, 0x21, 0x47, 0x30, 0x02, 0x63, 0x91, 0x48, 0x16, 0x1e, 0xa7, 0x89, 0x5b, 0xaf, 0x56, 0x1f, - 0xf5, 0x44, 0x55, 0xbb, 0xf2, 0xaf, 0x36, 0xc1, 0xb6, 0x4b, 0x7e, 0x41, 0x29, 0x10, 0x6c, 0x82, - 0x62, 0x24, 0xf7, 0x88, 0x27, 0xd2, 0xc4, 0xad, 0xcd, 0xc1, 0x80, 0x0a, 0x9b, 0xb5, 0xc9, 0x76, - 0xab, 0x5c, 0x4c, 0xbf, 0x21, 0x85, 0x55, 0xf9, 0x65, 0x01, 0x94, 0x56, 0x13, 0x1a, 0x07, 0x1e, - 0x22, 0x34, 0x48, 0x22, 0x8b, 0xac, 0x06, 0x6e, 0xe2, 0xf9, 0x6b, 0x64, 0xdf, 0xf1, 0x9d, 0x98, - 0xe5, 0xe8, 0x22, 0x18, 0xf6, 0xb1, 0x47, 0x64, 0xce, 0x4c, 0xca, 0x48, 0x0e, 0xdf, 0xc6, 0x1e, - 0x41, 0x9c, 0xc3, 0x24, 0x58, 0x8a, 0xc8, 0x13, 0xa0, 0x24, 0xee, 0x9c, 0x84, 0x04, 0x71, 0x0e, - 0x7c, 0x12, 0x8c, 0xee, 0x07, 0x91, 0x87, 0xc5, 0xee, 0x8d, 0x67, 0xfb, 0xf1, 0x12, 0xa7, 0x22, - 0xc9, 0x85, 0xcf, 0x81, 0x09, 0x9b, 0x50, 0x2b, 0x72, 0x42, 0x06, 0x6d, 0x0e, 0x73, 0xe1, 0x4b, - 0x52, 0x78, 0x62, 0x2d, 0x63, 0x21, 0x5d, 0x0e, 0xde, 0x00, 0xc5, 0x30, 0x72, 0x82, 0xc8, 0x89, - 0x4f, 0xcc, 0x91, 0x45, 0x63, 0x69, 0xa4, 0x36, 0x23, 0x75, 0x8a, 0x3b, 0x92, 0x8e, 0x94, 0x04, - 0x93, 0x7e, 0x87, 0x06, 0xfe, 0x0e, 0x8e, 0x0f, 0xcc, 0x51, 0x8e, 0xa0, 0xa4, 0x5f, 0xa9, 0x6f, - 0xdf, 0x66, 0x74, 0xa4, 0x24, 0x2a, 0x7f, 0x31, 0x80, 0x99, 0x8f, 0x50, 0x1a, 0x5e, 0xf8, 0x12, - 0x28, 0xd2, 0x98, 0xd5, 0x9c, 0xc6, 0x89, 0x8c, 0xcf, 0x53, 0xa9, 0xa9, 0xba, 0xa4, 0x9f, 0xb6, - 0xca, 0xf3, 0x99, 0x46, 0x4a, 0xe5, 0xb1, 0x51, 0xba, 0x2c, 0xe5, 0x8e, 0xc8, 0xde, 0x41, 0x10, - 0x1c, 0xca, 0xdd, 0x3f, 0x43, 0xca, 0xbd, 0x26, 0x0c, 0x65, 0x98, 0x22, 0xe5, 0x24, 0x19, 0xa5, - 0x40, 0x95, 0xff, 0x14, 0xf2, 0x0b, 0xd3, 0x36, 0xfd, 0x6d, 0x50, 0x64, 0x47, 0xc8, 0xc6, 0x31, - 0x96, 0x87, 0xe0, 0x99, 0x87, 0x3b, 0x70, 0xe2, 0xbc, 0x6e, 0x91, 0x18, 0xd7, 0xa0, 0x0c, 0x05, - 0xc8, 0x68, 0x48, 0x59, 0x85, 0xc7, 0x60, 0x98, 0x86, 0xc4, 0x92, 0xeb, 0xbd, 0x77, 0x86, 0x6c, - 0xef, 0xb3, 0x86, 0x7a, 0x48, 0xac, 0x2c, 0x19, 0xd9, 0x37, 0xc4, 0x11, 0xe1, 0xbb, 0x06, 0x18, - 0xa5, 0xbc, 0x2e, 0xc8, 0x5a, 0xb2, 0x7b, 0x0e, 0xe0, 0xb9, 0xba, 0x23, 0xbe, 0x23, 0x89, 0x5b, - 0xf9, 0x67, 0x01, 0x5c, 0xef, 0xa7, 0xba, 0x1a, 0xf8, 0xb6, 0xd8, 0x84, 0x0d, 0x79, 0xae, 0x44, - 0x66, 0x3d, 0xa7, 0x9f, 0xab, 0xd3, 0x56, 0xf9, 0x89, 0x07, 0x1a, 0xd0, 0x0e, 0xe0, 0x37, 0xd5, - 0x92, 0xc5, 0x21, 0xbd, 0xde, 0xe9, 0xd8, 0x69, 0xab, 0x3c, 0xad, 0xd4, 0x3a, 0x7d, 0x85, 0x4d, - 0x00, 0x5d, 0x4c, 0xe3, 0x3b, 0x11, 0xf6, 0xa9, 0x30, 0xeb, 0x78, 0x44, 0x46, 0xee, 0xa9, 0x87, - 0x4b, 0x0a, 0xa6, 0x51, 0x5b, 0x90, 0x90, 0x70, 0xb3, 0xcb, 0x1a, 0xea, 0x81, 0xc0, 0x6a, 0x46, - 0x44, 0x30, 0x55, 0x65, 0x40, 0xab, 0xe1, 0x8c, 0x8a, 0x24, 0x17, 0x7e, 0x15, 0x8c, 0x79, 0x84, - 0x52, 0xdc, 0x20, 0xfc, 0xec, 0x8f, 0x67, 0x97, 0xe2, 0x96, 0x20, 0xa3, 0x94, 0x5f, 0xf9, 0x97, - 0x01, 0xae, 0xf6, 0x8b, 0xda, 0xa6, 0x43, 0x63, 0xf8, 0xed, 0xae, 0xb4, 0xaf, 0x3e, 0xdc, 0x0a, - 0x99, 0x36, 0x4f, 0x7a, 0x55, 0x4a, 0x52, 0x8a, 0x96, 0xf2, 0x47, 0x60, 0xc4, 0x89, 0x89, 0x97, - 0xde, 0x96, 0x68, 0xf0, 0x69, 0x57, 0x9b, 0x92, 0xf0, 0x23, 0x1b, 0x0c, 0x08, 0x09, 0xbc, 0xca, - 0x47, 0x05, 0x70, 0xad, 0x9f, 0x0a, 0xab, 0xe3, 0x94, 0x05, 0x3b, 0x74, 0x93, 0x08, 0xbb, 0x32, - 0xd9, 0x54, 0xb0, 0x77, 0x38, 0x15, 0x49, 0x2e, 0xab, 0x9d, 0xd4, 0xf1, 0x1b, 0x89, 0x8b, 0x23, - 0x99, 0x49, 0x6a, 0xc1, 0x75, 0x49, 0x47, 0x4a, 0x02, 0x56, 0x01, 0xa0, 0x07, 0x41, 0x14, 0x73, - 0x0c, 0xde, 0xe1, 0x8c, 0xd7, 0x2e, 0xb2, 0x8a, 0x50, 0x57, 0x54, 0xa4, 0x49, 0xb0, 0x8b, 0xe4, - 0xd0, 0xf1, 0x6d, 0xb9, 0xe1, 0xea, 0xec, 0xbe, 0xea, 0xf8, 0x36, 0xe2, 0x1c, 0x86, 0xef, 0x3a, - 0x34, 0x66, 0x14, 0xb9, 0xdb, 0x1d, 0x01, 0xe7, 0x92, 0x4a, 0x82, 0xe1, 0x5b, 0xac, 0xc0, 0x06, - 0x91, 0x43, 0xa8, 0x39, 0x9a, 0xe1, 0xaf, 0x2a, 0x2a, 0xd2, 0x24, 0x2a, 0x7f, 0x1d, 0xee, 0x9f, - 0x1f, 0xac, 0x80, 0xc0, 0xc7, 0xc1, 0x48, 0x23, 0x0a, 0x92, 0x50, 0x46, 0x49, 0x45, 0xfb, 0x65, - 0x46, 0x44, 0x82, 0x07, 0xbf, 0x03, 0x46, 0x7c, 0xb9, 0x60, 0x96, 0x41, 0xaf, 0x0d, 0x7e, 0x9b, - 0x79, 0xb4, 0x32, 0x74, 0x11, 0x48, 0x01, 0x0a, 0x9f, 0x05, 0x23, 0xd4, 0x0a, 0x42, 0x22, 0x83, - 0x58, 0x4a, 0x85, 0xea, 0x8c, 0x78, 0xda, 0x2a, 0x4f, 0xa5, 0xe6, 0x38, 0x01, 0x09, 0x61, 0xf8, - 0x03, 0x03, 0x14, 0xe5, 0x75, 0x41, 0xcd, 0x31, 0x9e, 0x9e, 0xaf, 0x0f, 0xde, 0x6f, 0xd9, 0xf6, - 0x66, 0x7b, 0x26, 0x09, 0x14, 0x29, 0x70, 0xf8, 0x3d, 0x03, 0x00, 0x4b, 0xdd, 0x5d, 0xe6, 0x38, - 0x8f, 0xe1, 0xc0, 0x8e, 0x8a, 0x76, 0x2b, 0x8a, 0x44, 0xc8, 0x5a, 0x25, 0x0d, 0x15, 0xd6, 0xc1, - 0x5c, 0x18, 0x11, 0x6e, 0xfb, 0xae, 0x7f, 0xe8, 0x07, 0x47, 0xfe, 0x4b, 0x0e, 0x71, 0x6d, 0x6a, - 0x82, 0x45, 0x63, 0xa9, 0x58, 0xbb, 0x26, 0xfd, 0x9f, 0xdb, 0xe9, 0x25, 0x84, 0x7a, 0xeb, 0x56, - 0xde, 0x1b, 0xca, 0xf7, 0x5a, 0xf9, 0xfb, 0x02, 0x7e, 0x28, 0x16, 0x2f, 0xea, 0x30, 0x35, 0x0d, - 0xbe, 0x11, 0x6f, 0x0e, 0x7e, 0x23, 0x54, 0xad, 0xcf, 0x2e, 0x69, 0x45, 0xa2, 0x48, 0x73, 0x01, - 0xfe, 0xd4, 0x00, 0x53, 0xd8, 0xb2, 0x48, 0x18, 0x13, 0x5b, 0x1c, 0xe3, 0xc2, 0xf9, 0x66, 0xf5, - 0x9c, 0x74, 0x68, 0x6a, 0x45, 0x47, 0x45, 0x9d, 0x4e, 0xc0, 0x17, 0xc1, 0x45, 0x1a, 0x07, 0x11, - 0xb1, 0xd3, 0x0c, 0x92, 0xd5, 0x05, 0xb6, 0x5b, 0xe5, 0x8b, 0xf5, 0x0e, 0x0e, 0xca, 0x49, 0x56, - 0xfe, 0x3c, 0x0c, 0xca, 0x0f, 0xc8, 0xd0, 0x87, 0x68, 0x7a, 0x9f, 0x04, 0xa3, 0x7c, 0xa5, 0x36, - 0x0f, 0x48, 0x51, 0xbb, 0xea, 0x39, 0x15, 0x49, 0x2e, 0xbb, 0x9e, 0x18, 0x3e, 0xbb, 0x9e, 0x86, - 0xb8, 0xa0, 0xba, 0x9e, 0xea, 0x82, 0x8c, 0x52, 0x3e, 0x6c, 0x82, 0x51, 0x31, 0xca, 0xf2, 0xb3, - 0x3b, 0xc0, 0xac, 0xbf, 0x87, 0x5d, 0xc7, 0xc6, 0x7c, 0xbf, 0x01, 0x77, 0x91, 0xa3, 0x20, 0x89, - 0x06, 0xdf, 0x37, 0xc0, 0x24, 0x4d, 0xf6, 0x22, 0x29, 0x4d, 0x79, 0x65, 0x9d, 0xb8, 0x75, 0x67, - 0x50, 0xf0, 0x75, 0xcd, 0x76, 0x6d, 0xa6, 0xdd, 0x2a, 0x4f, 0xea, 0x14, 0xd4, 0x81, 0x0d, 0xff, - 0x60, 0x00, 0x13, 0xdb, 0x22, 0xfd, 0xb0, 0xbb, 0x13, 0x39, 0x7e, 0x4c, 0x22, 0x31, 0x94, 0x88, - 0x12, 0x3e, 0xc0, 0x7e, 0x2d, 0x3f, 0xeb, 0xd4, 0x16, 0xe5, 0xde, 0x98, 0x2b, 0x7d, 0x3c, 0x40, - 0x7d, 0x7d, 0xab, 0xfc, 0xdb, 0xc8, 0x1f, 0x6f, 0x6d, 0x95, 0x75, 0x0b, 0xbb, 0x04, 0xae, 0x81, - 0x19, 0xd6, 0x81, 0x22, 0x12, 0xba, 0x8e, 0x85, 0x29, 0x9f, 0x40, 0x44, 0x86, 0xa9, 0x51, 0xb8, - 0x9e, 0xe3, 0xa3, 0x2e, 0x0d, 0xf8, 0x0a, 0x80, 0xa2, 0x35, 0xeb, 0xb0, 0x23, 0x6e, 0x63, 0xd5, - 0x64, 0xd5, 0xbb, 0x24, 0x50, 0x0f, 0x2d, 0xb8, 0x0a, 0x66, 0x5d, 0xbc, 0x47, 0xdc, 0x3a, 0x71, - 0x89, 0x15, 0x07, 0x11, 0x37, 0x25, 0x66, 0xb4, 0xb9, 0x76, 0xab, 0x3c, 0xbb, 0x99, 0x67, 0xa2, - 0x6e, 0xf9, 0xca, 0xf5, 0xfc, 0x79, 0xd2, 0x17, 0x2e, 0x1a, 0xde, 0x9f, 0x15, 0xc0, 0x42, 0xff, - 0xa4, 0x80, 0xdf, 0x55, 0xed, 0xa9, 0xe8, 0xba, 0x5e, 0x3f, 0x87, 0xd4, 0x93, 0x2d, 0x39, 0xe8, - 0x6e, 0xc7, 0xe1, 0x09, 0xbb, 0x33, 0xb1, 0x9b, 0x8e, 0xde, 0xbb, 0xe7, 0x81, 0xce, 0xec, 0xd7, - 0xc6, 0xc5, 0x4d, 0x8c, 0x5d, 0x7e, 0xf1, 0x62, 0x97, 0x54, 0x3e, 0xea, 0x1a, 0x2f, 0xb3, 0xc3, - 0x0a, 0x7f, 0x68, 0x80, 0xe9, 0x20, 0x24, 0xfe, 0xca, 0xce, 0xc6, 0xbd, 0xaf, 0x8b, 0x43, 0x2b, - 0x03, 0xb4, 0xf1, 0xe8, 0x2e, 0xb2, 0x19, 0x57, 0xd8, 0xda, 0x89, 0x82, 0x90, 0xd6, 0x2e, 0xb5, - 0x5b, 0xe5, 0xe9, 0xed, 0x4e, 0x14, 0x94, 0x87, 0xad, 0x78, 0x60, 0x6e, 0xfd, 0x38, 0x26, 0x91, - 0x8f, 0xdd, 0xb5, 0xc0, 0x4a, 0x3c, 0xe2, 0xc7, 0xc2, 0xc7, 0xdc, 0xc8, 0x6e, 0x3c, 0xe4, 0xc8, - 0x7e, 0x0d, 0x0c, 0x25, 0x91, 0x2b, 0xb3, 0x76, 0x42, 0x3d, 0x44, 0xa1, 0x4d, 0xc4, 0xe8, 0x95, - 0xeb, 0x60, 0x98, 0xf9, 0x09, 0xaf, 0x80, 0xa1, 0x08, 0x1f, 0x71, 0xab, 0x93, 0xb5, 0x31, 0x26, - 0x82, 0xf0, 0x11, 0x62, 0xb4, 0xca, 0x07, 0x25, 0x30, 0x9d, 0x5b, 0x0b, 0x5c, 0x00, 0x05, 0xf5, - 0xba, 0x05, 0xa4, 0xd1, 0xc2, 0xc6, 0x1a, 0x2a, 0x38, 0x36, 0x7c, 0x5e, 0x55, 0x57, 0x01, 0x5a, - 0x56, 0x05, 0x9b, 0x53, 0x59, 0x6b, 0x94, 0x99, 0x63, 0x8e, 0xa4, 0xe5, 0x91, 0xf9, 0x40, 0xf6, - 0xe5, 0xa9, 0x10, 0x3e, 0x90, 0x7d, 0xc4, 0x68, 0x8f, 0xfa, 0x5e, 0x91, 0x3e, 0x98, 0x8c, 0x3c, - 0xc4, 0x83, 0xc9, 0xe8, 0xe7, 0x3e, 0x98, 0x3c, 0x0e, 0x46, 0x62, 0x27, 0x76, 0x89, 0x39, 0xd6, - 0xd9, 0x90, 0xde, 0x61, 0x44, 0x24, 0x78, 0x90, 0x80, 0x31, 0x9b, 0xec, 0xe3, 0xc4, 0x8d, 0xcd, - 0x22, 0xcf, 0x9e, 0x6f, 0x9d, 0x2d, 0x7b, 0xc4, 0x83, 0xc2, 0x9a, 0x30, 0x89, 0x52, 0xdb, 0xf0, - 0x09, 0x30, 0xe6, 0xe1, 0x63, 0xc7, 0x4b, 0x3c, 0xde, 0xb5, 0x19, 0x42, 0x6c, 0x4b, 0x90, 0x50, - 0xca, 0x63, 0x45, 0x90, 0x1c, 0x5b, 0x6e, 0x42, 0x9d, 0x26, 0x91, 0x4c, 0xd9, 0x56, 0xa9, 0x22, - 0xb8, 0x9e, 0xe3, 0xa3, 0x2e, 0x0d, 0x0e, 0xe6, 0xf8, 0x5c, 0x79, 0x42, 0x03, 0x13, 0x24, 0x94, - 0xf2, 0x3a, 0xc1, 0xa4, 0xfc, 0x64, 0x3f, 0x30, 0xa9, 0xdc, 0xa5, 0x01, 0xbf, 0x06, 0xc6, 0x3d, - 0x7c, 0xbc, 0x49, 0xfc, 0x46, 0x7c, 0x60, 0x4e, 0x2d, 0x1a, 0x4b, 0x43, 0xb5, 0xa9, 0x76, 0xab, - 0x3c, 0xbe, 0x95, 0x12, 0x51, 0xc6, 0xe7, 0xc2, 0x8e, 0x2f, 0x85, 0x2f, 0x6a, 0xc2, 0x29, 0x11, - 0x65, 0x7c, 0xd6, 0x1d, 0x84, 0x38, 0x66, 0xe7, 0xca, 0x9c, 0xee, 0x1c, 0x5e, 0x77, 0x04, 0x19, - 0xa5, 0x7c, 0xb8, 0x04, 0x8a, 0x1e, 0x3e, 0xe6, 0x73, 0x9d, 0x39, 0xc3, 0xcd, 0xf2, 0x47, 0xbd, - 0x2d, 0x49, 0x43, 0x8a, 0xcb, 0x25, 0x1d, 0x5f, 0x48, 0xce, 0x6a, 0x92, 0x92, 0x86, 0x14, 0x97, - 0xe5, 0x6f, 0xe2, 0x3b, 0xf7, 0x13, 0x22, 0x84, 0x21, 0x8f, 0x8c, 0xca, 0xdf, 0xbb, 0x19, 0x0b, - 0xe9, 0x72, 0x6c, 0xae, 0xf2, 0x12, 0x37, 0x76, 0x42, 0x97, 0x6c, 0xef, 0x9b, 0x97, 0x78, 0xfc, - 0x79, 0x3b, 0xbd, 0xa5, 0xa8, 0x48, 0x93, 0x80, 0x6f, 0x83, 0x61, 0xe2, 0x27, 0x9e, 0x79, 0x99, - 0x5f, 0xdf, 0x67, 0xcd, 0x3e, 0x75, 0x5e, 0xd6, 0xfd, 0xc4, 0x43, 0xdc, 0x32, 0x7c, 0x1e, 0x4c, - 0x79, 0xf8, 0x98, 0x15, 0x01, 0x12, 0xc5, 0x6c, 0xd8, 0x9b, 0xe3, 0xeb, 0x9e, 0x65, 0x8d, 0xe4, - 0x96, 0xce, 0x40, 0x9d, 0x72, 0x5c, 0xd1, 0xf1, 0x35, 0xc5, 0x79, 0x4d, 0x51, 0x67, 0xa0, 0x4e, - 0x39, 0x16, 0xe4, 0x88, 0xdc, 0x4f, 0x9c, 0x88, 0xd8, 0xe6, 0xff, 0xf1, 0xde, 0x53, 0xbe, 0xb1, - 0x0a, 0x1a, 0x52, 0x5c, 0x78, 0x3f, 0x1d, 0xfb, 0x4d, 0x7e, 0xf8, 0x76, 0x06, 0x56, 0xba, 0xb7, - 0xa3, 0x95, 0x28, 0xc2, 0x27, 0xe2, 0x56, 0xd1, 0x07, 0x7e, 0xe8, 0x83, 0x11, 0xec, 0xba, 0xdb, - 0xfb, 0xe6, 0x15, 0x1e, 0xf1, 0x01, 0xde, 0x16, 0xaa, 0xc2, 0xac, 0x30, 0xfb, 0x48, 0xc0, 0x30, - 0xbc, 0xc0, 0x67, 0xb9, 0xb0, 0x70, 0x6e, 0x78, 0xdb, 0xcc, 0x3e, 0x12, 0x30, 0x7c, 0x7d, 0xfe, - 0xc9, 0xf6, 0xbe, 0xf9, 0xd8, 0xf9, 0xad, 0x8f, 0xd9, 0x47, 0x02, 0x06, 0xda, 0x60, 0xc8, 0x0f, - 0x62, 0xf3, 0xea, 0xa0, 0xef, 0x5e, 0x7e, 0x9b, 0xdc, 0x0e, 0x62, 0xc4, 0xcc, 0xc3, 0x1f, 0x1b, - 0x00, 0x84, 0x59, 0x26, 0x5e, 0x3b, 0xeb, 0x18, 0x9e, 0x43, 0xab, 0x66, 0xd9, 0xbb, 0xee, 0xc7, - 0xd1, 0x49, 0x36, 0xfb, 0x69, 0x59, 0xae, 0x39, 0x00, 0x7f, 0x61, 0x80, 0xcb, 0x7a, 0xbb, 0xab, - 0x3c, 0x2b, 0xf1, 0x38, 0x6c, 0x0f, 0x30, 0x91, 0x6b, 0x41, 0xe0, 0xd6, 0xcc, 0x76, 0xab, 0x7c, - 0x79, 0xa5, 0x07, 0x20, 0xea, 0xe9, 0x06, 0xfc, 0x8d, 0x01, 0x66, 0x65, 0x75, 0xd4, 0x9c, 0x2b, - 0xf3, 0xb0, 0xbd, 0x3d, 0xc0, 0xb0, 0xe5, 0x21, 0x44, 0xf4, 0xd4, 0x2f, 0x7d, 0x5d, 0x7c, 0xd4, - 0xed, 0x15, 0xfc, 0xbd, 0x01, 0x26, 0x6d, 0x12, 0x12, 0xdf, 0x26, 0xbe, 0xc5, 0xdc, 0x5c, 0x3c, - 0xeb, 0x6c, 0x9f, 0x77, 0x73, 0x4d, 0xb3, 0x2e, 0x3c, 0xac, 0x4a, 0x0f, 0x27, 0x75, 0xd6, 0x69, - 0xab, 0x3c, 0x9f, 0xa9, 0xea, 0x1c, 0xd4, 0xe1, 0x20, 0xfc, 0xc0, 0x00, 0xd3, 0x59, 0xd8, 0xc5, - 0x05, 0x71, 0xfd, 0x7c, 0x36, 0x9e, 0xb7, 0xa0, 0x2b, 0x9d, 0x58, 0x28, 0x0f, 0x0e, 0x7f, 0x6b, - 0xb0, 0x6e, 0x2b, 0x9d, 0xd5, 0xa8, 0x59, 0xe1, 0x11, 0x7c, 0x63, 0x90, 0x11, 0x54, 0xc6, 0x45, - 0x00, 0x6f, 0x64, 0x9d, 0x9c, 0xe2, 0x9c, 0xb6, 0xca, 0x73, 0x7a, 0xfc, 0x14, 0x03, 0xe9, 0xce, - 0xc1, 0xf7, 0x0c, 0x30, 0x49, 0xb2, 0x86, 0x99, 0x9a, 0x8f, 0x9f, 0x35, 0x74, 0x3d, 0xdb, 0x6f, - 0x31, 0x4e, 0x6b, 0x2c, 0x8a, 0x3a, 0x60, 0x59, 0xef, 0x47, 0x8e, 0xb1, 0x17, 0xba, 0xc4, 0xfc, - 0xff, 0xc1, 0xf5, 0x7e, 0xeb, 0xc2, 0x24, 0x4a, 0x6d, 0xc3, 0x1b, 0xa0, 0xe8, 0x27, 0xae, 0x8b, - 0xf7, 0x5c, 0x62, 0x3e, 0xc1, 0xbb, 0x08, 0xf5, 0xc6, 0x77, 0x5b, 0xd2, 0x91, 0x92, 0x80, 0xfb, - 0x60, 0xf1, 0xf8, 0x55, 0xf5, 0x07, 0x88, 0x9e, 0x8f, 0x68, 0xe6, 0x93, 0xdc, 0xca, 0x42, 0xbb, - 0x55, 0x9e, 0xdf, 0xed, 0xfd, 0xcc, 0xf6, 0x40, 0x1b, 0xf0, 0x4d, 0xf0, 0x98, 0x26, 0xb3, 0xee, - 0xed, 0x11, 0xdb, 0x26, 0x76, 0x3a, 0x68, 0x99, 0x5f, 0xe1, 0x10, 0xea, 0x1c, 0xef, 0xe6, 0x05, - 0xd0, 0xe7, 0x69, 0xc3, 0x4d, 0x30, 0xaf, 0xb1, 0x37, 0xfc, 0x78, 0x3b, 0xaa, 0xc7, 0x91, 0xe3, - 0x37, 0xcc, 0x25, 0x6e, 0xf7, 0x72, 0x7a, 0xfa, 0x76, 0x35, 0x1e, 0xea, 0xa3, 0xb3, 0xc0, 0x46, - 0xbd, 0x5c, 0x85, 0x81, 0x33, 0x60, 0xe8, 0x90, 0xc8, 0x1f, 0x16, 0x11, 0xfb, 0x08, 0xdf, 0x02, - 0x23, 0x4d, 0xec, 0x26, 0xe9, 0xa0, 0x3a, 0xb8, 0x9b, 0x08, 0x09, 0xbb, 0x2f, 0x16, 0x5e, 0x30, - 0x16, 0x3e, 0x34, 0xc0, 0x7c, 0xef, 0x9a, 0xf7, 0x65, 0x79, 0xf4, 0x73, 0x03, 0xcc, 0x76, 0x95, - 0xb7, 0x1e, 0xce, 0xb8, 0x9d, 0xce, 0xdc, 0x1b, 0x60, 0x9d, 0x12, 0xdb, 0xc4, 0xfb, 0x2d, 0xdd, - 0xb3, 0x1f, 0x19, 0x60, 0x26, 0x5f, 0x36, 0xbe, 0xa4, 0x28, 0x55, 0xde, 0x2f, 0x80, 0xf9, 0xde, - 0x1d, 0x22, 0xf4, 0xd4, 0xec, 0x3b, 0xf0, 0xe7, 0x83, 0x5e, 0x0f, 0x8a, 0xef, 0x1a, 0x60, 0xe2, - 0x1d, 0x25, 0x97, 0xfe, 0xde, 0x35, 0xc8, 0x37, 0x8b, 0xb4, 0x30, 0x67, 0x0c, 0x8a, 0x74, 0xc8, - 0xca, 0xef, 0x0c, 0x30, 0xd7, 0xf3, 0xb2, 0x61, 0xa3, 0x35, 0x76, 0xdd, 0xe0, 0x48, 0xbc, 0x35, - 0x69, 0x0f, 0xb7, 0x2b, 0x9c, 0x8a, 0x24, 0x57, 0x8b, 0x59, 0xe1, 0x0b, 0x88, 0x59, 0xe5, 0x8f, - 0x06, 0xb8, 0xfa, 0x79, 0x59, 0xf7, 0x45, 0xef, 0xe1, 0x12, 0x28, 0xca, 0x56, 0xf0, 0x84, 0xef, - 0x9f, 0x9c, 0x6f, 0x64, 0x45, 0xe0, 0xff, 0xa7, 0x10, 0x9f, 0x2a, 0xbf, 0x32, 0xc0, 0x4c, 0x9d, - 0x44, 0x4d, 0xc7, 0x22, 0x88, 0xec, 0x93, 0x88, 0xf8, 0x16, 0x81, 0xcb, 0x60, 0x9c, 0xff, 0x1e, - 0x15, 0x62, 0x2b, 0x7d, 0x45, 0x9f, 0x95, 0x81, 0x1e, 0xbf, 0x9d, 0x32, 0x50, 0x26, 0xa3, 0x5e, - 0xdc, 0x0b, 0x7d, 0x5f, 0xdc, 0xaf, 0x82, 0xe1, 0x30, 0x7b, 0x9e, 0x2c, 0x32, 0x2e, 0x7f, 0x91, - 0xe4, 0x54, 0xce, 0x0d, 0xa2, 0x98, 0xbf, 0xc1, 0x8c, 0x48, 0x6e, 0x10, 0xc5, 0x88, 0x53, 0x2b, - 0x7f, 0x32, 0xc0, 0xa5, 0xf4, 0x8f, 0x11, 0xae, 0x43, 0xfc, 0x78, 0x35, 0xf0, 0xf7, 0x9d, 0x06, - 0xbc, 0x22, 0x9e, 0xa1, 0xb4, 0xb7, 0x9d, 0xf4, 0x09, 0x0a, 0xde, 0x07, 0x63, 0x54, 0xac, 0x4a, - 0x06, 0xfc, 0x95, 0x47, 0x0f, 0x78, 0x3e, 0x3c, 0xe2, 0x16, 0x4d, 0xa9, 0x29, 0x0e, 0x8b, 0xb9, - 0x85, 0x6b, 0x89, 0x6f, 0xcb, 0xa7, 0xc8, 0x49, 0x11, 0xf3, 0xd5, 0x15, 0x41, 0x43, 0x8a, 0x5b, - 0xf9, 0x87, 0x01, 0x66, 0xbb, 0xfe, 0xe8, 0x01, 0xbf, 0x6f, 0x80, 0x49, 0x4b, 0x5b, 0x9e, 0xcc, - 0xdc, 0xad, 0xb3, 0xff, 0x99, 0x44, 0x33, 0x2a, 0x5a, 0x0e, 0x9d, 0x82, 0x3a, 0x40, 0xe1, 0x2e, - 0x30, 0xad, 0xdc, 0x7f, 0xaa, 0x72, 0xbf, 0xd2, 0x5c, 0x6d, 0xb7, 0xca, 0xe6, 0x6a, 0x1f, 0x19, - 0xd4, 0x57, 0xbb, 0xb6, 0xf4, 0xf1, 0x67, 0xa5, 0x0b, 0x9f, 0x7c, 0x56, 0xba, 0xf0, 0xe9, 0x67, - 0xa5, 0x0b, 0xef, 0xb6, 0x4b, 0xc6, 0xc7, 0xed, 0x92, 0xf1, 0x49, 0xbb, 0x64, 0x7c, 0xda, 0x2e, - 0x19, 0x7f, 0x6b, 0x97, 0x8c, 0x9f, 0xfc, 0xbd, 0x74, 0xe1, 0x8d, 0x42, 0xf3, 0xe6, 0xff, 0x02, - 0x00, 0x00, 0xff, 0xff, 0x83, 0x15, 0x40, 0xab, 0x67, 0x29, 0x00, 0x00, + // 2919 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xcd, 0x6f, 0x24, 0x47, + 0x15, 0xdf, 0x1e, 0x7f, 0x8d, 0xcb, 0xf6, 0xda, 0xae, 0x5d, 0x9b, 0x5e, 0x67, 0xd7, 0xe3, 0x9d, + 0x90, 0xe0, 0x84, 0xcd, 0x38, 0xbb, 0x24, 0x24, 0xe4, 0x00, 0xf2, 0xd8, 0x4e, 0x70, 0xd6, 0x5e, + 0x5b, 0x35, 0xbb, 0x1b, 0x27, 0x41, 0x4a, 0xca, 0xdd, 0xe5, 0x71, 0xc7, 0xfd, 0xb5, 0x5d, 0xdd, + 0x63, 0x5b, 0x02, 0x29, 0x02, 0x45, 0x40, 0x24, 0x08, 0x07, 0x04, 0xe2, 0x80, 0x10, 0x42, 0x39, + 0xc0, 0x01, 0x6e, 0xf0, 0x2f, 0xe4, 0x82, 0x94, 0x03, 0x42, 0x91, 0x90, 0x46, 0x64, 0xf8, 0x13, + 0x00, 0x21, 0x7c, 0x40, 0xa8, 0x3e, 0xba, 0xba, 0xa6, 0x67, 0x66, 0x77, 0xb5, 0x1e, 0x27, 0xb7, + 0x99, 0xf7, 0xf5, 0x7b, 0xf5, 0xea, 0xd5, 0xab, 0xf7, 0x6a, 0x06, 0xe0, 0x83, 0x17, 0x69, 0xc5, + 0x09, 0x96, 0x0e, 0x92, 0x5d, 0x12, 0xf9, 0x24, 0x26, 0x74, 0xa9, 0x41, 0x7c, 0x3b, 0x88, 0x96, + 0x24, 0x03, 0x87, 0x0e, 0x39, 0x8a, 0x89, 0x4f, 0x9d, 0xc0, 0xa7, 0xcf, 0xe0, 0xd0, 0xa1, 0x24, + 0x6a, 0x90, 0x68, 0x29, 0x3c, 0xa8, 0x33, 0x1e, 0x6d, 0x17, 0x58, 0x6a, 0x5c, 0x5f, 0xaa, 0x13, + 0x9f, 0x44, 0x38, 0x26, 0x76, 0x25, 0x8c, 0x82, 0x38, 0x80, 0x2f, 0x0a, 0x4b, 0x95, 0x36, 0xc1, + 0xb7, 0x94, 0xa5, 0x4a, 0x78, 0x50, 0x67, 0x3c, 0xda, 0x2e, 0x50, 0x69, 0x5c, 0x9f, 0x7b, 0xa6, + 0xee, 0xc4, 0xfb, 0xc9, 0x6e, 0xc5, 0x0a, 0xbc, 0xa5, 0x7a, 0x50, 0x0f, 0x96, 0xb8, 0xc1, 0xdd, + 0x64, 0x8f, 0x7f, 0xe3, 0x5f, 0xf8, 0x27, 0x01, 0x34, 0xf7, 0x5c, 0xe6, 0xb2, 0x87, 0xad, 0x7d, + 0xc7, 0x27, 0xd1, 0x71, 0xe6, 0xa7, 0x47, 0x62, 0xdc, 0xc5, 0xbd, 0xb9, 0xa5, 0x5e, 0x5a, 0x51, + 0xe2, 0xc7, 0x8e, 0x47, 0x3a, 0x14, 0xbe, 0xfa, 0x20, 0x05, 0x6a, 0xed, 0x13, 0x0f, 0xe7, 0xf5, + 0xca, 0x27, 0x06, 0x98, 0x5e, 0x09, 0xfc, 0x06, 0x89, 0xd8, 0x02, 0x11, 0xb9, 0x97, 0x10, 0x1a, + 0xc3, 0x2a, 0x18, 0x48, 0x1c, 0xdb, 0x34, 0x16, 0x8c, 0xc5, 0xd1, 0xea, 0xb3, 0x1f, 0x35, 0x4b, + 0xe7, 0x5a, 0xcd, 0xd2, 0xc0, 0x9d, 0xf5, 0xd5, 0x93, 0x66, 0xe9, 0x6a, 0x2f, 0xa4, 0xf8, 0x38, + 0x24, 0xb4, 0x72, 0x67, 0x7d, 0x15, 0x31, 0x65, 0xf8, 0x0a, 0x98, 0xb6, 0x09, 0x75, 0x22, 0x62, + 0x2f, 0x6f, 0xaf, 0xdf, 0x15, 0xf6, 0xcd, 0x02, 0xb7, 0x78, 0x49, 0x5a, 0x9c, 0x5e, 0xcd, 0x0b, + 0xa0, 0x4e, 0x1d, 0xb8, 0x03, 0x46, 0x82, 0xdd, 0x77, 0x88, 0x15, 0x53, 0x73, 0x60, 0x61, 0x60, + 0x71, 0xec, 0xc6, 0x33, 0x95, 0x6c, 0xf3, 0x94, 0x0b, 0x7c, 0xc7, 0xe4, 0x62, 0x2b, 0x08, 0x1f, + 0xae, 0xa5, 0x9b, 0x56, 0x9d, 0x94, 0x68, 0x23, 0x5b, 0xc2, 0x0a, 0x4a, 0xcd, 0x95, 0x7f, 0x53, + 0x00, 0x50, 0x5f, 0x3c, 0x0d, 0x03, 0x9f, 0x92, 0xbe, 0xac, 0x9e, 0x82, 0x29, 0x8b, 0x5b, 0x8e, + 0x89, 0x2d, 0x71, 0xcd, 0xc2, 0xa3, 0x78, 0x6f, 0x4a, 0xfc, 0xa9, 0x95, 0x9c, 0x39, 0xd4, 0x01, + 0x00, 0x6f, 0x83, 0xe1, 0x88, 0xd0, 0xc4, 0x8d, 0xcd, 0x81, 0x05, 0x63, 0x71, 0xec, 0xc6, 0xb5, + 0x9e, 0x50, 0x3c, 0xb5, 0x59, 0xf2, 0x55, 0x1a, 0xd7, 0x2b, 0xb5, 0x18, 0xc7, 0x09, 0xad, 0x9e, + 0x97, 0x48, 0xc3, 0x88, 0xdb, 0x40, 0xd2, 0x56, 0xf9, 0x7f, 0x06, 0x98, 0xd2, 0xa3, 0xd4, 0x70, + 0xc8, 0x21, 0x8c, 0xc0, 0x48, 0x24, 0x92, 0x85, 0xc7, 0x69, 0xec, 0xc6, 0xcd, 0xca, 0xa3, 0x9e, + 0xa8, 0x4a, 0x47, 0xfe, 0x55, 0xc7, 0xd8, 0x76, 0xc9, 0x2f, 0x28, 0x05, 0x82, 0x0d, 0x50, 0x8c, + 0xe4, 0x1e, 0xf1, 0x44, 0x1a, 0xbb, 0xb1, 0xd1, 0x1f, 0x50, 0x61, 0xb3, 0x3a, 0xde, 0x6a, 0x96, + 0x8a, 0xe9, 0x37, 0xa4, 0xb0, 0xca, 0xbf, 0x2a, 0x80, 0xf9, 0x95, 0x84, 0xc6, 0x81, 0x87, 0x08, + 0x0d, 0x92, 0xc8, 0x22, 0x2b, 0x81, 0x9b, 0x78, 0xfe, 0x2a, 0xd9, 0x73, 0x7c, 0x27, 0x66, 0x39, + 0xba, 0x00, 0x06, 0x7d, 0xec, 0x11, 0x99, 0x33, 0xe3, 0x32, 0x92, 0x83, 0xb7, 0xb0, 0x47, 0x10, + 0xe7, 0x30, 0x09, 0x96, 0x22, 0xf2, 0x04, 0x28, 0x89, 0xdb, 0xc7, 0x21, 0x41, 0x9c, 0x03, 0x9f, + 0x04, 0xc3, 0x7b, 0x41, 0xe4, 0x61, 0xb1, 0x7b, 0xa3, 0xd9, 0x7e, 0xbc, 0xcc, 0xa9, 0x48, 0x72, + 0xe1, 0xf3, 0x60, 0xcc, 0x26, 0xd4, 0x8a, 0x9c, 0x90, 0x41, 0x9b, 0x83, 0x5c, 0xf8, 0x82, 0x14, + 0x1e, 0x5b, 0xcd, 0x58, 0x48, 0x97, 0x83, 0xd7, 0x40, 0x31, 0x8c, 0x9c, 0x20, 0x72, 0xe2, 0x63, + 0x73, 0x68, 0xc1, 0x58, 0x1c, 0xaa, 0x4e, 0x49, 0x9d, 0xe2, 0xb6, 0xa4, 0x23, 0x25, 0xc1, 0xa4, + 0xdf, 0xa1, 0x81, 0xbf, 0x8d, 0xe3, 0x7d, 0x73, 0x98, 0x23, 0x28, 0xe9, 0x57, 0x6b, 0x5b, 0xb7, + 0x18, 0x1d, 0x29, 0x89, 0xf2, 0x5f, 0x0d, 0x60, 0xe6, 0x23, 0x94, 0x86, 0x17, 0xbe, 0x0c, 0x8a, + 0x34, 0x66, 0x35, 0xa7, 0x7e, 0x2c, 0xe3, 0xf3, 0x74, 0x6a, 0xaa, 0x26, 0xe9, 0x27, 0xcd, 0xd2, + 0x6c, 0xa6, 0x91, 0x52, 0x79, 0x6c, 0x94, 0x2e, 0x4b, 0xb9, 0x43, 0xb2, 0xbb, 0x1f, 0x04, 0x07, + 0x72, 0xf7, 0x4f, 0x91, 0x72, 0xaf, 0x09, 0x43, 0x19, 0xa6, 0x48, 0x39, 0x49, 0x46, 0x29, 0x50, + 0xf9, 0xbf, 0x85, 0xfc, 0xc2, 0xb4, 0x4d, 0x7f, 0x1b, 0x14, 0xd9, 0x11, 0xb2, 0x71, 0x8c, 0xe5, + 0x21, 0x78, 0xf6, 0xe1, 0x0e, 0x9c, 0x38, 0xaf, 0x9b, 0x24, 0xc6, 0x55, 0x28, 0x43, 0x01, 0x32, + 0x1a, 0x52, 0x56, 0xe1, 0x11, 0x18, 0xa4, 0x21, 0xb1, 0xe4, 0x7a, 0xef, 0x9e, 0x22, 0xdb, 0x7b, + 0xac, 0xa1, 0x16, 0x12, 0x2b, 0x4b, 0x46, 0xf6, 0x0d, 0x71, 0x44, 0xf8, 0xae, 0x01, 0x86, 0x29, + 0xaf, 0x0b, 0xb2, 0x96, 0xec, 0x9c, 0x01, 0x78, 0xae, 0xee, 0x88, 0xef, 0x48, 0xe2, 0x96, 0xff, + 0x55, 0x00, 0x57, 0x7b, 0xa9, 0xae, 0x04, 0xbe, 0x2d, 0x36, 0x61, 0x5d, 0x9e, 0x2b, 0x91, 0x59, + 0xcf, 0xeb, 0xe7, 0xea, 0xa4, 0x59, 0x7a, 0xe2, 0x81, 0x06, 0xb4, 0x03, 0xf8, 0x35, 0xb5, 0x64, + 0x71, 0x48, 0xaf, 0xb6, 0x3b, 0x76, 0xd2, 0x2c, 0x4d, 0x2a, 0xb5, 0x76, 0x5f, 0x61, 0x03, 0x40, + 0x17, 0xd3, 0xf8, 0x76, 0x84, 0x7d, 0x2a, 0xcc, 0x3a, 0x1e, 0x91, 0x91, 0x7b, 0xfa, 0xe1, 0x92, + 0x82, 0x69, 0x54, 0xe7, 0x24, 0x24, 0xdc, 0xe8, 0xb0, 0x86, 0xba, 0x20, 0xb0, 0x9a, 0x11, 0x11, + 0x4c, 0x55, 0x19, 0xd0, 0x6a, 0x38, 0xa3, 0x22, 0xc9, 0x85, 0x4f, 0x81, 0x11, 0x8f, 0x50, 0x8a, + 0xeb, 0x84, 0x9f, 0xfd, 0xd1, 0xec, 0x52, 0xdc, 0x14, 0x64, 0x94, 0xf2, 0xcb, 0xff, 0x36, 0xc0, + 0xe5, 0x5e, 0x51, 0xdb, 0x70, 0x68, 0x0c, 0xbf, 0xd5, 0x91, 0xf6, 0x95, 0x87, 0x5b, 0x21, 0xd3, + 0xe6, 0x49, 0xaf, 0x4a, 0x49, 0x4a, 0xd1, 0x52, 0xfe, 0x10, 0x0c, 0x39, 0x31, 0xf1, 0xd2, 0xdb, + 0x12, 0xf5, 0x3f, 0xed, 0xaa, 0x13, 0x12, 0x7e, 0x68, 0x9d, 0x01, 0x21, 0x81, 0x57, 0xfe, 0xb0, + 0x00, 0xae, 0xf4, 0x52, 0x61, 0x75, 0x9c, 0xb2, 0x60, 0x87, 0x6e, 0x12, 0x61, 0x57, 0x26, 0x9b, + 0x0a, 0xf6, 0x36, 0xa7, 0x22, 0xc9, 0x65, 0xb5, 0x93, 0x3a, 0x7e, 0x3d, 0x71, 0x71, 0x24, 0x33, + 0x49, 0x2d, 0xb8, 0x26, 0xe9, 0x48, 0x49, 0xc0, 0x0a, 0x00, 0x74, 0x3f, 0x88, 0x62, 0x8e, 0xc1, + 0x3b, 0x9c, 0xd1, 0xea, 0x79, 0x56, 0x11, 0x6a, 0x8a, 0x8a, 0x34, 0x09, 0x76, 0x91, 0x1c, 0x38, + 0xbe, 0x2d, 0x37, 0x5c, 0x9d, 0xdd, 0x9b, 0x8e, 0x6f, 0x23, 0xce, 0x61, 0xf8, 0xae, 0x43, 0x63, + 0x46, 0x91, 0xbb, 0xdd, 0x16, 0x70, 0x2e, 0xa9, 0x24, 0x18, 0xbe, 0xc5, 0x0a, 0x6c, 0x10, 0x39, + 0x84, 0x9a, 0xc3, 0x19, 0xfe, 0x8a, 0xa2, 0x22, 0x4d, 0xa2, 0xfc, 0xb7, 0xc1, 0xde, 0xf9, 0xc1, + 0x0a, 0x08, 0x7c, 0x1c, 0x0c, 0xd5, 0xa3, 0x20, 0x09, 0x65, 0x94, 0x54, 0xb4, 0x5f, 0x61, 0x44, + 0x24, 0x78, 0xf0, 0xdb, 0x60, 0xc8, 0x97, 0x0b, 0x66, 0x19, 0xf4, 0x5a, 0xff, 0xb7, 0x99, 0x47, + 0x2b, 0x43, 0x17, 0x81, 0x14, 0xa0, 0xf0, 0x39, 0x30, 0x44, 0xad, 0x20, 0x24, 0x32, 0x88, 0xf3, + 0xa9, 0x50, 0x8d, 0x11, 0x4f, 0x9a, 0xa5, 0x89, 0xd4, 0x1c, 0x27, 0x20, 0x21, 0x0c, 0xbf, 0x6f, + 0x80, 0xa2, 0xbc, 0x2e, 0xa8, 0x39, 0xc2, 0xd3, 0xf3, 0xf5, 0xfe, 0xfb, 0x2d, 0xdb, 0xde, 0x6c, + 0xcf, 0x24, 0x81, 0x22, 0x05, 0x0e, 0xbf, 0x6b, 0x00, 0x60, 0xa9, 0xbb, 0xcb, 0x1c, 0xe5, 0x31, + 0xec, 0xdb, 0x51, 0xd1, 0x6e, 0x45, 0x91, 0x08, 0x59, 0xab, 0xa4, 0xa1, 0xc2, 0x1a, 0x98, 0x09, + 0x23, 0xc2, 0x6d, 0xdf, 0xf1, 0x0f, 0xfc, 0xe0, 0xd0, 0x7f, 0xd9, 0x21, 0xae, 0x4d, 0x4d, 0xb0, + 0x60, 0x2c, 0x16, 0xab, 0x57, 0xa4, 0xff, 0x33, 0xdb, 0xdd, 0x84, 0x50, 0x77, 0xdd, 0xf2, 0x7b, + 0x03, 0xf9, 0x5e, 0x2b, 0x7f, 0x5f, 0xc0, 0x0f, 0xc4, 0xe2, 0x45, 0x1d, 0xa6, 0xa6, 0xc1, 0x37, + 0xe2, 0xcd, 0xfe, 0x6f, 0x84, 0xaa, 0xf5, 0xd9, 0x25, 0xad, 0x48, 0x14, 0x69, 0x2e, 0xc0, 0x9f, + 0x1a, 0x60, 0x02, 0x5b, 0x16, 0x09, 0x63, 0x62, 0x8b, 0x63, 0x5c, 0x38, 0xdb, 0xac, 0x9e, 0x91, + 0x0e, 0x4d, 0x2c, 0xeb, 0xa8, 0xa8, 0xdd, 0x09, 0xf8, 0x12, 0x38, 0x4f, 0xe3, 0x20, 0x22, 0x76, + 0x9a, 0x41, 0xb2, 0xba, 0xc0, 0x56, 0xb3, 0x74, 0xbe, 0xd6, 0xc6, 0x41, 0x39, 0xc9, 0xf2, 0x5f, + 0x06, 0x41, 0xe9, 0x01, 0x19, 0xfa, 0x10, 0x4d, 0xef, 0x93, 0x60, 0x98, 0xaf, 0xd4, 0xe6, 0x01, + 0x29, 0x6a, 0x57, 0x3d, 0xa7, 0x22, 0xc9, 0x65, 0xd7, 0x13, 0xc3, 0x67, 0xd7, 0xd3, 0x00, 0x17, + 0x54, 0xd7, 0x53, 0x4d, 0x90, 0x51, 0xca, 0x87, 0x0d, 0x30, 0x2c, 0x46, 0x59, 0x7e, 0x76, 0xfb, + 0x98, 0xf5, 0x77, 0xb1, 0xeb, 0xd8, 0x98, 0xef, 0x37, 0xe0, 0x2e, 0x72, 0x14, 0x24, 0xd1, 0xe0, + 0xfb, 0x06, 0x18, 0xa7, 0xc9, 0x6e, 0x24, 0xa5, 0x29, 0xaf, 0xac, 0x63, 0x37, 0x6e, 0xf7, 0x0b, + 0xbe, 0xa6, 0xd9, 0xae, 0x4e, 0xb5, 0x9a, 0xa5, 0x71, 0x9d, 0x82, 0xda, 0xb0, 0xe1, 0x1f, 0x0d, + 0x60, 0x62, 0x5b, 0xa4, 0x1f, 0x76, 0xb7, 0x23, 0xc7, 0x8f, 0x49, 0x24, 0x86, 0x12, 0x51, 0xc2, + 0xfb, 0xd8, 0xaf, 0xe5, 0x67, 0x9d, 0xea, 0x82, 0xdc, 0x1b, 0x73, 0xb9, 0x87, 0x07, 0xa8, 0xa7, + 0x6f, 0xe5, 0xff, 0x18, 0xf9, 0xe3, 0xad, 0xad, 0xb2, 0x66, 0x61, 0x97, 0xc0, 0x55, 0x30, 0xc5, + 0x3a, 0x50, 0x44, 0x42, 0xd7, 0xb1, 0x30, 0xe5, 0x13, 0x88, 0xc8, 0x30, 0x35, 0x0a, 0xd7, 0x72, + 0x7c, 0xd4, 0xa1, 0x01, 0x5f, 0x05, 0x50, 0xb4, 0x66, 0x6d, 0x76, 0xc4, 0x6d, 0xac, 0x9a, 0xac, + 0x5a, 0x87, 0x04, 0xea, 0xa2, 0x05, 0x57, 0xc0, 0xb4, 0x8b, 0x77, 0x89, 0x5b, 0x23, 0x2e, 0xb1, + 0xe2, 0x20, 0xe2, 0xa6, 0xc4, 0x8c, 0x36, 0xd3, 0x6a, 0x96, 0xa6, 0x37, 0xf2, 0x4c, 0xd4, 0x29, + 0x5f, 0xbe, 0x9a, 0x3f, 0x4f, 0xfa, 0xc2, 0x45, 0xc3, 0xfb, 0xb3, 0x02, 0x98, 0xeb, 0x9d, 0x14, + 0xf0, 0x3b, 0xaa, 0x3d, 0x15, 0x5d, 0xd7, 0xeb, 0x67, 0x90, 0x7a, 0xb2, 0x25, 0x07, 0x9d, 0xed, + 0x38, 0x3c, 0x66, 0x77, 0x26, 0x76, 0xd3, 0xd1, 0x7b, 0xe7, 0x2c, 0xd0, 0x99, 0xfd, 0xea, 0xa8, + 0xb8, 0x89, 0xb1, 0xcb, 0x2f, 0x5e, 0xec, 0x92, 0xf2, 0x87, 0x1d, 0xe3, 0x65, 0x76, 0x58, 0xe1, + 0x0f, 0x0c, 0x30, 0x19, 0x84, 0xc4, 0x5f, 0xde, 0x5e, 0xbf, 0xfb, 0x15, 0x71, 0x68, 0x65, 0x80, + 0xd6, 0x1f, 0xdd, 0x45, 0x36, 0xe3, 0x0a, 0x5b, 0xdb, 0x51, 0x10, 0xd2, 0xea, 0x85, 0x56, 0xb3, + 0x34, 0xb9, 0xd5, 0x8e, 0x82, 0xf2, 0xb0, 0x65, 0x0f, 0xcc, 0xac, 0x1d, 0xc5, 0x24, 0xf2, 0xb1, + 0xbb, 0x1a, 0x58, 0x89, 0x47, 0xfc, 0x58, 0xf8, 0x98, 0x1b, 0xd9, 0x8d, 0x87, 0x1c, 0xd9, 0xaf, + 0x80, 0x81, 0x24, 0x72, 0x65, 0xd6, 0x8e, 0xa9, 0x87, 0x28, 0xb4, 0x81, 0x18, 0xbd, 0x7c, 0x15, + 0x0c, 0x32, 0x3f, 0xe1, 0x25, 0x30, 0x10, 0xe1, 0x43, 0x6e, 0x75, 0xbc, 0x3a, 0xc2, 0x44, 0x10, + 0x3e, 0x44, 0x8c, 0x56, 0xfe, 0x45, 0x09, 0x4c, 0xe6, 0xd6, 0x02, 0xe7, 0x40, 0x41, 0xbd, 0x6e, + 0x01, 0x69, 0xb4, 0xb0, 0xbe, 0x8a, 0x0a, 0x8e, 0x0d, 0x5f, 0x50, 0xd5, 0x55, 0x80, 0x96, 0x54, + 0xc1, 0xe6, 0x54, 0xd6, 0x1a, 0x65, 0xe6, 0x98, 0x23, 0x69, 0x79, 0x64, 0x3e, 0x90, 0x3d, 0x79, + 0x2a, 0x84, 0x0f, 0x64, 0x0f, 0x31, 0xda, 0xa3, 0xbe, 0x57, 0xa4, 0x0f, 0x26, 0x43, 0x0f, 0xf1, + 0x60, 0x32, 0x7c, 0xdf, 0x07, 0x93, 0xc7, 0xc1, 0x50, 0xec, 0xc4, 0x2e, 0x31, 0x47, 0xda, 0x1b, + 0xd2, 0xdb, 0x8c, 0x88, 0x04, 0x0f, 0x12, 0x30, 0x62, 0x93, 0x3d, 0x9c, 0xb8, 0xb1, 0x59, 0xe4, + 0xd9, 0xf3, 0xf5, 0xd3, 0x65, 0x8f, 0x78, 0x50, 0x58, 0x15, 0x26, 0x51, 0x6a, 0x1b, 0x3e, 0x01, + 0x46, 0x3c, 0x7c, 0xe4, 0x78, 0x89, 0xc7, 0xbb, 0x36, 0x43, 0x88, 0x6d, 0x0a, 0x12, 0x4a, 0x79, + 0xac, 0x08, 0x92, 0x23, 0xcb, 0x4d, 0xa8, 0xd3, 0x20, 0x92, 0x29, 0xdb, 0x2a, 0x55, 0x04, 0xd7, + 0x72, 0x7c, 0xd4, 0xa1, 0xc1, 0xc1, 0x1c, 0x9f, 0x2b, 0x8f, 0x69, 0x60, 0x82, 0x84, 0x52, 0x5e, + 0x3b, 0x98, 0x94, 0x1f, 0xef, 0x05, 0x26, 0x95, 0x3b, 0x34, 0xe0, 0x97, 0xc1, 0xa8, 0x87, 0x8f, + 0x36, 0x88, 0x5f, 0x8f, 0xf7, 0xcd, 0x89, 0x05, 0x63, 0x71, 0xa0, 0x3a, 0xd1, 0x6a, 0x96, 0x46, + 0x37, 0x53, 0x22, 0xca, 0xf8, 0x5c, 0xd8, 0xf1, 0xa5, 0xf0, 0x79, 0x4d, 0x38, 0x25, 0xa2, 0x8c, + 0xcf, 0xba, 0x83, 0x10, 0xc7, 0xec, 0x5c, 0x99, 0x93, 0xed, 0xc3, 0xeb, 0xb6, 0x20, 0xa3, 0x94, + 0x0f, 0x17, 0x41, 0xd1, 0xc3, 0x47, 0x7c, 0xae, 0x33, 0xa7, 0xb8, 0x59, 0xfe, 0xa8, 0xb7, 0x29, + 0x69, 0x48, 0x71, 0xb9, 0xa4, 0xe3, 0x0b, 0xc9, 0x69, 0x4d, 0x52, 0xd2, 0x90, 0xe2, 0xb2, 0xfc, + 0x4d, 0x7c, 0xe7, 0x5e, 0x42, 0x84, 0x30, 0xe4, 0x91, 0x51, 0xf9, 0x7b, 0x27, 0x63, 0x21, 0x5d, + 0x8e, 0xcd, 0x55, 0x5e, 0xe2, 0xc6, 0x4e, 0xe8, 0x92, 0xad, 0x3d, 0xf3, 0x02, 0x8f, 0x3f, 0x6f, + 0xa7, 0x37, 0x15, 0x15, 0x69, 0x12, 0xf0, 0x6d, 0x30, 0x48, 0xfc, 0xc4, 0x33, 0x2f, 0xf2, 0xeb, + 0xfb, 0xb4, 0xd9, 0xa7, 0xce, 0xcb, 0x9a, 0x9f, 0x78, 0x88, 0x5b, 0x86, 0x2f, 0x80, 0x09, 0x0f, + 0x1f, 0xb1, 0x22, 0x40, 0xa2, 0x98, 0x0d, 0x7b, 0x33, 0x7c, 0xdd, 0xd3, 0xac, 0x91, 0xdc, 0xd4, + 0x19, 0xa8, 0x5d, 0x8e, 0x2b, 0x3a, 0xbe, 0xa6, 0x38, 0xab, 0x29, 0xea, 0x0c, 0xd4, 0x2e, 0xc7, + 0x82, 0x1c, 0x91, 0x7b, 0x89, 0x13, 0x11, 0xdb, 0xfc, 0x02, 0xef, 0x3d, 0xe5, 0x1b, 0xab, 0xa0, + 0x21, 0xc5, 0x85, 0xf7, 0xd2, 0xb1, 0xdf, 0xe4, 0x87, 0x6f, 0xbb, 0x6f, 0xa5, 0x7b, 0x2b, 0x5a, + 0x8e, 0x22, 0x7c, 0x2c, 0x6e, 0x15, 0x7d, 0xe0, 0x87, 0x3e, 0x18, 0xc2, 0xae, 0xbb, 0xb5, 0x67, + 0x5e, 0xe2, 0x11, 0xef, 0xe3, 0x6d, 0xa1, 0x2a, 0xcc, 0x32, 0xb3, 0x8f, 0x04, 0x0c, 0xc3, 0x0b, + 0x7c, 0x96, 0x0b, 0x73, 0x67, 0x86, 0xb7, 0xc5, 0xec, 0x23, 0x01, 0xc3, 0xd7, 0xe7, 0x1f, 0x6f, + 0xed, 0x99, 0x8f, 0x9d, 0xdd, 0xfa, 0x98, 0x7d, 0x24, 0x60, 0xa0, 0x0d, 0x06, 0xfc, 0x20, 0x36, + 0x2f, 0xf7, 0xfb, 0xee, 0xe5, 0xb7, 0xc9, 0xad, 0x20, 0x46, 0xcc, 0x3c, 0xfc, 0x91, 0x01, 0x40, + 0x98, 0x65, 0xe2, 0x95, 0xd3, 0x8e, 0xe1, 0x39, 0xb4, 0x4a, 0x96, 0xbd, 0x6b, 0x7e, 0x1c, 0x1d, + 0x67, 0xb3, 0x9f, 0x96, 0xe5, 0x9a, 0x03, 0xf0, 0x97, 0x06, 0xb8, 0xa8, 0xb7, 0xbb, 0xca, 0xb3, + 0x79, 0x1e, 0x87, 0xad, 0x3e, 0x26, 0x72, 0x35, 0x08, 0xdc, 0xaa, 0xd9, 0x6a, 0x96, 0x2e, 0x2e, + 0x77, 0x01, 0x44, 0x5d, 0xdd, 0x80, 0xbf, 0x35, 0xc0, 0xb4, 0xac, 0x8e, 0x9a, 0x73, 0x25, 0x1e, + 0xb6, 0xb7, 0xfb, 0x18, 0xb6, 0x3c, 0x84, 0x88, 0x9e, 0xfa, 0xa5, 0xaf, 0x83, 0x8f, 0x3a, 0xbd, + 0x82, 0x7f, 0x30, 0xc0, 0xb8, 0x4d, 0x42, 0xe2, 0xdb, 0xc4, 0xb7, 0x98, 0x9b, 0x0b, 0xa7, 0x9d, + 0xed, 0xf3, 0x6e, 0xae, 0x6a, 0xd6, 0x85, 0x87, 0x15, 0xe9, 0xe1, 0xb8, 0xce, 0x3a, 0x69, 0x96, + 0x66, 0x33, 0x55, 0x9d, 0x83, 0xda, 0x1c, 0x84, 0x3f, 0x36, 0xc0, 0x64, 0x16, 0x76, 0x71, 0x41, + 0x5c, 0x3d, 0x9b, 0x8d, 0xe7, 0x2d, 0xe8, 0x72, 0x3b, 0x16, 0xca, 0x83, 0xc3, 0xdf, 0x19, 0xac, + 0xdb, 0x4a, 0x67, 0x35, 0x6a, 0x96, 0x79, 0x04, 0xdf, 0xe8, 0x67, 0x04, 0x95, 0x71, 0x11, 0xc0, + 0x6b, 0x59, 0x27, 0xa7, 0x38, 0x27, 0xcd, 0xd2, 0x8c, 0x1e, 0x3f, 0xc5, 0x40, 0xba, 0x73, 0xf0, + 0x3d, 0x03, 0x8c, 0x93, 0xac, 0x61, 0xa6, 0xe6, 0xe3, 0xa7, 0x0d, 0x5d, 0xd7, 0xf6, 0x5b, 0x8c, + 0xd3, 0x1a, 0x8b, 0xa2, 0x36, 0x58, 0xd6, 0xfb, 0x91, 0x23, 0xec, 0x85, 0x2e, 0x31, 0xbf, 0xd8, + 0xbf, 0xde, 0x6f, 0x4d, 0x98, 0x44, 0xa9, 0x6d, 0x78, 0x0d, 0x14, 0xfd, 0xc4, 0x75, 0xf1, 0xae, + 0x4b, 0xcc, 0x27, 0x78, 0x17, 0xa1, 0xde, 0xf8, 0x6e, 0x49, 0x3a, 0x52, 0x12, 0x70, 0x0f, 0x2c, + 0x1c, 0xdd, 0x54, 0x7f, 0x80, 0xe8, 0xfa, 0x88, 0x66, 0x3e, 0xc9, 0xad, 0xcc, 0xb5, 0x9a, 0xa5, + 0xd9, 0x9d, 0xee, 0xcf, 0x6c, 0x0f, 0xb4, 0x01, 0xdf, 0x04, 0x8f, 0x69, 0x32, 0x6b, 0xde, 0x2e, + 0xb1, 0x6d, 0x62, 0xa7, 0x83, 0x96, 0xf9, 0x25, 0x0e, 0xa1, 0xce, 0xf1, 0x4e, 0x5e, 0x00, 0xdd, + 0x4f, 0x1b, 0x6e, 0x80, 0x59, 0x8d, 0xbd, 0xee, 0xc7, 0x5b, 0x51, 0x2d, 0x8e, 0x1c, 0xbf, 0x6e, + 0x2e, 0x72, 0xbb, 0x17, 0xd3, 0xd3, 0xb7, 0xa3, 0xf1, 0x50, 0x0f, 0x1d, 0xf8, 0xcd, 0x36, 0x6b, + 0xfc, 0xc7, 0x03, 0x1c, 0xde, 0x24, 0xc7, 0xd4, 0x7c, 0x8a, 0x37, 0x17, 0x7c, 0x9f, 0x77, 0x34, + 0x3a, 0xea, 0x21, 0x0f, 0xbf, 0x01, 0x2e, 0xe4, 0x38, 0x6c, 0xae, 0x30, 0x9f, 0x16, 0x03, 0x02, + 0xeb, 0x44, 0x77, 0x52, 0x22, 0xea, 0x26, 0x39, 0xc7, 0xa6, 0xce, 0x5c, 0xb1, 0x83, 0x53, 0x60, + 0xe0, 0x80, 0xc8, 0xdf, 0x38, 0x11, 0xfb, 0x08, 0xdf, 0x02, 0x43, 0x0d, 0xec, 0x26, 0xe9, 0xcc, + 0xdc, 0xbf, 0x4b, 0x11, 0x09, 0xbb, 0x2f, 0x15, 0x5e, 0x34, 0xe6, 0x3e, 0x30, 0xc0, 0x6c, 0xf7, + 0xf2, 0xfb, 0x79, 0x79, 0xf4, 0x73, 0x03, 0x4c, 0x77, 0x54, 0xda, 0x2e, 0xce, 0xb8, 0xed, 0xce, + 0xdc, 0xed, 0x63, 0xc9, 0x14, 0x19, 0xc3, 0x5b, 0x3f, 0xdd, 0xb3, 0x1f, 0x1a, 0x60, 0x2a, 0x5f, + 0xc1, 0x3e, 0xa7, 0x28, 0x95, 0xdf, 0x2f, 0x80, 0xd9, 0xee, 0xcd, 0x2a, 0xf4, 0xd4, 0x18, 0xde, + 0xf7, 0x97, 0x8c, 0x6e, 0x6f, 0x9b, 0xef, 0x1a, 0x60, 0xec, 0x1d, 0x25, 0x97, 0xfe, 0xf4, 0xd6, + 0xcf, 0xe7, 0x93, 0xf4, 0x8e, 0xc8, 0x18, 0x14, 0xe9, 0x90, 0xe5, 0xdf, 0x1b, 0x60, 0xa6, 0xeb, + 0xbd, 0xc7, 0xa6, 0x7c, 0xec, 0xba, 0xc1, 0xa1, 0x78, 0xf6, 0xd2, 0xde, 0x90, 0x97, 0x39, 0x15, + 0x49, 0xae, 0x16, 0xb3, 0xc2, 0x67, 0x10, 0xb3, 0xf2, 0x9f, 0x0c, 0x70, 0xf9, 0x7e, 0x59, 0xf7, + 0x59, 0xef, 0xe1, 0x22, 0x28, 0xca, 0xae, 0xf4, 0x98, 0xef, 0x9f, 0x1c, 0xb5, 0x64, 0x45, 0xe0, + 0x7f, 0xed, 0x10, 0x9f, 0xca, 0xbf, 0x36, 0xc0, 0x54, 0x8d, 0x44, 0x0d, 0xc7, 0x22, 0x88, 0xec, + 0x91, 0x88, 0xf8, 0x16, 0x81, 0x4b, 0x60, 0x94, 0xff, 0x34, 0x16, 0x62, 0x2b, 0x7d, 0xd0, 0x9f, + 0x96, 0x81, 0x1e, 0xbd, 0x95, 0x32, 0x50, 0x26, 0xa3, 0x1e, 0xff, 0x0b, 0x3d, 0x1f, 0xff, 0x2f, + 0x83, 0xc1, 0x30, 0x7b, 0x29, 0x2d, 0x32, 0x2e, 0x7f, 0x1c, 0xe5, 0x54, 0xce, 0x0d, 0xa2, 0x98, + 0x3f, 0x07, 0x0d, 0x49, 0x6e, 0x10, 0xc5, 0x88, 0x53, 0xcb, 0x7f, 0x36, 0xc0, 0x85, 0xf4, 0x3f, + 0x1a, 0xae, 0x43, 0xfc, 0x78, 0x25, 0xf0, 0xf7, 0x9c, 0x3a, 0xbc, 0x24, 0x5e, 0xc4, 0xb4, 0x67, + 0xa6, 0xf4, 0x35, 0x0c, 0xde, 0x03, 0x23, 0x54, 0xac, 0x4a, 0x06, 0xfc, 0xd5, 0x47, 0x0f, 0x78, + 0x3e, 0x3c, 0xe2, 0x42, 0x4f, 0xa9, 0x29, 0x0e, 0x8b, 0xb9, 0x85, 0xab, 0x89, 0x6f, 0xcb, 0x57, + 0xd1, 0x71, 0x11, 0xf3, 0x95, 0x65, 0x41, 0x43, 0x8a, 0x5b, 0xfe, 0xa7, 0x01, 0xa6, 0x3b, 0xfe, + 0x73, 0x02, 0xbf, 0x67, 0x80, 0x71, 0x4b, 0x5b, 0x9e, 0xcc, 0xdc, 0xcd, 0xd3, 0xff, 0xaf, 0x45, + 0x33, 0x2a, 0x6e, 0x45, 0x9d, 0x82, 0xda, 0x40, 0xe1, 0x0e, 0x30, 0xad, 0xdc, 0xdf, 0xbb, 0x72, + 0x3f, 0x18, 0x5d, 0x6e, 0x35, 0x4b, 0xe6, 0x4a, 0x0f, 0x19, 0xd4, 0x53, 0xbb, 0xba, 0xf8, 0xd1, + 0xa7, 0xf3, 0xe7, 0x3e, 0xfe, 0x74, 0xfe, 0xdc, 0x27, 0x9f, 0xce, 0x9f, 0x7b, 0xb7, 0x35, 0x6f, + 0x7c, 0xd4, 0x9a, 0x37, 0x3e, 0x6e, 0xcd, 0x1b, 0x9f, 0xb4, 0xe6, 0x8d, 0xbf, 0xb7, 0xe6, 0x8d, + 0x9f, 0xfc, 0x63, 0xfe, 0xdc, 0x1b, 0x85, 0xc6, 0xf5, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xcd, + 0xae, 0x89, 0xe9, 0xf2, 0x29, 0x00, 0x00, } func (m *ConversionRequest) Marshal() (dAtA []byte, err error) { @@ -1862,6 +1865,26 @@ func (m *JSONSchemaProps) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.XListType != nil { + i -= len(*m.XListType) + copy(dAtA[i:], *m.XListType) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.XListType))) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xd2 + } + if len(m.XListMapKeys) > 0 { + for iNdEx := len(m.XListMapKeys) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.XListMapKeys[iNdEx]) + copy(dAtA[i:], m.XListMapKeys[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.XListMapKeys[iNdEx]))) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xca + } + } i-- if m.XIntOrString { dAtA[i] = 1 @@ -3095,6 +3118,16 @@ func (m *JSONSchemaProps) Size() (n int) { } n += 3 n += 3 + if len(m.XListMapKeys) > 0 { + for _, s := range m.XListMapKeys { + l = len(s) + n += 2 + l + sovGenerated(uint64(l)) + } + } + if m.XListType != nil { + l = len(*m.XListType) + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -3569,6 +3602,8 @@ func (this *JSONSchemaProps) String() string { `XPreserveUnknownFields:` + valueToStringGenerated(this.XPreserveUnknownFields) + `,`, `XEmbeddedResource:` + fmt.Sprintf("%v", this.XEmbeddedResource) + `,`, `XIntOrString:` + fmt.Sprintf("%v", this.XIntOrString) + `,`, + `XListMapKeys:` + fmt.Sprintf("%v", this.XListMapKeys) + `,`, + `XListType:` + valueToStringGenerated(this.XListType) + `,`, `}`, }, "") return s @@ -7930,6 +7965,71 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { } } m.XIntOrString = bool(v != 0) + case 41: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field XListMapKeys", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.XListMapKeys = append(m.XListMapKeys, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 42: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field XListType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.XListType = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto index 70a2996d11d..915807dec67 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated.proto @@ -439,6 +439,33 @@ message JSONSchemaProps { // - type: string // - ... zero or more optional bool xKubernetesIntOrString = 40; + + // x-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used + // as the index of the map. + // + // This tag MUST only be used on lists that have the "x-kubernetes-list-type" + // extension set to "map". Also, the values specified for this attribute must + // be a scalar typed field of the child structure (no nesting is supported). + // + // +optional + repeated string xKubernetesListMapKeys = 41; + + // x-kubernetes-list-type annotates an array to further describe its topology. + // This extension must only be used on lists and may have 3 possible values: + // + // 1) `atomic`: the list is treated as a single entity, like a scalar. + // Atomic lists will be entirely replaced when updated. This extension + // may be used on any type of list (struct, scalar, ...). + // 2) `set`: + // Sets are lists that must not have multiple items with the same value. Each + // value must be a scalar (or another atomic type). + // 3) `map`: + // These lists are like maps in that their elements have a non-index key + // used to identify them. Order is preserved upon merge. The map tag + // must only be used on a list with elements of type object. + // Defaults to atomic for arrays. + // +optional + optional string xKubernetesListType = 42; } // JSONSchemaPropsOrArray represents a value that can either be a JSONSchemaProps diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.conversion.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.conversion.go index aba70a5e630..de5c8089a13 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.conversion.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.conversion.go @@ -910,6 +910,8 @@ func autoConvert_v1_JSONSchemaProps_To_apiextensions_JSONSchemaProps(in *JSONSch out.XPreserveUnknownFields = (*bool)(unsafe.Pointer(in.XPreserveUnknownFields)) out.XEmbeddedResource = in.XEmbeddedResource out.XIntOrString = in.XIntOrString + out.XListMapKeys = *(*[]string)(unsafe.Pointer(&in.XListMapKeys)) + out.XListType = (*string)(unsafe.Pointer(in.XListType)) return nil } @@ -1095,6 +1097,8 @@ func autoConvert_apiextensions_JSONSchemaProps_To_v1_JSONSchemaProps(in *apiexte out.XPreserveUnknownFields = (*bool)(unsafe.Pointer(in.XPreserveUnknownFields)) out.XEmbeddedResource = in.XEmbeddedResource out.XIntOrString = in.XIntOrString + out.XListMapKeys = *(*[]string)(unsafe.Pointer(&in.XListMapKeys)) + out.XListType = (*string)(unsafe.Pointer(in.XListType)) return nil } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.defaults.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.defaults.go index ed03cdd886c..317522d1b86 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.defaults.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.defaults.go @@ -38,6 +38,14 @@ func RegisterDefaults(scheme *runtime.Scheme) error { func SetObjectDefaults_CustomResourceDefinition(in *CustomResourceDefinition) { SetDefaults_CustomResourceDefinition(in) SetDefaults_CustomResourceDefinitionSpec(&in.Spec) + for i := range in.Spec.Versions { + a := &in.Spec.Versions[i] + if a.Schema != nil { + if a.Schema.OpenAPIV3Schema != nil { + SetDefaults_JSONSchemaProps(a.Schema.OpenAPIV3Schema) + } + } + } if in.Spec.Conversion != nil { if in.Spec.Conversion.Webhook != nil { if in.Spec.Conversion.Webhook.ClientConfig != nil { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go index c1e7f187b37..c28384c22a9 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go @@ -756,189 +756,192 @@ func init() { } var fileDescriptor_98a4cc6918394e53 = []byte{ - // 2907 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x73, 0x23, 0x47, - 0x15, 0xdf, 0x91, 0x2c, 0x5b, 0x6e, 0xdb, 0x6b, 0xbb, 0x77, 0xed, 0xcc, 0x3a, 0x1b, 0xc9, 0xab, - 0x90, 0x60, 0xc2, 0xae, 0x9c, 0x2c, 0x09, 0x09, 0xa9, 0xe2, 0x60, 0xd9, 0x4e, 0xca, 0xc9, 0xda, - 0x32, 0xad, 0xdd, 0x64, 0x21, 0x9f, 0x6d, 0x4d, 0x4b, 0x9e, 0xf5, 0x7c, 0xed, 0xf4, 0x8c, 0x6c, - 0x57, 0x80, 0xe2, 0xa3, 0x52, 0x50, 0x14, 0x10, 0x8a, 0xe4, 0x42, 0x15, 0x1c, 0x02, 0xc5, 0x85, - 0x03, 0x1c, 0xe0, 0x06, 0x7f, 0x40, 0x8e, 0x29, 0x4e, 0x39, 0x50, 0x2a, 0x56, 0xb9, 0xc2, 0x8d, - 0x2a, 0xaa, 0x7c, 0xa2, 0xfa, 0x63, 0x7a, 0x46, 0x23, 0x69, 0xd7, 0x95, 0x95, 0xb2, 0xdc, 0xac, - 0xf7, 0xf5, 0x7b, 0xfd, 0xfa, 0xf5, 0xeb, 0xd7, 0x6f, 0x0c, 0x1a, 0x07, 0xcf, 0xd1, 0xb2, 0xe9, - 0xae, 0x1e, 0x84, 0x7b, 0xc4, 0x77, 0x48, 0x40, 0xe8, 0x6a, 0x8b, 0x38, 0x86, 0xeb, 0xaf, 0x4a, - 0x06, 0xf6, 0x4c, 0x72, 0x14, 0x10, 0x87, 0x9a, 0xae, 0x43, 0xaf, 0x60, 0xcf, 0xa4, 0xc4, 0x6f, - 0x11, 0x7f, 0xd5, 0x3b, 0x68, 0x32, 0x1e, 0xed, 0x16, 0x58, 0x6d, 0x3d, 0xb5, 0x47, 0x02, 0xfc, - 0xd4, 0x6a, 0x93, 0x38, 0xc4, 0xc7, 0x01, 0x31, 0xca, 0x9e, 0xef, 0x06, 0x2e, 0xfc, 0xba, 0x30, - 0x57, 0xee, 0x92, 0x7e, 0x4b, 0x99, 0x2b, 0x7b, 0x07, 0x4d, 0xc6, 0xa3, 0xdd, 0x02, 0x65, 0x69, - 0x6e, 0xe9, 0x4a, 0xd3, 0x0c, 0xf6, 0xc3, 0xbd, 0x72, 0xdd, 0xb5, 0x57, 0x9b, 0x6e, 0xd3, 0x5d, - 0xe5, 0x56, 0xf7, 0xc2, 0x06, 0xff, 0xc5, 0x7f, 0xf0, 0xbf, 0x04, 0xda, 0xd2, 0xd3, 0xb1, 0xf3, - 0x36, 0xae, 0xef, 0x9b, 0x0e, 0xf1, 0x8f, 0x63, 0x8f, 0x6d, 0x12, 0xe0, 0xd5, 0x56, 0x8f, 0x8f, - 0x4b, 0xab, 0x83, 0xb4, 0xfc, 0xd0, 0x09, 0x4c, 0x9b, 0xf4, 0x28, 0x7c, 0xf5, 0x5e, 0x0a, 0xb4, - 0xbe, 0x4f, 0x6c, 0x9c, 0xd6, 0x2b, 0x9d, 0x68, 0x60, 0x7e, 0xdd, 0x75, 0x5a, 0xc4, 0x67, 0xab, - 0x44, 0xe4, 0x76, 0x48, 0x68, 0x00, 0x2b, 0x20, 0x1b, 0x9a, 0x86, 0xae, 0x2d, 0x6b, 0x2b, 0x93, - 0x95, 0x27, 0x3f, 0x6a, 0x17, 0xcf, 0x74, 0xda, 0xc5, 0xec, 0x8d, 0xad, 0x8d, 0x93, 0x76, 0xf1, - 0xd2, 0x20, 0xa4, 0xe0, 0xd8, 0x23, 0xb4, 0x7c, 0x63, 0x6b, 0x03, 0x31, 0x65, 0xf8, 0x22, 0x98, - 0x37, 0x08, 0x35, 0x7d, 0x62, 0xac, 0xed, 0x6e, 0xbd, 0x22, 0xec, 0xeb, 0x19, 0x6e, 0xf1, 0x82, - 0xb4, 0x38, 0xbf, 0x91, 0x16, 0x40, 0xbd, 0x3a, 0xf0, 0x26, 0x98, 0x70, 0xf7, 0x6e, 0x91, 0x7a, - 0x40, 0xf5, 0xec, 0x72, 0x76, 0x65, 0xea, 0xea, 0x95, 0x72, 0xbc, 0x83, 0xca, 0x05, 0xbe, 0x6d, - 0x72, 0xb1, 0x65, 0x84, 0x0f, 0x37, 0xa3, 0x9d, 0xab, 0xcc, 0x4a, 0xb4, 0x89, 0xaa, 0xb0, 0x82, - 0x22, 0x73, 0xa5, 0xdf, 0x65, 0x00, 0x4c, 0x2e, 0x9e, 0x7a, 0xae, 0x43, 0xc9, 0x50, 0x56, 0x4f, - 0xc1, 0x5c, 0x9d, 0x5b, 0x0e, 0x88, 0x21, 0x71, 0xf5, 0xcc, 0x67, 0xf1, 0x5e, 0x97, 0xf8, 0x73, - 0xeb, 0x29, 0x73, 0xa8, 0x07, 0x00, 0x5e, 0x07, 0xe3, 0x3e, 0xa1, 0xa1, 0x15, 0xe8, 0xd9, 0x65, - 0x6d, 0x65, 0xea, 0xea, 0xe5, 0x81, 0x50, 0x3c, 0xbf, 0x59, 0xf2, 0x95, 0x5b, 0x4f, 0x95, 0x6b, - 0x01, 0x0e, 0x42, 0x5a, 0x39, 0x2b, 0x91, 0xc6, 0x11, 0xb7, 0x81, 0xa4, 0xad, 0xd2, 0x8f, 0x33, - 0x60, 0x2e, 0x19, 0xa5, 0x96, 0x49, 0x0e, 0xe1, 0x21, 0x98, 0xf0, 0x45, 0xb2, 0xf0, 0x38, 0x4d, - 0x5d, 0xdd, 0x2d, 0xdf, 0xd7, 0xb1, 0x2a, 0xf7, 0x24, 0x61, 0x65, 0x8a, 0xed, 0x99, 0xfc, 0x81, - 0x22, 0x34, 0xf8, 0x0e, 0xc8, 0xfb, 0x72, 0xa3, 0x78, 0x36, 0x4d, 0x5d, 0xfd, 0xc6, 0x10, 0x91, - 0x85, 0xe1, 0xca, 0x74, 0xa7, 0x5d, 0xcc, 0x47, 0xbf, 0x90, 0x02, 0x2c, 0xbd, 0x9f, 0x01, 0x85, - 0xf5, 0x90, 0x06, 0xae, 0x8d, 0x08, 0x75, 0x43, 0xbf, 0x4e, 0xd6, 0x5d, 0x2b, 0xb4, 0x9d, 0x0d, - 0xd2, 0x30, 0x1d, 0x33, 0x60, 0xd9, 0xba, 0x0c, 0xc6, 0x1c, 0x6c, 0x13, 0x99, 0x3d, 0xd3, 0x32, - 0xa6, 0x63, 0x3b, 0xd8, 0x26, 0x88, 0x73, 0x98, 0x04, 0x4b, 0x16, 0x79, 0x16, 0x94, 0xc4, 0xf5, - 0x63, 0x8f, 0x20, 0xce, 0x81, 0x8f, 0x83, 0xf1, 0x86, 0xeb, 0xdb, 0x58, 0xec, 0xe3, 0x64, 0xbc, - 0x33, 0x2f, 0x70, 0x2a, 0x92, 0x5c, 0xf8, 0x0c, 0x98, 0x32, 0x08, 0xad, 0xfb, 0xa6, 0xc7, 0xa0, - 0xf5, 0x31, 0x2e, 0x7c, 0x4e, 0x0a, 0x4f, 0x6d, 0xc4, 0x2c, 0x94, 0x94, 0x83, 0x97, 0x41, 0xde, - 0xf3, 0x4d, 0xd7, 0x37, 0x83, 0x63, 0x3d, 0xb7, 0xac, 0xad, 0xe4, 0x2a, 0x73, 0x52, 0x27, 0xbf, - 0x2b, 0xe9, 0x48, 0x49, 0xc0, 0x65, 0x90, 0x7f, 0xa9, 0x56, 0xdd, 0xd9, 0xc5, 0xc1, 0xbe, 0x3e, - 0xce, 0x11, 0xc6, 0x98, 0x34, 0xca, 0xdf, 0x92, 0xd4, 0xd2, 0x3f, 0x32, 0x40, 0x4f, 0x47, 0x25, - 0x0a, 0x29, 0x7c, 0x01, 0xe4, 0x69, 0xc0, 0x2a, 0x4e, 0xf3, 0x58, 0xc6, 0xe4, 0x89, 0x08, 0xac, - 0x26, 0xe9, 0x27, 0xed, 0xe2, 0x62, 0xac, 0x11, 0x51, 0x79, 0x3c, 0x94, 0x2e, 0xfc, 0x8d, 0x06, - 0xce, 0x1d, 0x92, 0xbd, 0x7d, 0xd7, 0x3d, 0x58, 0xb7, 0x4c, 0xe2, 0x04, 0xeb, 0xae, 0xd3, 0x30, - 0x9b, 0x32, 0x07, 0xd0, 0x7d, 0xe6, 0xc0, 0xab, 0xbd, 0x96, 0x2b, 0x0f, 0x75, 0xda, 0xc5, 0x73, - 0x7d, 0x18, 0xa8, 0x9f, 0x1f, 0xf0, 0x26, 0xd0, 0xeb, 0xa9, 0x43, 0x22, 0x0b, 0x98, 0x28, 0x5b, - 0x93, 0x95, 0x8b, 0x9d, 0x76, 0x51, 0x5f, 0x1f, 0x20, 0x83, 0x06, 0x6a, 0x97, 0x7e, 0x98, 0x4d, - 0x87, 0x37, 0x91, 0x6e, 0x6f, 0x83, 0x3c, 0x3b, 0xc6, 0x06, 0x0e, 0xb0, 0x3c, 0x88, 0x4f, 0x9e, - 0xee, 0xd0, 0x8b, 0x9a, 0xb1, 0x4d, 0x02, 0x5c, 0x81, 0x72, 0x43, 0x40, 0x4c, 0x43, 0xca, 0x2a, - 0xfc, 0x0e, 0x18, 0xa3, 0x1e, 0xa9, 0xcb, 0x40, 0xbf, 0x76, 0xbf, 0x87, 0x6d, 0xc0, 0x42, 0x6a, - 0x1e, 0xa9, 0xc7, 0x67, 0x81, 0xfd, 0x42, 0x1c, 0x16, 0xbe, 0xab, 0x81, 0x71, 0xca, 0x0b, 0x94, - 0x2c, 0x6a, 0x6f, 0x8c, 0xca, 0x83, 0x54, 0x15, 0x14, 0xbf, 0x91, 0x04, 0x2f, 0xfd, 0x27, 0x03, - 0x2e, 0x0d, 0x52, 0x5d, 0x77, 0x1d, 0x43, 0x6c, 0xc7, 0x96, 0x3c, 0xdb, 0x22, 0xd3, 0x9f, 0x49, - 0x9e, 0xed, 0x93, 0x76, 0xf1, 0xb1, 0x7b, 0x1a, 0x48, 0x14, 0x81, 0xaf, 0xa9, 0x75, 0x8b, 0x42, - 0x71, 0xa9, 0xdb, 0xb1, 0x93, 0x76, 0x71, 0x56, 0xa9, 0x75, 0xfb, 0x0a, 0x5b, 0x00, 0x5a, 0x98, - 0x06, 0xd7, 0x7d, 0xec, 0x50, 0x61, 0xd6, 0xb4, 0x89, 0x0c, 0xdf, 0x13, 0xa7, 0x4b, 0x0f, 0xa6, - 0x51, 0x59, 0x92, 0x90, 0xf0, 0x5a, 0x8f, 0x35, 0xd4, 0x07, 0x81, 0xd5, 0x2d, 0x9f, 0x60, 0xaa, - 0x4a, 0x51, 0xe2, 0x46, 0x61, 0x54, 0x24, 0xb9, 0xf0, 0x4b, 0x60, 0xc2, 0x26, 0x94, 0xe2, 0x26, - 0xe1, 0xf5, 0x67, 0x32, 0xbe, 0xa2, 0xb7, 0x05, 0x19, 0x45, 0x7c, 0xd6, 0x9f, 0x5c, 0x1c, 0x14, - 0xb5, 0x6b, 0x26, 0x0d, 0xe0, 0xeb, 0x3d, 0x07, 0xa0, 0x7c, 0xba, 0x15, 0x32, 0x6d, 0x9e, 0xfe, - 0xaa, 0xf8, 0x45, 0x94, 0x44, 0xf2, 0x7f, 0x1b, 0xe4, 0xcc, 0x80, 0xd8, 0xd1, 0xdd, 0xfd, 0xea, - 0x88, 0x72, 0xaf, 0x32, 0x23, 0x7d, 0xc8, 0x6d, 0x31, 0x34, 0x24, 0x40, 0x4b, 0xbf, 0xcf, 0x80, - 0x47, 0x06, 0xa9, 0xb0, 0x0b, 0x85, 0xb2, 0x88, 0x7b, 0x56, 0xe8, 0x63, 0x4b, 0x66, 0x9c, 0x8a, - 0xf8, 0x2e, 0xa7, 0x22, 0xc9, 0x65, 0x25, 0x9f, 0x9a, 0x4e, 0x33, 0xb4, 0xb0, 0x2f, 0xd3, 0x49, - 0xad, 0xba, 0x26, 0xe9, 0x48, 0x49, 0xc0, 0x32, 0x00, 0x74, 0xdf, 0xf5, 0x03, 0x8e, 0x21, 0xab, - 0xd7, 0x59, 0x56, 0x20, 0x6a, 0x8a, 0x8a, 0x12, 0x12, 0xec, 0x46, 0x3b, 0x30, 0x1d, 0x43, 0xee, - 0xba, 0x3a, 0xc5, 0x2f, 0x9b, 0x8e, 0x81, 0x38, 0x87, 0xe1, 0x5b, 0x26, 0x0d, 0x18, 0x45, 0x6e, - 0x79, 0x57, 0xd4, 0xb9, 0xa4, 0x92, 0x60, 0xf8, 0x75, 0x56, 0xf5, 0x5d, 0xdf, 0x24, 0x54, 0x1f, - 0x8f, 0xf1, 0xd7, 0x15, 0x15, 0x25, 0x24, 0x4a, 0xff, 0xca, 0x0f, 0x4e, 0x12, 0x56, 0x4a, 0xe0, - 0xa3, 0x20, 0xd7, 0xf4, 0xdd, 0xd0, 0x93, 0x51, 0x52, 0xd1, 0x7e, 0x91, 0x11, 0x91, 0xe0, 0xb1, - 0xac, 0x6c, 0x75, 0xb5, 0xa9, 0x2a, 0x2b, 0xa3, 0xe6, 0x34, 0xe2, 0xc3, 0xef, 0x6b, 0x20, 0xe7, - 0xc8, 0xe0, 0xb0, 0x94, 0x7b, 0x7d, 0x44, 0x79, 0xc1, 0xc3, 0x1b, 0xbb, 0x2b, 0x22, 0x2f, 0x90, - 0xe1, 0xd3, 0x20, 0x47, 0xeb, 0xae, 0x47, 0x64, 0xd4, 0x0b, 0x91, 0x50, 0x8d, 0x11, 0x4f, 0xda, - 0xc5, 0x99, 0xc8, 0x1c, 0x27, 0x20, 0x21, 0x0c, 0x7f, 0xa4, 0x01, 0xd0, 0xc2, 0x96, 0x69, 0x60, - 0xde, 0x32, 0xe4, 0xb8, 0xfb, 0xc3, 0x4d, 0xeb, 0x57, 0x94, 0x79, 0xb1, 0x69, 0xf1, 0x6f, 0x94, - 0x80, 0x86, 0xef, 0x69, 0x60, 0x9a, 0x86, 0x7b, 0xbe, 0xd4, 0xa2, 0xbc, 0xb9, 0x98, 0xba, 0xfa, - 0xcd, 0xa1, 0xfa, 0x52, 0x4b, 0x00, 0x54, 0xe6, 0x3a, 0xed, 0xe2, 0x74, 0x92, 0x82, 0xba, 0x1c, - 0x80, 0x3f, 0xd5, 0x40, 0xbe, 0x15, 0xdd, 0xd9, 0x13, 0xfc, 0xc0, 0xbf, 0x39, 0xa2, 0x8d, 0x95, - 0x19, 0x15, 0x9f, 0x02, 0xd5, 0x07, 0x28, 0x0f, 0xe0, 0x5f, 0x35, 0xa0, 0x63, 0x43, 0x14, 0x78, - 0x6c, 0xed, 0xfa, 0xa6, 0x13, 0x10, 0x5f, 0xf4, 0x9b, 0x54, 0xcf, 0x73, 0xf7, 0x86, 0x7b, 0x17, - 0xa6, 0x7b, 0xd9, 0xca, 0xb2, 0xf4, 0x4e, 0x5f, 0x1b, 0xe0, 0x06, 0x1a, 0xe8, 0x20, 0x4f, 0xb4, - 0xb8, 0xa5, 0xd1, 0x27, 0x47, 0x90, 0x68, 0x71, 0x2f, 0x25, 0xab, 0x43, 0xdc, 0x41, 0x25, 0xa0, - 0x61, 0x15, 0x2c, 0x78, 0x3e, 0xe1, 0x00, 0x37, 0x9c, 0x03, 0xc7, 0x3d, 0x74, 0x5e, 0x30, 0x89, - 0x65, 0x50, 0x1d, 0x2c, 0x6b, 0x2b, 0xf9, 0xca, 0x85, 0x4e, 0xbb, 0xb8, 0xb0, 0xdb, 0x4f, 0x00, - 0xf5, 0xd7, 0x2b, 0xbd, 0x97, 0x4d, 0xbf, 0x02, 0xd2, 0x5d, 0x04, 0xfc, 0x40, 0xac, 0x5e, 0xc4, - 0x86, 0xea, 0x1a, 0xdf, 0xad, 0xb7, 0x47, 0x94, 0x4c, 0xaa, 0x0d, 0x88, 0x3b, 0x39, 0x45, 0xa2, - 0x28, 0xe1, 0x07, 0xfc, 0x95, 0x06, 0x66, 0x70, 0xbd, 0x4e, 0xbc, 0x80, 0x18, 0xa2, 0xb8, 0x67, - 0x3e, 0x87, 0xfa, 0xb5, 0x20, 0xbd, 0x9a, 0x59, 0x4b, 0x42, 0xa3, 0x6e, 0x4f, 0xe0, 0xf3, 0xe0, - 0x2c, 0x0d, 0x5c, 0x9f, 0x18, 0xa9, 0xb6, 0x19, 0x76, 0xda, 0xc5, 0xb3, 0xb5, 0x2e, 0x0e, 0x4a, - 0x49, 0x96, 0x3e, 0x1d, 0x03, 0xc5, 0x7b, 0x1c, 0xb5, 0x53, 0x3c, 0xcc, 0x1e, 0x07, 0xe3, 0x7c, - 0xb9, 0x06, 0x8f, 0x4a, 0x3e, 0xd1, 0x0a, 0x72, 0x2a, 0x92, 0x5c, 0x76, 0x51, 0x30, 0x7c, 0xd6, - 0xbe, 0x64, 0xb9, 0xa0, 0xba, 0x28, 0x6a, 0x82, 0x8c, 0x22, 0x3e, 0x7c, 0x07, 0x8c, 0x8b, 0xc1, - 0x0b, 0xaf, 0xd2, 0x23, 0xac, 0xb4, 0x80, 0xfb, 0xc9, 0xa1, 0x90, 0x84, 0xec, 0xad, 0xb0, 0xb9, - 0x07, 0x5d, 0x61, 0xef, 0x5a, 0xd2, 0xc6, 0xff, 0xcf, 0x4b, 0x5a, 0xe9, 0xbf, 0x5a, 0xfa, 0xdc, - 0x27, 0x96, 0x5a, 0xab, 0x63, 0x8b, 0xc0, 0x0d, 0x30, 0xc7, 0x5e, 0x2d, 0x88, 0x78, 0x96, 0x59, - 0xc7, 0x94, 0x3f, 0x9a, 0x45, 0xc2, 0xa9, 0x39, 0x4e, 0x2d, 0xc5, 0x47, 0x3d, 0x1a, 0xf0, 0x25, - 0x00, 0x45, 0x27, 0xdf, 0x65, 0x47, 0x34, 0x25, 0xaa, 0x27, 0xaf, 0xf5, 0x48, 0xa0, 0x3e, 0x5a, - 0x70, 0x1d, 0xcc, 0x5b, 0x78, 0x8f, 0x58, 0x35, 0x62, 0x91, 0x7a, 0xe0, 0xfa, 0xdc, 0x94, 0x18, - 0x2b, 0x2c, 0x74, 0xda, 0xc5, 0xf9, 0x6b, 0x69, 0x26, 0xea, 0x95, 0x2f, 0x5d, 0x4a, 0x1f, 0xaf, - 0xe4, 0xc2, 0xc5, 0xfb, 0xe8, 0xc3, 0x0c, 0x58, 0x1a, 0x9c, 0x19, 0xf0, 0x07, 0xf1, 0x33, 0x4e, - 0x74, 0xe9, 0x6f, 0x8e, 0x2a, 0x0b, 0xe5, 0x3b, 0x0e, 0xf4, 0xbe, 0xe1, 0xe0, 0x77, 0x59, 0xcb, - 0x84, 0xad, 0x68, 0x70, 0xf4, 0xc6, 0xc8, 0x5c, 0x60, 0x20, 0x95, 0x49, 0xd1, 0x8d, 0x61, 0x8b, - 0x37, 0x5f, 0xd8, 0x22, 0xa5, 0x3f, 0x68, 0xe9, 0x97, 0x7c, 0x7c, 0x82, 0xe1, 0xcf, 0x34, 0x30, - 0xeb, 0x7a, 0xc4, 0x59, 0xdb, 0xdd, 0x7a, 0xe5, 0x2b, 0xe2, 0x24, 0xcb, 0x50, 0xed, 0xdc, 0xa7, - 0x9f, 0x2f, 0xd5, 0xaa, 0x3b, 0xc2, 0xe0, 0xae, 0xef, 0x7a, 0xb4, 0x72, 0xae, 0xd3, 0x2e, 0xce, - 0x56, 0xbb, 0xa1, 0x50, 0x1a, 0xbb, 0x64, 0x83, 0x85, 0xcd, 0xa3, 0x80, 0xf8, 0x0e, 0xb6, 0x36, - 0xdc, 0x7a, 0x68, 0x13, 0x27, 0x10, 0x8e, 0xa6, 0xa6, 0x4e, 0xda, 0x29, 0xa7, 0x4e, 0x8f, 0x80, - 0x6c, 0xe8, 0x5b, 0x32, 0x8b, 0xa7, 0xd4, 0x54, 0x15, 0x5d, 0x43, 0x8c, 0x5e, 0xba, 0x04, 0xc6, - 0x98, 0x9f, 0xf0, 0x02, 0xc8, 0xfa, 0xf8, 0x90, 0x5b, 0x9d, 0xae, 0x4c, 0x30, 0x11, 0x84, 0x0f, - 0x11, 0xa3, 0x95, 0xfe, 0x5d, 0x00, 0xb3, 0xa9, 0xb5, 0xc0, 0x25, 0x90, 0x51, 0xa3, 0x5a, 0x20, - 0x8d, 0x66, 0xb6, 0x36, 0x50, 0xc6, 0x34, 0xe0, 0xb3, 0xaa, 0xf8, 0x0a, 0xd0, 0xa2, 0xaa, 0xe7, - 0x9c, 0xca, 0x7a, 0xe4, 0xd8, 0x1c, 0x73, 0x24, 0x2a, 0x9c, 0xcc, 0x07, 0xd2, 0x90, 0xa7, 0x44, - 0xf8, 0x40, 0x1a, 0x88, 0xd1, 0x3e, 0xeb, 0xc8, 0x2d, 0x9a, 0xf9, 0xe5, 0x4e, 0x31, 0xf3, 0x1b, - 0xbf, 0xeb, 0xcc, 0xef, 0x51, 0x90, 0x0b, 0xcc, 0xc0, 0x22, 0xfa, 0x44, 0xf7, 0x53, 0xe6, 0x3a, - 0x23, 0x22, 0xc1, 0x83, 0xb7, 0xc0, 0x84, 0x41, 0x1a, 0x38, 0xb4, 0x02, 0x3d, 0xcf, 0x53, 0x68, - 0x7d, 0x08, 0x29, 0x24, 0x06, 0xb2, 0x1b, 0xc2, 0x2e, 0x8a, 0x00, 0xe0, 0x63, 0x60, 0xc2, 0xc6, - 0x47, 0xa6, 0x1d, 0xda, 0xbc, 0xc9, 0xd3, 0x84, 0xd8, 0xb6, 0x20, 0xa1, 0x88, 0xc7, 0x2a, 0x23, - 0x39, 0xaa, 0x5b, 0x21, 0x35, 0x5b, 0x44, 0x32, 0x65, 0x03, 0xa6, 0x2a, 0xe3, 0x66, 0x8a, 0x8f, - 0x7a, 0x34, 0x38, 0x98, 0xe9, 0x70, 0xe5, 0xa9, 0x04, 0x98, 0x20, 0xa1, 0x88, 0xd7, 0x0d, 0x26, - 0xe5, 0xa7, 0x07, 0x81, 0x49, 0xe5, 0x1e, 0x0d, 0xf8, 0x65, 0x30, 0x69, 0xe3, 0xa3, 0x6b, 0xc4, - 0x69, 0x06, 0xfb, 0xfa, 0xcc, 0xb2, 0xb6, 0x92, 0xad, 0xcc, 0x74, 0xda, 0xc5, 0xc9, 0xed, 0x88, - 0x88, 0x62, 0x3e, 0x17, 0x36, 0x1d, 0x29, 0x7c, 0x36, 0x21, 0x1c, 0x11, 0x51, 0xcc, 0x67, 0x1d, - 0x84, 0x87, 0x03, 0x76, 0xb8, 0xf4, 0xd9, 0xee, 0xa7, 0xe6, 0xae, 0x20, 0xa3, 0x88, 0x0f, 0x57, - 0x40, 0xde, 0xc6, 0x47, 0x7c, 0x2c, 0xa0, 0xcf, 0x71, 0xb3, 0x7c, 0x38, 0xbd, 0x2d, 0x69, 0x48, - 0x71, 0xb9, 0xa4, 0xe9, 0x08, 0xc9, 0xf9, 0x84, 0xa4, 0xa4, 0x21, 0xc5, 0x65, 0x49, 0x1c, 0x3a, - 0xe6, 0xed, 0x90, 0x08, 0x61, 0xc8, 0x23, 0xa3, 0x92, 0xf8, 0x46, 0xcc, 0x42, 0x49, 0x39, 0xf6, - 0x2c, 0xb7, 0x43, 0x2b, 0x30, 0x3d, 0x8b, 0x54, 0x1b, 0xfa, 0x39, 0x1e, 0x7f, 0xde, 0x78, 0x6f, - 0x2b, 0x2a, 0x4a, 0x48, 0x40, 0x02, 0xc6, 0x88, 0x13, 0xda, 0xfa, 0x79, 0x7e, 0xb1, 0x0f, 0x25, - 0x05, 0xd5, 0xc9, 0xd9, 0x74, 0x42, 0x1b, 0x71, 0xf3, 0xf0, 0x59, 0x30, 0x63, 0xe3, 0x23, 0x56, - 0x0e, 0x88, 0x1f, 0x98, 0x84, 0xea, 0x0b, 0x7c, 0xf1, 0xf3, 0xac, 0xe3, 0xdc, 0x4e, 0x32, 0x50, - 0xb7, 0x1c, 0x57, 0x34, 0x9d, 0x84, 0xe2, 0x62, 0x42, 0x31, 0xc9, 0x40, 0xdd, 0x72, 0x2c, 0xd2, - 0x3e, 0xb9, 0x1d, 0x9a, 0x3e, 0x31, 0xf4, 0x87, 0x78, 0x93, 0x2a, 0x3f, 0x18, 0x08, 0x1a, 0x52, - 0x5c, 0xd8, 0x8a, 0xe6, 0x47, 0x3a, 0x3f, 0x86, 0x37, 0x86, 0x5b, 0xc9, 0xab, 0xfe, 0x9a, 0xef, - 0xe3, 0x63, 0x71, 0xd3, 0x24, 0x27, 0x47, 0x90, 0x82, 0x1c, 0xb6, 0xac, 0x6a, 0x43, 0xbf, 0xc0, - 0x63, 0x3f, 0xec, 0x1b, 0x44, 0x55, 0x9d, 0x35, 0x06, 0x82, 0x04, 0x16, 0x03, 0x75, 0x1d, 0x96, - 0x1a, 0x4b, 0xa3, 0x05, 0xad, 0x32, 0x10, 0x24, 0xb0, 0xf8, 0x4a, 0x9d, 0xe3, 0x6a, 0x43, 0x7f, - 0x78, 0xc4, 0x2b, 0x65, 0x20, 0x48, 0x60, 0x41, 0x13, 0x64, 0x1d, 0x37, 0xd0, 0x2f, 0x8e, 0xe4, - 0x7a, 0xe6, 0x17, 0xce, 0x8e, 0x1b, 0x20, 0x86, 0x01, 0x7f, 0xa9, 0x01, 0xe0, 0xc5, 0x29, 0xfa, - 0xc8, 0x50, 0xc6, 0x12, 0x29, 0xc8, 0x72, 0x9c, 0xdb, 0x9b, 0x4e, 0xe0, 0x1f, 0xc7, 0xef, 0xc8, - 0xc4, 0x19, 0x48, 0x78, 0x01, 0x7f, 0xab, 0x81, 0xf3, 0xc9, 0x36, 0x59, 0xb9, 0x57, 0xe0, 0x11, - 0xb9, 0x3e, 0xec, 0x34, 0xaf, 0xb8, 0xae, 0x55, 0xd1, 0x3b, 0xed, 0xe2, 0xf9, 0xb5, 0x3e, 0xa8, - 0xa8, 0xaf, 0x2f, 0xf0, 0x8f, 0x1a, 0x98, 0x97, 0x55, 0x34, 0xe1, 0x61, 0x91, 0x07, 0x90, 0x0c, - 0x3b, 0x80, 0x69, 0x1c, 0x11, 0x47, 0xf5, 0xa1, 0xbb, 0x87, 0x8f, 0x7a, 0x5d, 0x83, 0x7f, 0xd1, - 0xc0, 0xb4, 0x41, 0x3c, 0xe2, 0x18, 0xc4, 0xa9, 0x33, 0x5f, 0x97, 0x87, 0x32, 0x36, 0x48, 0xfb, - 0xba, 0x91, 0x80, 0x10, 0x6e, 0x96, 0xa5, 0x9b, 0xd3, 0x49, 0xd6, 0x49, 0xbb, 0xb8, 0x18, 0xab, - 0x26, 0x39, 0xa8, 0xcb, 0x4b, 0xf8, 0xbe, 0x06, 0x66, 0xe3, 0x0d, 0x10, 0x57, 0xca, 0xa5, 0x11, - 0xe6, 0x01, 0x6f, 0x5f, 0xd7, 0xba, 0x01, 0x51, 0xda, 0x03, 0xf8, 0x27, 0x8d, 0x75, 0x6a, 0xd1, - 0xbb, 0x8f, 0xea, 0x25, 0x1e, 0xcb, 0xb7, 0x86, 0x1e, 0x4b, 0x85, 0x20, 0x42, 0x79, 0x39, 0x6e, - 0x05, 0x15, 0xe7, 0xa4, 0x5d, 0x5c, 0x48, 0x46, 0x52, 0x31, 0x50, 0xd2, 0x43, 0xf8, 0x13, 0x0d, - 0x4c, 0x93, 0xb8, 0xe3, 0xa6, 0xfa, 0xa3, 0x43, 0x09, 0x62, 0xdf, 0x26, 0x5e, 0xbc, 0xd4, 0x13, - 0x2c, 0x8a, 0xba, 0xb0, 0x59, 0x07, 0x49, 0x8e, 0xb0, 0xed, 0x59, 0x44, 0xff, 0xc2, 0x90, 0x3b, - 0xc8, 0x4d, 0x61, 0x17, 0x45, 0x00, 0xf0, 0x32, 0xc8, 0x3b, 0xa1, 0x65, 0xe1, 0x3d, 0x8b, 0xe8, - 0x8f, 0xf1, 0x5e, 0x44, 0x8d, 0x45, 0x77, 0x24, 0x1d, 0x29, 0x09, 0xd8, 0x00, 0xcb, 0x47, 0x2f, - 0xab, 0x7f, 0x11, 0xea, 0x3b, 0xb8, 0xd3, 0x1f, 0xe7, 0x56, 0x96, 0x3a, 0xed, 0xe2, 0xe2, 0xcd, - 0xfe, 0xa3, 0xbd, 0x7b, 0xda, 0x80, 0xaf, 0x81, 0x87, 0x13, 0x32, 0x9b, 0xf6, 0x1e, 0x31, 0x0c, - 0x62, 0x44, 0x0f, 0x37, 0xfd, 0x8b, 0x62, 0x78, 0x18, 0x1d, 0xf0, 0x9b, 0x69, 0x01, 0x74, 0x37, - 0x6d, 0x78, 0x0d, 0x2c, 0x26, 0xd8, 0x5b, 0x4e, 0x50, 0xf5, 0x6b, 0x81, 0x6f, 0x3a, 0x4d, 0x7d, - 0x85, 0xdb, 0x3d, 0x1f, 0x9d, 0xc8, 0x9b, 0x09, 0x1e, 0x1a, 0xa0, 0xb3, 0xc4, 0x9e, 0x8e, 0xa9, - 0xd2, 0x03, 0xe7, 0x40, 0xf6, 0x80, 0xc8, 0x4f, 0xee, 0x88, 0xfd, 0x09, 0x0d, 0x90, 0x6b, 0x61, - 0x2b, 0x8c, 0x5e, 0xbf, 0x43, 0xbe, 0xb6, 0x90, 0x30, 0xfe, 0x7c, 0xe6, 0x39, 0x6d, 0xe9, 0x03, - 0x0d, 0x2c, 0xf6, 0xaf, 0x88, 0x0f, 0xd4, 0xad, 0x5f, 0x6b, 0x60, 0xbe, 0xa7, 0xf8, 0xf5, 0xf1, - 0xe8, 0x76, 0xb7, 0x47, 0xaf, 0x0d, 0xbb, 0x8a, 0x89, 0x5d, 0xe3, 0xad, 0x5b, 0xd2, 0xbd, 0x9f, - 0x6b, 0x60, 0x2e, 0x5d, 0x4f, 0x1e, 0x64, 0xbc, 0x4a, 0x1f, 0x64, 0xc0, 0x62, 0xff, 0x8e, 0x13, - 0xfa, 0xea, 0x69, 0x3d, 0x9a, 0x11, 0x45, 0xbf, 0x71, 0xe6, 0xbb, 0x1a, 0x98, 0xba, 0xa5, 0xe4, - 0xa2, 0x4f, 0xb2, 0x43, 0x1f, 0x8e, 0x44, 0x05, 0x3c, 0x66, 0x50, 0x94, 0xc4, 0x2d, 0xfd, 0x59, - 0x03, 0x0b, 0x7d, 0x6f, 0x26, 0xf6, 0x86, 0xc7, 0x96, 0xe5, 0x1e, 0x8a, 0x19, 0x57, 0x62, 0x80, - 0xbc, 0xc6, 0xa9, 0x48, 0x72, 0x13, 0xd1, 0xcb, 0x7c, 0x5e, 0xd1, 0x2b, 0xfd, 0x4d, 0x03, 0x17, - 0xef, 0x96, 0x89, 0x0f, 0x64, 0x4b, 0x57, 0x40, 0x5e, 0x76, 0x95, 0xc7, 0x7c, 0x3b, 0xe5, 0x43, - 0x4a, 0x16, 0x0d, 0xfe, 0x5f, 0x48, 0xe2, 0xaf, 0xd2, 0x87, 0x1a, 0x98, 0xab, 0x11, 0xbf, 0x65, - 0xd6, 0x09, 0x22, 0x0d, 0xe2, 0x13, 0xa7, 0x4e, 0xe0, 0x2a, 0x98, 0xe4, 0xdf, 0x42, 0x3d, 0x5c, - 0x8f, 0xe6, 0xfa, 0xf3, 0x32, 0xe4, 0x93, 0x3b, 0x11, 0x03, 0xc5, 0x32, 0xea, 0x1b, 0x40, 0x66, - 0xe0, 0x37, 0x80, 0x8b, 0x60, 0xcc, 0x8b, 0x27, 0xa4, 0x79, 0xc6, 0xe5, 0x43, 0x51, 0x4e, 0xe5, - 0x5c, 0xd7, 0x0f, 0xf8, 0xd8, 0x27, 0x27, 0xb9, 0xae, 0x1f, 0x20, 0x4e, 0x2d, 0xfd, 0x5d, 0x03, - 0xfd, 0xfe, 0x5f, 0x08, 0x5e, 0x10, 0x93, 0xaf, 0xc4, 0x38, 0x29, 0x9a, 0x7a, 0xc1, 0x16, 0x98, - 0xa0, 0x62, 0x55, 0x32, 0xea, 0xd5, 0xfb, 0x8c, 0x7a, 0x3a, 0x46, 0xe2, 0xca, 0x8d, 0xa8, 0x11, - 0x18, 0x0b, 0x7c, 0x1d, 0x57, 0x42, 0xc7, 0x90, 0xc3, 0xd0, 0x69, 0x11, 0xf8, 0xf5, 0x35, 0x41, - 0x43, 0x8a, 0x5b, 0xb9, 0xf2, 0xd1, 0x9d, 0xc2, 0x99, 0x8f, 0xef, 0x14, 0xce, 0x7c, 0x72, 0xa7, - 0x70, 0xe6, 0x7b, 0x9d, 0x82, 0xf6, 0x51, 0xa7, 0xa0, 0x7d, 0xdc, 0x29, 0x68, 0x9f, 0x74, 0x0a, - 0xda, 0x3f, 0x3b, 0x05, 0xed, 0x17, 0x9f, 0x16, 0xce, 0x7c, 0x6b, 0x42, 0xe2, 0xff, 0x2f, 0x00, - 0x00, 0xff, 0xff, 0x91, 0x48, 0x25, 0x22, 0xc5, 0x2b, 0x00, 0x00, + // 2955 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcf, 0x73, 0x23, 0x47, + 0xf5, 0xdf, 0x91, 0x2c, 0x5b, 0x6e, 0xdb, 0x6b, 0xbb, 0x77, 0xed, 0xcc, 0x3a, 0x1b, 0xcb, 0xab, + 0x7c, 0xb3, 0x5f, 0x27, 0xec, 0xca, 0xc9, 0x92, 0x90, 0x90, 0x2a, 0x8a, 0xb2, 0x6c, 0x27, 0x38, + 0x59, 0x5b, 0xa6, 0xb5, 0x9b, 0x18, 0xf2, 0xb3, 0xad, 0x69, 0xc9, 0xb3, 0x9e, 0x5f, 0x3b, 0x3d, + 0x23, 0xdb, 0x15, 0xa0, 0xf8, 0x51, 0x29, 0x28, 0x0a, 0x08, 0x45, 0x72, 0xa1, 0x0a, 0x0e, 0x81, + 0xe2, 0xc2, 0x01, 0x0e, 0x70, 0x83, 0x3f, 0x20, 0xc7, 0x14, 0xa7, 0x1c, 0x28, 0x15, 0xab, 0x5c, + 0x39, 0x52, 0x05, 0xe5, 0x13, 0xd5, 0x3f, 0xa6, 0x67, 0x34, 0x92, 0x76, 0x5d, 0x59, 0x29, 0xcb, + 0xcd, 0x7a, 0xbf, 0x3e, 0xaf, 0x5f, 0xbf, 0x7e, 0xfd, 0xfa, 0x8d, 0x41, 0xfd, 0xe0, 0x39, 0x5a, + 0x32, 0xdd, 0x95, 0x83, 0x70, 0x8f, 0xf8, 0x0e, 0x09, 0x08, 0x5d, 0x69, 0x12, 0xc7, 0x70, 0xfd, + 0x15, 0xc9, 0xc0, 0x9e, 0x49, 0x8e, 0x02, 0xe2, 0x50, 0xd3, 0x75, 0xe8, 0x55, 0xec, 0x99, 0x94, + 0xf8, 0x4d, 0xe2, 0xaf, 0x78, 0x07, 0x0d, 0xc6, 0xa3, 0x9d, 0x02, 0x2b, 0xcd, 0xa7, 0xf6, 0x48, + 0x80, 0x9f, 0x5a, 0x69, 0x10, 0x87, 0xf8, 0x38, 0x20, 0x46, 0xc9, 0xf3, 0xdd, 0xc0, 0x85, 0x5f, + 0x11, 0xe6, 0x4a, 0x1d, 0xd2, 0x6f, 0x29, 0x73, 0x25, 0xef, 0xa0, 0xc1, 0x78, 0xb4, 0x53, 0xa0, + 0x24, 0xcd, 0x2d, 0x5c, 0x6d, 0x98, 0xc1, 0x7e, 0xb8, 0x57, 0xaa, 0xb9, 0xf6, 0x4a, 0xc3, 0x6d, + 0xb8, 0x2b, 0xdc, 0xea, 0x5e, 0x58, 0xe7, 0xbf, 0xf8, 0x0f, 0xfe, 0x97, 0x40, 0x5b, 0x78, 0x3a, + 0x76, 0xde, 0xc6, 0xb5, 0x7d, 0xd3, 0x21, 0xfe, 0x71, 0xec, 0xb1, 0x4d, 0x02, 0xbc, 0xd2, 0xec, + 0xf2, 0x71, 0x61, 0xa5, 0x9f, 0x96, 0x1f, 0x3a, 0x81, 0x69, 0x93, 0x2e, 0x85, 0x2f, 0xdd, 0x4b, + 0x81, 0xd6, 0xf6, 0x89, 0x8d, 0xd3, 0x7a, 0xc5, 0x13, 0x0d, 0xcc, 0xae, 0xb9, 0x4e, 0x93, 0xf8, + 0x6c, 0x95, 0x88, 0xdc, 0x0e, 0x09, 0x0d, 0x60, 0x19, 0x64, 0x43, 0xd3, 0xd0, 0xb5, 0x25, 0x6d, + 0x79, 0xbc, 0xfc, 0xe4, 0x47, 0xad, 0xc2, 0x99, 0x76, 0xab, 0x90, 0xbd, 0xb9, 0xb9, 0x7e, 0xd2, + 0x2a, 0x5c, 0xea, 0x87, 0x14, 0x1c, 0x7b, 0x84, 0x96, 0x6e, 0x6e, 0xae, 0x23, 0xa6, 0x0c, 0x5f, + 0x04, 0xb3, 0x06, 0xa1, 0xa6, 0x4f, 0x8c, 0xd5, 0x9d, 0xcd, 0x57, 0x84, 0x7d, 0x3d, 0xc3, 0x2d, + 0x5e, 0x90, 0x16, 0x67, 0xd7, 0xd3, 0x02, 0xa8, 0x5b, 0x07, 0xee, 0x82, 0x31, 0x77, 0xef, 0x16, + 0xa9, 0x05, 0x54, 0xcf, 0x2e, 0x65, 0x97, 0x27, 0xae, 0x5d, 0x2d, 0xc5, 0x3b, 0xa8, 0x5c, 0xe0, + 0xdb, 0x26, 0x17, 0x5b, 0x42, 0xf8, 0x70, 0x23, 0xda, 0xb9, 0xf2, 0xb4, 0x44, 0x1b, 0xab, 0x08, + 0x2b, 0x28, 0x32, 0x57, 0xfc, 0x6d, 0x06, 0xc0, 0xe4, 0xe2, 0xa9, 0xe7, 0x3a, 0x94, 0x0c, 0x64, + 0xf5, 0x14, 0xcc, 0xd4, 0xb8, 0xe5, 0x80, 0x18, 0x12, 0x57, 0xcf, 0x7c, 0x16, 0xef, 0x75, 0x89, + 0x3f, 0xb3, 0x96, 0x32, 0x87, 0xba, 0x00, 0xe0, 0x0d, 0x30, 0xea, 0x13, 0x1a, 0x5a, 0x81, 0x9e, + 0x5d, 0xd2, 0x96, 0x27, 0xae, 0x5d, 0xe9, 0x0b, 0xc5, 0xf3, 0x9b, 0x25, 0x5f, 0xa9, 0xf9, 0x54, + 0xa9, 0x1a, 0xe0, 0x20, 0xa4, 0xe5, 0xb3, 0x12, 0x69, 0x14, 0x71, 0x1b, 0x48, 0xda, 0x2a, 0xfe, + 0x28, 0x03, 0x66, 0x92, 0x51, 0x6a, 0x9a, 0xe4, 0x10, 0x1e, 0x82, 0x31, 0x5f, 0x24, 0x0b, 0x8f, + 0xd3, 0xc4, 0xb5, 0x9d, 0xd2, 0x7d, 0x1d, 0xab, 0x52, 0x57, 0x12, 0x96, 0x27, 0xd8, 0x9e, 0xc9, + 0x1f, 0x28, 0x42, 0x83, 0xef, 0x80, 0xbc, 0x2f, 0x37, 0x8a, 0x67, 0xd3, 0xc4, 0xb5, 0xaf, 0x0f, + 0x10, 0x59, 0x18, 0x2e, 0x4f, 0xb6, 0x5b, 0x85, 0x7c, 0xf4, 0x0b, 0x29, 0xc0, 0xe2, 0xfb, 0x19, + 0xb0, 0xb8, 0x16, 0xd2, 0xc0, 0xb5, 0x11, 0xa1, 0x6e, 0xe8, 0xd7, 0xc8, 0x9a, 0x6b, 0x85, 0xb6, + 0xb3, 0x4e, 0xea, 0xa6, 0x63, 0x06, 0x2c, 0x5b, 0x97, 0xc0, 0x88, 0x83, 0x6d, 0x22, 0xb3, 0x67, + 0x52, 0xc6, 0x74, 0x64, 0x1b, 0xdb, 0x04, 0x71, 0x0e, 0x93, 0x60, 0xc9, 0x22, 0xcf, 0x82, 0x92, + 0xb8, 0x71, 0xec, 0x11, 0xc4, 0x39, 0xf0, 0x32, 0x18, 0xad, 0xbb, 0xbe, 0x8d, 0xc5, 0x3e, 0x8e, + 0xc7, 0x3b, 0xf3, 0x02, 0xa7, 0x22, 0xc9, 0x85, 0xcf, 0x80, 0x09, 0x83, 0xd0, 0x9a, 0x6f, 0x7a, + 0x0c, 0x5a, 0x1f, 0xe1, 0xc2, 0xe7, 0xa4, 0xf0, 0xc4, 0x7a, 0xcc, 0x42, 0x49, 0x39, 0x78, 0x05, + 0xe4, 0x3d, 0xdf, 0x74, 0x7d, 0x33, 0x38, 0xd6, 0x73, 0x4b, 0xda, 0x72, 0xae, 0x3c, 0x23, 0x75, + 0xf2, 0x3b, 0x92, 0x8e, 0x94, 0x04, 0x5c, 0x02, 0xf9, 0x97, 0xaa, 0x95, 0xed, 0x1d, 0x1c, 0xec, + 0xeb, 0xa3, 0x1c, 0x61, 0x84, 0x49, 0xa3, 0xfc, 0x2d, 0x49, 0x2d, 0xfe, 0x3d, 0x03, 0xf4, 0x74, + 0x54, 0xa2, 0x90, 0xc2, 0x17, 0x40, 0x9e, 0x06, 0xac, 0xe2, 0x34, 0x8e, 0x65, 0x4c, 0x9e, 0x88, + 0xc0, 0xaa, 0x92, 0x7e, 0xd2, 0x2a, 0xcc, 0xc7, 0x1a, 0x11, 0x95, 0xc7, 0x43, 0xe9, 0xc2, 0x5f, + 0x6b, 0xe0, 0xdc, 0x21, 0xd9, 0xdb, 0x77, 0xdd, 0x83, 0x35, 0xcb, 0x24, 0x4e, 0xb0, 0xe6, 0x3a, + 0x75, 0xb3, 0x21, 0x73, 0x00, 0xdd, 0x67, 0x0e, 0xbc, 0xda, 0x6d, 0xb9, 0xfc, 0x50, 0xbb, 0x55, + 0x38, 0xd7, 0x83, 0x81, 0x7a, 0xf9, 0x01, 0x77, 0x81, 0x5e, 0x4b, 0x1d, 0x12, 0x59, 0xc0, 0x44, + 0xd9, 0x1a, 0x2f, 0x5f, 0x6c, 0xb7, 0x0a, 0xfa, 0x5a, 0x1f, 0x19, 0xd4, 0x57, 0xbb, 0xf8, 0x83, + 0x6c, 0x3a, 0xbc, 0x89, 0x74, 0x7b, 0x1b, 0xe4, 0xd9, 0x31, 0x36, 0x70, 0x80, 0xe5, 0x41, 0x7c, + 0xf2, 0x74, 0x87, 0x5e, 0xd4, 0x8c, 0x2d, 0x12, 0xe0, 0x32, 0x94, 0x1b, 0x02, 0x62, 0x1a, 0x52, + 0x56, 0xe1, 0xb7, 0xc1, 0x08, 0xf5, 0x48, 0x4d, 0x06, 0xfa, 0xb5, 0xfb, 0x3d, 0x6c, 0x7d, 0x16, + 0x52, 0xf5, 0x48, 0x2d, 0x3e, 0x0b, 0xec, 0x17, 0xe2, 0xb0, 0xf0, 0x5d, 0x0d, 0x8c, 0x52, 0x5e, + 0xa0, 0x64, 0x51, 0x7b, 0x63, 0x58, 0x1e, 0xa4, 0xaa, 0xa0, 0xf8, 0x8d, 0x24, 0x78, 0xf1, 0x5f, + 0x19, 0x70, 0xa9, 0x9f, 0xea, 0x9a, 0xeb, 0x18, 0x62, 0x3b, 0x36, 0xe5, 0xd9, 0x16, 0x99, 0xfe, + 0x4c, 0xf2, 0x6c, 0x9f, 0xb4, 0x0a, 0x8f, 0xdd, 0xd3, 0x40, 0xa2, 0x08, 0x7c, 0x59, 0xad, 0x5b, + 0x14, 0x8a, 0x4b, 0x9d, 0x8e, 0x9d, 0xb4, 0x0a, 0xd3, 0x4a, 0xad, 0xd3, 0x57, 0xd8, 0x04, 0xd0, + 0xc2, 0x34, 0xb8, 0xe1, 0x63, 0x87, 0x0a, 0xb3, 0xa6, 0x4d, 0x64, 0xf8, 0x9e, 0x38, 0x5d, 0x7a, + 0x30, 0x8d, 0xf2, 0x82, 0x84, 0x84, 0xd7, 0xbb, 0xac, 0xa1, 0x1e, 0x08, 0xac, 0x6e, 0xf9, 0x04, + 0x53, 0x55, 0x8a, 0x12, 0x37, 0x0a, 0xa3, 0x22, 0xc9, 0x85, 0x8f, 0x83, 0x31, 0x9b, 0x50, 0x8a, + 0x1b, 0x84, 0xd7, 0x9f, 0xf1, 0xf8, 0x8a, 0xde, 0x12, 0x64, 0x14, 0xf1, 0x59, 0x7f, 0x72, 0xb1, + 0x5f, 0xd4, 0xae, 0x9b, 0x34, 0x80, 0xaf, 0x77, 0x1d, 0x80, 0xd2, 0xe9, 0x56, 0xc8, 0xb4, 0x79, + 0xfa, 0xab, 0xe2, 0x17, 0x51, 0x12, 0xc9, 0xff, 0x2d, 0x90, 0x33, 0x03, 0x62, 0x47, 0x77, 0xf7, + 0xab, 0x43, 0xca, 0xbd, 0xf2, 0x94, 0xf4, 0x21, 0xb7, 0xc9, 0xd0, 0x90, 0x00, 0x2d, 0xfe, 0x2e, + 0x03, 0x1e, 0xe9, 0xa7, 0xc2, 0x2e, 0x14, 0xca, 0x22, 0xee, 0x59, 0xa1, 0x8f, 0x2d, 0x99, 0x71, + 0x2a, 0xe2, 0x3b, 0x9c, 0x8a, 0x24, 0x97, 0x95, 0x7c, 0x6a, 0x3a, 0x8d, 0xd0, 0xc2, 0xbe, 0x4c, + 0x27, 0xb5, 0xea, 0xaa, 0xa4, 0x23, 0x25, 0x01, 0x4b, 0x00, 0xd0, 0x7d, 0xd7, 0x0f, 0x38, 0x86, + 0xac, 0x5e, 0x67, 0x59, 0x81, 0xa8, 0x2a, 0x2a, 0x4a, 0x48, 0xb0, 0x1b, 0xed, 0xc0, 0x74, 0x0c, + 0xb9, 0xeb, 0xea, 0x14, 0xbf, 0x6c, 0x3a, 0x06, 0xe2, 0x1c, 0x86, 0x6f, 0x99, 0x34, 0x60, 0x14, + 0xb9, 0xe5, 0x1d, 0x51, 0xe7, 0x92, 0x4a, 0x82, 0xe1, 0xd7, 0x58, 0xd5, 0x77, 0x7d, 0x93, 0x50, + 0x7d, 0x34, 0xc6, 0x5f, 0x53, 0x54, 0x94, 0x90, 0x28, 0xfe, 0x33, 0xdf, 0x3f, 0x49, 0x58, 0x29, + 0x81, 0x8f, 0x82, 0x5c, 0xc3, 0x77, 0x43, 0x4f, 0x46, 0x49, 0x45, 0xfb, 0x45, 0x46, 0x44, 0x82, + 0xc7, 0xb2, 0xb2, 0xd9, 0xd1, 0xa6, 0xaa, 0xac, 0x8c, 0x9a, 0xd3, 0x88, 0x0f, 0xbf, 0xa7, 0x81, + 0x9c, 0x23, 0x83, 0xc3, 0x52, 0xee, 0xf5, 0x21, 0xe5, 0x05, 0x0f, 0x6f, 0xec, 0xae, 0x88, 0xbc, + 0x40, 0x86, 0x4f, 0x83, 0x1c, 0xad, 0xb9, 0x1e, 0x91, 0x51, 0x5f, 0x8c, 0x84, 0xaa, 0x8c, 0x78, + 0xd2, 0x2a, 0x4c, 0x45, 0xe6, 0x38, 0x01, 0x09, 0x61, 0xf8, 0x43, 0x0d, 0x80, 0x26, 0xb6, 0x4c, + 0x03, 0xf3, 0x96, 0x21, 0xc7, 0xdd, 0x1f, 0x6c, 0x5a, 0xbf, 0xa2, 0xcc, 0x8b, 0x4d, 0x8b, 0x7f, + 0xa3, 0x04, 0x34, 0x7c, 0x4f, 0x03, 0x93, 0x34, 0xdc, 0xf3, 0xa5, 0x16, 0xe5, 0xcd, 0xc5, 0xc4, + 0xb5, 0x6f, 0x0c, 0xd4, 0x97, 0x6a, 0x02, 0xa0, 0x3c, 0xd3, 0x6e, 0x15, 0x26, 0x93, 0x14, 0xd4, + 0xe1, 0x00, 0xfc, 0x89, 0x06, 0xf2, 0xcd, 0xe8, 0xce, 0x1e, 0xe3, 0x07, 0xfe, 0xcd, 0x21, 0x6d, + 0xac, 0xcc, 0xa8, 0xf8, 0x14, 0xa8, 0x3e, 0x40, 0x79, 0x00, 0xff, 0xa2, 0x01, 0x1d, 0x1b, 0xa2, + 0xc0, 0x63, 0x6b, 0xc7, 0x37, 0x9d, 0x80, 0xf8, 0xa2, 0xdf, 0xa4, 0x7a, 0x9e, 0xbb, 0x37, 0xd8, + 0xbb, 0x30, 0xdd, 0xcb, 0x96, 0x97, 0xa4, 0x77, 0xfa, 0x6a, 0x1f, 0x37, 0x50, 0x5f, 0x07, 0x79, + 0xa2, 0xc5, 0x2d, 0x8d, 0x3e, 0x3e, 0x84, 0x44, 0x8b, 0x7b, 0x29, 0x59, 0x1d, 0xe2, 0x0e, 0x2a, + 0x01, 0x0d, 0x2b, 0x60, 0xce, 0xf3, 0x09, 0x07, 0xb8, 0xe9, 0x1c, 0x38, 0xee, 0xa1, 0xf3, 0x82, + 0x49, 0x2c, 0x83, 0xea, 0x60, 0x49, 0x5b, 0xce, 0x97, 0x2f, 0xb4, 0x5b, 0x85, 0xb9, 0x9d, 0x5e, + 0x02, 0xa8, 0xb7, 0x5e, 0xf1, 0xbd, 0x6c, 0xfa, 0x15, 0x90, 0xee, 0x22, 0xe0, 0x07, 0x62, 0xf5, + 0x22, 0x36, 0x54, 0xd7, 0xf8, 0x6e, 0xbd, 0x3d, 0xa4, 0x64, 0x52, 0x6d, 0x40, 0xdc, 0xc9, 0x29, + 0x12, 0x45, 0x09, 0x3f, 0xe0, 0x2f, 0x35, 0x30, 0x85, 0x6b, 0x35, 0xe2, 0x05, 0xc4, 0x10, 0xc5, + 0x3d, 0xf3, 0x39, 0xd4, 0xaf, 0x39, 0xe9, 0xd5, 0xd4, 0x6a, 0x12, 0x1a, 0x75, 0x7a, 0x02, 0x9f, + 0x07, 0x67, 0x69, 0xe0, 0xfa, 0xc4, 0x48, 0xb5, 0xcd, 0xb0, 0xdd, 0x2a, 0x9c, 0xad, 0x76, 0x70, + 0x50, 0x4a, 0xb2, 0xf8, 0xe9, 0x08, 0x28, 0xdc, 0xe3, 0xa8, 0x9d, 0xe2, 0x61, 0x76, 0x19, 0x8c, + 0xf2, 0xe5, 0x1a, 0x3c, 0x2a, 0xf9, 0x44, 0x2b, 0xc8, 0xa9, 0x48, 0x72, 0xd9, 0x45, 0xc1, 0xf0, + 0x59, 0xfb, 0x92, 0xe5, 0x82, 0xea, 0xa2, 0xa8, 0x0a, 0x32, 0x8a, 0xf8, 0xf0, 0x1d, 0x30, 0x2a, + 0x06, 0x2f, 0xbc, 0x4a, 0x0f, 0xb1, 0xd2, 0x02, 0xee, 0x27, 0x87, 0x42, 0x12, 0xb2, 0xbb, 0xc2, + 0xe6, 0x1e, 0x74, 0x85, 0xbd, 0x6b, 0x49, 0x1b, 0xfd, 0x1f, 0x2f, 0x69, 0xc5, 0x7f, 0x6b, 0xe9, + 0x73, 0x9f, 0x58, 0x6a, 0xb5, 0x86, 0x2d, 0x02, 0xd7, 0xc1, 0x0c, 0x7b, 0xb5, 0x20, 0xe2, 0x59, + 0x66, 0x0d, 0x53, 0xfe, 0x68, 0x16, 0x09, 0xa7, 0xe6, 0x38, 0xd5, 0x14, 0x1f, 0x75, 0x69, 0xc0, + 0x97, 0x00, 0x14, 0x9d, 0x7c, 0x87, 0x1d, 0xd1, 0x94, 0xa8, 0x9e, 0xbc, 0xda, 0x25, 0x81, 0x7a, + 0x68, 0xc1, 0x35, 0x30, 0x6b, 0xe1, 0x3d, 0x62, 0x55, 0x89, 0x45, 0x6a, 0x81, 0xeb, 0x73, 0x53, + 0x62, 0xac, 0x30, 0xd7, 0x6e, 0x15, 0x66, 0xaf, 0xa7, 0x99, 0xa8, 0x5b, 0xbe, 0x78, 0x29, 0x7d, + 0xbc, 0x92, 0x0b, 0x17, 0xef, 0xa3, 0x0f, 0x33, 0x60, 0xa1, 0x7f, 0x66, 0xc0, 0xef, 0xc7, 0xcf, + 0x38, 0xd1, 0xa5, 0xbf, 0x39, 0xac, 0x2c, 0x94, 0xef, 0x38, 0xd0, 0xfd, 0x86, 0x83, 0xdf, 0x61, + 0x2d, 0x13, 0xb6, 0xa2, 0xc1, 0xd1, 0x1b, 0x43, 0x73, 0x81, 0x81, 0x94, 0xc7, 0x45, 0x37, 0x86, + 0x2d, 0xde, 0x7c, 0x61, 0x8b, 0x14, 0x7f, 0xaf, 0xa5, 0x5f, 0xf2, 0xf1, 0x09, 0x86, 0x3f, 0xd5, + 0xc0, 0xb4, 0xeb, 0x11, 0x67, 0x75, 0x67, 0xf3, 0x95, 0x2f, 0x8a, 0x93, 0x2c, 0x43, 0xb5, 0x7d, + 0x9f, 0x7e, 0xbe, 0x54, 0xad, 0x6c, 0x0b, 0x83, 0x3b, 0xbe, 0xeb, 0xd1, 0xf2, 0xb9, 0x76, 0xab, + 0x30, 0x5d, 0xe9, 0x84, 0x42, 0x69, 0xec, 0xa2, 0x0d, 0xe6, 0x36, 0x8e, 0x02, 0xe2, 0x3b, 0xd8, + 0x5a, 0x77, 0x6b, 0xa1, 0x4d, 0x9c, 0x40, 0x38, 0x9a, 0x9a, 0x3a, 0x69, 0xa7, 0x9c, 0x3a, 0x3d, + 0x02, 0xb2, 0xa1, 0x6f, 0xc9, 0x2c, 0x9e, 0x50, 0x53, 0x55, 0x74, 0x1d, 0x31, 0x7a, 0xf1, 0x12, + 0x18, 0x61, 0x7e, 0xc2, 0x0b, 0x20, 0xeb, 0xe3, 0x43, 0x6e, 0x75, 0xb2, 0x3c, 0xc6, 0x44, 0x10, + 0x3e, 0x44, 0x8c, 0x56, 0xfc, 0x4f, 0x01, 0x4c, 0xa7, 0xd6, 0x02, 0x17, 0x40, 0x46, 0x8d, 0x6a, + 0x81, 0x34, 0x9a, 0xd9, 0x5c, 0x47, 0x19, 0xd3, 0x80, 0xcf, 0xaa, 0xe2, 0x2b, 0x40, 0x0b, 0xaa, + 0x9e, 0x73, 0x2a, 0xeb, 0x91, 0x63, 0x73, 0xcc, 0x91, 0xa8, 0x70, 0x32, 0x1f, 0x48, 0x5d, 0x9e, + 0x12, 0xe1, 0x03, 0xa9, 0x23, 0x46, 0xfb, 0xac, 0x23, 0xb7, 0x68, 0xe6, 0x97, 0x3b, 0xc5, 0xcc, + 0x6f, 0xf4, 0xae, 0x33, 0xbf, 0x47, 0x41, 0x2e, 0x30, 0x03, 0x8b, 0xe8, 0x63, 0x9d, 0x4f, 0x99, + 0x1b, 0x8c, 0x88, 0x04, 0x0f, 0xde, 0x02, 0x63, 0x06, 0xa9, 0xe3, 0xd0, 0x0a, 0xf4, 0x3c, 0x4f, + 0xa1, 0xb5, 0x01, 0xa4, 0x90, 0x18, 0xc8, 0xae, 0x0b, 0xbb, 0x28, 0x02, 0x80, 0x8f, 0x81, 0x31, + 0x1b, 0x1f, 0x99, 0x76, 0x68, 0xf3, 0x26, 0x4f, 0x13, 0x62, 0x5b, 0x82, 0x84, 0x22, 0x1e, 0xab, + 0x8c, 0xe4, 0xa8, 0x66, 0x85, 0xd4, 0x6c, 0x12, 0xc9, 0x94, 0x0d, 0x98, 0xaa, 0x8c, 0x1b, 0x29, + 0x3e, 0xea, 0xd2, 0xe0, 0x60, 0xa6, 0xc3, 0x95, 0x27, 0x12, 0x60, 0x82, 0x84, 0x22, 0x5e, 0x27, + 0x98, 0x94, 0x9f, 0xec, 0x07, 0x26, 0x95, 0xbb, 0x34, 0xe0, 0x17, 0xc0, 0xb8, 0x8d, 0x8f, 0xae, + 0x13, 0xa7, 0x11, 0xec, 0xeb, 0x53, 0x4b, 0xda, 0x72, 0xb6, 0x3c, 0xd5, 0x6e, 0x15, 0xc6, 0xb7, + 0x22, 0x22, 0x8a, 0xf9, 0x5c, 0xd8, 0x74, 0xa4, 0xf0, 0xd9, 0x84, 0x70, 0x44, 0x44, 0x31, 0x9f, + 0x75, 0x10, 0x1e, 0x0e, 0xd8, 0xe1, 0xd2, 0xa7, 0x3b, 0x9f, 0x9a, 0x3b, 0x82, 0x8c, 0x22, 0x3e, + 0x5c, 0x06, 0x79, 0x1b, 0x1f, 0xf1, 0xb1, 0x80, 0x3e, 0xc3, 0xcd, 0xf2, 0xe1, 0xf4, 0x96, 0xa4, + 0x21, 0xc5, 0xe5, 0x92, 0xa6, 0x23, 0x24, 0x67, 0x13, 0x92, 0x92, 0x86, 0x14, 0x97, 0x25, 0x71, + 0xe8, 0x98, 0xb7, 0x43, 0x22, 0x84, 0x21, 0x8f, 0x8c, 0x4a, 0xe2, 0x9b, 0x31, 0x0b, 0x25, 0xe5, + 0xd8, 0xb3, 0xdc, 0x0e, 0xad, 0xc0, 0xf4, 0x2c, 0x52, 0xa9, 0xeb, 0xe7, 0x78, 0xfc, 0x79, 0xe3, + 0xbd, 0xa5, 0xa8, 0x28, 0x21, 0x01, 0x09, 0x18, 0x21, 0x4e, 0x68, 0xeb, 0xe7, 0xf9, 0xc5, 0x3e, + 0x90, 0x14, 0x54, 0x27, 0x67, 0xc3, 0x09, 0x6d, 0xc4, 0xcd, 0xc3, 0x67, 0xc1, 0x94, 0x8d, 0x8f, + 0x58, 0x39, 0x20, 0x7e, 0x60, 0x12, 0xaa, 0xcf, 0xf1, 0xc5, 0xcf, 0xb2, 0x8e, 0x73, 0x2b, 0xc9, + 0x40, 0x9d, 0x72, 0x5c, 0xd1, 0x74, 0x12, 0x8a, 0xf3, 0x09, 0xc5, 0x24, 0x03, 0x75, 0xca, 0xb1, + 0x48, 0xfb, 0xe4, 0x76, 0x68, 0xfa, 0xc4, 0xd0, 0x1f, 0xe2, 0x4d, 0xaa, 0xfc, 0x60, 0x20, 0x68, + 0x48, 0x71, 0x61, 0x33, 0x9a, 0x1f, 0xe9, 0xfc, 0x18, 0xde, 0x1c, 0x6c, 0x25, 0xaf, 0xf8, 0xab, + 0xbe, 0x8f, 0x8f, 0xc5, 0x4d, 0x93, 0x9c, 0x1c, 0x41, 0x0a, 0x72, 0xd8, 0xb2, 0x2a, 0x75, 0xfd, + 0x02, 0x8f, 0xfd, 0xa0, 0x6f, 0x10, 0x55, 0x75, 0x56, 0x19, 0x08, 0x12, 0x58, 0x0c, 0xd4, 0x75, + 0x58, 0x6a, 0x2c, 0x0c, 0x17, 0xb4, 0xc2, 0x40, 0x90, 0xc0, 0xe2, 0x2b, 0x75, 0x8e, 0x2b, 0x75, + 0xfd, 0xe1, 0x21, 0xaf, 0x94, 0x81, 0x20, 0x81, 0x05, 0x4d, 0x90, 0x75, 0xdc, 0x40, 0xbf, 0x38, + 0x94, 0xeb, 0x99, 0x5f, 0x38, 0xdb, 0x6e, 0x80, 0x18, 0x06, 0xfc, 0x85, 0x06, 0x80, 0x17, 0xa7, + 0xe8, 0x23, 0x03, 0x19, 0x4b, 0xa4, 0x20, 0x4b, 0x71, 0x6e, 0x6f, 0x38, 0x81, 0x7f, 0x1c, 0xbf, + 0x23, 0x13, 0x67, 0x20, 0xe1, 0x05, 0xfc, 0x8d, 0x06, 0xce, 0x27, 0xdb, 0x64, 0xe5, 0xde, 0x22, + 0x8f, 0xc8, 0x8d, 0x41, 0xa7, 0x79, 0xd9, 0x75, 0xad, 0xb2, 0xde, 0x6e, 0x15, 0xce, 0xaf, 0xf6, + 0x40, 0x45, 0x3d, 0x7d, 0x81, 0x7f, 0xd0, 0xc0, 0xac, 0xac, 0xa2, 0x09, 0x0f, 0x0b, 0x3c, 0x80, + 0x64, 0xd0, 0x01, 0x4c, 0xe3, 0x88, 0x38, 0xaa, 0x0f, 0xdd, 0x5d, 0x7c, 0xd4, 0xed, 0x1a, 0xfc, + 0xb3, 0x06, 0x26, 0x0d, 0xe2, 0x11, 0xc7, 0x20, 0x4e, 0x8d, 0xf9, 0xba, 0x34, 0x90, 0xb1, 0x41, + 0xda, 0xd7, 0xf5, 0x04, 0x84, 0x70, 0xb3, 0x24, 0xdd, 0x9c, 0x4c, 0xb2, 0x4e, 0x5a, 0x85, 0xf9, + 0x58, 0x35, 0xc9, 0x41, 0x1d, 0x5e, 0xc2, 0xf7, 0x35, 0x30, 0x1d, 0x6f, 0x80, 0xb8, 0x52, 0x2e, + 0x0d, 0x31, 0x0f, 0x78, 0xfb, 0xba, 0xda, 0x09, 0x88, 0xd2, 0x1e, 0xc0, 0x3f, 0x6a, 0xac, 0x53, + 0x8b, 0xde, 0x7d, 0x54, 0x2f, 0xf2, 0x58, 0xbe, 0x35, 0xf0, 0x58, 0x2a, 0x04, 0x11, 0xca, 0x2b, + 0x71, 0x2b, 0xa8, 0x38, 0x27, 0xad, 0xc2, 0x5c, 0x32, 0x92, 0x8a, 0x81, 0x92, 0x1e, 0xc2, 0x1f, + 0x6b, 0x60, 0x92, 0xc4, 0x1d, 0x37, 0xd5, 0x1f, 0x1d, 0x48, 0x10, 0x7b, 0x36, 0xf1, 0xe2, 0xa5, + 0x9e, 0x60, 0x51, 0xd4, 0x81, 0xcd, 0x3a, 0x48, 0x72, 0x84, 0x6d, 0xcf, 0x22, 0xfa, 0xff, 0x0d, + 0xb8, 0x83, 0xdc, 0x10, 0x76, 0x51, 0x04, 0x00, 0xaf, 0x80, 0xbc, 0x13, 0x5a, 0x16, 0xde, 0xb3, + 0x88, 0xfe, 0x18, 0xef, 0x45, 0xd4, 0x58, 0x74, 0x5b, 0xd2, 0x91, 0x92, 0x80, 0x75, 0xb0, 0x74, + 0xf4, 0xb2, 0xfa, 0x17, 0xa1, 0x9e, 0x83, 0x3b, 0xfd, 0x32, 0xb7, 0xb2, 0xd0, 0x6e, 0x15, 0xe6, + 0x77, 0x7b, 0x8f, 0xf6, 0xee, 0x69, 0x03, 0xbe, 0x06, 0x1e, 0x4e, 0xc8, 0x6c, 0xd8, 0x7b, 0xc4, + 0x30, 0x88, 0x11, 0x3d, 0xdc, 0xf4, 0xff, 0x17, 0xc3, 0xc3, 0xe8, 0x80, 0xef, 0xa6, 0x05, 0xd0, + 0xdd, 0xb4, 0xe1, 0x75, 0x30, 0x9f, 0x60, 0x6f, 0x3a, 0x41, 0xc5, 0xaf, 0x06, 0xbe, 0xe9, 0x34, + 0xf4, 0x65, 0x6e, 0xf7, 0x7c, 0x74, 0x22, 0x77, 0x13, 0x3c, 0xd4, 0x47, 0x07, 0x7e, 0xad, 0xc3, + 0x1a, 0xff, 0x8c, 0x85, 0xbd, 0x97, 0xc9, 0x31, 0xd5, 0x1f, 0xe7, 0xdd, 0x09, 0xdf, 0xec, 0xdd, + 0x04, 0x1d, 0xf5, 0x91, 0x87, 0x5f, 0x05, 0xe7, 0x52, 0x1c, 0xf6, 0x44, 0xd1, 0x9f, 0x10, 0x6f, + 0x0d, 0xd6, 0xcf, 0xee, 0x46, 0x44, 0xd4, 0x4b, 0x72, 0x81, 0xbd, 0x62, 0x53, 0x55, 0x10, 0xce, + 0x80, 0xec, 0x01, 0x91, 0x5f, 0xff, 0x11, 0xfb, 0x13, 0x1a, 0x20, 0xd7, 0xc4, 0x56, 0x18, 0x3d, + 0xc4, 0x07, 0x7c, 0x83, 0x22, 0x61, 0xfc, 0xf9, 0xcc, 0x73, 0xda, 0xc2, 0x07, 0x1a, 0x98, 0xef, + 0x5d, 0x9c, 0x1f, 0xa8, 0x5b, 0xbf, 0xd2, 0xc0, 0x6c, 0x57, 0x1d, 0xee, 0xe1, 0xd1, 0xed, 0x4e, + 0x8f, 0x5e, 0x1b, 0x74, 0x41, 0x15, 0x09, 0xc4, 0xbb, 0xc8, 0xa4, 0x7b, 0x3f, 0xd3, 0xc0, 0x4c, + 0xba, 0xb4, 0x3d, 0xc8, 0x78, 0x15, 0x3f, 0xc8, 0x80, 0xf9, 0xde, 0xcd, 0x2f, 0xf4, 0xd5, 0x2b, + 0x7f, 0x38, 0xd3, 0x92, 0x5e, 0x93, 0xd5, 0x77, 0x35, 0x30, 0x71, 0x4b, 0xc9, 0x45, 0x5f, 0x87, + 0x07, 0x3e, 0xa7, 0x89, 0xee, 0x92, 0x98, 0x41, 0x51, 0x12, 0xb7, 0xf8, 0x27, 0x0d, 0xcc, 0xf5, + 0xbc, 0x24, 0xe1, 0x65, 0x30, 0x8a, 0x2d, 0xcb, 0x3d, 0x14, 0xe3, 0xb6, 0xc4, 0x2c, 0x7b, 0x95, + 0x53, 0x91, 0xe4, 0x26, 0xa2, 0x97, 0xf9, 0xbc, 0xa2, 0x57, 0xfc, 0xab, 0x06, 0x2e, 0xde, 0x2d, + 0x13, 0x1f, 0xc8, 0x96, 0x2e, 0x83, 0xbc, 0x6c, 0x70, 0x8f, 0xf9, 0x76, 0xca, 0x37, 0x9d, 0x2c, + 0x1a, 0xfc, 0x1f, 0xa2, 0xc4, 0x5f, 0xc5, 0x0f, 0x35, 0x30, 0x53, 0x25, 0x7e, 0xd3, 0xac, 0x11, + 0x44, 0xea, 0xc4, 0x27, 0x4e, 0x8d, 0xc0, 0x15, 0x30, 0xce, 0x3f, 0xcb, 0x7a, 0xb8, 0x16, 0x7d, + 0x62, 0x98, 0x95, 0x21, 0x1f, 0xdf, 0x8e, 0x18, 0x28, 0x96, 0x51, 0x9f, 0x23, 0x32, 0x7d, 0x3f, + 0x47, 0x5c, 0x04, 0x23, 0x5e, 0x3c, 0xac, 0xcd, 0x33, 0x2e, 0x9f, 0xcf, 0x72, 0x2a, 0xe7, 0xba, + 0x7e, 0xc0, 0x27, 0x50, 0x39, 0xc9, 0x75, 0xfd, 0x00, 0x71, 0x6a, 0xf1, 0x6f, 0x1a, 0xe8, 0xf5, + 0xaf, 0x4b, 0xf0, 0x82, 0x18, 0xc2, 0x25, 0x26, 0x5b, 0xd1, 0x00, 0x0e, 0x36, 0xc1, 0x18, 0x15, + 0xab, 0x92, 0x51, 0xaf, 0xdc, 0x67, 0xd4, 0xd3, 0x31, 0x12, 0xb7, 0x7f, 0x44, 0x8d, 0xc0, 0x58, + 0xe0, 0x6b, 0xb8, 0x1c, 0x3a, 0x86, 0x9c, 0xcb, 0x4e, 0x8a, 0xc0, 0xaf, 0xad, 0x0a, 0x1a, 0x52, + 0xdc, 0xf2, 0xd5, 0x8f, 0xee, 0x2c, 0x9e, 0xf9, 0xf8, 0xce, 0xe2, 0x99, 0x4f, 0xee, 0x2c, 0x9e, + 0xf9, 0x6e, 0x7b, 0x51, 0xfb, 0xa8, 0xbd, 0xa8, 0x7d, 0xdc, 0x5e, 0xd4, 0x3e, 0x69, 0x2f, 0x6a, + 0xff, 0x68, 0x2f, 0x6a, 0x3f, 0xff, 0x74, 0xf1, 0xcc, 0x37, 0xc7, 0x24, 0xfe, 0x7f, 0x03, 0x00, + 0x00, 0xff, 0xff, 0x80, 0x3e, 0x52, 0x72, 0x50, 0x2c, 0x00, 0x00, } func (m *ConversionRequest) Marshal() (dAtA []byte, err error) { @@ -1889,6 +1892,26 @@ func (m *JSONSchemaProps) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.XListType != nil { + i -= len(*m.XListType) + copy(dAtA[i:], *m.XListType) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.XListType))) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xd2 + } + if len(m.XListMapKeys) > 0 { + for iNdEx := len(m.XListMapKeys) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.XListMapKeys[iNdEx]) + copy(dAtA[i:], m.XListMapKeys[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.XListMapKeys[iNdEx]))) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xca + } + } i-- if m.XIntOrString { dAtA[i] = 1 @@ -3102,6 +3125,16 @@ func (m *JSONSchemaProps) Size() (n int) { } n += 3 n += 3 + if len(m.XListMapKeys) > 0 { + for _, s := range m.XListMapKeys { + l = len(s) + n += 2 + l + sovGenerated(uint64(l)) + } + } + if m.XListType != nil { + l = len(*m.XListType) + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -3567,6 +3600,8 @@ func (this *JSONSchemaProps) String() string { `XPreserveUnknownFields:` + valueToStringGenerated(this.XPreserveUnknownFields) + `,`, `XEmbeddedResource:` + fmt.Sprintf("%v", this.XEmbeddedResource) + `,`, `XIntOrString:` + fmt.Sprintf("%v", this.XIntOrString) + `,`, + `XListMapKeys:` + fmt.Sprintf("%v", this.XListMapKeys) + `,`, + `XListType:` + valueToStringGenerated(this.XListType) + `,`, `}`, }, "") return s @@ -8088,6 +8123,71 @@ func (m *JSONSchemaProps) Unmarshal(dAtA []byte) error { } } m.XIntOrString = bool(v != 0) + case 41: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field XListMapKeys", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.XListMapKeys = append(m.XListMapKeys, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 42: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field XListType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.XListType = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto index ba7b67a0c09..5b96fbdf06f 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto @@ -491,6 +491,33 @@ message JSONSchemaProps { // - type: string // - ... zero or more optional bool xKubernetesIntOrString = 40; + + // x-kubernetes-list-map-keys annotates an array with the x-kubernetes-list-type `map` by specifying the keys used + // as the index of the map. + // + // This tag MUST only be used on lists that have the "x-kubernetes-list-type" + // extension set to "map". Also, the values specified for this attribute must + // be a scalar typed field of the child structure (no nesting is supported). + // + // +optional + repeated string xKubernetesListMapKeys = 41; + + // x-kubernetes-list-type annotates an array to further describe its topology. + // This extension must only be used on lists and may have 3 possible values: + // + // 1) `atomic`: the list is treated as a single entity, like a scalar. + // Atomic lists will be entirely replaced when updated. This extension + // may be used on any type of list (struct, scalar, ...). + // 2) `set`: + // Sets are lists that must not have multiple items with the same value. Each + // value must be a scalar (or another atomic type). + // 3) `map`: + // These lists are like maps in that their elements have a non-index key + // used to identify them. Order is preserved upon merge. The map tag + // must only be used on a list with elements of type object. + // Defaults to atomic for arrays. + // +optional + optional string xKubernetesListType = 42; } // JSONSchemaPropsOrArray represents a value that can either be a JSONSchemaProps diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go index 90be856c7f9..64073df08f5 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go @@ -943,6 +943,8 @@ func autoConvert_v1beta1_JSONSchemaProps_To_apiextensions_JSONSchemaProps(in *JS out.XPreserveUnknownFields = (*bool)(unsafe.Pointer(in.XPreserveUnknownFields)) out.XEmbeddedResource = in.XEmbeddedResource out.XIntOrString = in.XIntOrString + out.XListMapKeys = *(*[]string)(unsafe.Pointer(&in.XListMapKeys)) + out.XListType = (*string)(unsafe.Pointer(in.XListType)) return nil } @@ -1128,6 +1130,8 @@ func autoConvert_apiextensions_JSONSchemaProps_To_v1beta1_JSONSchemaProps(in *ap out.XPreserveUnknownFields = (*bool)(unsafe.Pointer(in.XPreserveUnknownFields)) out.XEmbeddedResource = in.XEmbeddedResource out.XIntOrString = in.XIntOrString + out.XListMapKeys = *(*[]string)(unsafe.Pointer(&in.XListMapKeys)) + out.XListType = (*string)(unsafe.Pointer(in.XListType)) return nil } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go index e1807243f01..7be1e1eeb3d 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go @@ -38,6 +38,19 @@ func RegisterDefaults(scheme *runtime.Scheme) error { func SetObjectDefaults_CustomResourceDefinition(in *CustomResourceDefinition) { SetDefaults_CustomResourceDefinition(in) SetDefaults_CustomResourceDefinitionSpec(&in.Spec) + if in.Spec.Validation != nil { + if in.Spec.Validation.OpenAPIV3Schema != nil { + SetDefaults_JSONSchemaProps(in.Spec.Validation.OpenAPIV3Schema) + } + } + for i := range in.Spec.Versions { + a := &in.Spec.Versions[i] + if a.Schema != nil { + if a.Schema.OpenAPIV3Schema != nil { + SetDefaults_JSONSchemaProps(a.Schema.OpenAPIV3Schema) + } + } + } if in.Spec.Conversion != nil { if in.Spec.Conversion.WebhookClientConfig != nil { if in.Spec.Conversion.WebhookClientConfig.Service != nil { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD index a419ee7182c..b44cca51f05 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD @@ -40,6 +40,7 @@ go_library( "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/nonstructuralschema:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi:go_default_library", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/crdserverscheme:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", @@ -81,6 +82,7 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/openapi:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", "//staging/src/k8s.io/client-go/scale:go_default_library", "//staging/src/k8s.io/client-go/scale/scheme/autoscalingv1:go_default_library", @@ -90,6 +92,7 @@ go_library( "//vendor/github.com/go-openapi/strfmt:go_default_library", "//vendor/github.com/go-openapi/validate:go_default_library", "//vendor/k8s.io/klog:go_default_library", + "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", ], ) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/BUILD index 6cfacb38340..32d6d981f49 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/BUILD @@ -56,7 +56,6 @@ go_test( "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", ], ) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/zz_generated.deepcopy.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/zz_generated.deepcopy.go index 01b566c8789..67590db9260 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/zz_generated.deepcopy.go @@ -23,6 +23,16 @@ package schema // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Extensions) DeepCopyInto(out *Extensions) { *out = *in + if in.XListMapKeys != nil { + in, out := &in.XListMapKeys, &out.XListMapKeys + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.XListType != nil { + in, out := &in.XListType, &out.XListType + *out = new(string) + **out = **in + } return } @@ -75,7 +85,7 @@ func (in *NestedValueValidation) DeepCopyInto(out *NestedValueValidation) { } } in.ForbiddenGenerics.DeepCopyInto(&out.ForbiddenGenerics) - out.ForbiddenExtensions = in.ForbiddenExtensions + in.ForbiddenExtensions.DeepCopyInto(&out.ForbiddenExtensions) return } @@ -105,7 +115,7 @@ func (in *Structural) DeepCopyInto(out *Structural) { } } in.Generic.DeepCopyInto(&out.Generic) - out.Extensions = in.Extensions + in.Extensions.DeepCopyInto(&out.Extensions) if in.ValueValidation != nil { in, out := &in.ValueValidation, &out.ValueValidation *out = new(ValueValidation) diff --git a/staging/src/k8s.io/apimachinery/go.mod b/staging/src/k8s.io/apimachinery/go.mod index 255db7fc3ae..cf76e6ee166 100644 --- a/staging/src/k8s.io/apimachinery/go.mod +++ b/staging/src/k8s.io/apimachinery/go.mod @@ -32,7 +32,7 @@ require ( gopkg.in/inf.v0 v0.9.0 gopkg.in/yaml.v2 v2.2.2 k8s.io/klog v0.4.0 - k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 + k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf sigs.k8s.io/yaml v1.1.0 ) diff --git a/staging/src/k8s.io/apimachinery/go.sum b/staging/src/k8s.io/apimachinery/go.sum index f5aa8adb473..e21152cae48 100644 --- a/staging/src/k8s.io/apimachinery/go.sum +++ b/staging/src/k8s.io/apimachinery/go.sum @@ -36,7 +36,6 @@ github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= @@ -113,8 +112,8 @@ k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/staging/src/k8s.io/apiserver/go.mod b/staging/src/k8s.io/apiserver/go.mod index 6b823329ba3..4b955290c8b 100644 --- a/staging/src/k8s.io/apiserver/go.mod +++ b/staging/src/k8s.io/apiserver/go.mod @@ -54,7 +54,7 @@ require ( k8s.io/client-go v0.0.0 k8s.io/component-base v0.0.0 k8s.io/klog v0.4.0 - k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 + k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf k8s.io/utils v0.0.0-20190801114015-581e00157fb1 sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca sigs.k8s.io/yaml v1.1.0 diff --git a/staging/src/k8s.io/apiserver/go.sum b/staging/src/k8s.io/apiserver/go.sum index d5ca1fb49a2..af6fa2dfdad 100644 --- a/staging/src/k8s.io/apiserver/go.sum +++ b/staging/src/k8s.io/apiserver/go.sum @@ -96,7 +96,6 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -279,8 +278,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ= diff --git a/staging/src/k8s.io/cli-runtime/go.sum b/staging/src/k8s.io/cli-runtime/go.sum index e70f6e2cfaa..c2e75b0b0ab 100644 --- a/staging/src/k8s.io/cli-runtime/go.sum +++ b/staging/src/k8s.io/cli-runtime/go.sum @@ -75,7 +75,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -215,8 +214,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= diff --git a/staging/src/k8s.io/client-go/go.sum b/staging/src/k8s.io/client-go/go.sum index 02c67f7d670..4962f896406 100644 --- a/staging/src/k8s.io/client-go/go.sum +++ b/staging/src/k8s.io/client-go/go.sum @@ -66,7 +66,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= @@ -183,8 +182,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= diff --git a/staging/src/k8s.io/cloud-provider/go.sum b/staging/src/k8s.io/cloud-provider/go.sum index e9467463418..118aef9c91e 100644 --- a/staging/src/k8s.io/cloud-provider/go.sum +++ b/staging/src/k8s.io/cloud-provider/go.sum @@ -53,7 +53,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -166,8 +165,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= diff --git a/staging/src/k8s.io/cluster-bootstrap/go.sum b/staging/src/k8s.io/cluster-bootstrap/go.sum index ffd0c5465a0..f90bab5da83 100644 --- a/staging/src/k8s.io/cluster-bootstrap/go.sum +++ b/staging/src/k8s.io/cluster-bootstrap/go.sum @@ -28,7 +28,6 @@ github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSN github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -98,7 +97,7 @@ k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/staging/src/k8s.io/code-generator/go.mod b/staging/src/k8s.io/code-generator/go.mod index 53a69df1053..1491331d103 100644 --- a/staging/src/k8s.io/code-generator/go.mod +++ b/staging/src/k8s.io/code-generator/go.mod @@ -17,7 +17,7 @@ require ( gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e // indirect k8s.io/gengo v0.0.0-20190822140433-26a664648505 k8s.io/klog v0.4.0 - k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 + k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf ) replace ( diff --git a/staging/src/k8s.io/code-generator/go.sum b/staging/src/k8s.io/code-generator/go.sum index 3b86622f984..3a65cee6cf8 100644 --- a/staging/src/k8s.io/code-generator/go.sum +++ b/staging/src/k8s.io/code-generator/go.sum @@ -32,7 +32,7 @@ github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5 github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -110,11 +110,12 @@ k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/staging/src/k8s.io/component-base/go.sum b/staging/src/k8s.io/component-base/go.sum index 37d91cd03dd..a73abab7691 100644 --- a/staging/src/k8s.io/component-base/go.sum +++ b/staging/src/k8s.io/component-base/go.sum @@ -58,7 +58,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -179,8 +178,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= diff --git a/staging/src/k8s.io/csi-translation-lib/go.sum b/staging/src/k8s.io/csi-translation-lib/go.sum index d0180bcddb8..6bb3ab974af 100644 --- a/staging/src/k8s.io/csi-translation-lib/go.sum +++ b/staging/src/k8s.io/csi-translation-lib/go.sum @@ -49,7 +49,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -147,7 +146,7 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= diff --git a/staging/src/k8s.io/kube-aggregator/go.mod b/staging/src/k8s.io/kube-aggregator/go.mod index 92548629b65..dc893b3e7e5 100644 --- a/staging/src/k8s.io/kube-aggregator/go.mod +++ b/staging/src/k8s.io/kube-aggregator/go.mod @@ -7,7 +7,6 @@ go 1.12 require ( github.com/davecgh/go-spew v1.1.1 github.com/emicklei/go-restful v2.9.5+incompatible - github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4 // indirect github.com/go-openapi/spec v0.19.2 github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d github.com/spf13/cobra v0.0.5 @@ -21,7 +20,7 @@ require ( k8s.io/code-generator v0.0.0 k8s.io/component-base v0.0.0 k8s.io/klog v0.4.0 - k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 + k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf k8s.io/utils v0.0.0-20190801114015-581e00157fb1 ) diff --git a/staging/src/k8s.io/kube-aggregator/go.sum b/staging/src/k8s.io/kube-aggregator/go.sum index 9b27e22e658..44d0621b798 100644 --- a/staging/src/k8s.io/kube-aggregator/go.sum +++ b/staging/src/k8s.io/kube-aggregator/go.sum @@ -60,8 +60,6 @@ github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4 h1:bRzFpEzvausOAt4va+I/22BZ1vXDtERngp0BNYDKej0= -github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= @@ -103,7 +101,6 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -318,8 +315,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= diff --git a/staging/src/k8s.io/kube-controller-manager/go.sum b/staging/src/k8s.io/kube-controller-manager/go.sum index cdbd853ba9b..205ee54a225 100644 --- a/staging/src/k8s.io/kube-controller-manager/go.sum +++ b/staging/src/k8s.io/kube-controller-manager/go.sum @@ -51,7 +51,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -155,7 +154,7 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= diff --git a/staging/src/k8s.io/kube-proxy/go.sum b/staging/src/k8s.io/kube-proxy/go.sum index cdbd853ba9b..205ee54a225 100644 --- a/staging/src/k8s.io/kube-proxy/go.sum +++ b/staging/src/k8s.io/kube-proxy/go.sum @@ -51,7 +51,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -155,7 +154,7 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= diff --git a/staging/src/k8s.io/kube-scheduler/go.sum b/staging/src/k8s.io/kube-scheduler/go.sum index cdbd853ba9b..205ee54a225 100644 --- a/staging/src/k8s.io/kube-scheduler/go.sum +++ b/staging/src/k8s.io/kube-scheduler/go.sum @@ -51,7 +51,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -155,7 +154,7 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= diff --git a/staging/src/k8s.io/kubectl/go.mod b/staging/src/k8s.io/kubectl/go.mod index 141ff14d962..bee8e06bb9b 100644 --- a/staging/src/k8s.io/kubectl/go.mod +++ b/staging/src/k8s.io/kubectl/go.mod @@ -41,7 +41,7 @@ require ( k8s.io/client-go v0.0.0 k8s.io/component-base v0.0.0 k8s.io/klog v0.4.0 - k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 + k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf k8s.io/metrics v0.0.0 k8s.io/utils v0.0.0-20190801114015-581e00157fb1 sigs.k8s.io/kustomize v2.0.3+incompatible diff --git a/staging/src/k8s.io/kubectl/go.sum b/staging/src/k8s.io/kubectl/go.sum index 20401768b3d..d4d8e419cf0 100644 --- a/staging/src/k8s.io/kubectl/go.sum +++ b/staging/src/k8s.io/kubectl/go.sum @@ -103,7 +103,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -279,8 +278,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= diff --git a/staging/src/k8s.io/kubelet/go.sum b/staging/src/k8s.io/kubelet/go.sum index 8db393b0e11..2b8d5c31c99 100644 --- a/staging/src/k8s.io/kubelet/go.sum +++ b/staging/src/k8s.io/kubelet/go.sum @@ -28,7 +28,6 @@ github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSN github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -94,7 +93,7 @@ k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/staging/src/k8s.io/legacy-cloud-providers/go.sum b/staging/src/k8s.io/legacy-cloud-providers/go.sum index f24dd8e12be..ca10dfb73fb 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/go.sum +++ b/staging/src/k8s.io/legacy-cloud-providers/go.sum @@ -97,7 +97,6 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= @@ -282,8 +281,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= diff --git a/staging/src/k8s.io/metrics/go.sum b/staging/src/k8s.io/metrics/go.sum index a915f54bc1c..b56ede60e77 100644 --- a/staging/src/k8s.io/metrics/go.sum +++ b/staging/src/k8s.io/metrics/go.sum @@ -68,7 +68,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -203,8 +202,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= diff --git a/staging/src/k8s.io/node-api/go.sum b/staging/src/k8s.io/node-api/go.sum index 2adccae2b68..13ed7c43c48 100644 --- a/staging/src/k8s.io/node-api/go.sum +++ b/staging/src/k8s.io/node-api/go.sum @@ -69,7 +69,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -206,8 +205,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= diff --git a/staging/src/k8s.io/sample-apiserver/go.mod b/staging/src/k8s.io/sample-apiserver/go.mod index 6fa85038cd7..08e9be17140 100644 --- a/staging/src/k8s.io/sample-apiserver/go.mod +++ b/staging/src/k8s.io/sample-apiserver/go.mod @@ -14,7 +14,7 @@ require ( k8s.io/code-generator v0.0.0 k8s.io/component-base v0.0.0 k8s.io/klog v0.4.0 - k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 + k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf ) replace ( diff --git a/staging/src/k8s.io/sample-apiserver/go.sum b/staging/src/k8s.io/sample-apiserver/go.sum index d432ce9183b..9f4a2d00d29 100644 --- a/staging/src/k8s.io/sample-apiserver/go.sum +++ b/staging/src/k8s.io/sample-apiserver/go.sum @@ -99,7 +99,6 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -313,8 +312,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= diff --git a/staging/src/k8s.io/sample-cli-plugin/go.sum b/staging/src/k8s.io/sample-cli-plugin/go.sum index e70f6e2cfaa..c2e75b0b0ab 100644 --- a/staging/src/k8s.io/sample-cli-plugin/go.sum +++ b/staging/src/k8s.io/sample-cli-plugin/go.sum @@ -75,7 +75,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -215,8 +214,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= diff --git a/staging/src/k8s.io/sample-controller/go.sum b/staging/src/k8s.io/sample-controller/go.sum index 25296e378ad..9eae2a13394 100644 --- a/staging/src/k8s.io/sample-controller/go.sum +++ b/staging/src/k8s.io/sample-controller/go.sum @@ -69,7 +69,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -207,8 +206,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= diff --git a/test/integration/apiserver/apply/BUILD b/test/integration/apiserver/apply/BUILD index 293fce4642a..e2f835972a0 100644 --- a/test/integration/apiserver/apply/BUILD +++ b/test/integration/apiserver/apply/BUILD @@ -4,6 +4,7 @@ go_test( name = "go_default_test", size = "large", srcs = [ + "apply_crd_test.go", "apply_test.go", "main_test.go", ], @@ -12,15 +13,21 @@ go_test( "integration", ], deps = [ + "//cmd/kube-apiserver/app/testing:go_default_library", "//pkg/master:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", + "//staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/client-go/dynamic:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//staging/src/k8s.io/client-go/rest:go_default_library", "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", diff --git a/vendor/k8s.io/kube-openapi/pkg/aggregator/aggregator.go b/vendor/k8s.io/kube-openapi/pkg/aggregator/aggregator.go index 9e3dcf05cdc..8f4a7215170 100644 --- a/vendor/k8s.io/kube-openapi/pkg/aggregator/aggregator.go +++ b/vendor/k8s.io/kube-openapi/pkg/aggregator/aggregator.go @@ -19,6 +19,7 @@ package aggregator import ( "fmt" "reflect" + "sort" "strings" "github.com/go-openapi/spec" @@ -184,78 +185,63 @@ func mergeSpecs(dest, source *spec.Swagger, renameModelConflicts, ignorePathConf source = FilterSpecByPathsWithoutSideEffects(source, keepPaths) } } - // Check for model conflicts - conflicts := false - for k, v := range source.Definitions { - v2, found := dest.Definitions[k] - if found && !deepEqualDefinitionsModuloGVKs(&v2, &v) { - if !renameModelConflicts { - return fmt.Errorf("model name conflict in merging OpenAPI spec: %s", k) - } - conflicts = true - break - } + + // Check for model conflicts and rename to make definitions conflict-free (modulo different GVKs) + usedNames := map[string]bool{} + for k := range dest.Definitions { + usedNames[k] = true } - - if conflicts { - usedNames := map[string]bool{} - for k := range dest.Definitions { - usedNames[k] = true + renames := map[string]string{} +DEFINITIONLOOP: + for k, v := range source.Definitions { + existing, found := dest.Definitions[k] + if !found || deepEqualDefinitionsModuloGVKs(&existing, &v) { + // skip for now, we copy them after the rename loop + continue } - renames := map[string]string{} - OUTERLOOP: - for k, v := range source.Definitions { - if usedNames[k] { - v2, found := dest.Definitions[k] - // Reuse model if they are exactly the same. - if found && deepEqualDefinitionsModuloGVKs(&v2, &v) { - if gvks, found, err := mergedGVKs(&v2, &v); err != nil { - return err - } else if found { - v2.Extensions[gvkKey] = gvks - } - continue - } + if !renameModelConflicts { + return fmt.Errorf("model name conflict in merging OpenAPI spec: %s", k) + } - // Reuse previously renamed model if one exists - var newName string - i := 1 - for found { - i++ - newName = fmt.Sprintf("%s_v%d", k, i) - v2, found = dest.Definitions[newName] - if found && deepEqualDefinitionsModuloGVKs(&v2, &v) { - renames[k] = newName - if gvks, found, err := mergedGVKs(&v2, &v); err != nil { - return err - } else if found { - v2.Extensions[gvkKey] = gvks - } - continue OUTERLOOP - } - } - - _, foundInSource := source.Definitions[newName] - for usedNames[newName] || foundInSource { - i++ - newName = fmt.Sprintf("%s_v%d", k, i) - _, foundInSource = source.Definitions[newName] - } + // Reuse previously renamed model if one exists + var newName string + i := 1 + for found { + i++ + newName = fmt.Sprintf("%s_v%d", k, i) + existing, found = dest.Definitions[newName] + if found && deepEqualDefinitionsModuloGVKs(&existing, &v) { renames[k] = newName - usedNames[newName] = true + continue DEFINITIONLOOP } } - source = renameDefinition(source, renames) + + _, foundInSource := source.Definitions[newName] + for usedNames[newName] || foundInSource { + i++ + newName = fmt.Sprintf("%s_v%d", k, i) + _, foundInSource = source.Definitions[newName] + } + renames[k] = newName + usedNames[newName] = true } + source = renameDefinition(source, renames) + + // now without conflict (modulo different GVKs), copy definitions to dest for k, v := range source.Definitions { - if _, found := dest.Definitions[k]; !found { + if existing, found := dest.Definitions[k]; !found { if dest.Definitions == nil { dest.Definitions = spec.Definitions{} } dest.Definitions[k] = v + } else if merged, changed, err := mergedGVKs(&existing, &v); err != nil { + return err + } else if changed { + existing.Extensions[gvkKey] = merged } } + // Check for path conflicts for k, v := range source.Paths.Paths { if _, found := dest.Paths.Paths[k]; found { @@ -267,6 +253,7 @@ func mergeSpecs(dest, source *spec.Swagger, renameModelConflicts, ignorePathConf } dest.Paths.Paths[k] = v } + return nil } @@ -336,6 +323,7 @@ func mergedGVKs(s1, s2 *spec.Schema) (interface{}, bool, error) { } ret := make([]interface{}, len(slice1), len(slice1)+len(slice2)) + keys := make([]string, 0, len(slice1)+len(slice2)) copy(ret, slice1) seen := make(map[string]bool, len(slice1)) for _, x := range slice1 { @@ -344,6 +332,7 @@ func mergedGVKs(s1, s2 *spec.Schema) (interface{}, bool, error) { return nil, false, fmt.Errorf(`expected {"group": , "kind": , "version": }, got: %#v`, x) } k := fmt.Sprintf("%s/%s.%s", gvk["group"], gvk["version"], gvk["kind"]) + keys = append(keys, k) seen[k] = true } changed := false @@ -357,8 +346,31 @@ func mergedGVKs(s1, s2 *spec.Schema) (interface{}, bool, error) { continue } ret = append(ret, x) + keys = append(keys, k) changed = true } + if changed { + sort.Sort(byKeys{ret, keys}) + } + return ret, changed, nil } + +type byKeys struct { + values []interface{} + keys []string +} + +func (b byKeys) Len() int { + return len(b.values) +} + +func (b byKeys) Less(i, j int) bool { + return b.keys[i] < b.keys[j] +} + +func (b byKeys) Swap(i, j int) { + b.values[i], b.values[j] = b.values[j], b.values[i] + b.keys[i], b.keys[j] = b.keys[j], b.keys[i] +} diff --git a/vendor/k8s.io/kube-openapi/pkg/builder/openapi.go b/vendor/k8s.io/kube-openapi/pkg/builder/openapi.go index 072c8ec4ae5..fd0e77cbbc5 100644 --- a/vendor/k8s.io/kube-openapi/pkg/builder/openapi.go +++ b/vendor/k8s.io/kube-openapi/pkg/builder/openapi.go @@ -31,8 +31,6 @@ import ( const ( OpenAPIVersion = "2.0" - // TODO: Make this configurable. - extensionPrefix = "x-kubernetes-" ) type openAPI struct { @@ -154,6 +152,11 @@ func (o *openAPI) buildDefinitionRecursively(name string) error { schema.Extensions[k] = v } } + if v, ok := item.Schema.Extensions[common.ExtensionV2Schema]; ok { + if v2Schema, isOpenAPISchema := v.(spec.Schema); isOpenAPISchema { + schema = v2Schema + } + } o.swagger.Definitions[uniqueName] = schema for _, v := range item.Dependencies { if err := o.buildDefinitionRecursively(v); err != nil { @@ -270,7 +273,7 @@ func (o *openAPI) buildOperations(route restful.Route, inPathCommonParamsMap map }, } for k, v := range route.Metadata { - if strings.HasPrefix(k, extensionPrefix) { + if strings.HasPrefix(k, common.ExtensionPrefix) { if ret.Extensions == nil { ret.Extensions = spec.Extensions{} } diff --git a/vendor/k8s.io/kube-openapi/pkg/common/common.go b/vendor/k8s.io/kube-openapi/pkg/common/common.go index 7d5534b24ec..f1c87c30086 100644 --- a/vendor/k8s.io/kube-openapi/pkg/common/common.go +++ b/vendor/k8s.io/kube-openapi/pkg/common/common.go @@ -24,6 +24,12 @@ import ( "github.com/go-openapi/spec" ) +const ( + // TODO: Make this configurable. + ExtensionPrefix = "x-kubernetes-" + ExtensionV2Schema = ExtensionPrefix + "v2-schema" +) + // OpenAPIDefinition describes single type. Normally these definitions are auto-generated using gen-openapi. type OpenAPIDefinition struct { Schema spec.Schema @@ -43,6 +49,10 @@ type OpenAPIDefinitionGetter interface { OpenAPIDefinition() *OpenAPIDefinition } +type OpenAPIV3DefinitionGetter interface { + OpenAPIV3Definition() *OpenAPIDefinition +} + type PathHandler interface { Handle(path string, handler http.Handler) } @@ -172,3 +182,11 @@ func EscapeJsonPointer(p string) string { p = strings.Replace(p, "/", "~1", -1) return p } + +func EmbedOpenAPIDefinitionIntoV2Extension(main OpenAPIDefinition, embedded OpenAPIDefinition) OpenAPIDefinition { + if main.Schema.Extensions == nil { + main.Schema.Extensions = make(map[string]interface{}) + } + main.Schema.Extensions[ExtensionV2Schema] = embedded.Schema + return main +} diff --git a/vendor/k8s.io/kube-openapi/pkg/generators/openapi.go b/vendor/k8s.io/kube-openapi/pkg/generators/openapi.go index 6a458473001..d42ed6108bc 100644 --- a/vendor/k8s.io/kube-openapi/pkg/generators/openapi.go +++ b/vendor/k8s.io/kube-openapi/pkg/generators/openapi.go @@ -242,6 +242,16 @@ func methodReturnsValue(mt *types.Type, pkg, name string) bool { return r.Name.Name == name && r.Name.Package == pkg } +func hasOpenAPIV3DefinitionMethod(t *types.Type) bool { + for mn, mt := range t.Methods { + if mn != "OpenAPIV3Definition" { + continue + } + return methodReturnsValue(mt, openAPICommonPackagePath, "OpenAPIDefinition") + } + return false +} + func hasOpenAPIDefinitionMethod(t *types.Type) bool { for mn, mt := range t.Methods { if mn != "OpenAPIDefinition" { @@ -304,9 +314,21 @@ func (g openAPITypeWriter) generateCall(t *types.Type) error { case types.Struct: args := argsFromType(t) g.Do("\"$.$\": ", t.Name) - if hasOpenAPIDefinitionMethod(t) { + + hasV2Definition := hasOpenAPIDefinitionMethod(t) + hasV2DefinitionTypeAndFormat := hasOpenAPIDefinitionMethods(t) + hasV3Definition := hasOpenAPIV3DefinitionMethod(t) + + switch { + case hasV2DefinitionTypeAndFormat: + g.Do(nameTmpl+"(ref),\n", args) + case hasV2Definition && hasV3Definition: + g.Do("common.EmbedOpenAPIDefinitionIntoV2Extension($.type|raw${}.OpenAPIV3Definition(), $.type|raw${}.OpenAPIDefinition()),\n", args) + case hasV2Definition: g.Do("$.type|raw${}.OpenAPIDefinition(),\n", args) - } else { + case hasV3Definition: + g.Do("$.type|raw${}.OpenAPIV3Definition(),\n", args) + default: g.Do(nameTmpl+"(ref),\n", args) } } @@ -317,14 +339,30 @@ func (g openAPITypeWriter) generate(t *types.Type) error { // Only generate for struct type and ignore the rest switch t.Kind { case types.Struct: - if hasOpenAPIDefinitionMethod(t) { + hasV2Definition := hasOpenAPIDefinitionMethod(t) + hasV2DefinitionTypeAndFormat := hasOpenAPIDefinitionMethods(t) + hasV3Definition := hasOpenAPIV3DefinitionMethod(t) + + if hasV2Definition || (hasV3Definition && !hasV2DefinitionTypeAndFormat) { // already invoked directly return nil } args := argsFromType(t) g.Do("func "+nameTmpl+"(ref $.ReferenceCallback|raw$) $.OpenAPIDefinition|raw$ {\n", args) - if hasOpenAPIDefinitionMethods(t) { + switch { + case hasV2DefinitionTypeAndFormat && hasV3Definition: + g.Do("return common.EmbedOpenAPIDefinitionIntoV2Extension($.type|raw${}.OpenAPIV3Definition(), $.OpenAPIDefinition|raw${\n"+ + "Schema: spec.Schema{\n"+ + "SchemaProps: spec.SchemaProps{\n", args) + g.generateDescription(t.CommentLines) + g.Do("Type:$.type|raw${}.OpenAPISchemaType(),\n"+ + "Format:$.type|raw${}.OpenAPISchemaFormat(),\n"+ + "},\n"+ + "},\n"+ + "})\n}\n\n", args) + return nil + case hasV2DefinitionTypeAndFormat: g.Do("return $.OpenAPIDefinition|raw${\n"+ "Schema: spec.Schema{\n"+ "SchemaProps: spec.SchemaProps{\n", args) diff --git a/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go b/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go index 7f808ab85a9..e5a78ee97b6 100644 --- a/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go +++ b/vendor/k8s.io/kube-openapi/pkg/schemaconv/smd.go @@ -30,9 +30,16 @@ import ( // ToSchema converts openapi definitions into a schema suitable for structured // merge (i.e. kubectl apply v2). func ToSchema(models proto.Models) (*schema.Schema, error) { + return ToSchemaWithPreserveUnknownFields(models, false) +} + +// ToSchemaWithPreserveUnknownFields converts openapi definitions into a schema suitable for structured +// merge (i.e. kubectl apply v2), it will preserve unknown fields if specified. +func ToSchemaWithPreserveUnknownFields(models proto.Models, preserveUnknownFields bool) (*schema.Schema, error) { c := convert{ - input: models, - output: &schema.Schema{}, + input: models, + preserveUnknownFields: preserveUnknownFields, + output: &schema.Schema{}, } if err := c.convertAll(); err != nil { return nil, err @@ -42,8 +49,9 @@ func ToSchema(models proto.Models) (*schema.Schema, error) { } type convert struct { - input proto.Models - output *schema.Schema + input proto.Models + preserveUnknownFields bool + output *schema.Schema currentName string current *schema.Atom @@ -52,10 +60,11 @@ type convert struct { func (c *convert) push(name string, a *schema.Atom) *convert { return &convert{ - input: c.input, - output: c.output, - currentName: name, - current: a, + input: c.input, + preserveUnknownFields: c.preserveUnknownFields, + output: c.output, + currentName: name, + current: a, } } @@ -98,6 +107,7 @@ func (c *convert) insertTypeDef(name string, model proto.Schema) { func (c *convert) addCommonTypes() { c.output.Types = append(c.output.Types, untypedDef) + c.output.Types = append(c.output.Types, deducedDef) } var untypedName string = "__untyped_atomic_" @@ -121,7 +131,28 @@ var untypedDef schema.TypeDef = schema.TypeDef{ }, } -func (c *convert) makeRef(model proto.Schema) schema.TypeRef { +var deducedName string = "__untyped_deduced_" + +var deducedDef schema.TypeDef = schema.TypeDef{ + Name: deducedName, + Atom: schema.Atom{ + Scalar: ptr(schema.Scalar("untyped")), + List: &schema.List{ + ElementType: schema.TypeRef{ + NamedType: &untypedName, + }, + ElementRelationship: schema.Atomic, + }, + Map: &schema.Map{ + ElementType: schema.TypeRef{ + NamedType: &deducedName, + }, + ElementRelationship: schema.Separable, + }, + }, +} + +func (c *convert) makeRef(model proto.Schema, preserveUnknownFields bool) schema.TypeRef { var tr schema.TypeRef if r, ok := model.(*proto.Ref); ok { if r.Reference() == "io.k8s.apimachinery.pkg.runtime.RawExtension" { @@ -135,6 +166,7 @@ func (c *convert) makeRef(model proto.Schema) schema.TypeRef { } else { // compute the type inline c2 := c.push("inlined in "+c.currentName, &tr.Inlined) + c2.preserveUnknownFields = preserveUnknownFields model.Accept(c2) c.pop(c2) @@ -250,11 +282,16 @@ func makeUnion(extensions map[string]interface{}) (schema.Union, error) { } func (c *convert) VisitKind(k *proto.Kind) { + preserveUnknownFields := c.preserveUnknownFields + if p, ok := k.GetExtensions()["x-kubernetes-preserve-unknown-fields"]; ok && p == true { + preserveUnknownFields = true + } + a := c.top() a.Map = &schema.Map{} for _, name := range k.FieldOrder { member := k.Fields[name] - tr := c.makeRef(member) + tr := c.makeRef(member, preserveUnknownFields) a.Map.Fields = append(a.Map.Fields, schema.StructField{ Name: name, Type: tr, @@ -270,7 +307,11 @@ func (c *convert) VisitKind(k *proto.Kind) { // specified in the union are actual fields in the struct. a.Map.Unions = unions - // TODO: Get element relationship when we start adding it to the spec. + if preserveUnknownFields { + a.Map.ElementType = schema.TypeRef{ + NamedType: &deducedName, + } + } } func toStringSlice(o interface{}) (out []string, ok bool) { @@ -293,7 +334,7 @@ func (c *convert) VisitArray(a *proto.Array) { ElementRelationship: schema.Atomic, } l := atom.List - l.ElementType = c.makeRef(a.SubType) + l.ElementType = c.makeRef(a.SubType, c.preserveUnknownFields) ext := a.GetExtensions() @@ -341,7 +382,7 @@ func (c *convert) VisitArray(a *proto.Array) { func (c *convert) VisitMap(m *proto.Map) { a := c.top() a.Map = &schema.Map{} - a.Map.ElementType = c.makeRef(m.SubType) + a.Map.ElementType = c.makeRef(m.SubType, c.preserveUnknownFields) // TODO: Get element relationship when we start putting it into the // spec. @@ -379,6 +420,9 @@ func (c *convert) VisitPrimitive(p *proto.Primitive) { func (c *convert) VisitArbitrary(a *proto.Arbitrary) { *c.top() = untypedDef.Atom + if c.preserveUnknownFields { + *c.top() = deducedDef.Atom + } } func (c *convert) VisitReference(proto.Reference) { diff --git a/vendor/modules.txt b/vendor/modules.txt index 11c569833be..dd3b2bd38e9 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1723,7 +1723,7 @@ k8s.io/kube-aggregator/pkg/registry/apiservice/etcd k8s.io/kube-aggregator/pkg/registry/apiservice/rest # k8s.io/kube-controller-manager v0.0.0 => ./staging/src/k8s.io/kube-controller-manager k8s.io/kube-controller-manager/config/v1alpha1 -# k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 => k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 +# k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf => k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf k8s.io/kube-openapi/cmd/openapi-gen k8s.io/kube-openapi/cmd/openapi-gen/args k8s.io/kube-openapi/pkg/aggregator From b0ff8d3f7412f5dd8428087a4d4fd9587f8e2b6b Mon Sep 17 00:00:00 2001 From: jennybuckley Date: Thu, 29 Aug 2019 22:40:01 -0700 Subject: [PATCH 5/7] Remove defaulting for x-k8s-list-type --- .../pkg/apis/apiextensions/v1/defaults.go | 44 --------------- .../apis/apiextensions/v1/defaults_test.go | 41 -------------- .../apiextensions/v1/zz_generated.defaults.go | 8 --- .../apis/apiextensions/v1beta1/defaults.go | 44 --------------- .../apiextensions/v1beta1/defaults_test.go | 28 ---------- .../v1beta1/zz_generated.defaults.go | 13 ----- .../apiextensions/validation/validation.go | 54 ++++++++++--------- .../validation/validation_test.go | 23 ++++---- test/e2e/apimachinery/crd_publish_openapi.go | 10 +--- 9 files changed, 40 insertions(+), 225 deletions(-) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go index 7bf26d5c7f0..5cebec927bd 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go @@ -59,47 +59,3 @@ func SetDefaults_ServiceReference(obj *ServiceReference) { obj.Port = utilpointer.Int32Ptr(443) } } - -// SetDefaults_JSONSchemaProps sets the defaults for JSONSchemaProps -func SetDefaults_JSONSchemaProps(obj *JSONSchemaProps) { - if obj == nil { - return - } - if obj.Type == "array" && obj.XListType == nil { - obj.XListType = utilpointer.StringPtr("atomic") - } - if obj.Items != nil { - SetDefaults_JSONSchemaProps(obj.Items.Schema) - defaultJSONSchemaPropsArray(obj.Items.JSONSchemas) - } - defaultJSONSchemaPropsArray(obj.AllOf) - defaultJSONSchemaPropsArray(obj.OneOf) - defaultJSONSchemaPropsArray(obj.AnyOf) - SetDefaults_JSONSchemaProps(obj.Not) - defaultJSONSchemaPropsMap(obj.Properties) - if obj.AdditionalProperties != nil { - SetDefaults_JSONSchemaProps(obj.AdditionalProperties.Schema) - } - defaultJSONSchemaPropsMap(obj.PatternProperties) - for i := range obj.Dependencies { - SetDefaults_JSONSchemaProps(obj.Dependencies[i].Schema) - } - if obj.AdditionalItems != nil { - SetDefaults_JSONSchemaProps(obj.AdditionalItems.Schema) - } - defaultJSONSchemaPropsMap(map[string]JSONSchemaProps(obj.Definitions)) -} - -func defaultJSONSchemaPropsArray(obj []JSONSchemaProps) { - for i := range obj { - SetDefaults_JSONSchemaProps(&obj[i]) - } -} - -func defaultJSONSchemaPropsMap(obj map[string]JSONSchemaProps) { - for i := range obj { - props := obj[i] - SetDefaults_JSONSchemaProps(&props) - obj[i] = props - } -} diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go index 4f17503218f..7640c10c5c4 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go @@ -124,47 +124,6 @@ func TestDefaults(t *testing.T) { }, }, }, - { - name: "list type extension defaults", - original: &CustomResourceDefinition{ - Spec: CustomResourceDefinitionSpec{ - Scope: NamespaceScoped, - Conversion: &CustomResourceConversion{Strategy: NoneConverter}, - Versions: []CustomResourceDefinitionVersion{ - { - Name: "v1", - Storage: true, - Schema: &CustomResourceValidation{ - OpenAPIV3Schema: &JSONSchemaProps{ - Type: "array", - }, - }, - }, - }, - }, - }, - expected: &CustomResourceDefinition{ - Spec: CustomResourceDefinitionSpec{ - Scope: NamespaceScoped, - Conversion: &CustomResourceConversion{Strategy: NoneConverter}, - Versions: []CustomResourceDefinitionVersion{ - { - Name: "v1", - Storage: true, - Schema: &CustomResourceValidation{ - OpenAPIV3Schema: &JSONSchemaProps{ - Type: "array", - XListType: utilpointer.StringPtr("atomic"), - }, - }, - }, - }, - }, - Status: CustomResourceDefinitionStatus{ - StoredVersions: []string{"v1"}, - }, - }, - }, } for _, test := range tests { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.defaults.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.defaults.go index 317522d1b86..ed03cdd886c 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.defaults.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/zz_generated.defaults.go @@ -38,14 +38,6 @@ func RegisterDefaults(scheme *runtime.Scheme) error { func SetObjectDefaults_CustomResourceDefinition(in *CustomResourceDefinition) { SetDefaults_CustomResourceDefinition(in) SetDefaults_CustomResourceDefinitionSpec(&in.Spec) - for i := range in.Spec.Versions { - a := &in.Spec.Versions[i] - if a.Schema != nil { - if a.Schema.OpenAPIV3Schema != nil { - SetDefaults_JSONSchemaProps(a.Schema.OpenAPIV3Schema) - } - } - } if in.Spec.Conversion != nil { if in.Spec.Conversion.Webhook != nil { if in.Spec.Conversion.Webhook.ClientConfig != nil { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go index bffce311907..1a9c2238e33 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go @@ -80,47 +80,3 @@ func SetDefaults_ServiceReference(obj *ServiceReference) { obj.Port = utilpointer.Int32Ptr(443) } } - -// SetDefaults_JSONSchemaProps sets the defaults for JSONSchemaProps -func SetDefaults_JSONSchemaProps(obj *JSONSchemaProps) { - if obj == nil { - return - } - if obj.Type == "array" && obj.XListType == nil { - obj.XListType = utilpointer.StringPtr("atomic") - } - if obj.Items != nil { - SetDefaults_JSONSchemaProps(obj.Items.Schema) - defaultJSONSchemaPropsArray(obj.Items.JSONSchemas) - } - defaultJSONSchemaPropsArray(obj.AllOf) - defaultJSONSchemaPropsArray(obj.OneOf) - defaultJSONSchemaPropsArray(obj.AnyOf) - SetDefaults_JSONSchemaProps(obj.Not) - defaultJSONSchemaPropsMap(obj.Properties) - if obj.AdditionalProperties != nil { - SetDefaults_JSONSchemaProps(obj.AdditionalProperties.Schema) - } - defaultJSONSchemaPropsMap(obj.PatternProperties) - for i := range obj.Dependencies { - SetDefaults_JSONSchemaProps(obj.Dependencies[i].Schema) - } - if obj.AdditionalItems != nil { - SetDefaults_JSONSchemaProps(obj.AdditionalItems.Schema) - } - defaultJSONSchemaPropsMap(map[string]JSONSchemaProps(obj.Definitions)) -} - -func defaultJSONSchemaPropsArray(obj []JSONSchemaProps) { - for i := range obj { - SetDefaults_JSONSchemaProps(&obj[i]) - } -} - -func defaultJSONSchemaPropsMap(obj map[string]JSONSchemaProps) { - for i := range obj { - props := obj[i] - SetDefaults_JSONSchemaProps(&props) - obj[i] = props - } -} diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults_test.go index dff89a77f1a..6aad4c5eee7 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults_test.go @@ -129,34 +129,6 @@ func TestDefaults(t *testing.T) { }, }, }, - { - name: "list type extension defaults", - original: &CustomResourceDefinition{ - Spec: CustomResourceDefinitionSpec{ - Scope: NamespaceScoped, - Conversion: &CustomResourceConversion{Strategy: NoneConverter}, - PreserveUnknownFields: utilpointer.BoolPtr(true), - Validation: &CustomResourceValidation{ - OpenAPIV3Schema: &JSONSchemaProps{ - Type: "array", - }, - }, - }, - }, - expected: &CustomResourceDefinition{ - Spec: CustomResourceDefinitionSpec{ - Scope: NamespaceScoped, - Conversion: &CustomResourceConversion{Strategy: NoneConverter}, - PreserveUnknownFields: utilpointer.BoolPtr(true), - Validation: &CustomResourceValidation{ - OpenAPIV3Schema: &JSONSchemaProps{ - Type: "array", - XListType: utilpointer.StringPtr("atomic"), - }, - }, - }, - }, - }, } for _, test := range tests { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go index 7be1e1eeb3d..e1807243f01 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go @@ -38,19 +38,6 @@ func RegisterDefaults(scheme *runtime.Scheme) error { func SetObjectDefaults_CustomResourceDefinition(in *CustomResourceDefinition) { SetDefaults_CustomResourceDefinition(in) SetDefaults_CustomResourceDefinitionSpec(&in.Spec) - if in.Spec.Validation != nil { - if in.Spec.Validation.OpenAPIV3Schema != nil { - SetDefaults_JSONSchemaProps(in.Spec.Validation.OpenAPIV3Schema) - } - } - for i := range in.Spec.Versions { - a := &in.Spec.Versions[i] - if a.Schema != nil { - if a.Schema.OpenAPIV3Schema != nil { - SetDefaults_JSONSchemaProps(a.Schema.OpenAPIV3Schema) - } - } - } if in.Spec.Conversion != nil { if in.Spec.Conversion.WebhookClientConfig != nil { if in.Spec.Conversion.WebhookClientConfig.Service != nil { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go index 17c4e24a028..b92f5c2ceae 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go @@ -796,10 +796,6 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch } } - if schema.XListType == nil && schema.Type == "array" { - allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-list-type"), "must be set if type is array")) - } - if schema.XListType != nil && *schema.XListType != "atomic" && *schema.XListType != "set" && *schema.XListType != "map" { allErrs = append(allErrs, field.NotSupported(fldPath.Child("x-kubernetes-list-type"), *schema.XListType, []string{"atomic", "set", "map"})) } @@ -812,32 +808,38 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch } } - if len(schema.XListMapKeys) == 0 && schema.XListType != nil && *schema.XListType == "map" { - allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-list-map-keys"), "must not be empty if x-kubernetes-list-type is map")) - } + if schema.XListType != nil && *schema.XListType == "map" { + if len(schema.XListMapKeys) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-list-map-keys"), "must not be empty if x-kubernetes-list-type is map")) + } - if schema.Items != nil && schema.Items.Schema == nil && schema.XListType != nil && *schema.XListType == "map" { - allErrs = append(allErrs, field.Invalid(fldPath.Child("items"), schema.Items, "must only have a single schema if x-kubernetes-list-type is map")) - } + if schema.Items == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("items"), "must have a schema if x-kubernetes-list-type is map")) + } - if schema.Items != nil && schema.Items.Schema != nil && schema.Items.Schema.Type != "object" && schema.XListType != nil && *schema.XListType == "map" { - allErrs = append(allErrs, field.Invalid(fldPath.Child("items").Child("type"), schema.Items.Schema.Type, "must be object if parent array's x-kubernetes-list-type is map")) - } + if schema.Items != nil && schema.Items.Schema == nil { + allErrs = append(allErrs, field.Invalid(fldPath.Child("items"), schema.Items, "must only have a single schema if x-kubernetes-list-type is map")) + } - if schema.Items != nil && schema.Items.Schema != nil && schema.Items.Schema.Type == "object" && schema.XListType != nil && *schema.XListType == "map" { - keys := map[string]struct{}{} - for _, k := range schema.XListMapKeys { - if s, ok := schema.Items.Schema.Properties[k]; ok { - if s.Type == "array" || s.Type == "object" { - allErrs = append(allErrs, field.Invalid(fldPath.Child("items").Child("properties").Child(k).Child("type"), schema.Items.Schema.Type, "must be a scalar type if parent array's x-kubernetes-list-type is map")) + if schema.Items != nil && schema.Items.Schema != nil && schema.Items.Schema.Type != "object" { + allErrs = append(allErrs, field.Invalid(fldPath.Child("items").Child("type"), schema.Items.Schema.Type, "must be object if parent array's x-kubernetes-list-type is map")) + } + + if schema.Items != nil && schema.Items.Schema != nil && schema.Items.Schema.Type == "object" { + keys := map[string]struct{}{} + for _, k := range schema.XListMapKeys { + if s, ok := schema.Items.Schema.Properties[k]; ok { + if s.Type == "array" || s.Type == "object" { + allErrs = append(allErrs, field.Invalid(fldPath.Child("items").Child("properties").Child(k).Child("type"), schema.Items.Schema.Type, "must be a scalar type if parent array's x-kubernetes-list-type is map")) + } + } else { + allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-map-keys"), schema.XListMapKeys, "entries must all be names of item properties")) } - } else { - allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-map-keys"), schema.XListMapKeys, "entries must all be names of item properties")) + if _, ok := keys[k]; ok { + allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-map-keys"), schema.XListMapKeys, "must not contain duplicate entries")) + } + keys[k] = struct{}{} } - if _, ok := keys[k]; ok { - allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-map-keys"), schema.XListMapKeys, "must not contain duplicate entries")) - } - keys[k] = struct{}{} } } @@ -1142,7 +1144,7 @@ func schemaHasKubernetesExtensions(s *apiextensions.JSONSchemaProps) bool { return false } - if s.XEmbeddedResource || s.XPreserveUnknownFields != nil || s.XIntOrString { + if s.XEmbeddedResource || s.XPreserveUnknownFields != nil || s.XIntOrString || len(s.XListMapKeys) > 0 || s.XListType != nil { return true } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go index e00bff9c917..0a0847dbad1 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go @@ -6510,9 +6510,6 @@ func TestValidateCustomResourceDefinitionValidation(t *testing.T) { "array": { Type: "array", Nullable: true, - - // This value is defaulted - XListType: strPtr("atomic"), }, "number": { Type: "number", @@ -6594,15 +6591,6 @@ func TestValidateCustomResourceDefinitionValidation(t *testing.T) { }, wantError: true, }, - { - name: "unset list type extension with type array", - input: apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ - Type: "array", - }, - }, - wantError: true, - }, { name: "invalid list type extension", input: apiextensions.CustomResourceValidation{ @@ -6643,6 +6631,17 @@ func TestValidateCustomResourceDefinitionValidation(t *testing.T) { }, wantError: true, }, + { + name: "no items schema with list type extension map", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "array", + XListType: strPtr("map"), + XListMapKeys: []string{"key"}, + }, + }, + wantError: true, + }, { name: "multiple schema items with list type extension map", input: apiextensions.CustomResourceValidation{ diff --git a/test/e2e/apimachinery/crd_publish_openapi.go b/test/e2e/apimachinery/crd_publish_openapi.go index 2179845677c..6dce7a38d59 100644 --- a/test/e2e/apimachinery/crd_publish_openapi.go +++ b/test/e2e/apimachinery/crd_publish_openapi.go @@ -35,7 +35,6 @@ import ( apiequality "k8s.io/apimachinery/pkg/api/equality" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - utildiff "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/wait" k8sclientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" @@ -508,8 +507,7 @@ func waitForDefinition(c k8sclientset.Interface, name string, schema []byte) err // drop properties and extension that we added dropDefaults(&d) if !apiequality.Semantic.DeepEqual(expect, d) { - diff := utildiff.ObjectGoPrintSideBySide(expect, d) - return false, fmt.Sprintf("spec.SwaggerProps.Definitions[\"%s\"] not match; expect: %v, actual: %v\n%v", name, expect, d, diff) + return false, fmt.Sprintf("spec.SwaggerProps.Definitions[\"%s\"] not match; expect: %v, actual: %v", name, expect, d) } } return true, "" @@ -629,7 +627,6 @@ properties: bars: description: List of Bars and their specs. type: array - x-kubernetes-list-type: atomic items: type: object required: @@ -646,7 +643,6 @@ properties: items: type: string type: array - x-kubernetes-list-type: atomic status: description: Status of Foo type: object @@ -654,7 +650,6 @@ properties: bars: description: List of Bars and their statuses. type: array - x-kubernetes-list-type: atomic items: type: object properties: @@ -686,7 +681,6 @@ properties: bars: description: List of Bars and their statuses. type: array - x-kubernetes-list-type: atomic items: type: object`) @@ -708,7 +702,6 @@ properties: bars: description: List of Bars and their statuses. type: array - x-kubernetes-list-type: atomic items: type: object`) @@ -730,6 +723,5 @@ properties: bars: description: List of Bars and their statuses. type: array - x-kubernetes-list-type: atomic items: type: object`) From df329d87e13844ecfd103df0d6d669463858dc56 Mon Sep 17 00:00:00 2001 From: jennybuckley Date: Thu, 29 Aug 2019 22:44:29 -0700 Subject: [PATCH 6/7] run hack/update-vendor.sh --- staging/src/k8s.io/apiextensions-apiserver/go.mod | 1 - staging/src/k8s.io/apiextensions-apiserver/go.sum | 2 -- 2 files changed, 3 deletions(-) diff --git a/staging/src/k8s.io/apiextensions-apiserver/go.mod b/staging/src/k8s.io/apiextensions-apiserver/go.mod index 8a55c43f513..c270ee4a5fe 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/go.mod +++ b/staging/src/k8s.io/apiextensions-apiserver/go.mod @@ -7,7 +7,6 @@ go 1.12 require ( github.com/coreos/etcd v3.3.15+incompatible github.com/emicklei/go-restful v2.9.5+incompatible - github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4 // indirect github.com/go-openapi/errors v0.19.2 github.com/go-openapi/spec v0.19.2 github.com/go-openapi/strfmt v0.19.0 diff --git a/staging/src/k8s.io/apiextensions-apiserver/go.sum b/staging/src/k8s.io/apiextensions-apiserver/go.sum index 40d7109a178..d2fb5cf861f 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/go.sum +++ b/staging/src/k8s.io/apiextensions-apiserver/go.sum @@ -65,8 +65,6 @@ github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4 h1:bRzFpEzvausOAt4va+I/22BZ1vXDtERngp0BNYDKej0= -github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= From 7303df0b2161600c47f49034e120fa2065ef539c Mon Sep 17 00:00:00 2001 From: jennybuckley Date: Thu, 29 Aug 2019 22:49:00 -0700 Subject: [PATCH 7/7] fix nit --- .../pkg/apis/apiextensions/validation/validation.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go index b92f5c2ceae..2f10a029df5 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go @@ -800,10 +800,10 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch allErrs = append(allErrs, field.NotSupported(fldPath.Child("x-kubernetes-list-type"), *schema.XListType, []string{"atomic", "set", "map"})) } - if len(schema.XListMapKeys) > 0 && (schema.XListType == nil || *schema.XListType != "map") { + if len(schema.XListMapKeys) > 0 { if schema.XListType == nil { allErrs = append(allErrs, field.Required(fldPath.Child("x-kubernetes-list-type"), "must be map if x-kubernetes-list-map-keys is non-empty")) - } else { + } else if *schema.XListType != "map" { allErrs = append(allErrs, field.Invalid(fldPath.Child("x-kubernetes-list-type"), *schema.XListType, "must be map if x-kubernetes-list-map-keys is non-empty")) } }