mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: Add lifecycle methods to the forked Alertmanager (#77741)
* Alerting: Add an empty Forked Alertmanager * Alerting: Add methods for silences to the forked Alertmanager * check for errors in tests * make linter happy * Alerting: Add methods for alerts to the forked Alertmanager * Alerting: Add methods for receivers to the forked Alertmanager * Alerting: Add TestTemplate method to the forked Alertmanager * make linter happy * separate into both forked AMs * fix tests * Alerting: Add lifecycle methods to the forked Alertmanager
This commit is contained in:
@@ -21,6 +21,14 @@ func TestForkedAlertmanager_ModeRemoteSecondary(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
expErr := errors.New("test error")
|
||||
|
||||
t.Run("GetStatus", func(tt *testing.T) {
|
||||
// We care about the status of the internal Alertmanager.
|
||||
internal, _, forked := genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
status := apimodels.GettableStatus{}
|
||||
internal.EXPECT().GetStatus().Return(status).Once()
|
||||
require.Equal(tt, status, forked.GetStatus())
|
||||
})
|
||||
|
||||
t.Run("CreateSilence", func(tt *testing.T) {
|
||||
// We should create the silence in the internal Alertmanager.
|
||||
internal, _, forked := genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
@@ -207,12 +215,55 @@ func TestForkedAlertmanager_ModeRemoteSecondary(t *testing.T) {
|
||||
_, err = forked.TestTemplate(ctx, apimodels.TestTemplatesConfigBodyParams{})
|
||||
require.ErrorIs(tt, expErr, err)
|
||||
})
|
||||
|
||||
t.Run("CleanUp", func(tt *testing.T) {
|
||||
// CleanUp() should be called only in the internal Alertmanager,
|
||||
// there's no cleanup to do in the remote one.
|
||||
internal, _, forked := genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
internal.EXPECT().CleanUp().Once()
|
||||
forked.CleanUp()
|
||||
})
|
||||
|
||||
t.Run("StopAndWait", func(tt *testing.T) {
|
||||
// StopAndWait should be called in both Alertmanagers.
|
||||
internal, remote, forked := genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
internal.EXPECT().StopAndWait().Once()
|
||||
remote.EXPECT().StopAndWait().Once()
|
||||
forked.StopAndWait()
|
||||
})
|
||||
|
||||
t.Run("Ready", func(tt *testing.T) {
|
||||
// Ready should be called on both Alertmanagers
|
||||
internal, remote, forked := genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
internal.EXPECT().Ready().Return(true).Once()
|
||||
remote.EXPECT().Ready().Return(true).Once()
|
||||
require.True(tt, forked.Ready())
|
||||
|
||||
// If one of the two Alertmanagers is not ready, it returns false.
|
||||
internal, remote, forked = genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
internal.EXPECT().Ready().Return(false).Maybe()
|
||||
remote.EXPECT().Ready().Return(true).Maybe()
|
||||
require.False(tt, forked.Ready())
|
||||
|
||||
internal, remote, forked = genTestAlertmanagers(tt, modeRemoteSecondary)
|
||||
internal.EXPECT().Ready().Return(true).Maybe()
|
||||
remote.EXPECT().Ready().Return(false).Maybe()
|
||||
require.False(tt, forked.Ready())
|
||||
})
|
||||
}
|
||||
|
||||
func TestForkedAlertmanager_ModeRemotePrimary(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
expErr := errors.New("test error")
|
||||
|
||||
t.Run("GetStatus", func(tt *testing.T) {
|
||||
// We care about the status of the remote Alertmanager.
|
||||
_, remote, forked := genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
status := apimodels.GettableStatus{}
|
||||
remote.EXPECT().GetStatus().Return(status).Once()
|
||||
require.Equal(tt, status, forked.GetStatus())
|
||||
})
|
||||
|
||||
t.Run("CreateSilence", func(tt *testing.T) {
|
||||
// We should create the silence in the remote Alertmanager.
|
||||
_, remote, forked := genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
@@ -396,6 +447,41 @@ func TestForkedAlertmanager_ModeRemotePrimary(t *testing.T) {
|
||||
_, err = forked.TestTemplate(ctx, apimodels.TestTemplatesConfigBodyParams{})
|
||||
require.ErrorIs(tt, expErr, err)
|
||||
})
|
||||
|
||||
t.Run("CleanUp", func(tt *testing.T) {
|
||||
// CleanUp() should be called only in the internal Alertmanager,
|
||||
// there's no cleanup to do in the remote one.
|
||||
internal, _, forked := genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
internal.EXPECT().CleanUp().Once()
|
||||
forked.CleanUp()
|
||||
})
|
||||
|
||||
t.Run("StopAndWait", func(tt *testing.T) {
|
||||
// StopAndWait should be called in both Alertmanagers.
|
||||
internal, remote, forked := genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
internal.EXPECT().StopAndWait().Once()
|
||||
remote.EXPECT().StopAndWait().Once()
|
||||
forked.StopAndWait()
|
||||
})
|
||||
|
||||
t.Run("Ready", func(tt *testing.T) {
|
||||
// Ready should be called on both Alertmanagers
|
||||
internal, remote, forked := genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
internal.EXPECT().Ready().Return(true).Once()
|
||||
remote.EXPECT().Ready().Return(true).Once()
|
||||
require.True(tt, forked.Ready())
|
||||
|
||||
// If one of the two Alertmanagers is not ready, it returns false.
|
||||
internal, remote, forked = genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
internal.EXPECT().Ready().Return(false).Maybe()
|
||||
remote.EXPECT().Ready().Return(true).Maybe()
|
||||
require.False(tt, forked.Ready())
|
||||
|
||||
internal, remote, forked = genTestAlertmanagers(tt, modeRemotePrimary)
|
||||
internal.EXPECT().Ready().Return(true).Maybe()
|
||||
remote.EXPECT().Ready().Return(false).Maybe()
|
||||
require.False(tt, forked.Ready())
|
||||
})
|
||||
}
|
||||
func genTestAlertmanagers(t *testing.T, mode int) (*alertmanager_mock.AlertmanagerMock, *alertmanager_mock.AlertmanagerMock, notifier.Alertmanager) {
|
||||
t.Helper()
|
||||
|
||||
Reference in New Issue
Block a user