Storage: raise errors when timestamps cannot be parsed (#79405)

* raise errors when timestamps cannot be parsed

* return partial origin info if timestamp parsing fails
pull/78363/head^2
Dan Cech 1 year ago committed by GitHub
parent aa63e91a43
commit 0c1d1c6b6e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 70
      pkg/kinds/general.go
  2. 2
      pkg/registry/apis/playlist/conversions.go
  3. 12
      pkg/services/grafana-apiserver/storage/entity/utils.go

@ -1,6 +1,7 @@
package kinds
import (
"fmt"
"time"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -79,15 +80,16 @@ func (m *GrafanaResourceMetadata) get(key string) string {
return m.Annotations[key]
}
func (m *GrafanaResourceMetadata) GetUpdatedTimestamp() *time.Time {
func (m *GrafanaResourceMetadata) GetUpdatedTimestamp() (*time.Time, error) {
v, ok := m.Annotations[annoKeyUpdatedTimestamp]
if ok {
t, err := time.Parse(time.RFC3339, v)
if err != nil {
return &t
}
if !ok || v == "" {
return nil, nil
}
return nil
t, err := time.Parse(time.RFC3339, v)
if err != nil {
return nil, fmt.Errorf("invalid updated timestamp: %s", err.Error())
}
return &t, nil
}
func (m *GrafanaResourceMetadata) SetUpdatedTimestampMillis(v int64) {
@ -163,17 +165,18 @@ func (m *GrafanaResourceMetadata) SetOriginInfo(info *ResourceOriginInfo) {
}
// GetOriginInfo returns the origin info stored in k8s metadata annotations
func (m *GrafanaResourceMetadata) GetOriginInfo() *ResourceOriginInfo {
func (m *GrafanaResourceMetadata) GetOriginInfo() (*ResourceOriginInfo, error) {
v, ok := m.Annotations[annoKeyOriginName]
if !ok {
return nil
return nil, nil
}
t, err := m.GetOriginTimestamp()
return &ResourceOriginInfo{
Name: v,
Path: m.GetOriginPath(),
Key: m.GetOriginKey(),
Timestamp: m.GetOriginTimestamp(),
}
Timestamp: t,
}, err
}
func (m *GrafanaResourceMetadata) GetOriginName() string {
@ -188,21 +191,21 @@ func (m *GrafanaResourceMetadata) GetOriginKey() string {
return m.Annotations[annoKeyOriginKey]
}
func (m *GrafanaResourceMetadata) GetOriginTimestamp() *time.Time {
func (m *GrafanaResourceMetadata) GetOriginTimestamp() (*time.Time, error) {
v, ok := m.Annotations[annoKeyOriginTimestamp]
if !ok {
return nil
if !ok || v == "" {
return nil, nil
}
t, err := time.Parse(time.RFC3339, v)
if err != nil {
return nil
return nil, fmt.Errorf("invalid origin timestamp: %s", err.Error())
}
return &t
return &t, nil
}
// Accessor functions for k8s objects
type GrafanaResourceMetaAccessor interface {
GetUpdatedTimestamp() *time.Time
GetUpdatedTimestamp() (*time.Time, error)
SetUpdatedTimestamp(v *time.Time)
GetCreatedBy() string
SetCreatedBy(user string)
@ -214,12 +217,12 @@ type GrafanaResourceMetaAccessor interface {
SetSlug(v string)
GetTitle() string
SetTitle(v string)
GetOriginInfo() *ResourceOriginInfo
GetOriginInfo() (*ResourceOriginInfo, error)
SetOriginInfo(info *ResourceOriginInfo)
GetOriginName() string
GetOriginPath() string
GetOriginKey() string
GetOriginTimestamp() *time.Time
GetOriginTimestamp() (*time.Time, error)
}
var _ GrafanaResourceMetaAccessor = (*grafanaResourceMetaAccessor)(nil)
@ -252,16 +255,16 @@ func (m *grafanaResourceMetaAccessor) get(key string) string {
return m.obj.GetAnnotations()[key]
}
func (m *grafanaResourceMetaAccessor) GetUpdatedTimestamp() *time.Time {
func (m *grafanaResourceMetaAccessor) GetUpdatedTimestamp() (*time.Time, error) {
v, ok := m.obj.GetAnnotations()[annoKeyUpdatedTimestamp]
if !ok {
return nil
if !ok || v == "" {
return nil, nil
}
t, err := time.Parse(time.RFC3339, v)
if err != nil {
return nil
return nil, fmt.Errorf("invalid updated timestamp: %s", err.Error())
}
return &t
return &t, nil
}
func (m *grafanaResourceMetaAccessor) SetUpdatedTimestampMillis(v int64) {
@ -348,17 +351,18 @@ func (m *grafanaResourceMetaAccessor) SetOriginInfo(info *ResourceOriginInfo) {
m.obj.SetAnnotations(anno)
}
func (m *grafanaResourceMetaAccessor) GetOriginInfo() *ResourceOriginInfo {
func (m *grafanaResourceMetaAccessor) GetOriginInfo() (*ResourceOriginInfo, error) {
v, ok := m.obj.GetAnnotations()[annoKeyOriginName]
if !ok {
return nil
return nil, nil
}
t, err := m.GetOriginTimestamp()
return &ResourceOriginInfo{
Name: v,
Path: m.GetOriginPath(),
Key: m.GetOriginKey(),
Timestamp: m.GetOriginTimestamp(),
}
Timestamp: t,
}, err
}
func (m *grafanaResourceMetaAccessor) GetOriginName() string {
@ -373,14 +377,14 @@ func (m *grafanaResourceMetaAccessor) GetOriginKey() string {
return m.get(annoKeyOriginKey)
}
func (m *grafanaResourceMetaAccessor) GetOriginTimestamp() *time.Time {
func (m *grafanaResourceMetaAccessor) GetOriginTimestamp() (*time.Time, error) {
v, ok := m.obj.GetAnnotations()[annoKeyOriginTimestamp]
if !ok {
return nil
if !ok || v == "" {
return nil, nil
}
t, err := time.Parse(time.RFC3339, v)
if err != nil {
return nil
return nil, fmt.Errorf("invalid origin timestamp: %s", err.Error())
}
return &t
return &t, nil
}

@ -123,7 +123,7 @@ func getLegacyID(item *unstructured.Unstructured) int64 {
meta := kinds.GrafanaResourceMetadata{
Annotations: item.GetAnnotations(),
}
info := meta.GetOriginInfo()
info, _ := meta.GetOriginInfo()
if info != nil && info.Name == "SQL" {
i, err := strconv.ParseInt(info.Key, 10, 64)
if err == nil {

@ -126,11 +126,19 @@ func resourceToEntity(key string, res runtime.Object, requestInfo *request.Reque
Labels: metaAccessor.GetLabels(),
}
if t := grafanaAccessor.GetUpdatedTimestamp(); t != nil {
t, err := grafanaAccessor.GetUpdatedTimestamp()
if err != nil {
return nil, err
}
if t != nil {
rsp.UpdatedAt = t.UnixMilli()
}
if t := grafanaAccessor.GetOriginTimestamp(); t != nil {
t, err = grafanaAccessor.GetOriginTimestamp()
if err != nil {
return nil, err
}
if t != nil {
rsp.Origin.Time = t.UnixMilli()
}

Loading…
Cancel
Save