Skip to content

Commit

Permalink
Support alert notification templates in grr serve
Browse files Browse the repository at this point in the history
  • Loading branch information
K-Phoen committed Jan 17, 2025
1 parent 43dd8cb commit 30c4b9a
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 3 deletions.
7 changes: 7 additions & 0 deletions pkg/grafana/notificationtemplate-handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ func NewAlertNotificationTemplateHandler(provider grizzly.Provider) *AlertNotifi
}
}

// ProxyConfigurator provides a configurator object describing how to proxy folders.
func (h *AlertNotificationTemplateHandler) ProxyConfigurator() grizzly.ProxyConfigurator {
return &alertNotificationTemplateProxyConfigurator{
provider: h.Provider,
}
}

// ResourceFilePath returns the location on disk where a resource should be updated
func (h *AlertNotificationTemplateHandler) ResourceFilePath(resource grizzly.Resource, filetype string) string {
filename := strings.ReplaceAll(resource.Name(), string(os.PathSeparator), "-")
Expand Down
93 changes: 93 additions & 0 deletions pkg/grafana/notificationtemplate-proxy.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package grafana

import (
"fmt"
"net/http"

"github.com/go-chi/chi"
"github.com/grafana/grizzly/internal/httputils"
"github.com/grafana/grizzly/pkg/grizzly"
)

var _ grizzly.ProxyConfigurator = &alertNotificationTemplateProxyConfigurator{}

// alertNotificationTemplateProxyConfigurator describes how to proxy AlertNotificationTemplate resources.
type alertNotificationTemplateProxyConfigurator struct {
provider grizzly.Provider
}

func (c *alertNotificationTemplateProxyConfigurator) ProxyURL(uid string) string {
return fmt.Sprintf("/alerting/notifications/templates/%s/edit", uid)
}

func (c *alertNotificationTemplateProxyConfigurator) Endpoints(s grizzly.Server) []grizzly.HTTPEndpoint {
return []grizzly.HTTPEndpoint{
{
Method: http.MethodGet,
URL: "/alerting/notifications/templates/{template_uid}/edit",
Handler: authenticateAndProxyHandler(s, c.provider),
},
// Depending on the Grafana version, the frontend can call either of these endpoints
{
Method: http.MethodGet,
URL: "/apis/notifications.alerting.grafana.app/v0alpha1/namespaces/{namespace}/templategroups/{template_uid}",
Handler: c.templateGetAsK8S(s),
},
{
Method: http.MethodGet,
URL: "/api/alertmanager/grafana/config/api/v1/alerts",
Handler: c.alertManagerConfigGet(s),
},
}
}

func (c *alertNotificationTemplateProxyConfigurator) StaticEndpoints() grizzly.StaticProxyConfig {
return grizzly.StaticProxyConfig{
ProxyPost: []string{
"/api/alertmanager/grafana/config/api/v1/templates/test",
},
}
}

func (c *alertNotificationTemplateProxyConfigurator) alertManagerConfigGet(s grizzly.Server) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
templates := s.Resources.OfKind(KindAlertNotificationTemplate).AsList()

templatesMap := make(map[string]any, len(templates))
for _, template := range templates {
templatesMap[template.Name()] = template.GetSpecValue("template")
}

httputils.WriteJSON(w, map[string]any{
"template_files": templatesMap,
"alertmanager_config": map[string]any{},
})
}
}

func (c *alertNotificationTemplateProxyConfigurator) templateGetAsK8S(s grizzly.Server) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
templateUID := chi.URLParam(r, "template_uid")

template, found := s.Resources.Find(grizzly.NewResourceRef(KindAlertNotificationTemplate, templateUID))
if !found {
httputils.Error(w, fmt.Sprintf("Alert notification template with UID %s not found", templateUID), fmt.Errorf("alert notification template with UID %s not found", templateUID), http.StatusNotFound)
return
}

httputils.WriteJSON(w, map[string]any{
"kind": "TemplateGroup",
"apiVersion": "notifications.alerting.grafana.app/v0alpha1",
"metadata": map[string]any{
"name": templateUID,
"uid": templateUID,
"namespace": chi.URLParam(r, "namespace"),
"resourceVersion": "resource-version",
},
"spec": map[string]any{
"title": templateUID,
"content": template.GetSpecValue("template"),
},
})
}
}
18 changes: 15 additions & 3 deletions pkg/grizzly/embed/templates/proxy/index.html.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,25 @@
<li>
{{ .Spec.title }}
<ul>
{{ range .Spec.rules }}
<li><a href="/grizzly/AlertRuleGroup/{{ .uid }}">{{ .title }}</a></li>
{{ end }}
{{ range .Spec.rules }}
<li><a href="/grizzly/AlertRuleGroup/{{ .uid }}">{{ .title }}</a></li>
{{ end }}
</ul>
</li>
{{ end }}
</ul>

<h1>Alert notification templates</h1>

<ul>
{{ range (.Resources.OfKind "AlertNotificationTemplate").AsList }}
<li>
<a href="/grizzly/{{ .Kind }}/{{ .Name }}">{{ .Spec.name }}</a>
</li>
{{ else }}
<li>No notification templates.</li>
{{ end }}
</ul>
</div>
</main>
</body>
Expand Down
1 change: 1 addition & 0 deletions pkg/grizzly/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ func (s *Server) staticProxyConfig() StaticProxyConfig {
"/api/usage/*": "[]",
"/api/frontend/assets": "{}",
"/api/org/preferences": "{}",
"/api/org/users": "[]",

"/api/prometheus/grafana/api/v1/rules": `{
"status": "success",
Expand Down

0 comments on commit 30c4b9a

Please sign in to comment.