alertmanager/handlers/template_handlers.go (223 lines of code) (raw):
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package handlers
import (
"fmt"
"io/ioutil"
"net/http"
"github.com/facebookincubator/prometheus-configmanager/alertmanager/client"
"github.com/labstack/echo"
)
func GetGetTemplateFileHandler(amClient client.AlertmanagerClient, tmplClient client.TemplateClient) func(c echo.Context) error {
return func(c echo.Context) error {
filename := c.Get(templateFilenameParam).(string)
exists, err := fileExists(amClient, tmplClient, filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
}
if !exists {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Errorf("error getting file %s: file does not exist", filename).Error())
}
file, err := tmplClient.GetTemplateFile(filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("error getting template file: %v", err))
}
return c.JSON(http.StatusOK, file)
}
}
func GetPostTemplateFileHandler(amClient client.AlertmanagerClient, tmplClient client.TemplateClient) func(c echo.Context) error {
return func(c echo.Context) error {
filename := c.Get(templateFilenameParam).(string)
exists, err := fileExists(amClient, tmplClient, filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
}
if exists {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("file %s already exists", filename))
}
body, err := readStringBody(c)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
}
err = tmplClient.CreateTemplateFile(filename, body)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("error creating template file: %v", err))
}
err = amClient.AddTemplateFile(getFullFilePath(filename, tmplClient))
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("error creating template file: %v", err))
}
return c.String(http.StatusOK, "Created")
}
}
func GetPutTemplateFileHandler(amClient client.AlertmanagerClient, tmplClient client.TemplateClient) func(c echo.Context) error {
return func(c echo.Context) error {
filename := c.Get(templateFilenameParam).(string)
exists, err := fileExists(amClient, tmplClient, filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
}
if !exists {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("error editing file %s: file does not exist", filename))
}
body, err := readStringBody(c)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
}
err = tmplClient.EditTemplateFile(filename, body)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("error editing template file: %v", err))
}
return c.NoContent(http.StatusOK)
}
}
func GetDeleteTemplateFileHandler(amClient client.AlertmanagerClient, tmplClient client.TemplateClient) func(c echo.Context) error {
return func(c echo.Context) error {
filename := c.Get(templateFilenameParam).(string)
exists, err := fileExists(amClient, tmplClient, filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
}
if !exists {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("error deleting file: file %s does not exist", filename))
}
err = tmplClient.DeleteTemplateFile(filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("error deleting template file: %v", err))
}
err = amClient.RemoveTemplateFile(getFullFilePath(filename, tmplClient))
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("error deleting template file: %v", err))
}
return c.NoContent(http.StatusOK)
}
}
func GetGetTemplatesHandler(amClient client.AlertmanagerClient, tmplClient client.TemplateClient) func(c echo.Context) error {
return func(c echo.Context) error {
filename := c.Get(templateFilenameParam).(string)
exists, err := fileExists(amClient, tmplClient, filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
}
if !exists {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("error getting file: file %s does not exist", filename))
}
tmps, err := tmplClient.GetTemplates(filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("error getting templates: %s", err.Error()))
}
return c.JSON(http.StatusOK, tmps)
}
}
func GetGetTemplateHandler(amClient client.AlertmanagerClient, tmplClient client.TemplateClient) func(c echo.Context) error {
return func(c echo.Context) error {
filename := c.Get(templateFilenameParam).(string)
tmplName := c.Get(templateNameParam).(string)
exists, err := fileExists(amClient, tmplClient, filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
}
if !exists {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("error getting template: file %s does not exist", filename))
}
tmpl, err := tmplClient.GetTemplate(filename, tmplName)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("error getting template: %s", err.Error()))
}
return c.JSON(http.StatusOK, tmpl)
}
}
func GetPostTemplateHandler(amClient client.AlertmanagerClient, tmplClient client.TemplateClient) func(c echo.Context) error {
return func(c echo.Context) error {
filename := c.Get(templateFilenameParam).(string)
tmplName := c.Get(templateNameParam).(string)
tmplText, err := readStringBody(c)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}
exists, err := fileExists(amClient, tmplClient, filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
}
if !exists {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("error getting file: file %s does not exist", filename))
}
err = tmplClient.AddTemplate(filename, tmplName, tmplText)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("error adding template: %s", err.Error()))
}
return c.NoContent(http.StatusOK)
}
}
func GetPutTemplateHandler(amClient client.AlertmanagerClient, tmplClient client.TemplateClient) func(c echo.Context) error {
return func(c echo.Context) error {
filename := c.Get(templateFilenameParam).(string)
tmplName := c.Get(templateNameParam).(string)
tmplText, err := readStringBody(c)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}
exists, err := fileExists(amClient, tmplClient, filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
}
if !exists {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("error getting template: file %s does not exist", filename))
}
err = tmplClient.EditTemplate(filename, tmplName, tmplText)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("error editing template: %s", err.Error()))
}
return c.NoContent(http.StatusOK)
}
}
func GetDeleteTemplateHandler(amClient client.AlertmanagerClient, tmplClient client.TemplateClient) func(c echo.Context) error {
return func(c echo.Context) error {
filename := c.Get(templateFilenameParam).(string)
tmplName := c.Get(templateNameParam).(string)
exists, err := fileExists(amClient, tmplClient, filename)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, err)
}
if !exists {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("error getting template: file %s does not exist", filename))
}
err = tmplClient.DeleteTemplate(filename, tmplName)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("error deleting template: %s", err.Error()))
}
return c.NoContent(http.StatusOK)
}
}
func stringParamProvider(paramName string) echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
requestedParam := c.Param(paramName)
if requestedParam == "" {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Must provide %s parameter", paramName))
}
c.Set(paramName, requestedParam)
return next(c)
}
}
}
func fileExists(amClient client.AlertmanagerClient, tmplClient client.TemplateClient, filename string) (bool, error) {
files, err := amClient.GetTemplateFileList()
if err != nil {
return false, err
}
for _, file := range files {
if file == getFullFilePath(filename, tmplClient) {
return true, nil
}
}
return false, nil
}
func getFullFilePath(filename string, tmplClient client.TemplateClient) string {
return tmplClient.Root() + filename + client.TemplateFilePostfix
}
func readStringBody(c echo.Context) (string, error) {
body, err := ioutil.ReadAll(c.Request().Body)
if err != nil {
return string(body), fmt.Errorf("error reading request body: %v", err)
}
return string(body), nil
}