Alerting: Add methods for silences to the forked Alertmanager (#77805)
* Alerting: Add an empty Forked Alertmanager * Alerting: Add methods for silences to the forked Alertmanager * check for errors in tests * make linter happy * make linter happy * Alerting: Add methods for silences to the forked Alertmanager
This commit is contained in:
@@ -0,0 +1,167 @@
|
||||
package remote
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
|
||||
"github.com/grafana/grafana/pkg/services/ngalert/notifier"
|
||||
"github.com/grafana/grafana/pkg/services/ngalert/notifier/alertmanager_mock"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
const (
|
||||
modeRemoteSecondary = iota
|
||||
modeRemotePrimary
|
||||
)
|
||||
|
||||
func TestForkedAlertmanager_ModeRemoteSecondary(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
t.Run("CreateSilence", func(tt *testing.T) {
|
||||
// We should create the silence in the internal Alertmanager.
|
||||
internal, _, forked := genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
|
||||
expID := "test-id"
|
||||
internal.EXPECT().CreateSilence(mock.Anything, mock.Anything).Return(expID, nil).Once()
|
||||
id, err := forked.CreateSilence(ctx, nil)
|
||||
require.NoError(tt, err)
|
||||
require.Equal(tt, expID, id)
|
||||
|
||||
// If there's an error in the internal Alertmanager, it should be returned.
|
||||
internal, _, forked = genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
expErr := errors.New("test error")
|
||||
internal.EXPECT().CreateSilence(mock.Anything, mock.Anything).Return("", expErr).Once()
|
||||
_, err = forked.CreateSilence(ctx, nil)
|
||||
require.ErrorIs(tt, expErr, err)
|
||||
})
|
||||
|
||||
t.Run("DeleteSilence", func(tt *testing.T) {
|
||||
// We should delete the silence in the internal Alertmanager.
|
||||
internal, _, forked := genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
internal.EXPECT().DeleteSilence(mock.Anything, mock.Anything).Return(nil).Once()
|
||||
require.NoError(tt, forked.DeleteSilence(ctx, ""))
|
||||
|
||||
// If there's an error in the internal Alertmanager, it should be returned.
|
||||
internal, _, forked = genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
expErr := errors.New("test error")
|
||||
internal.EXPECT().DeleteSilence(mock.Anything, mock.Anything).Return(expErr).Once()
|
||||
require.ErrorIs(tt, expErr, forked.DeleteSilence(ctx, ""))
|
||||
})
|
||||
|
||||
t.Run("GetSilence", func(tt *testing.T) {
|
||||
// We should get the silence from the internal Alertmanager.
|
||||
internal, _, forked := genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
|
||||
expSilence := apimodels.GettableSilence{}
|
||||
internal.EXPECT().GetSilence(mock.Anything, mock.Anything).Return(expSilence, nil).Once()
|
||||
silence, err := forked.GetSilence(ctx, "")
|
||||
require.NoError(tt, err)
|
||||
require.Equal(tt, expSilence, silence)
|
||||
|
||||
// If there's an error in the internal Alertmanager, it should be returned.
|
||||
internal, _, forked = genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
expErr := errors.New("test error")
|
||||
internal.EXPECT().GetSilence(mock.Anything, mock.Anything).Return(apimodels.GettableSilence{}, expErr).Once()
|
||||
_, err = forked.GetSilence(ctx, "")
|
||||
require.ErrorIs(tt, expErr, err)
|
||||
})
|
||||
|
||||
t.Run("ListSilences", func(tt *testing.T) {
|
||||
// We should get the silences from the internal Alertmanager.
|
||||
internal, _, forked := genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
|
||||
expSilences := apimodels.GettableSilences{}
|
||||
internal.EXPECT().ListSilences(mock.Anything, mock.Anything).Return(expSilences, nil).Once()
|
||||
silences, err := forked.ListSilences(ctx, []string{})
|
||||
require.NoError(tt, err)
|
||||
require.Equal(tt, expSilences, silences)
|
||||
|
||||
// If there's an error in the internal Alertmanager, it should be returned.
|
||||
internal, _, forked = genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
expErr := errors.New("test error")
|
||||
internal.EXPECT().ListSilences(mock.Anything, mock.Anything).Return(apimodels.GettableSilences{}, expErr).Once()
|
||||
_, err = forked.ListSilences(ctx, []string{})
|
||||
require.ErrorIs(tt, expErr, err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestForkedAlertmanager_ModeRemotePrimary(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
t.Run("CreateSilence", func(tt *testing.T) {
|
||||
// We should create the silence in the remote Alertmanager.
|
||||
_, remote, forked := genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
|
||||
expID := "test-id"
|
||||
remote.EXPECT().CreateSilence(mock.Anything, mock.Anything).Return(expID, nil).Once()
|
||||
id, err := forked.CreateSilence(ctx, nil)
|
||||
require.NoError(tt, err)
|
||||
require.Equal(tt, expID, id)
|
||||
|
||||
// If there's an error in the remote Alertmanager, the error should be returned.
|
||||
expErr := errors.New("test error")
|
||||
remote.EXPECT().CreateSilence(mock.Anything, mock.Anything).Return("", expErr).Maybe()
|
||||
_, err = forked.CreateSilence(ctx, nil)
|
||||
require.ErrorIs(tt, expErr, err)
|
||||
})
|
||||
|
||||
t.Run("DeleteSilence", func(tt *testing.T) {
|
||||
// We should delete the silence in the remote Alertmanager.
|
||||
_, remote, forked := genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
remote.EXPECT().DeleteSilence(mock.Anything, mock.Anything).Return(nil).Once()
|
||||
require.NoError(tt, forked.DeleteSilence(ctx, ""))
|
||||
|
||||
// If there's an error in the remote Alertmanager, the error should be returned.
|
||||
_, remote, forked = genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
expErr := errors.New("test error")
|
||||
remote.EXPECT().DeleteSilence(mock.Anything, mock.Anything).Return(expErr).Maybe()
|
||||
require.ErrorIs(tt, expErr, forked.DeleteSilence(ctx, ""))
|
||||
})
|
||||
|
||||
t.Run("GetSilence", func(tt *testing.T) {
|
||||
// We should get the silence from the remote Alertmanager.
|
||||
_, remote, forked := genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
expSilence := apimodels.GettableSilence{}
|
||||
remote.EXPECT().GetSilence(mock.Anything, mock.Anything).Return(expSilence, nil).Once()
|
||||
silence, err := forked.GetSilence(ctx, "")
|
||||
require.NoError(tt, err)
|
||||
require.Equal(tt, expSilence, silence)
|
||||
|
||||
// If there's an error in the remote Alertmanager, the error should be returned.
|
||||
_, remote, forked = genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
expErr := errors.New("test error")
|
||||
remote.EXPECT().GetSilence(mock.Anything, mock.Anything).Return(apimodels.GettableSilence{}, expErr).Once()
|
||||
_, err = forked.GetSilence(ctx, "")
|
||||
require.ErrorIs(tt, expErr, err)
|
||||
})
|
||||
|
||||
t.Run("ListSilences", func(tt *testing.T) {
|
||||
// We should get the silences from the remote Alertmanager.
|
||||
_, remote, forked := genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
expSilences := apimodels.GettableSilences{}
|
||||
remote.EXPECT().ListSilences(mock.Anything, mock.Anything).Return(expSilences, nil).Once()
|
||||
silences, err := forked.ListSilences(ctx, []string{})
|
||||
require.NoError(tt, err)
|
||||
require.Equal(tt, expSilences, silences)
|
||||
|
||||
// If there's an error in the remote Alertmanager, the error should be returned.
|
||||
_, remote, forked = genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
expErr := errors.New("test error")
|
||||
remote.EXPECT().ListSilences(mock.Anything, mock.Anything).Return(apimodels.GettableSilences{}, expErr).Once()
|
||||
_, err = forked.ListSilences(ctx, []string{})
|
||||
require.ErrorIs(tt, expErr, err)
|
||||
})
|
||||
}
|
||||
func genTestAlertmanagers(t *testing.T, mode int) (*alertmanager_mock.AlertmanagerMock, *alertmanager_mock.AlertmanagerMock, notifier.Alertmanager) {
|
||||
t.Helper()
|
||||
internal := alertmanager_mock.NewAlertmanagerMock(t)
|
||||
remote := alertmanager_mock.NewAlertmanagerMock(t)
|
||||
|
||||
if mode == modeRemoteSecondary {
|
||||
return internal, remote, NewRemoteSecondaryForkedAlertmanager(internal, remote)
|
||||
}
|
||||
return internal, remote, NewRemotePrimaryForkedAlertmanager(internal, remote)
|
||||
}
|
||||
@@ -37,19 +37,19 @@ func (fam *RemotePrimaryForkedAlertmanager) GetStatus() apimodels.GettableStatus
|
||||
}
|
||||
|
||||
func (fam *RemotePrimaryForkedAlertmanager) CreateSilence(ctx context.Context, silence *apimodels.PostableSilence) (string, error) {
|
||||
return "", nil
|
||||
return fam.remote.CreateSilence(ctx, silence)
|
||||
}
|
||||
|
||||
func (fam *RemotePrimaryForkedAlertmanager) DeleteSilence(ctx context.Context, id string) error {
|
||||
return nil
|
||||
return fam.remote.DeleteSilence(ctx, id)
|
||||
}
|
||||
|
||||
func (fam *RemotePrimaryForkedAlertmanager) GetSilence(ctx context.Context, id string) (apimodels.GettableSilence, error) {
|
||||
return apimodels.GettableSilence{}, nil
|
||||
return fam.remote.GetSilence(ctx, id)
|
||||
}
|
||||
|
||||
func (fam *RemotePrimaryForkedAlertmanager) ListSilences(ctx context.Context, filter []string) (apimodels.GettableSilences, error) {
|
||||
return apimodels.GettableSilences{}, nil
|
||||
return fam.remote.ListSilences(ctx, filter)
|
||||
}
|
||||
|
||||
func (fam *RemotePrimaryForkedAlertmanager) GetAlerts(ctx context.Context, active, silenced, inhibited bool, filter []string, receiver string) (apimodels.GettableAlerts, error) {
|
||||
|
||||
@@ -37,19 +37,19 @@ func (fam *RemoteSecondaryForkedAlertmanager) GetStatus() apimodels.GettableStat
|
||||
}
|
||||
|
||||
func (fam *RemoteSecondaryForkedAlertmanager) CreateSilence(ctx context.Context, silence *apimodels.PostableSilence) (string, error) {
|
||||
return "", nil
|
||||
return fam.internal.CreateSilence(ctx, silence)
|
||||
}
|
||||
|
||||
func (fam *RemoteSecondaryForkedAlertmanager) DeleteSilence(ctx context.Context, id string) error {
|
||||
return nil
|
||||
return fam.internal.DeleteSilence(ctx, id)
|
||||
}
|
||||
|
||||
func (fam *RemoteSecondaryForkedAlertmanager) GetSilence(ctx context.Context, id string) (apimodels.GettableSilence, error) {
|
||||
return apimodels.GettableSilence{}, nil
|
||||
return fam.internal.GetSilence(ctx, id)
|
||||
}
|
||||
|
||||
func (fam *RemoteSecondaryForkedAlertmanager) ListSilences(ctx context.Context, filter []string) (apimodels.GettableSilences, error) {
|
||||
return apimodels.GettableSilences{}, nil
|
||||
return fam.internal.ListSilences(ctx, filter)
|
||||
}
|
||||
|
||||
func (fam *RemoteSecondaryForkedAlertmanager) GetAlerts(ctx context.Context, active, silenced, inhibited bool, filter []string, receiver string) (apimodels.GettableAlerts, error) {
|
||||
|
||||
Reference in New Issue
Block a user