Alerting: Fix MuteTiming Get API to return provenance status (#80494)

This commit is contained in:
Yuri Tseretyan 2024-01-12 17:16:54 -05:00 committed by GitHub
parent 2fb03dfa56
commit 4b071f5452
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 12 deletions

View File

@ -37,9 +37,18 @@ func (svc *MuteTimingService) GetMuteTimings(ctx context.Context, orgID int64) (
return []definitions.MuteTimeInterval{}, nil
}
provenances, err := svc.provenanceStore.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
}
@ -60,12 +69,11 @@ func (svc *MuteTimingService) GetMuteTiming(ctx context.Context, name string, or
MuteTimeInterval: mt,
}
_, err = svc.provenanceStore.GetProvenance(ctx, &result, orgID)
prov, err := svc.provenanceStore.GetProvenance(ctx, &result, orgID)
if err != nil {
return definitions.MuteTimeInterval{}, err
}
// TODO uncomment in a follow up
// result.Provenance = definitions.Provenance(prov)
result.Provenance = definitions.Provenance(prov)
return result, nil
}

View File

@ -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)
})
})
}
@ -120,7 +142,7 @@ func TestGetMuteTiming(t *testing.T) {
require.NoError(t, err)
require.Equal(t, "Test1", result.Name)
require.EqualValues(t, "", result.Provenance) // TODO this is bug and that's how it works now. Fix it in follow up
require.EqualValues(t, models.ProvenanceAPI, result.Provenance)
require.Len(t, store.Calls, 1)
require.Equal(t, "Get", store.Calls[0].Method)

View File

@ -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) {