Alerting: Fix time-interval conversion to return bad request if payload is incorrect (#94995)

This commit is contained in:
Yuri Tseretyan 2024-10-18 13:16:03 -04:00 committed by GitHub
parent 672d5f92f2
commit 00bb3215cb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 54 additions and 2 deletions

View File

@ -11,6 +11,7 @@ import (
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models"
"github.com/grafana/grafana/pkg/services/ngalert/provisioning"
)
func convertToK8sResources(orgID int64, intervals []definitions.MuteTimeInterval, namespacer request.NamespaceMapper, selector fields.Selector) (*model.TimeIntervalList, error) {
@ -74,14 +75,14 @@ func convertToDomainModel(interval *model.TimeInterval) (definitions.MuteTimeInt
result := definitions.MuteTimeInterval{}
err = json.Unmarshal(b, &result)
if err != nil {
return definitions.MuteTimeInterval{}, err
return definitions.MuteTimeInterval{}, provisioning.MakeErrTimeIntervalInvalid(err)
}
result.Version = interval.ResourceVersion
result.UID = interval.ObjectMeta.Name
result.Provenance = definitions.Provenance(ngmodels.ProvenanceNone)
err = result.Validate()
if err != nil {
return definitions.MuteTimeInterval{}, err
return definitions.MuteTimeInterval{}, provisioning.MakeErrTimeIntervalInvalid(err)
}
return result, nil
}

View File

@ -778,3 +778,54 @@ func TestIntegrationTimeIntervalReferentialIntegrity(t *testing.T) {
})
})
}
func TestIntegrationTimeIntervalValidation(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test")
}
ctx := context.Background()
helper := getTestHelper(t)
adminK8sClient, err := versioned.NewForConfig(helper.Org1.Admin.NewRestConfig())
require.NoError(t, err)
adminClient := adminK8sClient.NotificationsV0alpha1().TimeIntervals("default")
testCases := []struct {
name string
interval v0alpha1.TimeIntervalSpec
}{
{
name: "missing name",
interval: v0alpha1.TimeIntervalSpec{
Name: "",
TimeIntervals: v0alpha1.IntervalGenerator{}.GenerateMany(1),
},
},
{
name: "invalid interval",
interval: v0alpha1.TimeIntervalSpec{
Name: "test",
TimeIntervals: []v0alpha1.Interval{
{
DaysOfMonth: []string{"1-31"},
},
},
},
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
i := &v0alpha1.TimeInterval{
ObjectMeta: v1.ObjectMeta{
Namespace: "default",
},
Spec: tc.interval,
}
_, err = adminClient.Create(ctx, i, v1.CreateOptions{})
require.Error(t, err)
require.Truef(t, errors.IsBadRequest(err), "Expected BadRequest, got: %s", err)
})
}
}