single route per Alerting config

This commit is contained in:
Owen Diehl
2021-02-26 11:29:22 -05:00
parent 0d5643570b
commit 18ae819cbe
4 changed files with 55 additions and 162 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ GO_PKG_FILES = $(shell find $(PKG_DIR) -name *.go -print)
spec.json: $(GO_PKG_FILES)
swagger generate spec -m -w $(PKG_DIR) | jq 'del(.definitions.ApiAlertingConfig.properties.route)' > $@
swagger generate spec -m -w $(PKG_DIR) -o $@
.PHONY: openapi
-1
View File
@@ -11,4 +11,3 @@ This repo aims to define the unified alerting API as code. It generates OpenAPI
## Requires
- [go-swagger](https://github.com/go-swagger/go-swagger)
- [jq](https://stedolan.github.io/jq/)
+15 -25
View File
@@ -180,12 +180,6 @@ type AlertingConfigResponse struct {
type ApiAlertingConfig struct {
config.Config
// TODO: PR a followup to https://github.com/go-swagger/go-swagger/pull/1527 in order to allow
// explicitly ignoring embedded fields. In the meantime, these are hackily removed in our make targets via `jq`
AlertManagerRoute *config.Route `yaml:"alertmanager_route,omitempty" json:"alertmanager_route,omitempty"`
GrafanaManagedRoute *config.Route `yaml:"grafana_managed_route,omitempty" json:"grafana_managed_route,omitempty"`
// Override with our superset receiver type
Receivers []*ApiReceiver `yaml:"receivers,omitempty" json:"receivers,omitempty"`
}
@@ -201,32 +195,28 @@ func (c *ApiAlertingConfig) UnmarshalJSON(b []byte) error {
// validate ensures that the two routing trees use the correct receiver types.
func (c *ApiAlertingConfig) validate() error {
receivers := make(map[string]ReceiverType, len(c.Receivers))
receivers := make(map[string]struct{}, len(c.Receivers))
var hasGrafReceivers, hasAMReceivers bool
for _, r := range c.Receivers {
receivers[r.Name] = r.Type()
receivers[r.Name] = struct{}{}
switch r.Type() {
case GrafanaReceiverType:
hasGrafReceivers = true
case AlertmanagerReceiverType:
hasAMReceivers = true
}
}
for _, receiver := range AllReceivers(c.GrafanaManagedRoute) {
t, ok := receivers[receiver]
if hasGrafReceivers && hasAMReceivers {
return fmt.Errorf("cannot mix Alertmanager & Grafana receiver types")
}
for _, receiver := range AllReceivers(c.Route) {
_, ok := receivers[receiver]
if !ok {
return fmt.Errorf("unexpected receiver (%s) is undefined", receiver)
}
if t != GrafanaReceiverType {
return fmt.Errorf("unexpected receiver (%s): cannot use Alertmanager receiver types in Grafana managed routes", receiver)
}
}
for _, receiver := range AllReceivers(c.AlertManagerRoute) {
t, ok := receivers[receiver]
if !ok {
return fmt.Errorf("unexpected receiver (%s) is undefined", receiver)
}
if t != AlertmanagerReceiverType {
return fmt.Errorf("unexpected receiver (%s): cannot use Grafana receiver types in non-Grafana managed routes", receiver)
}
}
return nil
+39 -135
View File
@@ -92,22 +92,15 @@ func Test_ApiAlertingConfig_Marshaling(t *testing.T) {
err bool
}{
{
desc: "success",
desc: "success am",
input: ApiAlertingConfig{
Config: config.Config{},
AlertManagerRoute: &config.Route{
Receiver: "am",
Routes: []*config.Route{
{
Receiver: "am",
},
},
},
GrafanaManagedRoute: &config.Route{
Receiver: "graf",
Routes: []*config.Route{
{
Receiver: "graf",
Config: config.Config{
Route: &config.Route{
Receiver: "am",
Routes: []*config.Route{
{
Receiver: "am",
},
},
},
},
@@ -118,6 +111,23 @@ func Test_ApiAlertingConfig_Marshaling(t *testing.T) {
EmailConfigs: []*config.EmailConfig{{}},
},
},
},
},
},
{
desc: "success graf",
input: ApiAlertingConfig{
Config: config.Config{
Route: &config.Route{
Receiver: "graf",
Routes: []*config.Route{
{
Receiver: "graf",
},
},
},
},
Receivers: []*ApiReceiver{
{
Receiver: config.Receiver{
Name: "graf",
@@ -132,20 +142,13 @@ func Test_ApiAlertingConfig_Marshaling(t *testing.T) {
{
desc: "failure undefined am receiver",
input: ApiAlertingConfig{
Config: config.Config{},
AlertManagerRoute: &config.Route{
Receiver: "am",
Routes: []*config.Route{
{
Receiver: "unmentioned",
},
},
},
GrafanaManagedRoute: &config.Route{
Receiver: "graf",
Routes: []*config.Route{
{
Receiver: "graf",
Config: config.Config{
Route: &config.Route{
Receiver: "am",
Routes: []*config.Route{
{
Receiver: "unmentioned",
},
},
},
},
@@ -156,14 +159,6 @@ func Test_ApiAlertingConfig_Marshaling(t *testing.T) {
EmailConfigs: []*config.EmailConfig{{}},
},
},
{
Receiver: config.Receiver{
Name: "graf",
},
GrafanaReceivers: GrafanaReceivers{
GrafanaManagedReceivers: []*GrafanaReceiver{{}},
},
},
},
},
err: true,
@@ -171,108 +166,17 @@ func Test_ApiAlertingConfig_Marshaling(t *testing.T) {
{
desc: "failure undefined graf receiver",
input: ApiAlertingConfig{
Config: config.Config{},
AlertManagerRoute: &config.Route{
Receiver: "am",
Routes: []*config.Route{
{
Receiver: "am",
},
},
},
GrafanaManagedRoute: &config.Route{
Receiver: "graf",
Routes: []*config.Route{
{
Receiver: "unmentioned",
Config: config.Config{
Route: &config.Route{
Receiver: "graf",
Routes: []*config.Route{
{
Receiver: "unmentioned",
},
},
},
},
Receivers: []*ApiReceiver{
{
Receiver: config.Receiver{
Name: "am",
EmailConfigs: []*config.EmailConfig{{}},
},
},
{
Receiver: config.Receiver{
Name: "graf",
},
GrafanaReceivers: GrafanaReceivers{
GrafanaManagedReceivers: []*GrafanaReceiver{{}},
},
},
},
},
err: true,
},
{
desc: "failure mixed AM in Grafana",
input: ApiAlertingConfig{
Config: config.Config{},
AlertManagerRoute: &config.Route{
Receiver: "am",
Routes: []*config.Route{
{
Receiver: "am",
},
},
},
GrafanaManagedRoute: &config.Route{
Receiver: "graf",
Routes: []*config.Route{
{
Receiver: "am",
},
},
},
Receivers: []*ApiReceiver{
{
Receiver: config.Receiver{
Name: "am",
EmailConfigs: []*config.EmailConfig{{}},
},
},
{
Receiver: config.Receiver{
Name: "graf",
},
GrafanaReceivers: GrafanaReceivers{
GrafanaManagedReceivers: []*GrafanaReceiver{{}},
},
},
},
},
err: true,
},
{
desc: "failure mixed Grafana in AM",
input: ApiAlertingConfig{
Config: config.Config{},
AlertManagerRoute: &config.Route{
Receiver: "am",
Routes: []*config.Route{
{
Receiver: "graf",
},
},
},
GrafanaManagedRoute: &config.Route{
Receiver: "graf",
Routes: []*config.Route{
{
Receiver: "graf",
},
},
},
Receivers: []*ApiReceiver{
{
Receiver: config.Receiver{
Name: "am",
EmailConfigs: []*config.EmailConfig{{}},
},
},
{
Receiver: config.Receiver{
Name: "graf",