mirror of
https://github.com/grafana/grafana.git
synced 2024-11-25 02:10:45 -06:00
K8s: dashboards: fix conversion (#96648)
This commit is contained in:
parent
7e442efa9c
commit
6571451a57
@ -12,6 +12,7 @@ import (
|
||||
"k8s.io/kube-openapi/pkg/common"
|
||||
"k8s.io/kube-openapi/pkg/spec3"
|
||||
|
||||
dashboardinternal "github.com/grafana/grafana/pkg/apis/dashboard"
|
||||
dashboardv0alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1"
|
||||
grafanaregistry "github.com/grafana/grafana/pkg/apiserver/registry/generic"
|
||||
grafanarest "github.com/grafana/grafana/pkg/apiserver/rest"
|
||||
@ -114,14 +115,30 @@ func (b *DashboardsAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver
|
||||
return err
|
||||
}
|
||||
|
||||
defaultOpts, err := optsGetter.GetRESTOptions(b.legacy.Resource.GroupResource(), &dashboardinternal.Dashboard{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
storageOpts := apistore.StorageOptions{
|
||||
InternalConversion: (func(b []byte, desiredObj runtime.Object) (runtime.Object, error) {
|
||||
internal := &dashboardinternal.Dashboard{}
|
||||
obj, _, err := defaultOpts.StorageConfig.Config.Codec.Decode(b, nil, internal)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = scheme.Convert(obj, desiredObj, nil)
|
||||
return desiredObj, err
|
||||
}),
|
||||
}
|
||||
|
||||
// Split dashboards when they are large
|
||||
var largeObjects apistore.LargeObjectSupport
|
||||
if b.legacy.Features.IsEnabledGlobally(featuremgmt.FlagUnifiedStorageBigObjectsSupport) {
|
||||
largeObjects = dashboard.NewDashboardLargeObjectSupport(scheme)
|
||||
opts.StorageOptions(dash.GroupResource(), apistore.StorageOptions{
|
||||
LargeObjectSupport: largeObjects,
|
||||
})
|
||||
storageOpts.LargeObjectSupport = largeObjects
|
||||
}
|
||||
opts.StorageOptions(dash.GroupResource(), storageOpts)
|
||||
|
||||
storage := map[string]rest.Storage{}
|
||||
storage[dash.StoragePath()] = legacyStore
|
||||
|
@ -10,6 +10,7 @@ import (
|
||||
"k8s.io/kube-openapi/pkg/common"
|
||||
"k8s.io/kube-openapi/pkg/spec3"
|
||||
|
||||
dashboardinternal "github.com/grafana/grafana/pkg/apis/dashboard"
|
||||
dashboardv1alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1"
|
||||
grafanaregistry "github.com/grafana/grafana/pkg/apiserver/registry/generic"
|
||||
grafanarest "github.com/grafana/grafana/pkg/apiserver/rest"
|
||||
@ -112,14 +113,30 @@ func (b *DashboardsAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver
|
||||
return err
|
||||
}
|
||||
|
||||
defaultOpts, err := optsGetter.GetRESTOptions(b.legacy.Resource.GroupResource(), &dashboardinternal.Dashboard{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
storageOpts := apistore.StorageOptions{
|
||||
InternalConversion: (func(b []byte, desiredObj runtime.Object) (runtime.Object, error) {
|
||||
internal := &dashboardinternal.Dashboard{}
|
||||
obj, _, err := defaultOpts.StorageConfig.Config.Codec.Decode(b, nil, internal)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = scheme.Convert(obj, desiredObj, nil)
|
||||
return desiredObj, err
|
||||
}),
|
||||
}
|
||||
|
||||
// Split dashboards when they are large
|
||||
var largeObjects apistore.LargeObjectSupport
|
||||
if b.legacy.Features.IsEnabledGlobally(featuremgmt.FlagUnifiedStorageBigObjectsSupport) {
|
||||
largeObjects = dashboard.NewDashboardLargeObjectSupport(scheme)
|
||||
opts.StorageOptions(dash.GroupResource(), apistore.StorageOptions{
|
||||
LargeObjectSupport: largeObjects,
|
||||
})
|
||||
storageOpts.LargeObjectSupport = largeObjects
|
||||
}
|
||||
opts.StorageOptions(dash.GroupResource(), storageOpts)
|
||||
|
||||
storage := map[string]rest.Storage{}
|
||||
storage[dash.StoragePath()] = legacyStore
|
||||
|
@ -10,6 +10,7 @@ import (
|
||||
"k8s.io/kube-openapi/pkg/common"
|
||||
"k8s.io/kube-openapi/pkg/spec3"
|
||||
|
||||
dashboardinternal "github.com/grafana/grafana/pkg/apis/dashboard"
|
||||
dashboardv2alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1"
|
||||
grafanaregistry "github.com/grafana/grafana/pkg/apiserver/registry/generic"
|
||||
grafanarest "github.com/grafana/grafana/pkg/apiserver/rest"
|
||||
@ -112,14 +113,30 @@ func (b *DashboardsAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver
|
||||
return err
|
||||
}
|
||||
|
||||
defaultOpts, err := optsGetter.GetRESTOptions(b.legacy.Resource.GroupResource(), &dashboardinternal.Dashboard{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
storageOpts := apistore.StorageOptions{
|
||||
InternalConversion: (func(b []byte, desiredObj runtime.Object) (runtime.Object, error) {
|
||||
internal := &dashboardinternal.Dashboard{}
|
||||
obj, _, err := defaultOpts.StorageConfig.Config.Codec.Decode(b, nil, internal)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = scheme.Convert(obj, desiredObj, nil)
|
||||
return desiredObj, err
|
||||
}),
|
||||
}
|
||||
|
||||
// Split dashboards when they are large
|
||||
var largeObjects apistore.LargeObjectSupport
|
||||
if b.legacy.Features.IsEnabledGlobally(featuremgmt.FlagUnifiedStorageBigObjectsSupport) {
|
||||
largeObjects = dashboard.NewDashboardLargeObjectSupport(scheme)
|
||||
opts.StorageOptions(dash.GroupResource(), apistore.StorageOptions{
|
||||
LargeObjectSupport: largeObjects,
|
||||
})
|
||||
storageOpts.LargeObjectSupport = largeObjects
|
||||
}
|
||||
opts.StorageOptions(dash.GroupResource(), storageOpts)
|
||||
|
||||
storage := map[string]rest.Storage{}
|
||||
storage[dash.StoragePath()] = legacyStore
|
||||
|
@ -44,6 +44,7 @@ var _ storage.Interface = (*Storage)(nil)
|
||||
// Optional settings that apply to a single resource
|
||||
type StorageOptions struct {
|
||||
LargeObjectSupport LargeObjectSupport
|
||||
InternalConversion func([]byte, runtime.Object) (runtime.Object, error)
|
||||
}
|
||||
|
||||
// Storage implements storage.Interface and storage resources as JSON files on disk.
|
||||
@ -132,6 +133,14 @@ func (s *Storage) Versioner() storage.Versioner {
|
||||
return s.versioner
|
||||
}
|
||||
|
||||
func (s *Storage) convertToObject(data []byte, obj runtime.Object) (runtime.Object, error) {
|
||||
if s.opts.InternalConversion != nil {
|
||||
return s.opts.InternalConversion(data, obj)
|
||||
}
|
||||
obj, _, err := s.codec.Decode(data, nil, obj)
|
||||
return obj, err
|
||||
}
|
||||
|
||||
// Create adds a new object at a key unless it already exists. 'ttl' is time-to-live
|
||||
// in seconds (0 means forever). If no error is returned and out is not nil, out will be
|
||||
// set to the read value from database.
|
||||
@ -310,7 +319,7 @@ func (s *Storage) Get(ctx context.Context, key string, opts storage.GetOptions,
|
||||
return resource.GetError(rsp.Error)
|
||||
}
|
||||
|
||||
_, _, err = s.codec.Decode(rsp.Value, nil, objPtr)
|
||||
_, err = s.convertToObject(rsp.Value, objPtr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -360,7 +369,7 @@ func (s *Storage) GetList(ctx context.Context, key string, opts storage.ListOpti
|
||||
}
|
||||
|
||||
for _, item := range rsp.Items {
|
||||
obj, _, err := s.codec.Decode(item.Value, nil, s.newFunc())
|
||||
obj, err := s.convertToObject(item.Value, s.newFunc())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -461,7 +470,7 @@ func (s *Storage) GuaranteedUpdate(
|
||||
existingObj = s.newFunc()
|
||||
if len(rsp.Value) > 0 {
|
||||
created = false
|
||||
_, _, err = s.codec.Decode(rsp.Value, nil, existingObj)
|
||||
_, err = s.convertToObject(rsp.Value, existingObj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user