diff --git a/Makefile b/Makefile index 8ec0e88b4ea..549012eec06 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/README.md b/README.md index b47529aff8c..02e11912023 100644 --- a/README.md +++ b/README.md @@ -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/) diff --git a/pkg/api/alertmanager.go b/pkg/api/alertmanager.go index 9d3f17025b6..5ca05a7d68e 100644 --- a/pkg/api/alertmanager.go +++ b/pkg/api/alertmanager.go @@ -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 diff --git a/pkg/api/alertmanager_test.go b/pkg/api/alertmanager_test.go index a551e3775d3..06ead584531 100644 --- a/pkg/api/alertmanager_test.go +++ b/pkg/api/alertmanager_test.go @@ -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",