Skip to content

Commit 1bf462a

Browse files
authored
Support loading alertmanager template files in different directories (#33)
Fixes #12 Signed-off-by: Charlie Le <[email protected]>
1 parent 4fdaaf7 commit 1bf462a

File tree

3 files changed

+97
-6
lines changed

3 files changed

+97
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Order should be `CHANGE`, `FEATURE`, `ENHANCEMENT`, and `BUGFIX`
77
* [CHANGE] Updates version of Go to 1.22 and Alpine to 3.19.1 in Dockerfiles
88
* [FEATURE] Make rulerAPI Path configurable
99
* [FEATURE] Add tool to deserialize alertmanager state file
10+
* [ENHANCEMENT] Support loading alertmanager templates from different directories
1011
* [BUGFIX] Set tenant id in prom analyse command
1112

1213
## v0.11.1

pkg/commands/alerts.go

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/http"
99
"os"
1010
"os/signal"
11+
"path/filepath"
1112
"strings"
1213
"time"
1314

@@ -120,16 +121,29 @@ func (a *AlertmanagerCommand) loadConfig(_ *kingpin.ParseContext) error {
120121
return err
121122
}
122123

123-
templates := map[string]string{}
124-
for _, f := range a.TemplateFiles {
124+
templates, err := createTemplates(a.TemplateFiles)
125+
if err != nil {
126+
return err
127+
}
128+
129+
return a.cli.CreateAlertmanagerConfig(context.Background(), cfg, templates)
130+
}
131+
132+
func createTemplates(templateFiles []string) (map[string]string, error) {
133+
templates := make(map[string]string)
134+
for _, f := range templateFiles {
125135
tmpl, err := os.ReadFile(f)
126136
if err != nil {
127-
return errors.Wrap(err, "unable to load template file: "+f)
137+
return nil, errors.Wrap(err, "unable to load template file: "+f)
128138
}
129-
templates[f] = string(tmpl)
130-
}
131139

132-
return a.cli.CreateAlertmanagerConfig(context.Background(), cfg, templates)
140+
baseName := filepath.Base(f)
141+
if _, ok := templates[baseName]; ok {
142+
return nil, fmt.Errorf("duplicate template file name: %s", baseName)
143+
}
144+
templates[baseName] = string(tmpl)
145+
}
146+
return templates, nil
133147
}
134148

135149
func (a *AlertmanagerCommand) deleteConfig(_ *kingpin.ParseContext) error {

pkg/commands/alerts_test.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package commands
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"strings"
7+
"testing"
8+
)
9+
10+
func TestCreateTemplates(t *testing.T) {
11+
// Create a temporary file
12+
tmpfile, err := os.CreateTemp("", "template")
13+
if err != nil {
14+
t.Fatal(err)
15+
}
16+
defer os.Remove(tmpfile.Name()) // clean up
17+
18+
// Write some data to the file
19+
text := "This is a test template"
20+
if _, err := tmpfile.Write([]byte(text)); err != nil {
21+
t.Fatal(err)
22+
}
23+
if err := tmpfile.Close(); err != nil {
24+
t.Fatal(err)
25+
}
26+
27+
// Call createTemplates
28+
templates, err := createTemplates([]string{tmpfile.Name()})
29+
if err != nil {
30+
t.Fatal(err)
31+
}
32+
33+
// Check the returned map
34+
if len(templates) != 1 {
35+
t.Fatalf("Expected 1 template, got %d", len(templates))
36+
}
37+
if templates[filepath.Base(tmpfile.Name())] != text {
38+
t.Fatalf("Expected template content to be '%s', got '%s'", text, templates[filepath.Base(tmpfile.Name())])
39+
}
40+
}
41+
42+
func TestCreateTemplates_DuplicateFilenames(t *testing.T) {
43+
// Create two temporary files with the same base name in different directories
44+
dir1 := filepath.Join(os.TempDir(), "dir1")
45+
if err := os.Mkdir(dir1, 0755); err != nil {
46+
t.Fatal(err)
47+
}
48+
defer os.RemoveAll(dir1) // clean up
49+
tmpfile1, err := os.Create(filepath.Join(os.TempDir(), "dir1", "fool.tmpl"))
50+
if err != nil {
51+
t.Fatal(err)
52+
}
53+
defer os.Remove(tmpfile1.Name()) // clean up
54+
55+
dir2 := filepath.Join(os.TempDir(), "dir2")
56+
if err := os.Mkdir(dir2, 0755); err != nil {
57+
t.Fatal(err)
58+
}
59+
defer os.RemoveAll(dir2) // clean up
60+
tmpfile2, err := os.Create(filepath.Join(os.TempDir(), "dir2", "fool.tmpl"))
61+
if err != nil {
62+
t.Fatal(err)
63+
}
64+
defer os.Remove(tmpfile2.Name()) // clean up
65+
66+
// Call createTemplates
67+
_, err = createTemplates([]string{tmpfile1.Name(), tmpfile2.Name()})
68+
if err == nil {
69+
t.Fatal("Expected error due to duplicate filenames, got nil")
70+
}
71+
72+
// Check that the error message contains "duplicate template file name"
73+
if !strings.Contains(err.Error(), "duplicate template file name") {
74+
t.Fatalf("Expected error message to contain 'duplicate template file name', got '%s'", err.Error())
75+
}
76+
}

0 commit comments

Comments
 (0)