Skip to content

Commit 50256c0

Browse files
authored
Add support for dashboard references (#46)
* Add support for references for dashboards * Use a function for common dashboard request builder in tests * Fix Test_DashboardCreateFromSavedSearchWithReferences
1 parent f7a3bb6 commit 50256c0

File tree

2 files changed

+112
-29
lines changed

2 files changed

+112
-29
lines changed

dashboard.go

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,18 @@ import (
88
uuid "github.com/satori/go.uuid"
99
)
1010

11+
// Enums for DashboardReferencesType
12+
const (
13+
DashboardReferencesTypeSearch dashboardReferencesType = "search"
14+
DashboardReferencesTypeVisualization dashboardReferencesType = "visualization"
15+
)
16+
17+
type dashboardReferencesType string
18+
19+
func (r dashboardReferencesType) String() string {
20+
return string(r)
21+
}
22+
1123
type DashboardClient interface {
1224
Create(request *CreateDashboardRequest) (*Dashboard, error)
1325
GetById(id string) (*Dashboard, error)
@@ -17,18 +29,27 @@ type DashboardClient interface {
1729
}
1830

1931
type CreateDashboardRequest struct {
20-
Attributes *DashboardAttributes `json:"attributes"`
32+
Attributes *DashboardAttributes `json:"attributes"`
33+
References []*DashboardReferences `json:"references,omitempty"`
2134
}
2235

2336
type UpdateDashboardRequest struct {
24-
Attributes *DashboardAttributes `json:"attributes"`
37+
Attributes *DashboardAttributes `json:"attributes"`
38+
References []*DashboardReferences `json:"references,omitempty"`
2539
}
2640

2741
type Dashboard struct {
28-
Id string `json:"id"`
29-
Type string `json:"type"`
30-
Version version `json:"version"`
31-
Attributes *DashboardAttributes `json:"attributes"`
42+
Id string `json:"id"`
43+
Type string `json:"type"`
44+
Version version `json:"version"`
45+
Attributes *DashboardAttributes `json:"attributes"`
46+
References []*DashboardReferences `json:"references,omitempty"`
47+
}
48+
49+
type DashboardReferences struct {
50+
Name string `json:"name"`
51+
Type dashboardReferencesType `json:"type"`
52+
Id string `json:"id"`
3253
}
3354

3455
type DashboardAttributes struct {
@@ -50,6 +71,7 @@ type DashboardRequestBuilder struct {
5071
uiStateJson string
5172
timeRestore bool
5273
kibanaSavedObjectMeta *SearchKibanaSavedObjectMeta
74+
references []*DashboardReferences
5375
}
5476

5577
type dashboardClient600 struct {
@@ -108,6 +130,11 @@ func (builder *DashboardRequestBuilder) WithKibanaSavedObjectMeta(meta *SearchKi
108130
return builder
109131
}
110132

133+
func (builder *DashboardRequestBuilder) WithReferences(refs []*DashboardReferences) *DashboardRequestBuilder {
134+
builder.references = refs
135+
return builder
136+
}
137+
111138
func (builder *DashboardRequestBuilder) Build() (*CreateDashboardRequest, error) {
112139

113140
return &CreateDashboardRequest{
@@ -120,6 +147,7 @@ func (builder *DashboardRequestBuilder) Build() (*CreateDashboardRequest, error)
120147
TimeRestore: builder.timeRestore,
121148
KibanaSavedObjectMeta: builder.kibanaSavedObjectMeta,
122149
},
150+
References: builder.references,
123151
}, nil
124152
}
125153

dashboard_test.go

Lines changed: 78 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@ import (
99
"github.com/stretchr/testify/assert"
1010
)
1111

12+
func newTestDashboardRequestBuilder(visID, searchID string) *DashboardRequestBuilder {
13+
builder := NewDashboardRequestBuilder().
14+
WithTitle("China errors").
15+
WithDescription("This dashboard shows errors from china").
16+
WithPanelsJson(fmt.Sprintf("[{\"size_x\":6,\"size_y\":3,\"panelIndex\":1,\"type\":\"visualization\",\"id\":\"%s\",\"col\":1,\"row\":1},{\"size_x\":6,\"size_y\":3,\"panelIndex\":2,\"type\":\"search\",\"id\":\"%s\",\"col\":7,\"row\":1,\"columns\":[\"_source\"],\"sort\":[\"@timestamp\",\"desc\"]}]", visID, searchID)).
17+
WithOptionsJson("{\"darkTheme\":false}")
18+
19+
return builder
20+
}
21+
1222
func Test_DashboardCreateFromSavedSearch(t *testing.T) {
1323
client := DefaultTestKibanaClient()
1424

@@ -37,11 +47,64 @@ func Test_DashboardCreateFromSavedSearch(t *testing.T) {
3747

3848
dashboardApi := client.Dashboard()
3949

40-
dashboardRequest, err := NewDashboardRequestBuilder().
41-
WithTitle("China errors").
42-
WithDescription("This dashboard shows errors from china").
43-
WithPanelsJson(fmt.Sprintf("[{\"size_x\":6,\"size_y\":3,\"panelIndex\":1,\"type\":\"visualization\",\"id\":\"%s\",\"col\":1,\"row\":1},{\"size_x\":6,\"size_y\":3,\"panelIndex\":2,\"type\":\"search\",\"id\":\"%s\",\"col\":7,\"row\":1,\"columns\":[\"_source\"],\"sort\":[\"@timestamp\",\"desc\"]}]", visualizationResponse.Id, searchResponse.Id)).
44-
WithOptionsJson("{\"darkTheme\":false}").
50+
dashboardRequest, err := newTestDashboardRequestBuilder(visualizationResponse.Id, searchResponse.Id).Build()
51+
52+
assert.Nil(t, err)
53+
54+
response, err := dashboardApi.Create(dashboardRequest)
55+
assert.Nil(t, err)
56+
57+
defer dashboardApi.Delete(response.Id)
58+
59+
assert.Nil(t, err)
60+
assert.NotNil(t, response)
61+
assert.Equal(t, dashboardRequest.Attributes.Title, response.Attributes.Title)
62+
assert.Equal(t, dashboardRequest.Attributes.PanelsJson, response.Attributes.PanelsJson)
63+
assert.Equal(t, dashboardRequest.Attributes.OptionsJson, response.Attributes.OptionsJson)
64+
assert.Equal(t, dashboardRequest.Attributes.UiStateJSON, response.Attributes.UiStateJSON)
65+
assert.Equal(t, dashboardRequest.Attributes.Version, response.Attributes.Version)
66+
}
67+
68+
func Test_DashboardCreateFromSavedSearchWithReferences(t *testing.T) {
69+
client := DefaultTestKibanaClient()
70+
if goversion.Compare(client.Config.KibanaVersion, "7.0.0", "<") {
71+
t.SkipNow()
72+
}
73+
74+
searchClient := client.Search()
75+
searchRequest, _, err := createSearchRequest(searchClient, client.Config.DefaultIndexId, t)
76+
assert.Nil(t, err)
77+
searchResponse, err := searchClient.Create(searchRequest)
78+
assert.Nil(t, err)
79+
defer searchClient.Delete(searchResponse.Id)
80+
81+
visualizationApi := client.Visualization()
82+
83+
builder := newTestVisualizationRequestBuilder()
84+
request, err := builder.
85+
WithSavedSearchId(searchResponse.Id).
86+
Build(client.Config.KibanaVersion)
87+
assert.Nil(t, err)
88+
89+
visualizationResponse, err := visualizationApi.Create(request)
90+
defer visualizationApi.Delete(visualizationResponse.Id)
91+
92+
dashboardApi := client.Dashboard()
93+
94+
dashboardRequest, err := newTestDashboardRequestBuilder(visualizationResponse.Id, searchResponse.Id).
95+
WithPanelsJson("[{\"size_x\":6,\"size_y\":3,\"panelIndex\":1,\"panelRefName\":\"panel_0\",\"col\":1,\"row\":1},{\"size_x\":6,\"size_y\":3,\"panelIndex\":2,\"panelRefName\":\"panel_1\",\"col\":7,\"row\":1,\"columns\":[\"_source\"],\"sort\":[\"@timestamp\",\"desc\"]}]").
96+
WithReferences([]*DashboardReferences{
97+
{
98+
Id: visualizationResponse.Id,
99+
Name: "panel_0",
100+
Type: DashboardReferencesTypeVisualization,
101+
},
102+
{
103+
Id: searchResponse.Id,
104+
Name: "panel_1",
105+
Type: DashboardReferencesTypeSearch,
106+
},
107+
}).
45108
Build()
46109

47110
assert.Nil(t, err)
@@ -58,18 +121,20 @@ func Test_DashboardCreateFromSavedSearch(t *testing.T) {
58121
assert.Equal(t, dashboardRequest.Attributes.OptionsJson, response.Attributes.OptionsJson)
59122
assert.Equal(t, dashboardRequest.Attributes.UiStateJSON, response.Attributes.UiStateJSON)
60123
assert.Equal(t, dashboardRequest.Attributes.Version, response.Attributes.Version)
124+
assert.NotEmpty(t, response.References)
125+
assert.Equal(t, visualizationResponse.Id, response.References[0].Id)
126+
assert.Equal(t, "panel_0", response.References[0].Name)
127+
assert.Equal(t, DashboardReferencesTypeVisualization, response.References[0].Type)
128+
assert.Equal(t, searchResponse.Id, response.References[1].Id)
129+
assert.Equal(t, "panel_1", response.References[1].Name)
130+
assert.Equal(t, DashboardReferencesTypeSearch, response.References[1].Type)
61131
}
62132

63133
func Test_DashboardRead(t *testing.T) {
64134
client := DefaultTestKibanaClient()
65135
dashboardApi := client.Dashboard()
66136

67-
request, err := NewDashboardRequestBuilder().
68-
WithTitle("China errors").
69-
WithDescription("This dashboard shows errors from china").
70-
WithPanelsJson("[{\"size_x\":6,\"size_y\":3,\"panelIndex\":1,\"type\":\"visualization\",\"id\":\"bc8a1970-175b-11e8-accb-65182aaf9591\",\"col\":1,\"row\":1},{\"size_x\":6,\"size_y\":3,\"panelIndex\":2,\"type\":\"search\",\"id\":\"aca8b340-175b-11e8-accb-65182aaf9591\",\"col\":7,\"row\":1,\"columns\":[\"_source\"],\"sort\":[\"@timestamp\",\"desc\"]}]").
71-
WithOptionsJson("{\"darkTheme\":false}").
72-
Build()
137+
request, err := newTestDashboardRequestBuilder("bc8a1970-175b-11e8-accb-65182aaf9591", "aca8b340-175b-11e8-accb-65182aaf9591").Build()
73138

74139
assert.Nil(t, err)
75140

@@ -112,12 +177,7 @@ func Test_DashboardList(t *testing.T) {
112177

113178
dashboardApi := client.Dashboard()
114179

115-
request, err := NewDashboardRequestBuilder().
116-
WithTitle("China errors").
117-
WithDescription("This dashboard shows errors from china").
118-
WithPanelsJson("[{\"size_x\":6,\"size_y\":3,\"panelIndex\":1,\"type\":\"visualization\",\"id\":\"bc8a1970-175b-11e8-accb-65182aaf9591\",\"col\":1,\"row\":1},{\"size_x\":6,\"size_y\":3,\"panelIndex\":2,\"type\":\"search\",\"id\":\"aca8b340-175b-11e8-accb-65182aaf9591\",\"col\":7,\"row\":1,\"columns\":[\"_source\"],\"sort\":[\"@timestamp\",\"desc\"]}]").
119-
WithOptionsJson("{\"darkTheme\":false}").
120-
Build()
180+
request, err := newTestDashboardRequestBuilder("bc8a1970-175b-11e8-accb-65182aaf9591", "aca8b340-175b-11e8-accb-65182aaf9591").Build()
121181

122182
assert.Nil(t, err)
123183

@@ -135,12 +195,7 @@ func Test_DashboardUpdate(t *testing.T) {
135195
client := DefaultTestKibanaClient()
136196
dashboardApi := client.Dashboard()
137197

138-
request, err := NewDashboardRequestBuilder().
139-
WithTitle("China errors").
140-
WithDescription("This dashboard shows errors from china").
141-
WithPanelsJson("[{\"size_x\":6,\"size_y\":3,\"panelIndex\":1,\"type\":\"visualization\",\"id\":\"bc8a1970-175b-11e8-accb-65182aaf9591\",\"col\":1,\"row\":1},{\"size_x\":6,\"size_y\":3,\"panelIndex\":2,\"type\":\"search\",\"id\":\"aca8b340-175b-11e8-accb-65182aaf9591\",\"col\":7,\"row\":1,\"columns\":[\"_source\"],\"sort\":[\"@timestamp\",\"desc\"]}]").
142-
WithOptionsJson("{\"darkTheme\":false}").
143-
Build()
198+
request, err := newTestDashboardRequestBuilder("bc8a1970-175b-11e8-accb-65182aaf9591", "aca8b340-175b-11e8-accb-65182aaf9591").Build()
144199

145200
assert.Nil(t, err)
146201

0 commit comments

Comments
 (0)