diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e43d98d7724..0ca4d539fdf 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -731,10 +731,6 @@ embed.go @grafana/grafana-as-code /public/app/plugins/*gen.go @grafana/grafana-as-code /cue.mod/ @grafana/grafana-as-code -# Rendered OpenAPI from app platform -# Eventually each file owned by the right team, OR a structure with the rendered value under /apis/{group}/openapi -/openapi/ @grafana/grafana-app-platform-squad - # GitHub Workflows and Templates /.github/CODEOWNERS @tolzhabayev /.github/ISSUE_TEMPLATE/ @torkelo @sympatheticmoose diff --git a/openapi/README.md b/pkg/tests/apis/openapi_snapshots/README.md similarity index 100% rename from openapi/README.md rename to pkg/tests/apis/openapi_snapshots/README.md diff --git a/openapi/dashboard.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v0alpha1.json similarity index 100% rename from openapi/dashboard.grafana.app-v0alpha1.json rename to pkg/tests/apis/openapi_snapshots/dashboard.grafana.app-v0alpha1.json diff --git a/openapi/folder.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/folder.grafana.app-v0alpha1.json similarity index 100% rename from openapi/folder.grafana.app-v0alpha1.json rename to pkg/tests/apis/openapi_snapshots/folder.grafana.app-v0alpha1.json diff --git a/openapi/peakq.grafana.app-v0alpha1.json b/pkg/tests/apis/openapi_snapshots/peakq.grafana.app-v0alpha1.json similarity index 100% rename from openapi/peakq.grafana.app-v0alpha1.json rename to pkg/tests/apis/openapi_snapshots/peakq.grafana.app-v0alpha1.json diff --git a/pkg/tests/apis/core/openapi_test.go b/pkg/tests/apis/openapi_test.go similarity index 54% rename from pkg/tests/apis/core/openapi_test.go rename to pkg/tests/apis/openapi_test.go index c861f54f4fb..ec9cda563ca 100644 --- a/pkg/tests/apis/core/openapi_test.go +++ b/pkg/tests/apis/openapi_test.go @@ -1,4 +1,4 @@ -package core +package apis import ( "bytes" @@ -18,7 +18,6 @@ import ( "github.com/stretchr/testify/require" "github.com/grafana/grafana/pkg/services/featuremgmt" - "github.com/grafana/grafana/pkg/tests/apis" "github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testsuite" ) @@ -32,18 +31,7 @@ func TestIntegrationOpenAPIs(t *testing.T) { t.Skip("skipping integration test") } - check := []schema.GroupVersion{{ - Group: "dashboard.grafana.app", - Version: "v0alpha1", - }, { - Group: "folder.grafana.app", - Version: "v0alpha1", - }, { - Group: "peakq.grafana.app", - Version: "v0alpha1", - }} - - h := apis.NewK8sTestHelper(t, testinfra.GrafanaOpts{ + h := NewK8sTestHelper(t, testinfra.GrafanaOpts{ AppModeProduction: true, EnableFeatureToggles: []string{ featuremgmt.FlagKubernetesFoldersServiceV2, // Will be default on by G12 @@ -73,47 +61,64 @@ func TestIntegrationOpenAPIs(t *testing.T) { require.Equal(t, info.Minor, fmt.Sprintf("%d", v.Minor())) }) - t.Run("build open", func(t *testing.T) { - // Now write each OpenAPI spec to a static file - dir := filepath.Join("..", "..", "..", "..", "openapi") - for _, gv := range check { - path := fmt.Sprintf("/openapi/v3/apis/%s/%s", gv.Group, gv.Version) - rsp := apis.DoRequest(h, apis.RequestParams{ - Method: http.MethodGet, - Path: path, - User: h.Org1.Admin, - }, &apis.AnyResource{}) + dir := "openapi_snapshots" - require.NotNil(t, rsp.Response) - require.Equal(t, 200, rsp.Response.StatusCode, path) + for _, gv := range []schema.GroupVersion{{ + Group: "dashboard.grafana.app", + Version: "v0alpha1", + }, { + Group: "folder.grafana.app", + Version: "v0alpha1", + }, { + Group: "peakq.grafana.app", + Version: "v0alpha1", + }} { + VerifyOpenAPISnapshots(t, dir, gv, h) + } +} - var prettyJSON bytes.Buffer - err := json.Indent(&prettyJSON, rsp.Body, "", " ") - require.NoError(t, err) - pretty := prettyJSON.String() +// This function should be moved to oss (it is now a duplicate) +func VerifyOpenAPISnapshots(t *testing.T, dir string, gv schema.GroupVersion, h *K8sTestHelper) { + if gv.Group == "" { + return // skip invalid groups + } + path := fmt.Sprintf("/openapi/v3/apis/%s/%s", gv.Group, gv.Version) + t.Run(path, func(t *testing.T) { + rsp := DoRequest(h, RequestParams{ + Method: http.MethodGet, + Path: path, + User: h.Org1.Admin, + }, &AnyResource{}) - write := false - fpath := filepath.Join(dir, fmt.Sprintf("%s-%s.json", gv.Group, gv.Version)) + require.NotNil(t, rsp.Response) + require.Equal(t, 200, rsp.Response.StatusCode, path) - // nolint:gosec - // We can ignore the gosec G304 warning since this is a test and the function is only called with explicit paths - body, err := os.ReadFile(fpath) - if err == nil { - if !assert.JSONEq(t, string(body), pretty) { - t.Logf("openapi spec has changed: %s", path) - t.Fail() - write = true - } - } else { - t.Errorf("missing openapi spec for: %s", path) + var prettyJSON bytes.Buffer + err := json.Indent(&prettyJSON, rsp.Body, "", " ") + require.NoError(t, err) + pretty := prettyJSON.String() + + write := false + fpath := filepath.Join(dir, fmt.Sprintf("%s-%s.json", gv.Group, gv.Version)) + + // nolint:gosec + // We can ignore the gosec G304 warning since this is a test and the function is only called with explicit paths + body, err := os.ReadFile(fpath) + if err == nil { + if !assert.JSONEq(t, string(body), pretty) { + t.Logf("openapi spec has changed: %s", path) + t.Fail() write = true } + } else { + t.Errorf("missing openapi spec for: %s", path) + write = true + } - if write { - e2 := os.WriteFile(fpath, []byte(pretty), 0644) - if e2 != nil { - t.Errorf("error writing file: %s", e2.Error()) - } + if write { + e2 := os.WriteFile(fpath, []byte(pretty), 0644) + if e2 != nil { + t.Errorf("error writing file: %s", e2.Error()) } } })