mirror of
https://github.com/grafana/grafana.git
synced 2025-07-29 22:22:25 +08:00

* Include access control metadata in k8s receiver List & Get * Add tests for receiver access * Simplify receiver access provisioning extension - prevents edge case infinite recursion - removes read requirement from create
99 lines
3.0 KiB
Go
99 lines
3.0 KiB
Go
package models
|
|
|
|
import (
|
|
amv2 "github.com/prometheus/alertmanager/api/v2/models"
|
|
"golang.org/x/exp/maps"
|
|
|
|
alertingModels "github.com/grafana/alerting/models"
|
|
"github.com/grafana/alerting/notify"
|
|
)
|
|
|
|
// Silence is the model-layer representation of an alertmanager silence. Currently just a wrapper around the
|
|
// alerting notify.Silence.
|
|
type Silence notify.GettableSilence
|
|
|
|
// GetRuleUID returns the rule UID of the silence if the silence is associated with a rule, otherwise nil.
|
|
// Currently, this works by looking for a matcher with the RuleUIDLabel name and returning its value.
|
|
func (s Silence) GetRuleUID() *string {
|
|
return getRuleUIDLabelValue(s.Silence)
|
|
}
|
|
|
|
// getRuleUIDLabelValue returns the value of the RuleUIDLabel matcher in the given silence, if it exists.
|
|
func getRuleUIDLabelValue(silence notify.Silence) *string {
|
|
for _, m := range silence.Matchers {
|
|
if m != nil && isRuleUIDMatcher(*m) {
|
|
return m.Value
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func isRuleUIDMatcher(m amv2.Matcher) bool {
|
|
return isEqualMatcher(m) && m.Name != nil && *m.Name == alertingModels.RuleUIDLabel
|
|
}
|
|
|
|
func isEqualMatcher(m amv2.Matcher) bool {
|
|
// If IsEqual is nil, it is considered to be true.
|
|
return (m.IsEqual == nil || *m.IsEqual) && (m.IsRegex == nil || !*m.IsRegex)
|
|
}
|
|
|
|
// SilenceWithMetadata is a helper type for managing a silence with associated metadata.
|
|
type SilenceWithMetadata struct {
|
|
*Silence
|
|
Metadata SilenceMetadata
|
|
}
|
|
|
|
// SilenceMetadata contains metadata about a silence. Fields are pointers to allow for metadata to be optionally loaded.
|
|
type SilenceMetadata struct {
|
|
RuleMetadata *SilenceRuleMetadata
|
|
Permissions *SilencePermissionSet
|
|
}
|
|
|
|
// SilenceRuleMetadata contains metadata about the rule associated with a silence.
|
|
type SilenceRuleMetadata struct {
|
|
RuleUID string
|
|
RuleTitle string
|
|
FolderUID string
|
|
}
|
|
|
|
// SilencePermission is a type for representing a silence permission.
|
|
type SilencePermission string
|
|
|
|
const (
|
|
SilencePermissionRead SilencePermission = "read"
|
|
SilencePermissionCreate SilencePermission = "create"
|
|
SilencePermissionWrite SilencePermission = "write"
|
|
)
|
|
|
|
// SilencePermissions returns all possible silence permissions.
|
|
func SilencePermissions() [3]SilencePermission {
|
|
return [3]SilencePermission{
|
|
SilencePermissionRead,
|
|
SilencePermissionCreate,
|
|
SilencePermissionWrite,
|
|
}
|
|
}
|
|
|
|
// SilencePermissionSet represents a set of permissions for a silence.
|
|
type SilencePermissionSet map[SilencePermission]bool // TODO: Implement using PermissionSet[SilencePermission]
|
|
|
|
// Clone returns a deep copy of the permission set.
|
|
func (p SilencePermissionSet) Clone() SilencePermissionSet {
|
|
return maps.Clone(p)
|
|
}
|
|
|
|
// AllSet returns true if all possible permissions are set.
|
|
func (p SilencePermissionSet) AllSet() bool {
|
|
for _, permission := range SilencePermissions() {
|
|
if _, ok := p[permission]; !ok {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
// Has returns true if the given permission is allowed in the set.
|
|
func (p SilencePermissionSet) Has(permission SilencePermission) bool {
|
|
return p[permission]
|
|
}
|