mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
93 lines
2.0 KiB
Go
93 lines
2.0 KiB
Go
package resource
|
|
|
|
import (
|
|
context "context"
|
|
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
|
|
"github.com/grafana/grafana/pkg/apimachinery/identity"
|
|
"github.com/grafana/grafana/pkg/apimachinery/utils"
|
|
)
|
|
|
|
type WriteEvent struct {
|
|
Type WatchEvent_Type // ADDED, MODIFIED, DELETED
|
|
Key *ResourceKey // the request key
|
|
PreviousRV int64 // only for Update+Delete
|
|
|
|
// The json payload (without resourceVersion)
|
|
Value []byte
|
|
|
|
// Access real fields
|
|
Object utils.GrafanaMetaAccessor
|
|
|
|
// Access to the old metadata
|
|
ObjectOld utils.GrafanaMetaAccessor
|
|
}
|
|
|
|
// WriteEvents after they include a resource version
|
|
type WrittenEvent struct {
|
|
WriteEvent
|
|
|
|
// The resource version
|
|
ResourceVersion int64
|
|
|
|
// Timestamp when the event is created
|
|
Timestamp int64
|
|
}
|
|
|
|
// A function to write events
|
|
type EventAppender = func(context.Context, *WriteEvent) (int64, error)
|
|
|
|
type writeEventBuilder struct {
|
|
EventID int64
|
|
Key *ResourceKey // the request key
|
|
Type WatchEvent_Type
|
|
|
|
Requester identity.Requester
|
|
Object *unstructured.Unstructured
|
|
|
|
// Access the raw metadata values
|
|
Meta utils.GrafanaMetaAccessor
|
|
OldMeta utils.GrafanaMetaAccessor
|
|
}
|
|
|
|
func newEventFromBytes(value, oldValue []byte) (*writeEventBuilder, error) {
|
|
builder := &writeEventBuilder{
|
|
Object: &unstructured.Unstructured{},
|
|
}
|
|
err := builder.Object.UnmarshalJSON(value)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
builder.Meta, err = utils.MetaAccessor(builder.Object)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if oldValue == nil {
|
|
builder.Type = WatchEvent_ADDED
|
|
} else {
|
|
builder.Type = WatchEvent_MODIFIED
|
|
|
|
temp := &unstructured.Unstructured{}
|
|
err = temp.UnmarshalJSON(oldValue)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
builder.OldMeta, err = utils.MetaAccessor(temp)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return builder, nil
|
|
}
|
|
|
|
func (b *writeEventBuilder) toEvent() (event WriteEvent, err error) {
|
|
event.Key = b.Key
|
|
event.Type = b.Type
|
|
event.ObjectOld = b.OldMeta
|
|
event.Object = b.Meta
|
|
event.Value, err = b.Object.MarshalJSON()
|
|
return // includes the named values
|
|
}
|