Skip to content
This repository was archived by the owner on Jan 15, 2024. It is now read-only.

Commit f8719f8

Browse files
authored
Merge pull request #88 from grafana/alexweav/alerting-templates
Alerting: Add support for Unified Alerting message templates
2 parents 6ee7f30 + 4568268 commit f8719f8

File tree

2 files changed

+153
-0
lines changed

2 files changed

+153
-0
lines changed

alerting_message_template.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package gapi
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"fmt"
7+
)
8+
9+
// AlertingMessageTemplate is a re-usable template for Grafana Alerting messages.
10+
type AlertingMessageTemplate struct {
11+
Name string `json:"name"`
12+
Template string `json:"template"`
13+
}
14+
15+
// MessageTemplates fetches all message templates.
16+
func (c *Client) MessageTemplates() ([]AlertingMessageTemplate, error) {
17+
ts := make([]AlertingMessageTemplate, 0)
18+
err := c.request("GET", "/api/v1/provisioning/templates", nil, nil, &ts)
19+
if err != nil {
20+
return nil, err
21+
}
22+
return ts, nil
23+
}
24+
25+
// MessageTemplate fetches a single message template, identified by its name.
26+
func (c *Client) MessageTemplate(name string) (*AlertingMessageTemplate, error) {
27+
t := AlertingMessageTemplate{}
28+
uri := fmt.Sprintf("/api/v1/provisioning/templates/%s", name)
29+
err := c.request("GET", uri, nil, nil, &t)
30+
if err != nil {
31+
return nil, err
32+
}
33+
return &t, err
34+
}
35+
36+
// SetMessageTemplate creates or updates a message template.
37+
func (c *Client) SetMessageTemplate(name, content string) error {
38+
req := struct {
39+
Template string `json:"template"`
40+
}{Template: content}
41+
body, err := json.Marshal(req)
42+
if err != nil {
43+
return err
44+
}
45+
46+
uri := fmt.Sprintf("/api/v1/provisioning/templates/%s", name)
47+
return c.request("PUT", uri, nil, bytes.NewBuffer(body), nil)
48+
}
49+
50+
// DeleteMessageTemplate deletes a message template.
51+
func (c *Client) DeleteMessageTemplate(name string) error {
52+
uri := fmt.Sprintf("/api/v1/provisioning/templates/%s", name)
53+
return c.request("DELETE", uri, nil, nil, nil)
54+
}

alerting_message_template_test.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package gapi
2+
3+
import (
4+
"testing"
5+
6+
"github.com/gobs/pretty"
7+
)
8+
9+
func TestMessageTemplates(t *testing.T) {
10+
t.Run("get message templates succeeds", func(t *testing.T) {
11+
server, client := gapiTestTools(t, 200, getMessageTemplatesJSON)
12+
defer server.Close()
13+
14+
ts, err := client.MessageTemplates()
15+
16+
if err != nil {
17+
t.Error(err)
18+
}
19+
t.Log(pretty.PrettyFormat(ts))
20+
if len(ts) != 2 {
21+
t.Errorf("wrong number of templates returned, got %#v", ts)
22+
}
23+
if ts[0].Name != "template-one" {
24+
t.Errorf("incorrect name - expected %s on element %d, got %#v", "template-one", 0, ts)
25+
}
26+
if ts[1].Name != "template-two" {
27+
t.Errorf("incorrect name - expected %s on element %d, got %#v", "template-two", 0, ts)
28+
}
29+
})
30+
31+
t.Run("get message template succeeds", func(t *testing.T) {
32+
server, client := gapiTestTools(t, 200, messageTemplateJSON)
33+
defer server.Close()
34+
35+
tmpl, err := client.MessageTemplate("template-one")
36+
37+
if err != nil {
38+
t.Error(err)
39+
}
40+
t.Log(pretty.PrettyFormat(tmpl))
41+
if tmpl.Name != "template-one" {
42+
t.Errorf("incorrect name - expected %s, got %#v", "template-one", tmpl)
43+
}
44+
})
45+
46+
t.Run("get non-existent message template fails", func(t *testing.T) {
47+
server, client := gapiTestTools(t, 404, ``)
48+
defer server.Close()
49+
50+
tmpl, err := client.MessageTemplate("does not exist")
51+
52+
if err == nil {
53+
t.Errorf("expected error but got nil")
54+
t.Log(pretty.PrettyFormat(tmpl))
55+
}
56+
})
57+
58+
t.Run("put message template succeeds", func(t *testing.T) {
59+
server, client := gapiTestTools(t, 202, messageTemplateJSON)
60+
defer server.Close()
61+
62+
err := client.SetMessageTemplate("template-three", "{{define \"template-one\" }}\n content three\n{{ end }}")
63+
64+
if err != nil {
65+
t.Error(err)
66+
}
67+
})
68+
69+
t.Run("delete message template succeeds", func(t *testing.T) {
70+
server, client := gapiTestTools(t, 204, ``)
71+
defer server.Close()
72+
73+
err := client.DeleteMessageTemplate("template-three")
74+
75+
if err != nil {
76+
t.Error(err)
77+
}
78+
})
79+
}
80+
81+
const getMessageTemplatesJSON = `
82+
[
83+
{
84+
"name": "template-one",
85+
"template": "{{define \"template-one\" }}\n content one\n{{ end }}"
86+
},
87+
{
88+
"name": "template-two",
89+
"template": "{{define \"template-one\" }}\n content two\n{{ end }}"
90+
}
91+
]
92+
`
93+
94+
const messageTemplateJSON = `
95+
{
96+
"name": "template-one",
97+
"template": "{{define \"template-one\" }}\n content one\n{{ end }}"
98+
}
99+
`

0 commit comments

Comments
 (0)