From 169abcc0398434d5ddbd057600adc145e5dabf66 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Tue, 23 May 2023 15:57:15 +0200 Subject: [PATCH] openapi: reference shared parameters --- .../openapi/builder/builder_test.go | 2 +- .../pkg/controller/openapi/builder/merge.go | 24 ++++++++++++++----- .../openapi/aggregator/aggregator.go | 5 ++-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/builder_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/builder_test.go index 497df29c38d..275e3d8d064 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/builder_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/builder_test.go @@ -520,7 +520,7 @@ func TestCRDRouteParameterBuilder(t *testing.T) { hasNamespaceParam := false hasNameParam := false for _, param := range path.Parameters { - if param.In == "path" && param.Name == "namespace" { + if strings.HasPrefix(param.Ref.String(), "#/parameters/namespace-") { hasNamespaceParam = true } if param.In == "path" && param.Name == "name" { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/merge.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/merge.go index be8b571ee90..7bb05b82462 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/merge.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder/merge.go @@ -35,14 +35,20 @@ func MergeSpecs(staticSpec *spec.Swagger, crdSpecs ...*spec.Swagger) (*spec.Swag // create shallow copy of staticSpec, but replace paths and definitions because we modify them. specToReturn := *staticSpec if staticSpec.Definitions != nil { - specToReturn.Definitions = spec.Definitions{} + specToReturn.Definitions = make(spec.Definitions, len(staticSpec.Definitions)) for k, s := range staticSpec.Definitions { specToReturn.Definitions[k] = s } } + if staticSpec.Parameters != nil { + specToReturn.Parameters = make(map[string]spec.Parameter, len(staticSpec.Parameters)) + for k, s := range staticSpec.Parameters { + specToReturn.Parameters[k] = s + } + } if staticSpec.Paths != nil { specToReturn.Paths = &spec.Paths{ - Paths: map[string]spec.PathItem{}, + Paths: make(map[string]spec.PathItem, len(staticSpec.Paths.Paths)), } for k, p := range staticSpec.Paths.Paths { specToReturn.Paths.Paths[k] = p @@ -58,13 +64,13 @@ func MergeSpecs(staticSpec *spec.Swagger, crdSpecs ...*spec.Swagger) (*spec.Swag // The static spec has the highest priority. Resolve conflicts to prevent user-defined // CRDs potentially overlapping the built-in apiextensions API - if err := aggregator.MergeSpecsIgnorePathConflict(&specToReturn, crdSpec); err != nil { + if err := aggregator.MergeSpecsIgnorePathConflictRenamingDefinitionsAndParameters(&specToReturn, crdSpec); err != nil { return nil, err } return &specToReturn, nil } -// mergeSpec copies paths and definitions from source to dest, mutating dest, but not source. +// mergeSpec copies paths, parameters and definitions from source to dest, mutating dest, but not source. // We assume that conflicts do not matter. func mergeSpec(dest, source *spec.Swagger) { if source == nil || source.Paths == nil { @@ -75,13 +81,19 @@ func mergeSpec(dest, source *spec.Swagger) { } for k, v := range source.Definitions { if dest.Definitions == nil { - dest.Definitions = spec.Definitions{} + dest.Definitions = make(spec.Definitions, len(source.Definitions)) } dest.Definitions[k] = v } + for k, v := range source.Parameters { + if dest.Parameters == nil { + dest.Parameters = make(map[string]spec.Parameter, len(source.Parameters)) + } + dest.Parameters[k] = v + } for k, v := range source.Paths.Paths { if dest.Paths.Paths == nil { - dest.Paths.Paths = map[string]spec.PathItem{} + dest.Paths.Paths = make(map[string]spec.PathItem, len(source.Paths.Paths)) } dest.Paths.Paths[k] = v } diff --git a/staging/src/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator/aggregator.go b/staging/src/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator/aggregator.go index 733da8d46f1..6764edd328d 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator/aggregator.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/controllers/openapi/aggregator/aggregator.go @@ -191,11 +191,12 @@ func (s *specAggregator) buildOpenAPISpec() (specToReturn *spec.Swagger, err err if specToReturn == nil { specToReturn = &spec.Swagger{} *specToReturn = *specInfo.spec - // Paths and Definitions are set by MergeSpecsIgnorePathConflict + // Paths, Definitions and parameters are set by MergeSpecsIgnorePathConflict specToReturn.Paths = nil specToReturn.Definitions = nil + specToReturn.Parameters = nil } - if err := aggregator.MergeSpecsIgnorePathConflict(specToReturn, specInfo.spec); err != nil { + if err := aggregator.MergeSpecsIgnorePathConflictRenamingDefinitionsAndParameters(specToReturn, specInfo.spec); err != nil { return nil, err } }