From dbc8df699ef959996506113d125b4a05c13354ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Gomez?= Date: Sun, 12 Mar 2023 23:27:35 +0100 Subject: [PATCH] Support links to dashboards in json converter --- internal/pkg/converter/dashboardlink.go | 26 ++++++++++++++++ internal/pkg/converter/dashboardlink_test.go | 32 ++++++++++++++++++++ internal/pkg/converter/externallink.go | 16 ---------- internal/pkg/converter/externallink_test.go | 13 +------- internal/pkg/converter/json.go | 25 ++++++++++++++- internal/pkg/converter/json_test.go | 28 +++++++++++++++++ 6 files changed, 111 insertions(+), 29 deletions(-) create mode 100644 internal/pkg/converter/dashboardlink.go create mode 100644 internal/pkg/converter/dashboardlink_test.go diff --git a/internal/pkg/converter/dashboardlink.go b/internal/pkg/converter/dashboardlink.go new file mode 100644 index 00000000..c189ee70 --- /dev/null +++ b/internal/pkg/converter/dashboardlink.go @@ -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 +} diff --git a/internal/pkg/converter/dashboardlink_test.go b/internal/pkg/converter/dashboardlink_test.go new file mode 100644 index 00000000..115fc263 --- /dev/null +++ b/internal/pkg/converter/dashboardlink_test.go @@ -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) +} diff --git a/internal/pkg/converter/externallink.go b/internal/pkg/converter/externallink.go index ec606056..36cf26d3 100644 --- a/internal/pkg/converter/externallink.go +++ b/internal/pkg/converter/externallink.go @@ -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 diff --git a/internal/pkg/converter/externallink_test.go b/internal/pkg/converter/externallink_test.go index 6971e7bd..fcad1ebc 100644 --- a/internal/pkg/converter/externallink_test.go +++ b/internal/pkg/converter/externallink_test.go @@ -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" @@ -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) diff --git a/internal/pkg/converter/json.go b/internal/pkg/converter/json.go index 96277517..d9905ca2 100644 --- a/internal/pkg/converter/json.go +++ b/internal/pkg/converter/json.go @@ -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 diff --git a/internal/pkg/converter/json_test.go b/internal/pkg/converter/json_test.go index bd193422..9a631bdb 100644 --- a/internal/pkg/converter/json_test.go +++ b/internal/pkg/converter/json_test.go @@ -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 }