mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* Define query param and regenerate * Add query struct for contact points * Filter contact points by name in query * Document that name filter is optional
183 lines
4.7 KiB
Go
183 lines
4.7 KiB
Go
package definitions
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
|
"github.com/grafana/grafana/pkg/services/ngalert/notifier/channels"
|
|
)
|
|
|
|
// swagger:route GET /api/v1/provisioning/contact-points provisioning stable RouteGetContactpoints
|
|
//
|
|
// Get all the contact points.
|
|
//
|
|
// Responses:
|
|
// 200: ContactPoints
|
|
|
|
// swagger:route POST /api/v1/provisioning/contact-points provisioning stable RoutePostContactpoints
|
|
//
|
|
// Create a contact point.
|
|
//
|
|
// Consumes:
|
|
// - application/json
|
|
//
|
|
// Responses:
|
|
// 202: EmbeddedContactPoint
|
|
// 400: ValidationError
|
|
|
|
// swagger:route PUT /api/v1/provisioning/contact-points/{UID} provisioning stable RoutePutContactpoint
|
|
//
|
|
// Update an existing contact point.
|
|
//
|
|
// Consumes:
|
|
// - application/json
|
|
//
|
|
// Responses:
|
|
// 202: Ack
|
|
// 400: ValidationError
|
|
|
|
// swagger:route DELETE /api/v1/provisioning/contact-points/{UID} provisioning stable RouteDeleteContactpoints
|
|
//
|
|
// Delete a contact point.
|
|
//
|
|
// Consumes:
|
|
// - application/json
|
|
//
|
|
// Responses:
|
|
// 204: description: The contact point was deleted successfully.
|
|
|
|
// swagger:parameters RoutePutContactpoint RouteDeleteContactpoints
|
|
type ContactPointUIDReference struct {
|
|
// UID is the contact point unique identifier
|
|
// in:path
|
|
UID string
|
|
}
|
|
|
|
// swagger:parameters RouteGetContactpoints
|
|
type ContactPointParams struct {
|
|
// Filter by name
|
|
// in: query
|
|
// required: false
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
// swagger:parameters RoutePostContactpoints RoutePutContactpoint
|
|
type ContactPointPayload struct {
|
|
// in:body
|
|
Body EmbeddedContactPoint
|
|
}
|
|
|
|
// swagger:model
|
|
type ContactPoints []EmbeddedContactPoint
|
|
|
|
// EmbeddedContactPoint is the contact point type that is used
|
|
// by grafanas embedded alertmanager implementation.
|
|
// swagger:model
|
|
type EmbeddedContactPoint struct {
|
|
// UID is the unique identifier of the contact point. The UID can be
|
|
// set by the user.
|
|
// example: my_external_reference
|
|
UID string `json:"uid"`
|
|
// Name is used as grouping key in the UI. Contact points with the
|
|
// same name will be grouped in the UI.
|
|
// example: webhook_1
|
|
Name string `json:"name" binding:"required"`
|
|
// required: true
|
|
// example: webhook
|
|
// enum: alertmanager, dingding, discord, email, googlechat, kafka, line, opsgenie, pagerduty, pushover, sensugo, slack, teams, telegram, threema, victorops, webhook, wecom
|
|
Type string `json:"type" binding:"required"`
|
|
// required: true
|
|
Settings *simplejson.Json `json:"settings" binding:"required"`
|
|
// example: false
|
|
DisableResolveMessage bool `json:"disableResolveMessage"`
|
|
// readonly: true
|
|
Provenance string `json:"provenance,omitempty"`
|
|
}
|
|
|
|
const RedactedValue = "[REDACTED]"
|
|
|
|
func (e *EmbeddedContactPoint) Valid(decryptFunc channels.GetDecryptedValueFn) error {
|
|
if e.Type == "" {
|
|
return fmt.Errorf("type should not be an empty string")
|
|
}
|
|
if e.Settings == nil {
|
|
return fmt.Errorf("settings should not be empty")
|
|
}
|
|
factory, exists := channels.Factory(e.Type)
|
|
if !exists {
|
|
return fmt.Errorf("unknown type '%s'", e.Type)
|
|
}
|
|
cfg, _ := channels.NewFactoryConfig(&channels.NotificationChannelConfig{
|
|
Settings: e.Settings,
|
|
Type: e.Type,
|
|
}, nil, decryptFunc, nil, nil)
|
|
if _, err := factory(cfg); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e *EmbeddedContactPoint) SecretKeys() ([]string, error) {
|
|
switch e.Type {
|
|
case "alertmanager":
|
|
return []string{"basicAuthPassword"}, nil
|
|
case "dingding":
|
|
return []string{}, nil
|
|
case "discord":
|
|
return []string{}, nil
|
|
case "email":
|
|
return []string{}, nil
|
|
case "googlechat":
|
|
return []string{}, nil
|
|
case "kafka":
|
|
return []string{}, nil
|
|
case "line":
|
|
return []string{"token"}, nil
|
|
case "opsgenie":
|
|
return []string{"apiKey"}, nil
|
|
case "pagerduty":
|
|
return []string{"integrationKey"}, nil
|
|
case "pushover":
|
|
return []string{"userKey", "apiToken"}, nil
|
|
case "sensugo":
|
|
return []string{"apiKey"}, nil
|
|
case "slack":
|
|
return []string{"url", "token"}, nil
|
|
case "teams":
|
|
return []string{}, nil
|
|
case "telegram":
|
|
return []string{"bottoken"}, nil
|
|
case "threema":
|
|
return []string{"api_secret"}, nil
|
|
case "victorops":
|
|
return []string{}, nil
|
|
case "webhook":
|
|
return []string{}, nil
|
|
case "wecom":
|
|
return []string{"url"}, nil
|
|
}
|
|
return nil, fmt.Errorf("no secrets configured for type '%s'", e.Type)
|
|
}
|
|
|
|
func (e *EmbeddedContactPoint) ExtractSecrets() (map[string]string, error) {
|
|
secrets := map[string]string{}
|
|
secretKeys, err := e.SecretKeys()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, secretKey := range secretKeys {
|
|
secretValue := e.Settings.Get(secretKey).MustString()
|
|
e.Settings.Del(secretKey)
|
|
secrets[secretKey] = secretValue
|
|
}
|
|
return secrets, nil
|
|
}
|
|
|
|
func (e *EmbeddedContactPoint) ResourceID() string {
|
|
return e.UID
|
|
}
|
|
|
|
func (e *EmbeddedContactPoint) ResourceType() string {
|
|
return "contactPoint"
|
|
}
|