From c7a5c4f069723980fbf74fe27c358f743b4a3577 Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Thu, 12 Mar 2020 14:01:40 -0700 Subject: [PATCH] Only drop API type if replacement type can be found --- pkg/clustercache/controller.go | 8 ------- pkg/controllers/schema/schemas.go | 30 ++++++++++++++++++++++++--- pkg/schema/converter/crd.go | 2 +- pkg/schema/converter/discovery.go | 4 ++-- pkg/schema/converter/k8stonorman.go | 2 +- pkg/schema/converter/openapi.go | 2 +- pkg/server/resources/counts/counts.go | 8 ------- 7 files changed, 32 insertions(+), 24 deletions(-) diff --git a/pkg/clustercache/controller.go b/pkg/clustercache/controller.go index f4fba9d..b082b79 100644 --- a/pkg/clustercache/controller.go +++ b/pkg/clustercache/controller.go @@ -89,14 +89,6 @@ func validSchema(schema *types.APISchema) bool { return false } - if attributes.PreferredVersion(schema) != "" { - return false - } - - if attributes.PreferredGroup(schema) != "" { - return false - } - return true } diff --git a/pkg/controllers/schema/schemas.go b/pkg/controllers/schema/schemas.go index f6d5aef..6e4c7e2 100644 --- a/pkg/controllers/schema/schemas.go +++ b/pkg/controllers/schema/schemas.go @@ -24,7 +24,10 @@ import ( ) var ( - listPool = semaphore.NewWeighted(10) + listPool = semaphore.NewWeighted(10) + typeNameChanges = map[string]string{ + "extensions.v1beta1.ingress": "networking.k8s.io.v1beta1.ingress", + } ) type SchemasHandler interface { @@ -151,8 +154,7 @@ func (h *handler) refreshAll() error { filteredSchemas := map[string]*types.APISchema{} for _, schema := range schemas { if isListWatchable(schema) { - if attributes.PreferredGroup(schema) != "" || - attributes.PreferredVersion(schema) != "" { + if preferredTypeExists(schema, schemas) { continue } if ok, err := h.allowed(schema); err != nil { @@ -183,6 +185,28 @@ func (h *handler) refreshAll() error { return nil } +func preferredTypeExists(schema *types.APISchema, schemas map[string]*types.APISchema) bool { + if replacement, ok := typeNameChanges[schema.ID]; ok && schemas[replacement] != nil { + return true + } + pg := attributes.PreferredGroup(schema) + pv := attributes.PreferredVersion(schema) + if pg == "" && pv == "" { + return false + } + + gvk := attributes.GVK(schema) + if pg != "" { + gvk.Group = pg + } + if pv != "" { + gvk.Version = pv + } + + _, ok := schemas[converter.GVKToVersionedSchemaID(gvk)] + return ok +} + func (h *handler) allowed(schema *types.APISchema) (bool, error) { gvr := attributes.GVR(schema) ssar, err := h.ssar.Create(&authorizationv1.SelfSubjectAccessReview{ diff --git a/pkg/schema/converter/crd.go b/pkg/schema/converter/crd.go index e868361..492bf21 100644 --- a/pkg/schema/converter/crd.go +++ b/pkg/schema/converter/crd.go @@ -72,7 +72,7 @@ func forVersion(crd *beta1.CustomResourceDefinition, group, version, kind string versionColumns = columns } - id := gvkToSchemaID(schema.GroupVersionKind{ + id := GVKToVersionedSchemaID(schema.GroupVersionKind{ Group: group, Version: version, Kind: kind, diff --git a/pkg/schema/converter/discovery.go b/pkg/schema/converter/discovery.go index 9b541e1..c23da18 100644 --- a/pkg/schema/converter/discovery.go +++ b/pkg/schema/converter/discovery.go @@ -69,11 +69,11 @@ func refresh(gv schema.GroupVersion, groupToPreferredVersion map[string]string, logrus.Infof("APIVersion %s/%s Kind %s", gvk.Group, gvk.Version, gvk.Kind) - schema := schemasMap[gvkToSchemaID(gvk)] + schema := schemasMap[GVKToVersionedSchemaID(gvk)] if schema == nil { schema = &types.APISchema{ Schema: &schemas.Schema{ - ID: gvkToSchemaID(gvk), + ID: GVKToVersionedSchemaID(gvk), }, } attributes.SetGVK(schema, gvk) diff --git a/pkg/schema/converter/k8stonorman.go b/pkg/schema/converter/k8stonorman.go index 5ee53b0..a1a5f54 100644 --- a/pkg/schema/converter/k8stonorman.go +++ b/pkg/schema/converter/k8stonorman.go @@ -10,7 +10,7 @@ import ( "k8s.io/client-go/discovery" ) -func gvkToSchemaID(gvk schema.GroupVersionKind) string { +func GVKToVersionedSchemaID(gvk schema.GroupVersionKind) string { if gvk.Group == "" { return strings.ToLower(fmt.Sprintf("core.%s.%s", gvk.Version, gvk.Kind)) } diff --git a/pkg/schema/converter/openapi.go b/pkg/schema/converter/openapi.go index e771453..76bd5da 100644 --- a/pkg/schema/converter/openapi.go +++ b/pkg/schema/converter/openapi.go @@ -41,7 +41,7 @@ func modelToSchema(modelName string, k *proto.Kind) *types.APISchema { Kind: convert.ToString(m["kind"]), } - s.ID = gvkToSchemaID(gvk) + s.ID = GVKToVersionedSchemaID(gvk) attributes.SetGVK(&s, gvk) } } diff --git a/pkg/server/resources/counts/counts.go b/pkg/server/resources/counts/counts.go index e3f06d6..9fa7137 100644 --- a/pkg/server/resources/counts/counts.go +++ b/pkg/server/resources/counts/counts.go @@ -182,14 +182,6 @@ func (s *Store) schemasToWatch(apiOp *types.APIRequest) (result []*types.APISche continue } - if attributes.PreferredVersion(schema) != "" { - continue - } - - if attributes.PreferredGroup(schema) != "" { - continue - } - if schema.Store == nil { continue }