Skip to content

Commit

Permalink
Support links to dashboards in json converter
Browse files Browse the repository at this point in the history
  • Loading branch information
K-Phoen committed Mar 12, 2023
1 parent 95715b4 commit dbc8df6
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 29 deletions.
26 changes: 26 additions & 0 deletions internal/pkg/converter/dashboardlink.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package converter

import (
grabana "github.com/K-Phoen/grabana/decoder"
"github.com/K-Phoen/sdk"
)

func (converter *JSON) convertDashboardLink(link sdk.Link) *grabana.DashboardInternalLink {
extLink := &grabana.DashboardInternalLink{
Title: link.Title,
Tags: link.Tags,
IncludeVariableValues: link.IncludeVars,
}

if link.AsDropdown != nil {
extLink.AsDropdown = *link.AsDropdown
}
if link.TargetBlank != nil {
extLink.OpenInNewTab = *link.TargetBlank
}
if link.KeepTime != nil {
extLink.IncludeTimeRange = *link.KeepTime
}

return extLink
}
32 changes: 32 additions & 0 deletions internal/pkg/converter/dashboardlink_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package converter

import (
"testing"

"github.com/K-Phoen/sdk"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
)

func TestConvertDashboardLink(t *testing.T) {
req := require.New(t)

externalLink := sdk.Link{
Title: "joe",
Tags: []string{"my-service"},
Type: "dashboards",
IncludeVars: true,
AsDropdown: boolPtr(true),
KeepTime: boolPtr(true),
TargetBlank: boolPtr(true),
}
converter := NewJSON(zap.NewNop())
link := converter.convertDashboardLink(externalLink)

req.Equal("joe", link.Title)
req.ElementsMatch([]string{"my-service"}, link.Tags)
req.True(link.OpenInNewTab)
req.True(link.IncludeTimeRange)
req.True(link.AsDropdown)
req.True(link.IncludeVariableValues)
}
16 changes: 0 additions & 16 deletions internal/pkg/converter/externallink.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,7 @@ import (
"go.uber.org/zap"
)

func (converter *JSON) convertExternalLinks(links []sdk.Link, dashboard *grabana.DashboardModel) {
for _, link := range links {
extLink := converter.convertExternalLink(link)
if extLink == nil {
continue
}

dashboard.ExternalLinks = append(dashboard.ExternalLinks, *extLink)
}
}

func (converter *JSON) convertExternalLink(link sdk.Link) *grabana.DashboardExternalLink {
if link.Type != "link" {
converter.logger.Warn("unhandled link type: skipped", zap.String("type", link.Type), zap.String("title", link.Title))
return nil
}

if link.URL == nil || *link.URL == "" {
converter.logger.Warn("link URL empty: skipped", zap.String("title", link.Title))
return nil
Expand Down
13 changes: 1 addition & 12 deletions internal/pkg/converter/externallink_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package converter
import (
"testing"

grabana "github.com/K-Phoen/grabana/decoder"
"github.com/K-Phoen/sdk"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
Expand All @@ -22,18 +21,8 @@ func TestConvertExternalLink(t *testing.T) {
Tooltip: strPtr("description"),
URL: strPtr("http://lala"),
}
dashLink := sdk.Link{
Title: "not link",
}

converter := NewJSON(zap.NewNop())

dashboard := &grabana.DashboardModel{}
converter.convertExternalLinks([]sdk.Link{externalLink, dashLink}, dashboard)

req.Len(dashboard.ExternalLinks, 1)

link := dashboard.ExternalLinks[0]
link := converter.convertExternalLink(externalLink)

req.Equal("joe", link.Title)
req.Equal("description", link.Description)
Expand Down
25 changes: 24 additions & 1 deletion internal/pkg/converter/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,12 +119,35 @@ func (converter *JSON) parseInput(input io.Reader) (*grabana.DashboardModel, err
converter.convertGeneralSettings(board, dashboard)
converter.convertVariables(board.Templating.List, dashboard)
converter.convertAnnotations(board.Annotations.List, dashboard)
converter.convertExternalLinks(board.Links, dashboard)
converter.convertLinks(board.Links, dashboard)
converter.convertPanels(board.Panels, dashboard)

return dashboard, nil
}

func (converter *JSON) convertLinks(links []sdk.Link, dashboard *grabana.DashboardModel) {
for _, link := range links {
switch link.Type {
case "link":
extLink := converter.convertExternalLink(link)
if extLink == nil {
continue
}

dashboard.ExternalLinks = append(dashboard.ExternalLinks, *extLink)
case "dashboards":
dashLink := converter.convertDashboardLink(link)
if dashLink == nil {
continue
}

dashboard.DashboardLinks = append(dashboard.DashboardLinks, *dashLink)
default:
converter.logger.Warn("unhandled link type: skipped", zap.String("type", link.Type), zap.String("title", link.Title))
}
}
}

func (converter *JSON) convertGeneralSettings(board *sdk.Board, dashboard *grabana.DashboardModel) {
dashboard.Title = board.Title
dashboard.SharedCrosshair = board.SharedCrosshair
Expand Down
28 changes: 28 additions & 0 deletions internal/pkg/converter/json_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,34 @@ func TestConvertGeneralSettings(t *testing.T) {
req.True(dashboard.SharedCrosshair)
}

func TestConvertLinks(t *testing.T) {
req := require.New(t)

links := []sdk.Link{
{
Title: "ext link",
Type: "link",
URL: strPtr("https://foo"),
},
{
Title: "dash link",
Type: "dashboards",
Tags: []string{"foo"},
},
{
Title: "some link",
Type: "unknown",
},
}

converter := NewJSON(zap.NewNop())
dashboard := &grabana.DashboardModel{}
converter.convertLinks(links, dashboard)

req.Equal(1, len(dashboard.DashboardLinks))
req.Equal(1, len(dashboard.ExternalLinks))
}

func strPtr(input string) *string {
return &input
}
Expand Down

0 comments on commit dbc8df6

Please sign in to comment.