From 48fec7a8687811f80f983cf04eb85ba1f5de6c63 Mon Sep 17 00:00:00 2001 From: Yuri Tseretyan Date: Wed, 20 Dec 2023 19:28:42 -0500 Subject: [PATCH] make getAll return provenance status --- .../ngalert/provisioning/mute_timings.go | 16 +++++++++-- .../ngalert/provisioning/mute_timings_test.go | 28 +++++++++++++++++-- .../api/alerting/api_provisioning_test.go | 8 +++--- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/pkg/services/ngalert/provisioning/mute_timings.go b/pkg/services/ngalert/provisioning/mute_timings.go index f10c9950168c..f018dc6efb24 100644 --- a/pkg/services/ngalert/provisioning/mute_timings.go +++ b/pkg/services/ngalert/provisioning/mute_timings.go @@ -2,7 +2,6 @@ package provisioning import ( "context" - "fmt" "github.com/prometheus/alertmanager/config" @@ -36,9 +35,22 @@ func (svc *MuteTimingService) GetMuteTimings(ctx context.Context, orgID int64) ( return []definitions.MuteTimeInterval{}, nil } + provenances, err := svc.prov.GetProvenances(ctx, orgID, (&definitions.MuteTimeInterval{}).ResourceType()) + if err != nil { + return nil, err + } + result := make([]definitions.MuteTimeInterval, 0, len(rev.cfg.AlertmanagerConfig.MuteTimeIntervals)) for _, interval := range rev.cfg.AlertmanagerConfig.MuteTimeIntervals { - result = append(result, definitions.MuteTimeInterval{MuteTimeInterval: interval}) + def := definitions.MuteTimeInterval{MuteTimeInterval: interval} + if prov, ok := provenances[def.ResourceID()]; ok { + def.Provenance = definitions.Provenance(prov) + } + result = append(result, def) + } + return result, nil +} + // GetMuteTiming returns a mute timing by name func (svc *MuteTimingService) GetMuteTiming(ctx context.Context, name string, orgID int64) (definitions.MuteTimeInterval, error) { rev, err := svc.config.Get(ctx, orgID) diff --git a/pkg/services/ngalert/provisioning/mute_timings_test.go b/pkg/services/ngalert/provisioning/mute_timings_test.go index fde16e4c481d..f00506b3d01f 100644 --- a/pkg/services/ngalert/provisioning/mute_timings_test.go +++ b/pkg/services/ngalert/provisioning/mute_timings_test.go @@ -42,26 +42,35 @@ func TestGetMuteTimings(t *testing.T) { }, } + provenances := map[string]models.Provenance{ + "Test1": models.ProvenanceFile, + "Test2": models.ProvenanceAPI, + } + t.Run("service returns timings from config file", func(t *testing.T) { - sut, store, _ := createMuteTimingSvcSut() + sut, store, prov := createMuteTimingSvcSut() store.GetFn = func(ctx context.Context, orgID int64) (*cfgRevision, error) { return revision, nil } + prov.EXPECT().GetProvenances(mock.Anything, mock.Anything, mock.Anything).Return(provenances, nil) + result, err := sut.GetMuteTimings(context.Background(), 1) require.NoError(t, err) require.Len(t, result, len(revision.cfg.AlertmanagerConfig.MuteTimeIntervals)) require.Equal(t, "Test1", result[0].Name) - require.EqualValues(t, "", result[0].Provenance) + require.EqualValues(t, provenances["Test1"], result[0].Provenance) require.Equal(t, "Test2", result[1].Name) - require.EqualValues(t, "", result[1].Provenance) + require.EqualValues(t, provenances["Test2"], result[1].Provenance) require.Equal(t, "Test3", result[2].Name) require.EqualValues(t, "", result[2].Provenance) require.Len(t, store.Calls, 1) require.Equal(t, "Get", store.Calls[0].Method) require.Equal(t, orgID, store.Calls[0].Args[1]) + + prov.AssertCalled(t, "GetProvenances", mock.Anything, orgID, (&definitions.MuteTimeInterval{}).ResourceType()) }) t.Run("service returns empty list when config file contains no mute timings", func(t *testing.T) { @@ -88,6 +97,19 @@ func TestGetMuteTimings(t *testing.T) { require.ErrorIs(t, err, expected) }) + + t.Run("when unable to read provenance", func(t *testing.T) { + sut, store, prov := createMuteTimingSvcSut() + store.GetFn = func(ctx context.Context, orgID int64) (*cfgRevision, error) { + return revision, nil + } + expected := fmt.Errorf("failed") + prov.EXPECT().GetProvenances(mock.Anything, mock.Anything, mock.Anything).Return(nil, expected) + + _, err := sut.GetMuteTimings(context.Background(), orgID) + + require.ErrorIs(t, err, expected) + }) }) } diff --git a/pkg/tests/api/alerting/api_provisioning_test.go b/pkg/tests/api/alerting/api_provisioning_test.go index 3a905891d374..f19a54d0c653 100644 --- a/pkg/tests/api/alerting/api_provisioning_test.go +++ b/pkg/tests/api/alerting/api_provisioning_test.go @@ -457,12 +457,12 @@ func TestMuteTimings(t *testing.T) { mt, status, body := apiClient.GetMuteTimingByNameWithStatus(t, emptyMuteTiming.Name) requireStatusCode(t, http.StatusOK, status, body) require.Equal(t, emptyMuteTiming.MuteTimeInterval, mt.MuteTimeInterval) - require.EqualValues(t, "", mt.Provenance) // TODO this is a bug + require.EqualValues(t, models.ProvenanceAPI, mt.Provenance) mt, status, body = apiClient.GetMuteTimingByNameWithStatus(t, anotherMuteTiming.Name) requireStatusCode(t, http.StatusOK, status, body) require.Equal(t, anotherMuteTiming.MuteTimeInterval, mt.MuteTimeInterval) - require.EqualValues(t, "", mt.Provenance) // TODO this is a bug + require.EqualValues(t, models.ProvenanceAPI, mt.Provenance) }) t.Run("should return NotFound if mute timing does not exist", func(t *testing.T) { @@ -480,10 +480,10 @@ func TestMuteTimings(t *testing.T) { }) require.Equal(t, emptyMuteTiming.MuteTimeInterval, mt[0].MuteTimeInterval) - require.EqualValues(t, "", mt[0].Provenance) // TODO this is a bug + require.EqualValues(t, models.ProvenanceAPI, mt[0].Provenance) require.Equal(t, anotherMuteTiming.MuteTimeInterval, mt[1].MuteTimeInterval) - require.EqualValues(t, "", mt[1].Provenance) // TODO this is a bug + require.EqualValues(t, models.ProvenanceAPI, mt[1].Provenance) }) t.Run("should get BadRequest if creates a new mute timing with the same name", func(t *testing.T) {