mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-21 19:01:49 +00:00
Merge pull request #116106 from alexzielenski/revert-116062-revert-field-manager
Revert "Revert "Merge pull request #115324 from alexzielenski/apiserver/smd/use-openapiv3"
This commit is contained in:
commit
b4b2345f9a
@ -377,10 +377,8 @@ func buildGenericConfig(
|
|||||||
getOpenAPIDefinitions := openapi.GetOpenAPIDefinitionsWithoutDisabledFeatures(generatedopenapi.GetOpenAPIDefinitions)
|
getOpenAPIDefinitions := openapi.GetOpenAPIDefinitionsWithoutDisabledFeatures(generatedopenapi.GetOpenAPIDefinitions)
|
||||||
genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(getOpenAPIDefinitions, openapinamer.NewDefinitionNamer(legacyscheme.Scheme, extensionsapiserver.Scheme, aggregatorscheme.Scheme))
|
genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(getOpenAPIDefinitions, openapinamer.NewDefinitionNamer(legacyscheme.Scheme, extensionsapiserver.Scheme, aggregatorscheme.Scheme))
|
||||||
genericConfig.OpenAPIConfig.Info.Title = "Kubernetes"
|
genericConfig.OpenAPIConfig.Info.Title = "Kubernetes"
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(genericfeatures.OpenAPIV3) {
|
genericConfig.OpenAPIV3Config = genericapiserver.DefaultOpenAPIV3Config(getOpenAPIDefinitions, openapinamer.NewDefinitionNamer(legacyscheme.Scheme, extensionsapiserver.Scheme, aggregatorscheme.Scheme))
|
||||||
genericConfig.OpenAPIV3Config = genericapiserver.DefaultOpenAPIV3Config(getOpenAPIDefinitions, openapinamer.NewDefinitionNamer(legacyscheme.Scheme, extensionsapiserver.Scheme, aggregatorscheme.Scheme))
|
genericConfig.OpenAPIV3Config.Info.Title = "Kubernetes"
|
||||||
genericConfig.OpenAPIV3Config.Info.Title = "Kubernetes"
|
|
||||||
}
|
|
||||||
|
|
||||||
genericConfig.LongRunningFunc = filters.BasicLongRunningRequestCheck(
|
genericConfig.LongRunningFunc = filters.BasicLongRunningRequestCheck(
|
||||||
sets.NewString("watch", "proxy"),
|
sets.NewString("watch", "proxy"),
|
||||||
|
@ -76,6 +76,7 @@ import (
|
|||||||
"k8s.io/client-go/scale/scheme/autoscalingv1"
|
"k8s.io/client-go/scale/scheme/autoscalingv1"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
|
"k8s.io/kube-openapi/pkg/spec3"
|
||||||
"k8s.io/kube-openapi/pkg/validation/spec"
|
"k8s.io/kube-openapi/pkg/validation/spec"
|
||||||
"k8s.io/kube-openapi/pkg/validation/strfmt"
|
"k8s.io/kube-openapi/pkg/validation/strfmt"
|
||||||
"k8s.io/kube-openapi/pkg/validation/validate"
|
"k8s.io/kube-openapi/pkg/validation/validate"
|
||||||
@ -120,7 +121,7 @@ type crdHandler struct {
|
|||||||
// staticOpenAPISpec is used as a base for the schema of CR's for the
|
// 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
|
// purpose of managing fields, it is how CR handlers get the structure
|
||||||
// of TypeMeta and ObjectMeta
|
// of TypeMeta and ObjectMeta
|
||||||
staticOpenAPISpec *spec.Swagger
|
staticOpenAPISpec map[string]*spec.Schema
|
||||||
|
|
||||||
// The limit on the request size that would be accepted and decoded in a write request
|
// The limit on the request size that would be accepted and decoded in a write request
|
||||||
// 0 means no limit.
|
// 0 means no limit.
|
||||||
@ -174,7 +175,7 @@ func NewCustomResourceDefinitionHandler(
|
|||||||
authorizer authorizer.Authorizer,
|
authorizer authorizer.Authorizer,
|
||||||
requestTimeout time.Duration,
|
requestTimeout time.Duration,
|
||||||
minRequestTimeout time.Duration,
|
minRequestTimeout time.Duration,
|
||||||
staticOpenAPISpec *spec.Swagger,
|
staticOpenAPISpec map[string]*spec.Schema,
|
||||||
maxRequestBodyBytes int64) (*crdHandler, error) {
|
maxRequestBodyBytes int64) (*crdHandler, error) {
|
||||||
|
|
||||||
if converterFactory == nil {
|
if converterFactory == nil {
|
||||||
@ -680,7 +681,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd
|
|||||||
}
|
}
|
||||||
|
|
||||||
var typeConverter fieldmanager.TypeConverter = fieldmanager.NewDeducedTypeConverter()
|
var typeConverter fieldmanager.TypeConverter = fieldmanager.NewDeducedTypeConverter()
|
||||||
if openAPIModels != nil {
|
if len(openAPIModels) > 0 {
|
||||||
typeConverter, err = fieldmanager.NewTypeConverter(openAPIModels, crd.Spec.PreserveUnknownFields)
|
typeConverter, err = fieldmanager.NewTypeConverter(openAPIModels, crd.Spec.PreserveUnknownFields)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -1369,25 +1370,39 @@ func hasServedCRDVersion(spec *apiextensionsv1.CustomResourceDefinitionSpec, ver
|
|||||||
// buildOpenAPIModelsForApply constructs openapi models from any validation schemas specified in the custom resource,
|
// buildOpenAPIModelsForApply constructs openapi models from any validation schemas specified in the custom resource,
|
||||||
// and merges it with the models defined in the static OpenAPI spec.
|
// and merges it with the models defined in the static OpenAPI spec.
|
||||||
// Returns nil models ifthe static spec is nil, or an error is encountered.
|
// Returns nil models ifthe static spec is nil, or an error is encountered.
|
||||||
func buildOpenAPIModelsForApply(staticOpenAPISpec *spec.Swagger, crd *apiextensionsv1.CustomResourceDefinition) (*spec.Swagger, error) {
|
func buildOpenAPIModelsForApply(staticOpenAPISpec map[string]*spec.Schema, crd *apiextensionsv1.CustomResourceDefinition) (map[string]*spec.Schema, error) {
|
||||||
if staticOpenAPISpec == nil {
|
if staticOpenAPISpec == nil {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
specs := []*spec.Swagger{}
|
// Convert static spec to V3 format to be able to merge
|
||||||
|
staticSpecV3 := &spec3.OpenAPI{
|
||||||
|
Version: "3.0.0",
|
||||||
|
Info: &spec.Info{
|
||||||
|
InfoProps: spec.InfoProps{
|
||||||
|
Title: "Kubernetes CRD Swagger",
|
||||||
|
Version: "v0.1.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Components: &spec3.Components{
|
||||||
|
Schemas: staticOpenAPISpec,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
specs := []*spec3.OpenAPI{staticSpecV3}
|
||||||
for _, v := range crd.Spec.Versions {
|
for _, v := range crd.Spec.Versions {
|
||||||
// Defaults are not pruned here, but before being served.
|
// Defaults are not pruned here, but before being served.
|
||||||
// See flag description in builder.go for flag usage
|
// See flag description in builder.go for flag usage
|
||||||
s, err := builder.BuildOpenAPIV2(crd, v.Name, builder.Options{V2: true, SkipFilterSchemaForKubectlOpenAPIV2Validation: true, StripValueValidation: true, StripNullable: true, AllowNonStructural: false})
|
s, err := builder.BuildOpenAPIV3(crd, v.Name, builder.Options{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
specs = append(specs, s)
|
specs = append(specs, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
mergedOpenAPI, err := builder.MergeSpecs(staticOpenAPISpec, specs...)
|
mergedOpenAPI, err := builder.MergeSpecsV3(specs...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return mergedOpenAPI, nil
|
return mergedOpenAPI.Components.Schemas, nil
|
||||||
}
|
}
|
||||||
|
@ -1023,9 +1023,15 @@ func TestBuildOpenAPIModelsForApply(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
convertedDefs := map[string]*spec.Schema{}
|
||||||
|
for k, v := range staticSpec.Definitions {
|
||||||
|
vCopy := v
|
||||||
|
convertedDefs[k] = &vCopy
|
||||||
|
}
|
||||||
|
|
||||||
for i, test := range tests {
|
for i, test := range tests {
|
||||||
crd.Spec.Versions[0].Schema = &test
|
crd.Spec.Versions[0].Schema = &test
|
||||||
models, err := buildOpenAPIModelsForApply(staticSpec, &crd)
|
models, err := buildOpenAPIModelsForApply(convertedDefs, &crd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to convert to apply model: %v", err)
|
t.Fatalf("failed to convert to apply model: %v", err)
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -34,7 +34,6 @@ import (
|
|||||||
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
|
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
|
||||||
"k8s.io/apiserver/pkg/registry/rest"
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
"k8s.io/apiserver/pkg/storageversion"
|
"k8s.io/apiserver/pkg/storageversion"
|
||||||
"k8s.io/kube-openapi/pkg/validation/spec"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ConvertabilityChecker indicates what versions a GroupKind is available in.
|
// ConvertabilityChecker indicates what versions a GroupKind is available in.
|
||||||
@ -95,9 +94,6 @@ type APIGroupVersion struct {
|
|||||||
|
|
||||||
MinRequestTimeout time.Duration
|
MinRequestTimeout time.Duration
|
||||||
|
|
||||||
// OpenAPIModels exposes the OpenAPI models to each individual handler.
|
|
||||||
OpenAPIModels *spec.Swagger
|
|
||||||
|
|
||||||
// The limit on the request body size that would be accepted and decoded in a write request.
|
// The limit on the request body size that would be accepted and decoded in a write request.
|
||||||
// 0 means no limit.
|
// 0 means no limit.
|
||||||
MaxRequestBodyBytes int64
|
MaxRequestBodyBytes int64
|
||||||
|
@ -47,11 +47,16 @@ var fakeTypeConverter = func() fieldmanager.TypeConverter {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
spec := spec.Swagger{}
|
swag := spec.Swagger{}
|
||||||
if err := json.Unmarshal(data, &spec); err != nil {
|
if err := json.Unmarshal(data, &swag); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
typeConverter, err := fieldmanager.NewTypeConverter(&spec, false)
|
convertedDefs := map[string]*spec.Schema{}
|
||||||
|
for k, v := range swag.Definitions {
|
||||||
|
vCopy := v
|
||||||
|
convertedDefs[k] = &vCopy
|
||||||
|
}
|
||||||
|
typeConverter, err := fieldmanager.NewTypeConverter(convertedDefs, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -33,11 +33,18 @@ var fakeTypeConverter = func() internal.TypeConverter {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
convertedDefs := map[string]*spec.Schema{}
|
||||||
spec := spec.Swagger{}
|
spec := spec.Swagger{}
|
||||||
if err := json.Unmarshal(data, &spec); err != nil {
|
if err := json.Unmarshal(data, &spec); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
typeConverter, err := internal.NewTypeConverter(&spec, false)
|
|
||||||
|
for k, v := range spec.Definitions {
|
||||||
|
vCopy := v
|
||||||
|
convertedDefs[k] = &vCopy
|
||||||
|
}
|
||||||
|
|
||||||
|
typeConverter, err := internal.NewTypeConverter(convertedDefs, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -42,23 +42,14 @@ type typeConverter struct {
|
|||||||
|
|
||||||
var _ TypeConverter = &typeConverter{}
|
var _ TypeConverter = &typeConverter{}
|
||||||
|
|
||||||
// NewTypeConverter builds a TypeConverter from a spec.Swagger. This
|
func NewTypeConverter(openapiSpec map[string]*spec.Schema, preserveUnknownFields bool) (TypeConverter, error) {
|
||||||
// will automatically find the proper version of the object, and the
|
typeSchema, err := schemaconv.ToSchemaFromOpenAPI(openapiSpec, preserveUnknownFields)
|
||||||
// corresponding schema information.
|
|
||||||
func NewTypeConverter(openapiSpec *spec.Swagger, preserveUnknownFields bool) (TypeConverter, error) {
|
|
||||||
pointerDefs := map[string]*spec.Schema{}
|
|
||||||
for k, v := range openapiSpec.Definitions {
|
|
||||||
vCopy := v
|
|
||||||
pointerDefs[k] = &vCopy
|
|
||||||
}
|
|
||||||
|
|
||||||
typeSchema, err := schemaconv.ToSchemaFromOpenAPI(pointerDefs, preserveUnknownFields)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to convert models to schema: %v", err)
|
return nil, fmt.Errorf("failed to convert models to schema: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
typeParser := typed.Parser{Schema: smdschema.Schema{Types: typeSchema.Types}}
|
typeParser := typed.Parser{Schema: smdschema.Schema{Types: typeSchema.Types}}
|
||||||
tr := indexModels(&typeParser, pointerDefs)
|
tr := indexModels(&typeParser, openapiSpec)
|
||||||
|
|
||||||
return &typeConverter{parser: tr}, nil
|
return &typeConverter{parser: tr}, nil
|
||||||
}
|
}
|
||||||
|
@ -36,11 +36,17 @@ var testTypeConverter = func() TypeConverter {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
spec := spec.Swagger{}
|
swag := spec.Swagger{}
|
||||||
if err := json.Unmarshal(data, &spec); err != nil {
|
if err := json.Unmarshal(data, &swag); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
typeConverter, err := NewTypeConverter(&spec, false)
|
|
||||||
|
convertedDefs := map[string]*spec.Schema{}
|
||||||
|
for k, v := range swag.Definitions {
|
||||||
|
vCopy := v
|
||||||
|
convertedDefs[k] = &vCopy
|
||||||
|
}
|
||||||
|
typeConverter, err := NewTypeConverter(convertedDefs, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -34,9 +34,14 @@ func NewDeducedTypeConverter() TypeConverter {
|
|||||||
return internal.NewDeducedTypeConverter()
|
return internal.NewDeducedTypeConverter()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTypeConverter builds a TypeConverter from a proto.Models. This
|
// NewTypeConverter builds a TypeConverter from a map of OpenAPIV3 schemas.
|
||||||
// will automatically find the proper version of the object, and the
|
// This will automatically find the proper version of the object, and the
|
||||||
// corresponding schema information.
|
// corresponding schema information.
|
||||||
func NewTypeConverter(openapiSpec *spec.Swagger, preserveUnknownFields bool) (TypeConverter, error) {
|
// The keys to the map must be consistent with the names
|
||||||
|
// used by Refs within the schemas.
|
||||||
|
// The schemas should conform to the Kubernetes Structural Schema OpenAPI
|
||||||
|
// restrictions found in docs:
|
||||||
|
// https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#specifying-a-structural-schema
|
||||||
|
func NewTypeConverter(openapiSpec map[string]*spec.Schema, preserveUnknownFields bool) (TypeConverter, error) {
|
||||||
return internal.NewTypeConverter(openapiSpec, preserveUnknownFields)
|
return internal.NewTypeConverter(openapiSpec, preserveUnknownFields)
|
||||||
}
|
}
|
||||||
|
@ -345,13 +345,6 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
|
|||||||
isCreater = true
|
isCreater = true
|
||||||
}
|
}
|
||||||
|
|
||||||
var resetFields map[fieldpath.APIVersion]*fieldpath.Set
|
|
||||||
if a.group.OpenAPIModels != nil {
|
|
||||||
if resetFieldsStrategy, isResetFieldsStrategy := storage.(rest.ResetFieldsStrategy); isResetFieldsStrategy {
|
|
||||||
resetFields = resetFieldsStrategy.GetResetFields()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var versionedList interface{}
|
var versionedList interface{}
|
||||||
if isLister {
|
if isLister {
|
||||||
list := lister.NewList()
|
list := lister.NewList()
|
||||||
@ -680,7 +673,16 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
|
|||||||
if a.group.MetaGroupVersion != nil {
|
if a.group.MetaGroupVersion != nil {
|
||||||
reqScope.MetaGroupVersion = *a.group.MetaGroupVersion
|
reqScope.MetaGroupVersion = *a.group.MetaGroupVersion
|
||||||
}
|
}
|
||||||
if a.group.OpenAPIModels != nil {
|
|
||||||
|
// Use TypeConverter's nil-ness as a proxy for whether SSA/OpenAPI is enabled
|
||||||
|
// This should be removed in the future and made unconditional
|
||||||
|
// https://github.com/kubernetes/kubernetes/pull/114998
|
||||||
|
if a.group.TypeConverter != nil {
|
||||||
|
var resetFields map[fieldpath.APIVersion]*fieldpath.Set
|
||||||
|
if resetFieldsStrategy, isResetFieldsStrategy := storage.(rest.ResetFieldsStrategy); isResetFieldsStrategy {
|
||||||
|
resetFields = resetFieldsStrategy.GetResetFields()
|
||||||
|
}
|
||||||
|
|
||||||
reqScope.FieldManager, err = fieldmanager.NewDefaultFieldManager(
|
reqScope.FieldManager, err = fieldmanager.NewDefaultFieldManager(
|
||||||
a.group.TypeConverter,
|
a.group.TypeConverter,
|
||||||
a.group.UnsafeConvertor,
|
a.group.UnsafeConvertor,
|
||||||
@ -695,6 +697,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
|
|||||||
return nil, nil, fmt.Errorf("failed to create field manager: %v", err)
|
return nil, nil, fmt.Errorf("failed to create field manager: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, action := range actions {
|
for _, action := range actions {
|
||||||
producedObject := storageMeta.ProducesObject(action.Verb)
|
producedObject := storageMeta.ProducesObject(action.Verb)
|
||||||
if producedObject == nil {
|
if producedObject == nil {
|
||||||
|
@ -53,7 +53,7 @@ import (
|
|||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
openapibuilder2 "k8s.io/kube-openapi/pkg/builder"
|
openapibuilder3 "k8s.io/kube-openapi/pkg/builder3"
|
||||||
openapicommon "k8s.io/kube-openapi/pkg/common"
|
openapicommon "k8s.io/kube-openapi/pkg/common"
|
||||||
"k8s.io/kube-openapi/pkg/handler"
|
"k8s.io/kube-openapi/pkg/handler"
|
||||||
"k8s.io/kube-openapi/pkg/handler3"
|
"k8s.io/kube-openapi/pkg/handler3"
|
||||||
@ -89,7 +89,7 @@ type APIGroupInfo struct {
|
|||||||
|
|
||||||
// StaticOpenAPISpec is the spec derived from the definitions of all resources installed together.
|
// StaticOpenAPISpec is the spec derived from the definitions of all resources installed together.
|
||||||
// It is set during InstallAPIGroups, InstallAPIGroup, and InstallLegacyAPIGroup.
|
// It is set during InstallAPIGroups, InstallAPIGroup, and InstallLegacyAPIGroup.
|
||||||
StaticOpenAPISpec *spec.Swagger
|
StaticOpenAPISpec map[string]*spec.Schema
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *APIGroupInfo) destroyStorage() {
|
func (a *APIGroupInfo) destroyStorage() {
|
||||||
@ -736,7 +736,16 @@ func (s preparedGenericAPIServer) NonBlockingRun(stopCh <-chan struct{}, shutdow
|
|||||||
}
|
}
|
||||||
|
|
||||||
// installAPIResources is a private method for installing the REST storage backing each api groupversionresource
|
// installAPIResources is a private method for installing the REST storage backing each api groupversionresource
|
||||||
func (s *GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *APIGroupInfo, openAPIModels *spec.Swagger) error {
|
func (s *GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *APIGroupInfo, openAPIModels map[string]*spec.Schema) error {
|
||||||
|
var typeConverter fieldmanager.TypeConverter
|
||||||
|
|
||||||
|
if len(openAPIModels) > 0 {
|
||||||
|
var err error
|
||||||
|
typeConverter, err = fieldmanager.NewTypeConverter(openAPIModels, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
var resourceInfos []*storageversion.ResourceInfo
|
var resourceInfos []*storageversion.ResourceInfo
|
||||||
for _, groupVersion := range apiGroupInfo.PrioritizedVersions {
|
for _, groupVersion := range apiGroupInfo.PrioritizedVersions {
|
||||||
if len(apiGroupInfo.VersionedResourcesStorageMap[groupVersion.Version]) == 0 {
|
if len(apiGroupInfo.VersionedResourcesStorageMap[groupVersion.Version]) == 0 {
|
||||||
@ -751,16 +760,7 @@ func (s *GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *A
|
|||||||
if apiGroupInfo.OptionsExternalVersion != nil {
|
if apiGroupInfo.OptionsExternalVersion != nil {
|
||||||
apiGroupVersion.OptionsExternalVersion = apiGroupInfo.OptionsExternalVersion
|
apiGroupVersion.OptionsExternalVersion = apiGroupInfo.OptionsExternalVersion
|
||||||
}
|
}
|
||||||
apiGroupVersion.OpenAPIModels = openAPIModels
|
apiGroupVersion.TypeConverter = typeConverter
|
||||||
|
|
||||||
if openAPIModels != nil {
|
|
||||||
typeConverter, err := fieldmanager.NewTypeConverter(openAPIModels, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
apiGroupVersion.TypeConverter = typeConverter
|
|
||||||
}
|
|
||||||
|
|
||||||
apiGroupVersion.MaxRequestBodyBytes = s.maxRequestBodyBytes
|
apiGroupVersion.MaxRequestBodyBytes = s.maxRequestBodyBytes
|
||||||
|
|
||||||
discoveryAPIResources, r, err := apiGroupVersion.InstallREST(s.Handler.GoRestfulContainer)
|
discoveryAPIResources, r, err := apiGroupVersion.InstallREST(s.Handler.GoRestfulContainer)
|
||||||
@ -951,8 +951,10 @@ func NewDefaultAPIGroupInfo(group string, scheme *runtime.Scheme, parameterCodec
|
|||||||
}
|
}
|
||||||
|
|
||||||
// getOpenAPIModels is a private method for getting the OpenAPI models
|
// getOpenAPIModels is a private method for getting the OpenAPI models
|
||||||
func (s *GenericAPIServer) getOpenAPIModels(apiPrefix string, apiGroupInfos ...*APIGroupInfo) (*spec.Swagger, error) {
|
func (s *GenericAPIServer) getOpenAPIModels(apiPrefix string, apiGroupInfos ...*APIGroupInfo) (map[string]*spec.Schema, error) {
|
||||||
if s.openAPIConfig == nil {
|
if s.openAPIV3Config == nil {
|
||||||
|
//!TODO: A future work should add a requirement that
|
||||||
|
// OpenAPIV3 config is required. May require some refactoring of tests.
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
pathsToIgnore := openapiutil.NewTrie(s.openAPIConfig.IgnorePrefixes)
|
pathsToIgnore := openapiutil.NewTrie(s.openAPIConfig.IgnorePrefixes)
|
||||||
@ -966,7 +968,7 @@ func (s *GenericAPIServer) getOpenAPIModels(apiPrefix string, apiGroupInfos ...*
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Build the openapi definitions for those resources and convert it to proto models
|
// Build the openapi definitions for those resources and convert it to proto models
|
||||||
openAPISpec, err := openapibuilder2.BuildOpenAPIDefinitionsForResources(s.openAPIConfig, resourceNames...)
|
openAPISpec, err := openapibuilder3.BuildOpenAPIDefinitionsForResources(s.openAPIV3Config, resourceNames...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user