mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
K8s: remove dashboard summary abstraction (#89761)
This commit is contained in:
@@ -19,12 +19,6 @@ var DashboardResourceInfo = common.NewResourceInfo(GROUP, VERSION,
|
|||||||
func() runtime.Object { return &DashboardList{} },
|
func() runtime.Object { return &DashboardList{} },
|
||||||
)
|
)
|
||||||
|
|
||||||
var DashboardSummaryResourceInfo = common.NewResourceInfo(GROUP, VERSION,
|
|
||||||
"summary", "summary", "DashboardSummary",
|
|
||||||
func() runtime.Object { return &DashboardSummary{} },
|
|
||||||
func() runtime.Object { return &DashboardSummaryList{} },
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// SchemeGroupVersion is group version used to register these objects
|
// SchemeGroupVersion is group version used to register these objects
|
||||||
SchemeGroupVersion = schema.GroupVersion{Group: GROUP, Version: VERSION}
|
SchemeGroupVersion = schema.GroupVersion{Group: GROUP, Version: VERSION}
|
||||||
|
|||||||
@@ -27,29 +27,6 @@ type DashboardList struct {
|
|||||||
Items []Dashboard `json:"items,omitempty"`
|
Items []Dashboard `json:"items,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
|
||||||
type DashboardSummary struct {
|
|
||||||
metav1.TypeMeta `json:",inline"`
|
|
||||||
metav1.ObjectMeta `json:"metadata,omitempty"`
|
|
||||||
|
|
||||||
// The dashboard body
|
|
||||||
Spec DashboardSummarySpec `json:"spec,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type DashboardSummarySpec struct {
|
|
||||||
Title string `json:"title"`
|
|
||||||
Tags []string `json:"tags,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
|
||||||
type DashboardSummaryList struct {
|
|
||||||
metav1.TypeMeta `json:",inline"`
|
|
||||||
// +optional
|
|
||||||
metav1.ListMeta `json:"metadata,omitempty"`
|
|
||||||
|
|
||||||
Items []DashboardSummary `json:"items,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
type DashboardVersionList struct {
|
type DashboardVersionList struct {
|
||||||
metav1.TypeMeta `json:",inline"`
|
metav1.TypeMeta `json:",inline"`
|
||||||
|
|||||||
@@ -126,87 +126,6 @@ func (in *DashboardList) DeepCopyObject() runtime.Object {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *DashboardSummary) DeepCopyInto(out *DashboardSummary) {
|
|
||||||
*out = *in
|
|
||||||
out.TypeMeta = in.TypeMeta
|
|
||||||
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
|
|
||||||
in.Spec.DeepCopyInto(&out.Spec)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DashboardSummary.
|
|
||||||
func (in *DashboardSummary) DeepCopy() *DashboardSummary {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(DashboardSummary)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
|
|
||||||
func (in *DashboardSummary) DeepCopyObject() runtime.Object {
|
|
||||||
if c := in.DeepCopy(); c != nil {
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *DashboardSummaryList) DeepCopyInto(out *DashboardSummaryList) {
|
|
||||||
*out = *in
|
|
||||||
out.TypeMeta = in.TypeMeta
|
|
||||||
in.ListMeta.DeepCopyInto(&out.ListMeta)
|
|
||||||
if in.Items != nil {
|
|
||||||
in, out := &in.Items, &out.Items
|
|
||||||
*out = make([]DashboardSummary, len(*in))
|
|
||||||
for i := range *in {
|
|
||||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DashboardSummaryList.
|
|
||||||
func (in *DashboardSummaryList) DeepCopy() *DashboardSummaryList {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(DashboardSummaryList)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
|
|
||||||
func (in *DashboardSummaryList) DeepCopyObject() runtime.Object {
|
|
||||||
if c := in.DeepCopy(); c != nil {
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
|
||||||
func (in *DashboardSummarySpec) DeepCopyInto(out *DashboardSummarySpec) {
|
|
||||||
*out = *in
|
|
||||||
if in.Tags != nil {
|
|
||||||
in, out := &in.Tags, &out.Tags
|
|
||||||
*out = make([]string, len(*in))
|
|
||||||
copy(*out, *in)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DashboardSummarySpec.
|
|
||||||
func (in *DashboardSummarySpec) DeepCopy() *DashboardSummarySpec {
|
|
||||||
if in == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
out := new(DashboardSummarySpec)
|
|
||||||
in.DeepCopyInto(out)
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *DashboardVersionInfo) DeepCopyInto(out *DashboardVersionInfo) {
|
func (in *DashboardVersionInfo) DeepCopyInto(out *DashboardVersionInfo) {
|
||||||
*out = *in
|
*out = *in
|
||||||
|
|||||||
@@ -189,58 +189,6 @@ func (a *dashboardSqlAccess) GetDashboard(ctx context.Context, orgId int64, uid
|
|||||||
return nil, fmt.Errorf("not found")
|
return nil, fmt.Errorf("not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDashboards implements DashboardAccess.
|
|
||||||
func (a *dashboardSqlAccess) GetDashboardSummaries(ctx context.Context, query *DashboardQuery) (*dashboardsV0.DashboardSummaryList, error) {
|
|
||||||
rows, limit, err := a.getRows(ctx, query, true)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer func() { _ = rows.Close() }()
|
|
||||||
|
|
||||||
totalSize := 0
|
|
||||||
list := &dashboardsV0.DashboardSummaryList{}
|
|
||||||
for {
|
|
||||||
row, err := rows.Next()
|
|
||||||
if err != nil || row == nil {
|
|
||||||
return list, err
|
|
||||||
}
|
|
||||||
|
|
||||||
totalSize += row.Bytes
|
|
||||||
if len(list.Items) > 0 && (totalSize > query.MaxBytes || len(list.Items) >= limit) {
|
|
||||||
if query.Requirements.Folder != nil {
|
|
||||||
row.token.folder = *query.Requirements.Folder
|
|
||||||
}
|
|
||||||
list.Continue = row.token.String() // will skip this one but start here next time
|
|
||||||
return list, err
|
|
||||||
}
|
|
||||||
list.Items = append(list.Items, toSummary(row))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *dashboardSqlAccess) GetDashboardSummary(ctx context.Context, orgId int64, uid string) (*dashboardsV0.DashboardSummary, error) {
|
|
||||||
r, err := a.GetDashboardSummaries(ctx, &DashboardQuery{
|
|
||||||
OrgID: orgId,
|
|
||||||
UID: uid,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(r.Items) > 0 {
|
|
||||||
return &r.Items[0], nil
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("not found")
|
|
||||||
}
|
|
||||||
|
|
||||||
func toSummary(row *dashboardRow) dashboardsV0.DashboardSummary {
|
|
||||||
return dashboardsV0.DashboardSummary{
|
|
||||||
ObjectMeta: row.Dash.ObjectMeta,
|
|
||||||
Spec: dashboardsV0.DashboardSummarySpec{
|
|
||||||
Title: row.Title,
|
|
||||||
Tags: row.Tags,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *dashboardSqlAccess) doQuery(ctx context.Context, query string, args ...any) (*rowsWrapper, error) {
|
func (a *dashboardSqlAccess) doQuery(ctx context.Context, query string, args ...any) (*rowsWrapper, error) {
|
||||||
user, err := appcontext.User(ctx)
|
user, err := appcontext.User(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -30,9 +30,6 @@ type DashboardAccess interface {
|
|||||||
GetDashboard(ctx context.Context, orgId int64, uid string) (*dashboardsV0.Dashboard, error)
|
GetDashboard(ctx context.Context, orgId int64, uid string) (*dashboardsV0.Dashboard, error)
|
||||||
GetDashboards(ctx context.Context, query *DashboardQuery) (*dashboardsV0.DashboardList, error)
|
GetDashboards(ctx context.Context, query *DashboardQuery) (*dashboardsV0.DashboardList, error)
|
||||||
|
|
||||||
GetDashboardSummary(ctx context.Context, orgId int64, uid string) (*dashboardsV0.DashboardSummary, error)
|
|
||||||
GetDashboardSummaries(ctx context.Context, query *DashboardQuery) (*dashboardsV0.DashboardSummaryList, error)
|
|
||||||
|
|
||||||
SaveDashboard(ctx context.Context, orgId int64, dash *dashboardsV0.Dashboard) (*dashboardsV0.Dashboard, bool, error)
|
SaveDashboard(ctx context.Context, orgId int64, dash *dashboardsV0.Dashboard) (*dashboardsV0.Dashboard, bool, error)
|
||||||
DeleteDashboard(ctx context.Context, orgId int64, uid string) (*dashboardsV0.Dashboard, bool, error)
|
DeleteDashboard(ctx context.Context, orgId int64, uid string) (*dashboardsV0.Dashboard, bool, error)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,8 +87,6 @@ func addKnownTypes(scheme *runtime.Scheme, gv schema.GroupVersion) {
|
|||||||
&v0alpha1.DashboardList{},
|
&v0alpha1.DashboardList{},
|
||||||
&v0alpha1.DashboardWithAccessInfo{},
|
&v0alpha1.DashboardWithAccessInfo{},
|
||||||
&v0alpha1.DashboardVersionList{},
|
&v0alpha1.DashboardVersionList{},
|
||||||
&v0alpha1.DashboardSummary{},
|
|
||||||
&v0alpha1.DashboardSummaryList{},
|
|
||||||
&v0alpha1.VersionsQueryOptions{},
|
&v0alpha1.VersionsQueryOptions{},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -152,14 +150,6 @@ func (b *DashboardsAPIBuilder) GetAPIGroupInfo(
|
|||||||
storage[resourceInfo.StoragePath()] = grafanarest.NewDualWriter(grafanarest.Mode1, legacyStore, store, reg)
|
storage[resourceInfo.StoragePath()] = grafanarest.NewDualWriter(grafanarest.Mode1, legacyStore, store, reg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Summary
|
|
||||||
resourceInfo2 := v0alpha1.DashboardSummaryResourceInfo
|
|
||||||
storage[resourceInfo2.StoragePath()] = &summaryStorage{
|
|
||||||
resource: resourceInfo2,
|
|
||||||
access: b.access,
|
|
||||||
tableConverter: store.TableConvertor,
|
|
||||||
}
|
|
||||||
|
|
||||||
apiGroupInfo.VersionedResourcesStorageMap[v0alpha1.VERSION] = storage
|
apiGroupInfo.VersionedResourcesStorageMap[v0alpha1.VERSION] = storage
|
||||||
return &apiGroupInfo, nil
|
return &apiGroupInfo, nil
|
||||||
}
|
}
|
||||||
@@ -178,7 +168,6 @@ func (b *DashboardsAPIBuilder) PostProcessOpenAPI(oas *spec3.OpenAPI) (*spec3.Op
|
|||||||
// Hide the ability to list or watch across all tenants
|
// Hide the ability to list or watch across all tenants
|
||||||
delete(oas.Paths.Paths, root+v0alpha1.DashboardResourceInfo.GroupResource().Resource)
|
delete(oas.Paths.Paths, root+v0alpha1.DashboardResourceInfo.GroupResource().Resource)
|
||||||
delete(oas.Paths.Paths, root+"watch/"+v0alpha1.DashboardResourceInfo.GroupResource().Resource)
|
delete(oas.Paths.Paths, root+"watch/"+v0alpha1.DashboardResourceInfo.GroupResource().Resource)
|
||||||
delete(oas.Paths.Paths, root+v0alpha1.DashboardSummaryResourceInfo.GroupResource().Resource)
|
|
||||||
|
|
||||||
// The root API discovery list
|
// The root API discovery list
|
||||||
sub := oas.Paths.Paths[root]
|
sub := oas.Paths.Paths[root]
|
||||||
|
|||||||
@@ -54,14 +54,6 @@ func newStorage(scheme *runtime.Scheme) (*storage, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
summary, ok := obj.(*v0alpha1.DashboardSummary)
|
|
||||||
if ok {
|
|
||||||
return []interface{}{
|
|
||||||
dash.Name,
|
|
||||||
summary.Spec.Title,
|
|
||||||
dash.CreationTimestamp.UTC().Format(time.RFC3339),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("expected dashboard or summary")
|
return nil, fmt.Errorf("expected dashboard or summary")
|
||||||
})
|
})
|
||||||
return &storage{Store: store}, nil
|
return &storage{Store: store}, nil
|
||||||
|
|||||||
@@ -1,83 +0,0 @@
|
|||||||
package dashboard
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/internalversion"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
|
||||||
"k8s.io/apiserver/pkg/registry/rest"
|
|
||||||
|
|
||||||
common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
|
|
||||||
"github.com/grafana/grafana/pkg/registry/apis/dashboard/access"
|
|
||||||
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
|
|
||||||
"github.com/grafana/grafana/pkg/services/apiserver/storage/entity"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
_ rest.Storage = (*summaryStorage)(nil)
|
|
||||||
_ rest.Scoper = (*summaryStorage)(nil)
|
|
||||||
_ rest.SingularNameProvider = (*summaryStorage)(nil)
|
|
||||||
_ rest.Getter = (*summaryStorage)(nil)
|
|
||||||
_ rest.Lister = (*summaryStorage)(nil)
|
|
||||||
)
|
|
||||||
|
|
||||||
type summaryStorage struct {
|
|
||||||
resource common.ResourceInfo
|
|
||||||
access access.DashboardAccess
|
|
||||||
tableConverter rest.TableConvertor
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *summaryStorage) New() runtime.Object {
|
|
||||||
return s.resource.NewFunc()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *summaryStorage) Destroy() {}
|
|
||||||
|
|
||||||
func (s *summaryStorage) NamespaceScoped() bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *summaryStorage) GetSingularName() string {
|
|
||||||
return s.resource.GetSingularName()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *summaryStorage) NewList() runtime.Object {
|
|
||||||
return s.resource.NewListFunc()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *summaryStorage) ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1.Table, error) {
|
|
||||||
return s.tableConverter.ConvertToTable(ctx, object, tableOptions)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *summaryStorage) List(ctx context.Context, options *internalversion.ListOptions) (runtime.Object, error) {
|
|
||||||
orgId, err := request.OrgIDForList(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// translate grafana.app/* label selectors into field requirements
|
|
||||||
requirements, newSelector, err := entity.ReadLabelSelectors(options.LabelSelector)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
query := &access.DashboardQuery{
|
|
||||||
OrgID: orgId,
|
|
||||||
Limit: int(options.Limit),
|
|
||||||
MaxBytes: 2 * 1024 * 1024, // 2MB,
|
|
||||||
ContinueToken: options.Continue,
|
|
||||||
Requirements: requirements,
|
|
||||||
Labels: newSelector,
|
|
||||||
}
|
|
||||||
return s.access.GetDashboardSummaries(ctx, query)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *summaryStorage) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
|
|
||||||
info, err := request.NamespaceInfoFrom(ctx, true)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.access.GetDashboardSummary(ctx, info.OrgID, name)
|
|
||||||
}
|
|
||||||
@@ -95,20 +95,6 @@ func TestIntegrationDashboardsApp(t *testing.T) {
|
|||||||
"patch",
|
"patch",
|
||||||
"update"
|
"update"
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"resource": "summary",
|
|
||||||
"responseKind": {
|
|
||||||
"group": "",
|
|
||||||
"kind": "DashboardSummary",
|
|
||||||
"version": ""
|
|
||||||
},
|
|
||||||
"scope": "Namespaced",
|
|
||||||
"singularResource": "summary",
|
|
||||||
"verbs": [
|
|
||||||
"get",
|
|
||||||
"list"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"version": "v0alpha1"
|
"version": "v0alpha1"
|
||||||
|
|||||||
Reference in New Issue
Block a user