From acabe8615340d50729d5749eb98e7f5f0fdcb914 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Wed, 2 Jul 2025 19:32:01 -0700 Subject: [PATCH] APIServer: Exclude internal GroupVersionKind from openapi (#107551) --- pkg/services/apiserver/builder/openapi.go | 37 +++++++++--- .../advisor.grafana.app-v0alpha1.json | 20 ------- .../folder.grafana.app-v1beta1.json | 25 -------- .../iam.grafana.app-v0alpha1.json | 60 ------------------- .../investigations.grafana.app-v0alpha1.json | 20 ------- ...cations.alerting.grafana.app-v0alpha1.json | 40 ------------- .../playlist.grafana.app-v0alpha1.json | 10 ---- .../provisioning.grafana.app-v0alpha1.json | 40 ------------- 8 files changed, 30 insertions(+), 222 deletions(-) diff --git a/pkg/services/apiserver/builder/openapi.go b/pkg/services/apiserver/builder/openapi.go index 206531ca5dc..b708e372d16 100644 --- a/pkg/services/apiserver/builder/openapi.go +++ b/pkg/services/apiserver/builder/openapi.go @@ -4,21 +4,23 @@ import ( "maps" "strings" - common "k8s.io/kube-openapi/pkg/common" + openapi "k8s.io/kube-openapi/pkg/common" "k8s.io/kube-openapi/pkg/spec3" spec "k8s.io/kube-openapi/pkg/validation/spec" data "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1" - "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" + common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1" + secret "github.com/grafana/grafana/pkg/apis/secret/v0alpha1" ) // This should eventually live in grafana-app-sdk -func GetOpenAPIDefinitions(builders []APIGroupBuilder) common.GetOpenAPIDefinitions { - return func(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { - defs := v0alpha1.GetOpenAPIDefinitions(ref) // common grafana apis +func GetOpenAPIDefinitions(builders []APIGroupBuilder) openapi.GetOpenAPIDefinitions { + return func(ref openapi.ReferenceCallback) map[string]openapi.OpenAPIDefinition { + defs := common.GetOpenAPIDefinitions(ref) // common grafana apis maps.Copy(defs, data.GetOpenAPIDefinitions(ref)) + maps.Copy(defs, secret.GetOpenAPIDefinitions(ref)) // Expose secret reference to all resources // TODO: add timerange to upstream SDK setup - maps.Copy(defs, map[string]common.OpenAPIDefinition{ + maps.Copy(defs, map[string]openapi.OpenAPIDefinition{ "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1.TimeRange": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -117,8 +119,29 @@ func getOpenAPIPostProcessor(version string, builders []APIGroupBuilder) func(*s // Remove the growing list of kinds for k, v := range copy.Components.Schemas { - if strings.HasPrefix(k, "io.k8s.apimachinery.pkg.apis.meta.v1") && v.Extensions != nil { + if v.Extensions == nil { + continue + } + if strings.HasPrefix(k, "io.k8s.apimachinery.pkg.apis.meta.v1") { delete(v.Extensions, "x-kubernetes-group-version-kind") // a growing list of everything + continue + } + + // Remove the internal annotations + val, ok := v.Extensions["x-kubernetes-group-version-kind"] + if ok { + gvks, ok := val.([]any) + if ok { + keep := make([]map[string]any, 0, len(gvks)) + for _, val := range gvks { + gvk, ok := val.(map[string]any) + if ok && gvk["version"] == "__internal" { + continue + } + keep = append(keep, gvk) + } + v.Extensions["x-kubernetes-group-version-kind"] = keep + } } } diff --git a/pkg/tests/apis/openapi_snapshots/advisor.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/advisor.grafana.app-v0alpha1.json index 1fb2aa6d751..7ef15e8f82b 100644 --- a/pkg/tests/apis/openapi_snapshots/advisor.grafana.app-v0alpha1.json +++ b/pkg/tests/apis/openapi_snapshots/advisor.grafana.app-v0alpha1.json @@ -1740,11 +1740,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "advisor.grafana.app", - "kind": "Check", - "version": "__internal" - }, { "group": "advisor.grafana.app", "kind": "Check", @@ -1807,11 +1802,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "advisor.grafana.app", - "kind": "CheckList", - "version": "__internal" - }, { "group": "advisor.grafana.app", "kind": "CheckList", @@ -1957,11 +1947,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "advisor.grafana.app", - "kind": "CheckType", - "version": "__internal" - }, { "group": "advisor.grafana.app", "kind": "CheckType", @@ -2005,11 +1990,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "advisor.grafana.app", - "kind": "CheckTypeList", - "version": "__internal" - }, { "group": "advisor.grafana.app", "kind": "CheckTypeList", diff --git a/pkg/tests/apis/openapi_snapshots/folder.grafana.app-v1beta1.json b/pkg/tests/apis/openapi_snapshots/folder.grafana.app-v1beta1.json index fe18767f3f3..653549d0bdb 100644 --- a/pkg/tests/apis/openapi_snapshots/folder.grafana.app-v1beta1.json +++ b/pkg/tests/apis/openapi_snapshots/folder.grafana.app-v1beta1.json @@ -1043,11 +1043,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "folder.grafana.app", - "kind": "DescendantCounts", - "version": "__internal" - }, { "group": "folder.grafana.app", "kind": "DescendantCounts", @@ -1098,11 +1093,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "folder.grafana.app", - "kind": "Folder", - "version": "__internal" - }, { "group": "folder.grafana.app", "kind": "Folder", @@ -1146,11 +1136,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "folder.grafana.app", - "kind": "FolderAccessInfo", - "version": "__internal" - }, { "group": "folder.grafana.app", "kind": "FolderAccessInfo", @@ -1230,11 +1215,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "folder.grafana.app", - "kind": "FolderInfoList", - "version": "__internal" - }, { "group": "folder.grafana.app", "kind": "FolderInfoList", @@ -1278,11 +1258,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "folder.grafana.app", - "kind": "FolderList", - "version": "__internal" - }, { "group": "folder.grafana.app", "kind": "FolderList", diff --git a/pkg/tests/apis/openapi_snapshots/iam.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/iam.grafana.app-v0alpha1.json index ae580b54a56..3d70923422a 100644 --- a/pkg/tests/apis/openapi_snapshots/iam.grafana.app-v0alpha1.json +++ b/pkg/tests/apis/openapi_snapshots/iam.grafana.app-v0alpha1.json @@ -1824,11 +1824,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "SSOSetting", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "SSOSetting", @@ -1871,11 +1866,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "SSOSettingList", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "SSOSettingList", @@ -1934,11 +1924,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "ServiceAccount", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "ServiceAccount", @@ -1981,11 +1966,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "ServiceAccountList", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "ServiceAccountList", @@ -2075,11 +2055,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "Team", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "Team", @@ -2116,11 +2091,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "TeamBinding", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "TeamBinding", @@ -2163,11 +2133,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "TeamBindingList", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "TeamBindingList", @@ -2234,11 +2199,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "TeamList", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "TeamList", @@ -2324,11 +2284,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "TeamMemberList", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "TeamMemberList", @@ -2410,11 +2365,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "User", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "User", @@ -2457,11 +2407,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "UserList", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "UserList", @@ -2548,11 +2493,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "iam.grafana.app", - "kind": "UserTeamList", - "version": "__internal" - }, { "group": "iam.grafana.app", "kind": "UserTeamList", diff --git a/pkg/tests/apis/openapi_snapshots/investigations.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/investigations.grafana.app-v0alpha1.json index c768321d510..017323b2a1e 100644 --- a/pkg/tests/apis/openapi_snapshots/investigations.grafana.app-v0alpha1.json +++ b/pkg/tests/apis/openapi_snapshots/investigations.grafana.app-v0alpha1.json @@ -1741,11 +1741,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "investigations.grafana.app", - "kind": "Investigation", - "version": "__internal" - }, { "group": "investigations.grafana.app", "kind": "Investigation", @@ -1892,11 +1887,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "investigations.grafana.app", - "kind": "InvestigationIndex", - "version": "__internal" - }, { "group": "investigations.grafana.app", "kind": "InvestigationIndex", @@ -2031,11 +2021,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "investigations.grafana.app", - "kind": "InvestigationIndexList", - "version": "__internal" - }, { "group": "investigations.grafana.app", "kind": "InvestigationIndexList", @@ -2218,11 +2203,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "investigations.grafana.app", - "kind": "InvestigationList", - "version": "__internal" - }, { "group": "investigations.grafana.app", "kind": "InvestigationList", diff --git a/pkg/tests/apis/openapi_snapshots/notifications.alerting.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/notifications.alerting.grafana.app-v0alpha1.json index c2668e45ba6..569369c3733 100644 --- a/pkg/tests/apis/openapi_snapshots/notifications.alerting.grafana.app-v0alpha1.json +++ b/pkg/tests/apis/openapi_snapshots/notifications.alerting.grafana.app-v0alpha1.json @@ -3401,11 +3401,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "notifications.alerting.grafana.app", - "kind": "Receiver", - "version": "__internal" - }, { "group": "notifications.alerting.grafana.app", "kind": "Receiver", @@ -3481,11 +3476,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "notifications.alerting.grafana.app", - "kind": "ReceiverList", - "version": "__internal" - }, { "group": "notifications.alerting.grafana.app", "kind": "ReceiverList", @@ -3614,11 +3604,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "notifications.alerting.grafana.app", - "kind": "RoutingTree", - "version": "__internal" - }, { "group": "notifications.alerting.grafana.app", "kind": "RoutingTree", @@ -3662,11 +3647,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "notifications.alerting.grafana.app", - "kind": "RoutingTreeList", - "version": "__internal" - }, { "group": "notifications.alerting.grafana.app", "kind": "RoutingTreeList", @@ -3916,11 +3896,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "notifications.alerting.grafana.app", - "kind": "TemplateGroup", - "version": "__internal" - }, { "group": "notifications.alerting.grafana.app", "kind": "TemplateGroup", @@ -3964,11 +3939,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "notifications.alerting.grafana.app", - "kind": "TemplateGroupList", - "version": "__internal" - }, { "group": "notifications.alerting.grafana.app", "kind": "TemplateGroupList", @@ -4090,11 +4060,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "notifications.alerting.grafana.app", - "kind": "TimeInterval", - "version": "__internal" - }, { "group": "notifications.alerting.grafana.app", "kind": "TimeInterval", @@ -4185,11 +4150,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "notifications.alerting.grafana.app", - "kind": "TimeIntervalList", - "version": "__internal" - }, { "group": "notifications.alerting.grafana.app", "kind": "TimeIntervalList", diff --git a/pkg/tests/apis/openapi_snapshots/playlist.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/playlist.grafana.app-v0alpha1.json index 2926b4997ef..a5fe373b77a 100644 --- a/pkg/tests/apis/openapi_snapshots/playlist.grafana.app-v0alpha1.json +++ b/pkg/tests/apis/openapi_snapshots/playlist.grafana.app-v0alpha1.json @@ -911,11 +911,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "playlist.grafana.app", - "kind": "Playlist", - "version": "__internal" - }, { "group": "playlist.grafana.app", "kind": "Playlist", @@ -978,11 +973,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "playlist.grafana.app", - "kind": "PlaylistList", - "version": "__internal" - }, { "group": "playlist.grafana.app", "kind": "PlaylistList", diff --git a/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json index f55b3f751ca..8079e4bf0b4 100644 --- a/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json +++ b/pkg/tests/apis/openapi_snapshots/provisioning.grafana.app-v0alpha1.json @@ -2776,11 +2776,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "provisioning.grafana.app", - "kind": "Job", - "version": "__internal" - }, { "group": "provisioning.grafana.app", "kind": "Job", @@ -2823,11 +2818,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "provisioning.grafana.app", - "kind": "JobList", - "version": "__internal" - }, { "group": "provisioning.grafana.app", "kind": "JobList", @@ -3085,11 +3075,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "provisioning.grafana.app", - "kind": "Repository", - "version": "__internal" - }, { "group": "provisioning.grafana.app", "kind": "Repository", @@ -3133,11 +3118,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "provisioning.grafana.app", - "kind": "RepositoryList", - "version": "__internal" - }, { "group": "provisioning.grafana.app", "kind": "RepositoryList", @@ -3426,11 +3406,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "provisioning.grafana.app", - "kind": "ResourceList", - "version": "__internal" - }, { "group": "provisioning.grafana.app", "kind": "ResourceList", @@ -3737,11 +3712,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "provisioning.grafana.app", - "kind": "ResourceWrapper", - "version": "__internal" - }, { "group": "provisioning.grafana.app", "kind": "ResourceWrapper", @@ -3887,11 +3857,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "provisioning.grafana.app", - "kind": "TestResults", - "version": "__internal" - }, { "group": "provisioning.grafana.app", "kind": "TestResults", @@ -3929,11 +3894,6 @@ } }, "x-kubernetes-group-version-kind": [ - { - "group": "provisioning.grafana.app", - "kind": "WebhookResponse", - "version": "__internal" - }, { "group": "provisioning.grafana.app", "kind": "WebhookResponse",