Alerting: Support for imported Templates (#114196)

* refactor template service to contstruct notification template in one place, get provenance before creating and calculate resource version after.
* refactor get by UID and name

* introduce template kind in NotificationTemplate
* introduce includeImported flag and use in the k8s api
* support imported templates
* add kind to template uid
* tests for imported templates
* update API model
* set kind to default templates
This commit is contained in:
Yuri Tseretyan
2025-12-17 20:26:22 +00:00
committed by GitHub
parent 370d5c2dc2
commit db3503fb32
16 changed files with 706 additions and 210 deletions
@@ -20,6 +20,7 @@ import (
"github.com/grafana/grafana/pkg/registry/apps/alerting/notifications/timeinterval"
"github.com/grafana/grafana/pkg/services/apiserver/appinstaller"
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/services/ngalert"
ac "github.com/grafana/grafana/pkg/services/ngalert/accesscontrol"
ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models"
@@ -97,7 +98,12 @@ func (a AlertingNotificationsAppInstaller) GetLegacyStorage(gvr schema.GroupVers
} else if gvr == timeinterval.ResourceInfo.GroupVersionResource() {
return timeinterval.NewStorage(api.MuteTimings, namespacer)
} else if gvr == templategroup.ResourceInfo.GroupVersionResource() {
return templategroup.NewStorage(api.Templates, namespacer)
srv := api.Templates
//nolint:staticcheck // not yet migrated to OpenFeature
if a.ng.FeatureToggles.IsEnabledGlobally(featuremgmt.FlagAlertingImportAlertmanagerAPI) {
srv = srv.WithIncludeImported()
}
return templategroup.NewStorage(srv, namespacer)
} else if gvr == routingtree.ResourceInfo.GroupVersionResource() {
return routingtree.NewStorage(api.Policies, namespacer)
}
@@ -1,6 +1,7 @@
package templategroup
import (
"github.com/grafana/alerting/definition"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/types"
@@ -36,6 +37,7 @@ func convertToK8sResource(orgID int64, template definitions.NotificationTemplate
Spec: model.TemplateGroupSpec{
Title: template.Name,
Content: template.Template,
Kind: model.TemplateGroupTemplateKind(template.Kind),
},
}
result.SetProvenanceStatus(string(template.Provenance))
@@ -50,5 +52,6 @@ func convertToDomainModel(template *model.TemplateGroup) definitions.Notificatio
Template: template.Spec.Content,
ResourceVersion: template.ResourceVersion,
Provenance: definitions.Provenance(ngmodels.ProvenanceNone),
Kind: definition.TemplateKind(template.Spec.Kind),
}
}
@@ -4,6 +4,7 @@ import (
"context"
"fmt"
"github.com/grafana/alerting/definition"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/apis/meta/internalversion"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -211,6 +212,7 @@ func (s *legacyStorage) defaultTemplate() (definitions.NotificationTemplate, err
UID: defaultTemplate.Name,
Provenance: definitions.Provenance("system"),
Template: defaultTemplate.Template,
Kind: definition.GrafanaTemplateKind,
}
return dto, nil