mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
K8s: Move GrafanaMetaAccessor into grafana-apiserver and remove usage of kinds metadata (#79602)
* move GrafanaMetaAccessor into pkg/apis, add support for Spec.Title & Spec.Name * K8s: Move GrafanaMetaAccessor (PR into another) (#79728) * access titles * remove title * remove title * remove kinds metadata accessor * remove kinds metadata accessor * fixes * error handling * fix tests --------- Co-authored-by: Ryan McKinley <ryantxu@gmail.com>
This commit is contained in:
co-authored by
Ryan McKinley
parent
da894994d4
commit
d76defe517
@@ -13,7 +13,6 @@ import (
|
||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||
"github.com/grafana/grafana/pkg/infra/appcontext"
|
||||
"github.com/grafana/grafana/pkg/infra/db"
|
||||
"github.com/grafana/grafana/pkg/kinds"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||
"github.com/grafana/grafana/pkg/services/grafana-apiserver/endpoints/request"
|
||||
@@ -65,7 +64,7 @@ func NewDashboardAccess(sql db.DB, namespacer request.NamespaceMapper, dashStore
|
||||
}
|
||||
}
|
||||
|
||||
const selector = `SELECT
|
||||
const selector = `SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid,slug,
|
||||
dashboard.folder_uid,
|
||||
@@ -79,10 +78,10 @@ const selector = `SELECT
|
||||
dashboard.version,
|
||||
title,
|
||||
dashboard.data
|
||||
FROM dashboard
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN user AS CreatedUSER ON dashboard.created_by = CreatedUSER.id
|
||||
LEFT OUTER JOIN user AS UpdatedUSER ON dashboard.created_by = UpdatedUSER.id
|
||||
LEFT OUTER JOIN user AS CreatedUSER ON dashboard.created_by = CreatedUSER.id
|
||||
LEFT OUTER JOIN user AS UpdatedUSER ON dashboard.created_by = UpdatedUSER.id
|
||||
WHERE is_folder = false`
|
||||
|
||||
// GetDashboards implements DashboardAccess.
|
||||
@@ -303,7 +302,10 @@ func (a *dashboardSqlAccess) scanRow(rows *sql.Rows) (*dashboardRow, error) {
|
||||
dash.Namespace = a.namespacer(orgId)
|
||||
dash.UID = utils.CalculateClusterWideUID(dash)
|
||||
dash.SetCreationTimestamp(v1.NewTime(created))
|
||||
meta := kinds.MetaAccessor(dash)
|
||||
meta, err := utils.MetaAccessor(dash)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
meta.SetUpdatedTimestamp(&updated)
|
||||
meta.SetSlug(slug)
|
||||
if createdByID > 0 {
|
||||
@@ -328,14 +330,14 @@ func (a *dashboardSqlAccess) scanRow(rows *sql.Rows) (*dashboardRow, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
meta.SetOriginInfo(&kinds.ResourceOriginInfo{
|
||||
meta.SetOriginInfo(&utils.ResourceOriginInfo{
|
||||
Name: origin_name.String,
|
||||
Path: originPath,
|
||||
Key: origin_key.String,
|
||||
Timestamp: &ts,
|
||||
})
|
||||
} else if plugin_id != "" {
|
||||
meta.SetOriginInfo(&kinds.ResourceOriginInfo{
|
||||
meta.SetOriginInfo(&utils.ResourceOriginInfo{
|
||||
Name: "plugin",
|
||||
Path: plugin_id,
|
||||
})
|
||||
@@ -403,7 +405,10 @@ func (a *dashboardSqlAccess) SaveDashboard(ctx context.Context, orgId int64, das
|
||||
dash.Spec.Remove("uid")
|
||||
}
|
||||
|
||||
meta := kinds.MetaAccessor(dash)
|
||||
meta, err := utils.MetaAccessor(dash)
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
out, err := a.dashStore.SaveDashboard(ctx, dashboards.SaveDashboardCommand{
|
||||
OrgID: orgId,
|
||||
Dashboard: simplejson.NewFromAny(dash.Spec.UnstructuredContent()),
|
||||
|
||||
@@ -12,7 +12,6 @@ import (
|
||||
|
||||
common "github.com/grafana/grafana/pkg/apis/common/v0alpha1"
|
||||
"github.com/grafana/grafana/pkg/apis/datasource/v0alpha1"
|
||||
"github.com/grafana/grafana/pkg/kinds"
|
||||
"github.com/grafana/grafana/pkg/services/datasources"
|
||||
"github.com/grafana/grafana/pkg/services/grafana-apiserver/utils"
|
||||
)
|
||||
@@ -63,7 +62,7 @@ func (s *connectionAccess) Get(ctx context.Context, name string, options *metav1
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return s.asConnection(ds, ns), nil
|
||||
return s.asConnection(ds, ns)
|
||||
}
|
||||
|
||||
func (s *connectionAccess) List(ctx context.Context, options *internalversion.ListOptions) (runtime.Object, error) {
|
||||
@@ -78,13 +77,14 @@ func (s *connectionAccess) List(ctx context.Context, options *internalversion.Li
|
||||
vals, err := s.builder.getDataSources(ctx)
|
||||
if err == nil {
|
||||
for _, ds := range vals {
|
||||
result.Items = append(result.Items, *s.asConnection(ds, ns))
|
||||
v, _ := s.asConnection(ds, ns)
|
||||
result.Items = append(result.Items, *v)
|
||||
}
|
||||
}
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *connectionAccess) asConnection(ds *datasources.DataSource, ns string) *v0alpha1.DataSourceConnection {
|
||||
func (s *connectionAccess) asConnection(ds *datasources.DataSource, ns string) (*v0alpha1.DataSourceConnection, error) {
|
||||
v := &v0alpha1.DataSourceConnection{
|
||||
TypeMeta: s.resourceInfo.TypeMeta(),
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
@@ -96,7 +96,9 @@ func (s *connectionAccess) asConnection(ds *datasources.DataSource, ns string) *
|
||||
Title: ds.Name,
|
||||
}
|
||||
v.UID = utils.CalculateClusterWideUID(v) // indicates if the value changed on the server
|
||||
meta := kinds.MetaAccessor(v)
|
||||
meta.SetUpdatedTimestamp(&ds.Updated)
|
||||
return v
|
||||
meta, err := utils.MetaAccessor(v)
|
||||
if err != nil {
|
||||
meta.SetUpdatedTimestamp(&ds.Updated)
|
||||
}
|
||||
return v, err
|
||||
}
|
||||
|
||||
@@ -6,27 +6,12 @@ import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
|
||||
"github.com/grafana/grafana/pkg/apis/folders/v0alpha1"
|
||||
"github.com/grafana/grafana/pkg/kinds"
|
||||
"github.com/grafana/grafana/pkg/services/folder"
|
||||
"github.com/grafana/grafana/pkg/services/grafana-apiserver/endpoints/request"
|
||||
"github.com/grafana/grafana/pkg/services/grafana-apiserver/utils"
|
||||
)
|
||||
|
||||
func convertToK8sResource(v *folder.Folder, namespacer request.NamespaceMapper) *v0alpha1.Folder {
|
||||
meta := kinds.GrafanaResourceMetadata{}
|
||||
meta.SetUpdatedTimestampMillis(v.Updated.UnixMilli())
|
||||
if v.ID > 0 { // nolint:staticcheck
|
||||
meta.SetOriginInfo(&kinds.ResourceOriginInfo{
|
||||
Name: "SQL",
|
||||
Key: fmt.Sprintf("%d", v.ID), // nolint:staticcheck
|
||||
})
|
||||
}
|
||||
if v.CreatedBy > 0 {
|
||||
meta.SetCreatedBy(fmt.Sprintf("user:%d", v.CreatedBy))
|
||||
}
|
||||
if v.UpdatedBy > 0 {
|
||||
meta.SetUpdatedBy(fmt.Sprintf("user:%d", v.UpdatedBy))
|
||||
}
|
||||
f := &v0alpha1.Folder{
|
||||
TypeMeta: v0alpha1.FolderResourceInfo.TypeMeta(),
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
@@ -34,13 +19,30 @@ func convertToK8sResource(v *folder.Folder, namespacer request.NamespaceMapper)
|
||||
ResourceVersion: fmt.Sprintf("%d", v.Updated.UnixMilli()),
|
||||
CreationTimestamp: metav1.NewTime(v.Created),
|
||||
Namespace: namespacer(v.OrgID),
|
||||
Annotations: meta.Annotations,
|
||||
},
|
||||
Spec: v0alpha1.Spec{
|
||||
Title: v.Title,
|
||||
Description: v.Description,
|
||||
},
|
||||
}
|
||||
|
||||
meta, err := utils.MetaAccessor(f)
|
||||
if err == nil {
|
||||
meta.SetUpdatedTimestamp(&v.Updated)
|
||||
if v.ID > 0 { // nolint:staticcheck
|
||||
meta.SetOriginInfo(&utils.ResourceOriginInfo{
|
||||
Name: "SQL",
|
||||
Key: fmt.Sprintf("%d", v.ID), // nolint:staticcheck
|
||||
})
|
||||
}
|
||||
if v.CreatedBy > 0 {
|
||||
meta.SetCreatedBy(fmt.Sprintf("user:%d", v.CreatedBy))
|
||||
}
|
||||
if v.UpdatedBy > 0 {
|
||||
meta.SetUpdatedBy(fmt.Sprintf("user:%d", v.UpdatedBy))
|
||||
}
|
||||
}
|
||||
|
||||
f.UID = utils.CalculateClusterWideUID(f)
|
||||
return f
|
||||
}
|
||||
|
||||
@@ -13,10 +13,10 @@ import (
|
||||
|
||||
"github.com/grafana/grafana/pkg/apis/folders/v0alpha1"
|
||||
"github.com/grafana/grafana/pkg/infra/appcontext"
|
||||
"github.com/grafana/grafana/pkg/kinds"
|
||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||
"github.com/grafana/grafana/pkg/services/folder"
|
||||
"github.com/grafana/grafana/pkg/services/grafana-apiserver/endpoints/request"
|
||||
"github.com/grafana/grafana/pkg/services/grafana-apiserver/utils"
|
||||
"github.com/grafana/grafana/pkg/util"
|
||||
)
|
||||
|
||||
@@ -148,7 +148,10 @@ func (s *legacyStorage) Create(ctx context.Context,
|
||||
p.Spec.Title = strings.ReplaceAll(p.Spec.Title, "${RAND}", rand)
|
||||
}
|
||||
|
||||
accessor := kinds.MetaAccessor(p)
|
||||
accessor, err := utils.MetaAccessor(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
parent := accessor.GetFolder()
|
||||
|
||||
out, err := s.service.Create(ctx, &folder.CreateFolderCommand{
|
||||
@@ -202,8 +205,10 @@ func (s *legacyStorage) Update(ctx context.Context,
|
||||
return nil, created, fmt.Errorf("expected old object to be a folder also")
|
||||
}
|
||||
|
||||
oldParent := kinds.MetaAccessor(old).GetFolder()
|
||||
newParent := kinds.MetaAccessor(f).GetFolder()
|
||||
mOld, _ := utils.MetaAccessor(old)
|
||||
mNew, _ := utils.MetaAccessor(f)
|
||||
oldParent := mOld.GetFolder()
|
||||
newParent := mNew.GetFolder()
|
||||
if oldParent != newParent {
|
||||
_, err = s.service.Move(ctx, &folder.MoveFolderCommand{
|
||||
SignedInUser: user,
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
common "k8s.io/kube-openapi/pkg/common"
|
||||
|
||||
"github.com/grafana/grafana/pkg/apis/folders/v0alpha1"
|
||||
"github.com/grafana/grafana/pkg/kinds"
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
"github.com/grafana/grafana/pkg/services/folder"
|
||||
grafanaapiserver "github.com/grafana/grafana/pkg/services/grafana-apiserver"
|
||||
@@ -116,7 +115,7 @@ func (b *FolderAPIBuilder) GetAPIGroupInfo(
|
||||
func(obj any) ([]interface{}, error) {
|
||||
r, ok := obj.(*v0alpha1.Folder)
|
||||
if ok {
|
||||
accessor := kinds.MetaAccessor(r)
|
||||
accessor, _ := utils.MetaAccessor(r)
|
||||
return []interface{}{
|
||||
r.Name,
|
||||
r.Spec.Title,
|
||||
|
||||
@@ -11,7 +11,6 @@ import (
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
|
||||
playlist "github.com/grafana/grafana/pkg/apis/playlist/v0alpha1"
|
||||
"github.com/grafana/grafana/pkg/kinds"
|
||||
"github.com/grafana/grafana/pkg/services/grafana-apiserver/endpoints/request"
|
||||
"github.com/grafana/grafana/pkg/services/grafana-apiserver/utils"
|
||||
playlistsvc "github.com/grafana/grafana/pkg/services/playlist"
|
||||
@@ -78,14 +77,6 @@ func convertToK8sResource(v *playlistsvc.PlaylistDTO, namespacer request.Namespa
|
||||
})
|
||||
}
|
||||
|
||||
meta := kinds.GrafanaResourceMetadata{}
|
||||
meta.SetUpdatedTimestampMillis(v.UpdatedAt)
|
||||
if v.Id > 0 {
|
||||
meta.SetOriginInfo(&kinds.ResourceOriginInfo{
|
||||
Name: "SQL",
|
||||
Key: fmt.Sprintf("%d", v.Id),
|
||||
})
|
||||
}
|
||||
p := &playlist.Playlist{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: v.Uid,
|
||||
@@ -93,10 +84,20 @@ func convertToK8sResource(v *playlistsvc.PlaylistDTO, namespacer request.Namespa
|
||||
ResourceVersion: fmt.Sprintf("%d", v.UpdatedAt),
|
||||
CreationTimestamp: metav1.NewTime(time.UnixMilli(v.CreatedAt)),
|
||||
Namespace: namespacer(v.OrgID),
|
||||
Annotations: meta.Annotations,
|
||||
},
|
||||
Spec: spec,
|
||||
}
|
||||
meta, err := utils.MetaAccessor(p)
|
||||
if err == nil {
|
||||
meta.SetUpdatedTimestampMillis(v.UpdatedAt)
|
||||
if v.Id > 0 {
|
||||
meta.SetOriginInfo(&utils.ResourceOriginInfo{
|
||||
Name: "SQL",
|
||||
Key: fmt.Sprintf("%d", v.Id),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
p.UID = utils.CalculateClusterWideUID(p)
|
||||
return p
|
||||
}
|
||||
@@ -123,8 +124,9 @@ func convertToLegacyUpdateCommand(p *playlist.Playlist, orgId int64) (*playlists
|
||||
|
||||
// Read legacy ID from metadata annotations
|
||||
func getLegacyID(item *unstructured.Unstructured) int64 {
|
||||
meta := kinds.GrafanaResourceMetadata{
|
||||
Annotations: item.GetAnnotations(),
|
||||
meta, err := utils.MetaAccessor(item)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
info, _ := meta.GetOriginInfo()
|
||||
if info != nil && info.Name == "SQL" {
|
||||
|
||||
Reference in New Issue
Block a user